2014-05-13 11:07:01 +00:00
|
|
|
/*
|
2016-02-07 20:46:45 -08:00
|
|
|
* Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
|
2014-05-13 11:07:01 +00:00
|
|
|
*
|
2016-02-07 20:46:45 -08:00
|
|
|
* Use of this source code is governed by a BSD-style license
|
|
|
|
|
* that can be found in the LICENSE file in the root of the source
|
|
|
|
|
* tree. An additional intellectual property rights grant can be found
|
|
|
|
|
* in the file PATENTS. All contributing project authors may
|
|
|
|
|
* be found in the AUTHORS file in the root of the source tree.
|
2014-05-13 11:07:01 +00:00
|
|
|
*/
|
|
|
|
|
|
2015-01-05 18:51:13 +00:00
|
|
|
#include <algorithm>
|
2014-05-13 11:07:01 +00:00
|
|
|
#include <map>
|
2016-02-26 03:00:35 -08:00
|
|
|
#include <memory>
|
2014-06-10 08:53:05 +00:00
|
|
|
#include <vector>
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2015-01-28 21:36:55 +00:00
|
|
|
#include "webrtc/base/arraysize.h"
|
2014-08-13 17:26:08 +00:00
|
|
|
#include "webrtc/base/gunit.h"
|
|
|
|
|
#include "webrtc/base/stringutils.h"
|
Move talk/media to webrtc/media
I removed the 'libjingle' target in talk/libjingle.gyp and replaced
all users of it with base/base.gyp:rtc_base. It seems the jsoncpp
and expat dependencies were not used by it's previous references.
The files in talk/media/testdata were uploaded to Google Storage and
added .sha1 files in resources/media instead of simply moving them.
The previously disabled warnings that were inherited from
talk/build/common.gypi are now replaced by target-specific disabling
of only the failing warnings. Additional disabling was needed since the stricter
compilation warnings that applies to code in webrtc/.
License headers will be updated in a follow-up CL in order to not
break Git history.
Other modifications:
* Updated the header guards.
* Sorted the includes using chromium/src/tools/sort-headers.py
except for these files:
talk/app/webrtc/peerconnectionendtoend_unittest.cc
talk/app/webrtc/java/jni/androidmediadecoder_jni.cc
talk/app/webrtc/java/jni/androidmediaencoder_jni.cc
webrtc/media/devices/win32devicemanager.cc.
* Unused GYP reference to libjingle_tests_additional_deps was removed.
* Removed duplicated GYP entries of
webrtc/base/testutils.cc
webrtc/base/testutils.h
The HAVE_WEBRTC_VIDEO and HAVE_WEBRTC_VOICE defines were used by only talk/media,
so they were moved to the media.gyp.
I also checked that none of
EXPAT_RELATIVE_PATH,
FEATURE_ENABLE_VOICEMAIL,
GTEST_RELATIVE_PATH,
JSONCPP_RELATIVE_PATH,
LOGGING=1,
SRTP_RELATIVE_PATH,
FEATURE_ENABLE_SSL,
FEATURE_ENABLE_VOICEMAIL,
FEATURE_ENABLE_PSTN,
HAVE_SCTP,
HAVE_SRTP,
are used by the talk/media code.
For Chromium, the following changes will need to be applied to the roll CL that updates the
DEPS for WebRTC and libjingle: https://codereview.chromium.org/1604303002/
BUG=webrtc:5420
NOPRESUBMIT=True
TBR=tommi@webrtc.org
Review URL: https://codereview.webrtc.org/1587193006
Cr-Commit-Position: refs/heads/master@{#11495}
2016-02-04 23:52:28 -08:00
|
|
|
#include "webrtc/media/base/testutils.h"
|
|
|
|
|
#include "webrtc/media/base/videoengine_unittest.h"
|
2016-02-12 06:39:40 +01:00
|
|
|
#include "webrtc/media/engine/fakewebrtccall.h"
|
|
|
|
|
#include "webrtc/media/engine/fakewebrtcvideoengine.h"
|
|
|
|
|
#include "webrtc/media/engine/simulcast.h"
|
|
|
|
|
#include "webrtc/media/engine/webrtcvideochannelfactory.h"
|
|
|
|
|
#include "webrtc/media/engine/webrtcvideoengine2.h"
|
|
|
|
|
#include "webrtc/media/engine/webrtcvoiceengine.h"
|
2015-10-15 07:26:07 -07:00
|
|
|
#include "webrtc/test/field_trial.h"
|
2014-10-03 11:25:45 +00:00
|
|
|
#include "webrtc/video_encoder.h"
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2016-05-26 11:24:55 -07:00
|
|
|
using webrtc::RtpExtension;
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
namespace {
|
2014-12-10 09:01:18 +00:00
|
|
|
static const int kDefaultQpMax = 56;
|
|
|
|
|
static const int kDefaultFramerate = 30;
|
|
|
|
|
|
2016-04-13 10:07:16 -07:00
|
|
|
static const cricket::VideoCodec kVp8Codec720p(100, "VP8", 1280, 720, 30);
|
|
|
|
|
static const cricket::VideoCodec kVp8Codec360p(100, "VP8", 640, 360, 30);
|
|
|
|
|
static const cricket::VideoCodec kVp8Codec270p(100, "VP8", 480, 270, 30);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2016-04-13 10:07:16 -07:00
|
|
|
static const cricket::VideoCodec kVp8Codec(100, "VP8", 640, 400, 30);
|
|
|
|
|
static const cricket::VideoCodec kVp9Codec(101, "VP9", 640, 400, 30);
|
|
|
|
|
static const cricket::VideoCodec kH264Codec(102, "H264", 640, 400, 30);
|
2014-10-14 04:25:33 +00:00
|
|
|
|
2016-04-13 10:07:16 -07:00
|
|
|
static const cricket::VideoCodec kRedCodec(116, "red", 0, 0, 0);
|
|
|
|
|
static const cricket::VideoCodec kUlpfecCodec(117, "ulpfec", 0, 0, 0);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2015-07-10 11:27:55 -07:00
|
|
|
static const uint8_t kRedRtxPayloadType = 125;
|
|
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
static const uint32_t kSsrcs1[] = {1};
|
|
|
|
|
static const uint32_t kSsrcs3[] = {1, 2, 3};
|
|
|
|
|
static const uint32_t kRtxSsrcs1[] = {4};
|
|
|
|
|
static const uint32_t kIncomingUnsignalledSsrc = 0xC0FFEE;
|
2014-07-20 15:27:35 +00:00
|
|
|
static const char kUnsupportedExtensionName[] =
|
|
|
|
|
"urn:ietf:params:rtp-hdrext:unsupported";
|
2014-06-13 12:27:38 +00:00
|
|
|
|
|
|
|
|
void VerifyCodecHasDefaultFeedbackParams(const cricket::VideoCodec& codec) {
|
|
|
|
|
EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
|
|
|
|
|
cricket::kRtcpFbParamNack, cricket::kParamValueEmpty)));
|
|
|
|
|
EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
|
|
|
|
|
cricket::kRtcpFbParamNack, cricket::kRtcpFbNackParamPli)));
|
|
|
|
|
EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
|
|
|
|
|
cricket::kRtcpFbParamRemb, cricket::kParamValueEmpty)));
|
2015-11-20 18:05:48 -08:00
|
|
|
EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
|
|
|
|
|
cricket::kRtcpFbParamTransportCc, cricket::kParamValueEmpty)));
|
2014-06-13 12:27:38 +00:00
|
|
|
EXPECT_TRUE(codec.HasFeedbackParam(cricket::FeedbackParam(
|
|
|
|
|
cricket::kRtcpFbParamCcm, cricket::kRtcpFbCcmParamFir)));
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-29 17:21:40 -07:00
|
|
|
static void CreateBlackFrame(webrtc::VideoFrame* video_frame,
|
2015-01-27 09:57:01 +00:00
|
|
|
int width,
|
|
|
|
|
int height) {
|
|
|
|
|
video_frame->CreateEmptyFrame(
|
|
|
|
|
width, height, width, (width + 1) / 2, (width + 1) / 2);
|
Reland of Delete webrtc::VideoFrame methods buffer and stride. (patchset #1 id:1 of https://codereview.webrtc.org/1983583002/ )
Reason for revert:
Should work after cl https://codereview.webrtc.org/1985693002/ is landed, which initializes the frames used by FakeWebRtcVideoCaptureModule. So intend to reland after that, with no changes.
Original issue's description:
> Revert of Delete webrtc::VideoFrame methods buffer and stride. (patchset #2 id:290001 of https://codereview.webrtc.org/1963413004/ )
>
> Reason for revert:
> Speculative revert to see if failures on the DrMemory bot are related to this cl. See e.g. here:
> https://build.chromium.org/p/client.webrtc/builders/Win%20DrMemory%20Full/builds/4243
>
> UNINITIALIZED READ: reading 0x04980040-0x04980060 32 byte(s) within 0x04980040-0x04980060
> # 0 CopyRow_AVX
> # 1 CopyPlane
> # 2 I420Copy
> # 3 webrtc::ExtractBuffer
> # 4 cricket::WebRtcVideoCapturer::SignalFrameCapturedOnStartThread
> # 5 cricket::WebRtcVideoCapturer::OnIncomingCapturedFrame
> # 6 FakeWebRtcVideoCaptureModule::SendFrame
> # 7 WebRtcVideoCapturerTest_TestCaptureVcm_Test::TestBody
> # 8 testing::internal::HandleSehExceptionsInMethodIfSupported<>
>
> Original issue's description:
> > Reland of Delete webrtc::VideoFrame methods buffer and stride. (patchset #1 id:1 of https://codereview.webrtc.org/1935443002/ )
> >
> > Reason for revert:
> > I plan to reland this change in a week or two, after downstream users are updated.
> >
> > Original issue's description:
> > > Revert of Delete webrtc::VideoFrame methods buffer and stride. (patchset #14 id:250001 of https://codereview.webrtc.org/1900673002/ )
> > >
> > > Reason for revert:
> > > Breaks chrome FYI bots.
> > >
> > > Original issue's description:
> > > > Delete webrtc::VideoFrame methods buffer and stride.
> > > >
> > > > To make the HasOneRef/IsMutable hack work, also had to change the
> > > > video_frame_buffer method to return a const ref to a scoped_ref_ptr,
> > > > to not imply an AddRef.
> > > >
> > > > BUG=webrtc:5682
> > >
> > > TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org
> > > # Skipping CQ checks because original CL landed less than 1 days ago.
> > > NOPRESUBMIT=true
> > > NOTREECHECKS=true
> > > NOTRY=true
> > > BUG=webrtc:5682
> > >
> > > Committed: https://crrev.com/5b3c443d301f2c2f18dac5b02652c08b91ea3828
> > > Cr-Commit-Position: refs/heads/master@{#12558}
> >
> > TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org
> > # Not skipping CQ checks because original CL landed more than 1 days ago.
> > BUG=webrtc:5682
> >
> > Committed: https://crrev.com/d0dc66e0ea30c8614001e425a4ae0aa7dd56c2a7
> > Cr-Commit-Position: refs/heads/master@{#12721}
>
> TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org,nisse@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:5682
>
> Committed: https://crrev.com/d49c30cd2fe442f2b5b4ecec8d5cbaa430464725
> Cr-Commit-Position: refs/heads/master@{#12745}
TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org,tommi@webrtc.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=webrtc:5682
Review-Url: https://codereview.webrtc.org/1979193003
Cr-Commit-Position: refs/heads/master@{#12773}
2016-05-17 04:05:47 -07:00
|
|
|
memset(video_frame->video_frame_buffer()->MutableDataY(), 16,
|
2015-01-27 09:57:01 +00:00
|
|
|
video_frame->allocated_size(webrtc::kYPlane));
|
Reland of Delete webrtc::VideoFrame methods buffer and stride. (patchset #1 id:1 of https://codereview.webrtc.org/1983583002/ )
Reason for revert:
Should work after cl https://codereview.webrtc.org/1985693002/ is landed, which initializes the frames used by FakeWebRtcVideoCaptureModule. So intend to reland after that, with no changes.
Original issue's description:
> Revert of Delete webrtc::VideoFrame methods buffer and stride. (patchset #2 id:290001 of https://codereview.webrtc.org/1963413004/ )
>
> Reason for revert:
> Speculative revert to see if failures on the DrMemory bot are related to this cl. See e.g. here:
> https://build.chromium.org/p/client.webrtc/builders/Win%20DrMemory%20Full/builds/4243
>
> UNINITIALIZED READ: reading 0x04980040-0x04980060 32 byte(s) within 0x04980040-0x04980060
> # 0 CopyRow_AVX
> # 1 CopyPlane
> # 2 I420Copy
> # 3 webrtc::ExtractBuffer
> # 4 cricket::WebRtcVideoCapturer::SignalFrameCapturedOnStartThread
> # 5 cricket::WebRtcVideoCapturer::OnIncomingCapturedFrame
> # 6 FakeWebRtcVideoCaptureModule::SendFrame
> # 7 WebRtcVideoCapturerTest_TestCaptureVcm_Test::TestBody
> # 8 testing::internal::HandleSehExceptionsInMethodIfSupported<>
>
> Original issue's description:
> > Reland of Delete webrtc::VideoFrame methods buffer and stride. (patchset #1 id:1 of https://codereview.webrtc.org/1935443002/ )
> >
> > Reason for revert:
> > I plan to reland this change in a week or two, after downstream users are updated.
> >
> > Original issue's description:
> > > Revert of Delete webrtc::VideoFrame methods buffer and stride. (patchset #14 id:250001 of https://codereview.webrtc.org/1900673002/ )
> > >
> > > Reason for revert:
> > > Breaks chrome FYI bots.
> > >
> > > Original issue's description:
> > > > Delete webrtc::VideoFrame methods buffer and stride.
> > > >
> > > > To make the HasOneRef/IsMutable hack work, also had to change the
> > > > video_frame_buffer method to return a const ref to a scoped_ref_ptr,
> > > > to not imply an AddRef.
> > > >
> > > > BUG=webrtc:5682
> > >
> > > TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org
> > > # Skipping CQ checks because original CL landed less than 1 days ago.
> > > NOPRESUBMIT=true
> > > NOTREECHECKS=true
> > > NOTRY=true
> > > BUG=webrtc:5682
> > >
> > > Committed: https://crrev.com/5b3c443d301f2c2f18dac5b02652c08b91ea3828
> > > Cr-Commit-Position: refs/heads/master@{#12558}
> >
> > TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org
> > # Not skipping CQ checks because original CL landed more than 1 days ago.
> > BUG=webrtc:5682
> >
> > Committed: https://crrev.com/d0dc66e0ea30c8614001e425a4ae0aa7dd56c2a7
> > Cr-Commit-Position: refs/heads/master@{#12721}
>
> TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org,nisse@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:5682
>
> Committed: https://crrev.com/d49c30cd2fe442f2b5b4ecec8d5cbaa430464725
> Cr-Commit-Position: refs/heads/master@{#12745}
TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org,tommi@webrtc.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=webrtc:5682
Review-Url: https://codereview.webrtc.org/1979193003
Cr-Commit-Position: refs/heads/master@{#12773}
2016-05-17 04:05:47 -07:00
|
|
|
memset(video_frame->video_frame_buffer()->MutableDataU(), 128,
|
2015-01-27 09:57:01 +00:00
|
|
|
video_frame->allocated_size(webrtc::kUPlane));
|
Reland of Delete webrtc::VideoFrame methods buffer and stride. (patchset #1 id:1 of https://codereview.webrtc.org/1983583002/ )
Reason for revert:
Should work after cl https://codereview.webrtc.org/1985693002/ is landed, which initializes the frames used by FakeWebRtcVideoCaptureModule. So intend to reland after that, with no changes.
Original issue's description:
> Revert of Delete webrtc::VideoFrame methods buffer and stride. (patchset #2 id:290001 of https://codereview.webrtc.org/1963413004/ )
>
> Reason for revert:
> Speculative revert to see if failures on the DrMemory bot are related to this cl. See e.g. here:
> https://build.chromium.org/p/client.webrtc/builders/Win%20DrMemory%20Full/builds/4243
>
> UNINITIALIZED READ: reading 0x04980040-0x04980060 32 byte(s) within 0x04980040-0x04980060
> # 0 CopyRow_AVX
> # 1 CopyPlane
> # 2 I420Copy
> # 3 webrtc::ExtractBuffer
> # 4 cricket::WebRtcVideoCapturer::SignalFrameCapturedOnStartThread
> # 5 cricket::WebRtcVideoCapturer::OnIncomingCapturedFrame
> # 6 FakeWebRtcVideoCaptureModule::SendFrame
> # 7 WebRtcVideoCapturerTest_TestCaptureVcm_Test::TestBody
> # 8 testing::internal::HandleSehExceptionsInMethodIfSupported<>
>
> Original issue's description:
> > Reland of Delete webrtc::VideoFrame methods buffer and stride. (patchset #1 id:1 of https://codereview.webrtc.org/1935443002/ )
> >
> > Reason for revert:
> > I plan to reland this change in a week or two, after downstream users are updated.
> >
> > Original issue's description:
> > > Revert of Delete webrtc::VideoFrame methods buffer and stride. (patchset #14 id:250001 of https://codereview.webrtc.org/1900673002/ )
> > >
> > > Reason for revert:
> > > Breaks chrome FYI bots.
> > >
> > > Original issue's description:
> > > > Delete webrtc::VideoFrame methods buffer and stride.
> > > >
> > > > To make the HasOneRef/IsMutable hack work, also had to change the
> > > > video_frame_buffer method to return a const ref to a scoped_ref_ptr,
> > > > to not imply an AddRef.
> > > >
> > > > BUG=webrtc:5682
> > >
> > > TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org
> > > # Skipping CQ checks because original CL landed less than 1 days ago.
> > > NOPRESUBMIT=true
> > > NOTREECHECKS=true
> > > NOTRY=true
> > > BUG=webrtc:5682
> > >
> > > Committed: https://crrev.com/5b3c443d301f2c2f18dac5b02652c08b91ea3828
> > > Cr-Commit-Position: refs/heads/master@{#12558}
> >
> > TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org
> > # Not skipping CQ checks because original CL landed more than 1 days ago.
> > BUG=webrtc:5682
> >
> > Committed: https://crrev.com/d0dc66e0ea30c8614001e425a4ae0aa7dd56c2a7
> > Cr-Commit-Position: refs/heads/master@{#12721}
>
> TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org,nisse@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:5682
>
> Committed: https://crrev.com/d49c30cd2fe442f2b5b4ecec8d5cbaa430464725
> Cr-Commit-Position: refs/heads/master@{#12745}
TBR=perkj@webrtc.org,magjed@webrtc.org,pbos@webrtc.org,pthatcher@webrtc.org,stefan@webrtc.org,tommi@webrtc.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=webrtc:5682
Review-Url: https://codereview.webrtc.org/1979193003
Cr-Commit-Position: refs/heads/master@{#12773}
2016-05-17 04:05:47 -07:00
|
|
|
memset(video_frame->video_frame_buffer()->MutableDataV(), 128,
|
2015-01-27 09:57:01 +00:00
|
|
|
video_frame->allocated_size(webrtc::kVPlane));
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-21 20:24:50 +08:00
|
|
|
void VerifySendStreamHasRtxTypes(const webrtc::VideoSendStream::Config& config,
|
|
|
|
|
const std::map<int, int>& rtx_types) {
|
|
|
|
|
std::map<int, int>::const_iterator it;
|
|
|
|
|
it = rtx_types.find(config.encoder_settings.payload_type);
|
|
|
|
|
EXPECT_TRUE(it != rtx_types.end() &&
|
|
|
|
|
it->second == config.rtp.rtx.payload_type);
|
|
|
|
|
|
|
|
|
|
if (config.rtp.fec.red_rtx_payload_type != -1) {
|
|
|
|
|
it = rtx_types.find(config.rtp.fec.red_payload_type);
|
|
|
|
|
EXPECT_TRUE(it != rtx_types.end() &&
|
|
|
|
|
it->second == config.rtp.fec.red_rtx_payload_type);
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-05-13 11:07:01 +00:00
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
namespace cricket {
|
2014-10-14 04:25:33 +00:00
|
|
|
class WebRtcVideoEngine2Test : public ::testing::Test {
|
2014-05-13 11:07:01 +00:00
|
|
|
public:
|
2015-10-15 07:26:07 -07:00
|
|
|
WebRtcVideoEngine2Test() : WebRtcVideoEngine2Test("") {}
|
|
|
|
|
explicit WebRtcVideoEngine2Test(const char* field_trials)
|
|
|
|
|
: override_field_trials_(field_trials),
|
|
|
|
|
call_(webrtc::Call::Create(webrtc::Call::Config())),
|
2015-09-15 12:26:33 +02:00
|
|
|
engine_() {
|
2014-06-13 09:34:13 +00:00
|
|
|
std::vector<VideoCodec> engine_codecs = engine_.codecs();
|
2015-09-17 00:24:34 -07:00
|
|
|
RTC_DCHECK(!engine_codecs.empty());
|
2014-05-13 11:07:01 +00:00
|
|
|
bool codec_set = false;
|
2014-06-13 09:34:13 +00:00
|
|
|
for (size_t i = 0; i < engine_codecs.size(); ++i) {
|
|
|
|
|
if (engine_codecs[i].name == "red") {
|
|
|
|
|
default_red_codec_ = engine_codecs[i];
|
|
|
|
|
} else if (engine_codecs[i].name == "ulpfec") {
|
|
|
|
|
default_ulpfec_codec_ = engine_codecs[i];
|
|
|
|
|
} else if (engine_codecs[i].name == "rtx") {
|
2015-04-21 20:24:50 +08:00
|
|
|
int associated_payload_type;
|
|
|
|
|
if (engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
|
|
|
|
|
&associated_payload_type)) {
|
|
|
|
|
default_apt_rtx_types_[associated_payload_type] = engine_codecs[i].id;
|
|
|
|
|
}
|
2014-05-13 11:07:01 +00:00
|
|
|
} else if (!codec_set) {
|
2014-06-13 09:34:13 +00:00
|
|
|
default_codec_ = engine_codecs[i];
|
2014-05-13 11:07:01 +00:00
|
|
|
codec_set = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-17 00:24:34 -07:00
|
|
|
RTC_DCHECK(codec_set);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected:
|
2014-10-14 04:25:33 +00:00
|
|
|
VideoMediaChannel* SetUpForExternalEncoderFactory(
|
|
|
|
|
cricket::WebRtcVideoEncoderFactory* encoder_factory,
|
|
|
|
|
const std::vector<VideoCodec>& codecs);
|
2014-10-20 11:07:07 +00:00
|
|
|
|
2014-11-03 14:46:44 +00:00
|
|
|
VideoMediaChannel* SetUpForExternalDecoderFactory(
|
|
|
|
|
cricket::WebRtcVideoDecoderFactory* decoder_factory,
|
|
|
|
|
const std::vector<VideoCodec>& codecs);
|
|
|
|
|
|
2016-02-05 11:13:28 +01:00
|
|
|
void TestExtendedEncoderOveruse(bool use_external_encoder);
|
|
|
|
|
|
2015-10-15 07:26:07 -07:00
|
|
|
webrtc::test::ScopedFieldTrials override_field_trials_;
|
2015-03-02 13:30:15 +00:00
|
|
|
// Used in WebRtcVideoEngine2VoiceTest, but defined here so it's properly
|
|
|
|
|
// initialized when the constructor is called.
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<webrtc::Call> call_;
|
2014-05-13 11:07:01 +00:00
|
|
|
WebRtcVideoEngine2 engine_;
|
|
|
|
|
VideoCodec default_codec_;
|
|
|
|
|
VideoCodec default_red_codec_;
|
|
|
|
|
VideoCodec default_ulpfec_codec_;
|
2015-04-21 20:24:50 +08:00
|
|
|
std::map<int, int> default_apt_rtx_types_;
|
2014-05-13 11:07:01 +00:00
|
|
|
};
|
|
|
|
|
|
2016-05-14 02:03:18 +02:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, AnnouncesVp9AccordingToBuildFlags) {
|
|
|
|
|
bool claims_vp9_support = false;
|
|
|
|
|
for (const cricket::VideoCodec& codec : engine_.codecs()) {
|
|
|
|
|
if (codec.name == "VP9") {
|
|
|
|
|
claims_vp9_support = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#if defined(RTC_DISABLE_VP9)
|
|
|
|
|
EXPECT_FALSE(claims_vp9_support);
|
|
|
|
|
#else
|
|
|
|
|
EXPECT_TRUE(claims_vp9_support);
|
|
|
|
|
#endif // defined(RTC_DISABLE_VP9)
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-13 11:47:28 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, DefaultRtxCodecHasAssociatedPayloadTypeSet) {
|
|
|
|
|
std::vector<VideoCodec> engine_codecs = engine_.codecs();
|
|
|
|
|
for (size_t i = 0; i < engine_codecs.size(); ++i) {
|
|
|
|
|
if (engine_codecs[i].name != kRtxCodecName)
|
|
|
|
|
continue;
|
|
|
|
|
int associated_payload_type;
|
|
|
|
|
EXPECT_TRUE(engine_codecs[i].GetParam(kCodecParamAssociatedPayloadType,
|
2014-10-03 11:25:45 +00:00
|
|
|
&associated_payload_type));
|
2014-06-13 11:47:28 +00:00
|
|
|
EXPECT_EQ(default_codec_.id, associated_payload_type);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
FAIL() << "No RTX codec found among default codecs.";
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-16 17:32:02 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, SupportsTimestampOffsetHeaderExtension) {
|
2015-12-07 10:45:43 +01:00
|
|
|
RtpCapabilities capabilities = engine_.GetCapabilities();
|
|
|
|
|
ASSERT_FALSE(capabilities.header_extensions.empty());
|
2016-05-26 11:24:55 -07:00
|
|
|
for (const RtpExtension& extension : capabilities.header_extensions) {
|
|
|
|
|
if (extension.uri == RtpExtension::kTimestampOffsetUri) {
|
|
|
|
|
EXPECT_EQ(RtpExtension::kTimestampOffsetDefaultId, extension.id);
|
2014-06-16 17:32:02 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
FAIL() << "Timestamp offset extension not in header-extension list.";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test, SupportsAbsoluteSenderTimeHeaderExtension) {
|
2015-12-07 10:45:43 +01:00
|
|
|
RtpCapabilities capabilities = engine_.GetCapabilities();
|
|
|
|
|
ASSERT_FALSE(capabilities.header_extensions.empty());
|
2016-05-26 11:24:55 -07:00
|
|
|
for (const RtpExtension& extension : capabilities.header_extensions) {
|
|
|
|
|
if (extension.uri == RtpExtension::kAbsSendTimeUri) {
|
|
|
|
|
EXPECT_EQ(RtpExtension::kAbsSendTimeDefaultId, extension.id);
|
2014-06-16 17:32:02 +00:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
FAIL() << "Absolute Sender Time extension not in header-extension list.";
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-15 07:26:07 -07:00
|
|
|
class WebRtcVideoEngine2WithSendSideBweTest : public WebRtcVideoEngine2Test {
|
|
|
|
|
public:
|
|
|
|
|
WebRtcVideoEngine2WithSendSideBweTest()
|
|
|
|
|
: WebRtcVideoEngine2Test("WebRTC-SendSideBwe/Enabled/") {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoEngine2WithSendSideBweTest,
|
|
|
|
|
SupportsTransportSequenceNumberHeaderExtension) {
|
2015-12-07 10:45:43 +01:00
|
|
|
RtpCapabilities capabilities = engine_.GetCapabilities();
|
|
|
|
|
ASSERT_FALSE(capabilities.header_extensions.empty());
|
2016-05-26 11:24:55 -07:00
|
|
|
for (const RtpExtension& extension : capabilities.header_extensions) {
|
|
|
|
|
if (extension.uri == RtpExtension::kTransportSequenceNumberUri) {
|
|
|
|
|
EXPECT_EQ(RtpExtension::kTransportSequenceNumberDefaultId, extension.id);
|
2015-10-15 07:26:07 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
FAIL() << "Transport sequence number extension not in header-extension list.";
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-01 15:33:06 -07:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, SupportsVideoRotationHeaderExtension) {
|
2015-12-07 10:45:43 +01:00
|
|
|
RtpCapabilities capabilities = engine_.GetCapabilities();
|
|
|
|
|
ASSERT_FALSE(capabilities.header_extensions.empty());
|
2016-05-26 11:24:55 -07:00
|
|
|
for (const RtpExtension& extension : capabilities.header_extensions) {
|
|
|
|
|
if (extension.uri == RtpExtension::kVideoRotationUri) {
|
|
|
|
|
EXPECT_EQ(RtpExtension::kVideoRotationDefaultId, extension.id);
|
2015-04-01 15:33:06 -07:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
FAIL() << "Video Rotation extension not in header-extension list.";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test, CVOSetHeaderExtensionBeforeCapturer) {
|
|
|
|
|
// Allocate the capturer first to prevent early destruction before channel's
|
|
|
|
|
// dtor is called.
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
|
|
|
|
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2015-04-01 15:33:06 -07:00
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-09-17 16:42:56 +02:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
|
2015-04-01 15:33:06 -07:00
|
|
|
EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
|
|
|
|
|
// Add CVO extension.
|
|
|
|
|
const int id = 1;
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kVideoRotationUri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2015-04-01 15:33:06 -07:00
|
|
|
|
|
|
|
|
// Set capturer.
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
|
2015-04-01 15:33:06 -07:00
|
|
|
|
|
|
|
|
// Verify capturer has turned off applying rotation.
|
2016-05-25 08:47:01 -07:00
|
|
|
EXPECT_FALSE(capturer.apply_rotation());
|
2015-04-01 15:33:06 -07:00
|
|
|
|
|
|
|
|
// Verify removing header extension turns on applying rotation.
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.extensions.clear();
|
|
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2016-05-25 08:47:01 -07:00
|
|
|
EXPECT_TRUE(capturer.apply_rotation());
|
2015-04-01 15:33:06 -07:00
|
|
|
}
|
|
|
|
|
|
2016-03-02 05:34:00 -08:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, CVOSetHeaderExtensionBeforeAddSendStream) {
|
|
|
|
|
// Allocate the capturer first to prevent early destruction before channel's
|
|
|
|
|
// dtor is called.
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
|
|
|
|
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
|
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
|
|
|
|
|
// Add CVO extension.
|
|
|
|
|
const int id = 1;
|
|
|
|
|
parameters.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kVideoRotationUri, id));
|
2016-03-02 05:34:00 -08:00
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
|
|
|
|
EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
|
|
|
|
|
// Set capturer.
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
|
2016-03-02 05:34:00 -08:00
|
|
|
|
|
|
|
|
// Verify capturer has turned off applying rotation.
|
2016-05-25 08:47:01 -07:00
|
|
|
EXPECT_FALSE(capturer.apply_rotation());
|
2016-03-02 05:34:00 -08:00
|
|
|
}
|
|
|
|
|
|
2015-04-01 15:33:06 -07:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, CVOSetHeaderExtensionAfterCapturer) {
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
|
|
|
|
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
2016-03-20 07:34:29 -07:00
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP9, "VP9");
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2016-03-20 07:34:29 -07:00
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
2015-04-01 15:33:06 -07:00
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-09-17 16:42:56 +02:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
|
2015-04-01 15:33:06 -07:00
|
|
|
EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
|
|
|
|
|
// Set capturer.
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
|
2015-04-01 15:33:06 -07:00
|
|
|
|
2016-03-20 07:34:29 -07:00
|
|
|
// Verify capturer has turned on applying rotation.
|
2016-05-25 08:47:01 -07:00
|
|
|
EXPECT_TRUE(capturer.apply_rotation());
|
2016-03-20 07:34:29 -07:00
|
|
|
|
2015-04-01 15:33:06 -07:00
|
|
|
// Add CVO extension.
|
|
|
|
|
const int id = 1;
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kVideoRotationUri, id));
|
2016-03-20 07:34:29 -07:00
|
|
|
// Also remove the first codec to trigger a codec change as well.
|
|
|
|
|
parameters.codecs.erase(parameters.codecs.begin());
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2015-04-01 15:33:06 -07:00
|
|
|
|
|
|
|
|
// Verify capturer has turned off applying rotation.
|
2016-05-25 08:47:01 -07:00
|
|
|
EXPECT_FALSE(capturer.apply_rotation());
|
2015-04-01 15:33:06 -07:00
|
|
|
|
|
|
|
|
// Verify removing header extension turns on applying rotation.
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.extensions.clear();
|
|
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2016-05-25 08:47:01 -07:00
|
|
|
EXPECT_TRUE(capturer.apply_rotation());
|
2015-04-01 15:33:06 -07:00
|
|
|
}
|
|
|
|
|
|
2014-07-17 08:51:46 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, SetSendFailsBeforeSettingCodecs) {
|
2015-05-22 09:04:09 +02:00
|
|
|
engine_.Init();
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2016-02-12 02:27:06 -08:00
|
|
|
engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions()));
|
2014-07-17 08:51:46 +00:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
|
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(channel->SetSend(true))
|
|
|
|
|
<< "Channel should not start without codecs.";
|
|
|
|
|
EXPECT_TRUE(channel->SetSend(false))
|
|
|
|
|
<< "Channel should be stoppable even without set codecs.";
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-12 20:55:10 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, GetStatsWithoutSendCodecsSetDoesNotCrash) {
|
2015-05-22 09:04:09 +02:00
|
|
|
engine_.Init();
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2016-02-12 02:27:06 -08:00
|
|
|
engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions()));
|
2014-08-12 20:55:10 +00:00
|
|
|
EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123)));
|
|
|
|
|
VideoMediaInfo info;
|
|
|
|
|
channel->GetStats(&info);
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-14 04:25:33 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, UseExternalFactoryForVp8WhenSupported) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2014-10-14 04:25:33 +00:00
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-09-17 16:42:56 +02:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
|
2014-10-14 04:25:33 +00:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
2016-04-20 06:35:56 -07:00
|
|
|
ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1));
|
2014-10-14 04:25:33 +00:00
|
|
|
ASSERT_EQ(1u, encoder_factory.encoders().size());
|
|
|
|
|
EXPECT_TRUE(channel->SetSend(true));
|
|
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
|
2014-10-14 04:25:33 +00:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2016-04-20 06:35:56 -07:00
|
|
|
// Sending one frame will have reallocated the encoder since input size
|
|
|
|
|
// changes from a small default to the actual frame width/height. Wait for
|
|
|
|
|
// that to happen then for the frame to be sent.
|
|
|
|
|
ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2));
|
2014-10-14 04:25:33 +00:00
|
|
|
EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0,
|
|
|
|
|
kTimeout);
|
|
|
|
|
|
2015-02-16 21:02:00 +00:00
|
|
|
int num_created_encoders = encoder_factory.GetNumCreatedEncoders();
|
|
|
|
|
EXPECT_EQ(num_created_encoders, 2);
|
|
|
|
|
|
|
|
|
|
// Setting codecs of the same type should not reallocate any encoders
|
|
|
|
|
// (expecting a no-op).
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2015-02-16 21:02:00 +00:00
|
|
|
EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders());
|
2014-10-14 04:25:33 +00:00
|
|
|
|
|
|
|
|
// Remove stream previously added to free the external encoder instance.
|
|
|
|
|
EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
|
|
|
|
|
EXPECT_EQ(0u, encoder_factory.encoders().size());
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-05 11:13:28 +01:00
|
|
|
void WebRtcVideoEngine2Test::TestExtendedEncoderOveruse(
|
|
|
|
|
bool use_external_encoder) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel;
|
2016-02-05 11:13:28 +01:00
|
|
|
FakeCall* fake_call = new FakeCall(webrtc::Call::Config());
|
|
|
|
|
call_.reset(fake_call);
|
|
|
|
|
if (use_external_encoder) {
|
|
|
|
|
channel.reset(
|
|
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, parameters.codecs));
|
|
|
|
|
} else {
|
|
|
|
|
engine_.Init();
|
2016-02-12 02:27:06 -08:00
|
|
|
channel.reset(
|
|
|
|
|
engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions()));
|
2016-02-05 11:13:28 +01:00
|
|
|
}
|
|
|
|
|
ASSERT_TRUE(
|
|
|
|
|
channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
|
|
|
|
EXPECT_TRUE(channel->SetSend(true));
|
|
|
|
|
FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0];
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(use_external_encoder,
|
|
|
|
|
stream->GetConfig().encoder_settings.full_overuse_time);
|
|
|
|
|
// Remove stream previously added to free the external encoder instance.
|
|
|
|
|
EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test, EnablesFullEncoderTimeForExternalEncoders) {
|
|
|
|
|
TestExtendedEncoderOveruse(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test, DisablesFullEncoderTimeForNonExternalEncoders) {
|
|
|
|
|
TestExtendedEncoderOveruse(false);
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-14 02:03:18 +02:00
|
|
|
#if !defined(RTC_DISABLE_VP9)
|
2015-03-27 15:53:18 +01:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, CanConstructDecoderForVp9EncoderFactory) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP9, "VP9");
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kVp9Codec);
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-03-27 15:53:18 +01:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
}
|
2016-05-14 02:03:18 +02:00
|
|
|
#endif // !defined(RTC_DISABLE_VP9)
|
2015-03-27 15:53:18 +01:00
|
|
|
|
2015-07-16 10:27:16 -07:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, PropagatesInputFrameTimestamp) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kVp8Codec);
|
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
FakeCall* fake_call = new FakeCall(webrtc::Call::Config());
|
|
|
|
|
call_.reset(fake_call);
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-07-16 10:27:16 -07:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
|
|
|
|
|
FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer));
|
2015-07-16 10:27:16 -07:00
|
|
|
capturer.Start(cricket::VideoFormat(1280, 720,
|
|
|
|
|
cricket::VideoFormat::FpsToInterval(60),
|
|
|
|
|
cricket::FOURCC_I420));
|
|
|
|
|
channel->SetSend(true);
|
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0];
|
2015-07-16 10:27:16 -07:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2015-09-14 11:38:38 -07:00
|
|
|
int64_t last_timestamp = stream->GetLastTimestamp();
|
2015-07-16 10:27:16 -07:00
|
|
|
for (int i = 0; i < 10; i++) {
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2015-09-14 11:38:38 -07:00
|
|
|
int64_t timestamp = stream->GetLastTimestamp();
|
2015-07-16 10:27:16 -07:00
|
|
|
int64_t interval = timestamp - last_timestamp;
|
|
|
|
|
|
|
|
|
|
// Precision changes from nanosecond to millisecond.
|
|
|
|
|
// Allow error to be no more than 1.
|
|
|
|
|
EXPECT_NEAR(cricket::VideoFormat::FpsToInterval(60) / 1E6, interval, 1);
|
|
|
|
|
|
|
|
|
|
last_timestamp = timestamp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
capturer.Start(cricket::VideoFormat(1280, 720,
|
|
|
|
|
cricket::VideoFormat::FpsToInterval(30),
|
|
|
|
|
cricket::FOURCC_I420));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
last_timestamp = stream->GetLastTimestamp();
|
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2015-09-14 11:38:38 -07:00
|
|
|
int64_t timestamp = stream->GetLastTimestamp();
|
2015-07-16 10:27:16 -07:00
|
|
|
int64_t interval = timestamp - last_timestamp;
|
|
|
|
|
|
|
|
|
|
// Precision changes from nanosecond to millisecond.
|
|
|
|
|
// Allow error to be no more than 1.
|
|
|
|
|
EXPECT_NEAR(cricket::VideoFormat::FpsToInterval(30) / 1E6, interval, 1);
|
|
|
|
|
|
|
|
|
|
last_timestamp = timestamp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Remove stream previously added to free the external encoder instance.
|
|
|
|
|
EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-14 11:38:38 -07:00
|
|
|
TEST_F(WebRtcVideoEngine2Test,
|
|
|
|
|
ProducesIncreasingTimestampsWithResetInputSources) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kVp8Codec);
|
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
FakeCall* fake_call = new FakeCall(webrtc::Call::Config());
|
|
|
|
|
call_.reset(fake_call);
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-09-14 11:38:38 -07:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
channel->SetSend(true);
|
2015-09-15 12:26:33 +02:00
|
|
|
FakeVideoSendStream* stream = fake_call->GetVideoSendStreams()[0];
|
2015-09-14 11:38:38 -07:00
|
|
|
|
|
|
|
|
FakeVideoCapturer capturer1;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer1));
|
2015-09-14 11:38:38 -07:00
|
|
|
|
|
|
|
|
cricket::CapturedFrame frame;
|
|
|
|
|
frame.width = 1280;
|
|
|
|
|
frame.height = 720;
|
|
|
|
|
frame.fourcc = cricket::FOURCC_I420;
|
2016-02-12 01:01:11 -08:00
|
|
|
frame.data_size = frame.width * frame.height +
|
|
|
|
|
2 * ((frame.width + 1) / 2) * ((frame.height + 1) / 2);
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<char[]> data(new char[frame.data_size]);
|
2015-09-14 11:38:38 -07:00
|
|
|
frame.data = data.get();
|
|
|
|
|
memset(frame.data, 1, frame.data_size);
|
2016-04-14 02:29:29 -07:00
|
|
|
int64_t initial_timestamp = rtc::TimeNanos();
|
|
|
|
|
frame.time_stamp = initial_timestamp;
|
2015-09-14 11:38:38 -07:00
|
|
|
|
|
|
|
|
// Deliver initial frame.
|
|
|
|
|
capturer1.SignalCapturedFrame(&frame);
|
|
|
|
|
// Deliver next frame 1 second later.
|
|
|
|
|
frame.time_stamp += rtc::kNumNanosecsPerSec;
|
|
|
|
|
rtc::Thread::Current()->SleepMs(1000);
|
|
|
|
|
capturer1.SignalCapturedFrame(&frame);
|
|
|
|
|
|
|
|
|
|
int64_t capturer1_last_timestamp = stream->GetLastTimestamp();
|
|
|
|
|
// Reset input source, should still be continuous even though input-frame
|
|
|
|
|
// timestamp is less than before.
|
|
|
|
|
FakeVideoCapturer capturer2;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer2));
|
2015-09-14 11:38:38 -07:00
|
|
|
|
|
|
|
|
rtc::Thread::Current()->SleepMs(1);
|
|
|
|
|
// Deliver with a timestamp (10 seconds) before the previous initial one,
|
|
|
|
|
// these should not be related at all anymore and it should still work fine.
|
2016-04-14 02:29:29 -07:00
|
|
|
frame.time_stamp = initial_timestamp - 10 * rtc::kNumNanosecsPerSec;
|
2015-09-14 11:38:38 -07:00
|
|
|
capturer2.SignalCapturedFrame(&frame);
|
|
|
|
|
|
|
|
|
|
// New timestamp should be at least 1ms in the future and not old.
|
|
|
|
|
EXPECT_GT(stream->GetLastTimestamp(), capturer1_last_timestamp);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel->RemoveSendStream(kSsrc));
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-14 04:25:33 +00:00
|
|
|
VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalEncoderFactory(
|
|
|
|
|
cricket::WebRtcVideoEncoderFactory* encoder_factory,
|
|
|
|
|
const std::vector<VideoCodec>& codecs) {
|
|
|
|
|
engine_.SetExternalEncoderFactory(encoder_factory);
|
2015-05-22 09:04:09 +02:00
|
|
|
engine_.Init();
|
2014-10-14 04:25:33 +00:00
|
|
|
|
2014-10-14 20:29:28 +00:00
|
|
|
VideoMediaChannel* channel =
|
2016-02-12 02:27:06 -08:00
|
|
|
engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions());
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs = codecs;
|
|
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2014-10-14 04:25:33 +00:00
|
|
|
|
|
|
|
|
return channel;
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-03 14:46:44 +00:00
|
|
|
VideoMediaChannel* WebRtcVideoEngine2Test::SetUpForExternalDecoderFactory(
|
|
|
|
|
cricket::WebRtcVideoDecoderFactory* decoder_factory,
|
|
|
|
|
const std::vector<VideoCodec>& codecs) {
|
|
|
|
|
engine_.SetExternalDecoderFactory(decoder_factory);
|
2015-05-22 09:04:09 +02:00
|
|
|
engine_.Init();
|
2014-11-03 14:46:44 +00:00
|
|
|
|
|
|
|
|
VideoMediaChannel* channel =
|
2016-02-12 02:27:06 -08:00
|
|
|
engine_.CreateChannel(call_.get(), MediaConfig(), VideoOptions());
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs = codecs;
|
|
|
|
|
EXPECT_TRUE(channel->SetRecvParameters(parameters));
|
2014-11-03 14:46:44 +00:00
|
|
|
|
|
|
|
|
return channel;
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-14 16:26:23 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, UsesSimulcastAdapterForVp8Factories) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kVp8Codec);
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-01-14 16:26:23 +00:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
|
2015-01-14 16:26:23 +00:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
|
|
|
|
|
EXPECT_TRUE(channel->SetSend(true));
|
|
|
|
|
|
2015-02-16 21:02:00 +00:00
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer));
|
2015-02-16 21:02:00 +00:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
2016-04-20 06:35:56 -07:00
|
|
|
ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2));
|
2015-01-14 16:26:23 +00:00
|
|
|
|
|
|
|
|
// Verify that encoders are configured for simulcast through adapter
|
|
|
|
|
// (increasing resolution and only configured to send one stream each).
|
|
|
|
|
int prev_width = -1;
|
|
|
|
|
for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) {
|
2016-04-20 06:35:56 -07:00
|
|
|
ASSERT_TRUE(encoder_factory.encoders()[i]->WaitForInitEncode());
|
2015-01-14 16:26:23 +00:00
|
|
|
webrtc::VideoCodec codec_settings =
|
|
|
|
|
encoder_factory.encoders()[i]->GetCodecSettings();
|
|
|
|
|
EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams);
|
|
|
|
|
EXPECT_GT(codec_settings.width, prev_width);
|
|
|
|
|
prev_width = codec_settings.width;
|
|
|
|
|
}
|
2015-02-16 21:02:00 +00:00
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, nullptr));
|
2015-03-06 02:20:58 +00:00
|
|
|
|
|
|
|
|
channel.reset();
|
|
|
|
|
ASSERT_EQ(0u, encoder_factory.encoders().size());
|
2015-01-14 16:26:23 +00:00
|
|
|
}
|
|
|
|
|
|
2014-10-14 04:25:33 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, ChannelWithExternalH264CanChangeToInternalVp8) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kH264Codec);
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2014-10-14 04:25:33 +00:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
ASSERT_EQ(1u, encoder_factory.encoders().size());
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
EXPECT_TRUE(channel->SetSendParameters(parameters));
|
2014-10-14 04:25:33 +00:00
|
|
|
ASSERT_EQ(0u, encoder_factory.encoders().size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test,
|
|
|
|
|
DontUseExternalEncoderFactoryForUnsupportedCodecs) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kVp8Codec);
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2014-10-14 04:25:33 +00:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
2015-03-06 02:20:58 +00:00
|
|
|
// Make sure DestroyVideoEncoder was called on the factory.
|
|
|
|
|
ASSERT_EQ(0u, encoder_factory.encoders().size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test,
|
|
|
|
|
UsesSimulcastAdapterForVp8WithCombinedVP8AndH264Factory) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
|
|
|
|
|
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kVp8Codec);
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-03-06 02:20:58 +00:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
|
2015-03-06 02:20:58 +00:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(CreateSimStreamParams("cname", ssrcs)));
|
|
|
|
|
EXPECT_TRUE(channel->SetSend(true));
|
|
|
|
|
|
|
|
|
|
// Send a fake frame, or else the media engine will configure the simulcast
|
|
|
|
|
// encoder adapter at a low-enough size that it'll only create a single
|
|
|
|
|
// encoder layer.
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, &capturer));
|
2015-03-06 02:20:58 +00:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
2016-04-20 06:35:56 -07:00
|
|
|
ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2));
|
|
|
|
|
ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode());
|
2015-03-06 02:20:58 +00:00
|
|
|
EXPECT_EQ(webrtc::kVideoCodecVP8,
|
|
|
|
|
encoder_factory.encoders()[0]->GetCodecSettings().codecType);
|
|
|
|
|
|
|
|
|
|
channel.reset();
|
|
|
|
|
// Make sure DestroyVideoEncoder was called on the factory.
|
|
|
|
|
EXPECT_EQ(0u, encoder_factory.encoders().size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test,
|
|
|
|
|
DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
|
|
|
|
|
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kH264Codec);
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-03-06 02:20:58 +00:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
ASSERT_EQ(1u, encoder_factory.encoders().size());
|
2016-04-20 06:35:56 -07:00
|
|
|
ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode());
|
2015-03-06 02:20:58 +00:00
|
|
|
EXPECT_EQ(webrtc::kVideoCodecH264,
|
|
|
|
|
encoder_factory.encoders()[0]->GetCodecSettings().codecType);
|
|
|
|
|
|
|
|
|
|
channel.reset();
|
|
|
|
|
// Make sure DestroyVideoEncoder was called on the factory.
|
2014-10-14 04:25:33 +00:00
|
|
|
ASSERT_EQ(0u, encoder_factory.encoders().size());
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-27 01:59:29 -07:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, SimulcastDisabledForH264) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kH264Codec);
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-08-27 01:59:29 -07:00
|
|
|
SetUpForExternalEncoderFactory(&encoder_factory, codecs));
|
|
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
|
2015-08-27 01:59:29 -07:00
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddSendStream(cricket::CreateSimStreamParams("cname", ssrcs)));
|
2016-02-02 14:14:30 +01:00
|
|
|
|
|
|
|
|
// Send a frame of 720p. This should trigger a "real" encoder initialization.
|
2015-08-27 01:59:29 -07:00
|
|
|
cricket::VideoFormat format(
|
|
|
|
|
1280, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420);
|
2016-02-02 14:14:30 +01:00
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, &capturer));
|
2016-02-02 14:14:30 +01:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format));
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
2015-08-27 01:59:29 -07:00
|
|
|
ASSERT_EQ(1u, encoder_factory.encoders().size());
|
|
|
|
|
FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0];
|
2016-04-20 06:35:56 -07:00
|
|
|
ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode());
|
2015-08-27 01:59:29 -07:00
|
|
|
EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType);
|
|
|
|
|
EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, nullptr));
|
2015-08-27 01:59:29 -07:00
|
|
|
}
|
|
|
|
|
|
2016-01-27 01:36:03 -08:00
|
|
|
// Test that external codecs are added to the end of the supported codec list.
|
2014-10-14 04:25:33 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, ReportSupportedExternalCodecs) {
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
2016-01-27 01:36:03 -08:00
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecUnknown,
|
|
|
|
|
"FakeExternalCodec");
|
2014-10-14 04:25:33 +00:00
|
|
|
engine_.SetExternalEncoderFactory(&encoder_factory);
|
2015-05-22 09:04:09 +02:00
|
|
|
engine_.Init();
|
2014-10-14 04:25:33 +00:00
|
|
|
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs(engine_.codecs());
|
|
|
|
|
ASSERT_GE(codecs.size(), 2u);
|
|
|
|
|
cricket::VideoCodec internal_codec = codecs.front();
|
|
|
|
|
cricket::VideoCodec external_codec = codecs.back();
|
|
|
|
|
|
|
|
|
|
// The external codec will appear at last.
|
|
|
|
|
EXPECT_EQ("VP8", internal_codec.name);
|
2016-01-27 01:36:03 -08:00
|
|
|
EXPECT_EQ("FakeExternalCodec", external_codec.name);
|
2014-10-14 04:25:33 +00:00
|
|
|
}
|
|
|
|
|
|
2014-11-03 14:46:44 +00:00
|
|
|
TEST_F(WebRtcVideoEngine2Test, RegisterExternalDecodersIfSupported) {
|
|
|
|
|
cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
|
|
|
|
|
decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2014-11-03 14:46:44 +00:00
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2015-09-17 16:42:56 +02:00
|
|
|
SetUpForExternalDecoderFactory(&decoder_factory, parameters.codecs));
|
2014-11-03 14:46:44 +00:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
ASSERT_EQ(1u, decoder_factory.decoders().size());
|
|
|
|
|
|
|
|
|
|
// Setting codecs of the same type should not reallocate the decoder.
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel->SetRecvParameters(parameters));
|
2014-11-03 14:46:44 +00:00
|
|
|
EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders());
|
|
|
|
|
|
|
|
|
|
// Remove stream previously added to free the external decoder instance.
|
|
|
|
|
EXPECT_TRUE(channel->RemoveRecvStream(kSsrc));
|
|
|
|
|
EXPECT_EQ(0u, decoder_factory.decoders().size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Verifies that we can set up decoders that are not internally supported.
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test, RegisterExternalH264DecoderIfSupported) {
|
|
|
|
|
// TODO(pbos): Do not assume that encoder/decoder support is symmetric. We
|
|
|
|
|
// can't even query the WebRtcVideoDecoderFactory for supported codecs.
|
|
|
|
|
// For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported
|
|
|
|
|
// codecs.
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory;
|
|
|
|
|
encoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264, "H264");
|
|
|
|
|
engine_.SetExternalEncoderFactory(&encoder_factory);
|
|
|
|
|
cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
|
|
|
|
|
decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264);
|
|
|
|
|
std::vector<cricket::VideoCodec> codecs;
|
|
|
|
|
codecs.push_back(kH264Codec);
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
2014-11-03 14:46:44 +00:00
|
|
|
SetUpForExternalDecoderFactory(&decoder_factory, codecs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
ASSERT_EQ(1u, decoder_factory.decoders().size());
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
class WebRtcVideoChannel2BaseTest
|
|
|
|
|
: public VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> {
|
|
|
|
|
protected:
|
|
|
|
|
typedef VideoMediaChannelTest<WebRtcVideoEngine2, WebRtcVideoChannel2> Base;
|
2014-10-03 11:25:45 +00:00
|
|
|
|
2015-03-04 12:58:35 +00:00
|
|
|
cricket::VideoCodec DefaultCodec() override { return kVp8Codec; }
|
2014-05-13 11:07:01 +00:00
|
|
|
};
|
|
|
|
|
|
2016-06-22 00:46:15 -07:00
|
|
|
// Verifies that id given in stream params is passed to the decoder factory.
|
|
|
|
|
TEST_F(WebRtcVideoEngine2Test, StreamParamsIdPassedToDecoderFactory) {
|
|
|
|
|
cricket::FakeWebRtcVideoDecoderFactory decoder_factory;
|
|
|
|
|
decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
|
|
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
|
|
|
|
|
std::unique_ptr<VideoMediaChannel> channel(
|
|
|
|
|
SetUpForExternalDecoderFactory(&decoder_factory, parameters.codecs));
|
|
|
|
|
|
|
|
|
|
StreamParams sp = cricket::StreamParams::CreateLegacy(kSsrc);
|
|
|
|
|
sp.id = "FakeStreamParamsId";
|
|
|
|
|
EXPECT_TRUE(channel->AddRecvStream(sp));
|
|
|
|
|
EXPECT_EQ(1u, decoder_factory.decoders().size());
|
|
|
|
|
|
|
|
|
|
std::vector<cricket::VideoDecoderParams> params = decoder_factory.params();
|
|
|
|
|
ASSERT_EQ(1u, params.size());
|
|
|
|
|
EXPECT_EQ(sp.id, params[0].receive_stream_id);
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
#define WEBRTC_BASE_TEST(test) \
|
|
|
|
|
TEST_F(WebRtcVideoChannel2BaseTest, test) { Base::test(); }
|
|
|
|
|
|
|
|
|
|
#define WEBRTC_DISABLED_BASE_TEST(test) \
|
2014-10-03 11:25:45 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2BaseTest, DISABLED_##test) { Base::test(); }
|
2014-07-20 14:40:23 +00:00
|
|
|
|
|
|
|
|
WEBRTC_BASE_TEST(SetSend);
|
|
|
|
|
WEBRTC_BASE_TEST(SetSendWithoutCodecs);
|
|
|
|
|
WEBRTC_BASE_TEST(SetSendSetsTransportBufferSizes);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(GetStats);
|
|
|
|
|
WEBRTC_BASE_TEST(GetStatsMultipleRecvStreams);
|
|
|
|
|
WEBRTC_BASE_TEST(GetStatsMultipleSendStreams);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(SetSendBandwidth);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(SetSendSsrc);
|
|
|
|
|
WEBRTC_BASE_TEST(SetSendSsrcAfterSetCodecs);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2016-02-04 01:24:52 -08:00
|
|
|
WEBRTC_BASE_TEST(SetSink);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(AddRemoveSendStreams);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(SimulateConference);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2016-06-15 15:39:46 -07:00
|
|
|
WEBRTC_DISABLED_BASE_TEST(AddRemoveCapturer);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(RemoveCapturerWithoutAdd);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(AddRemoveCapturerMultipleSources);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
|
|
|
|
// TODO(pbos): Figure out why this fails so often.
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_DISABLED_BASE_TEST(HighAspectHighHeightCapturer);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(RejectEmptyStreamParams);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(AdaptResolution16x10);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_BASE_TEST(AdaptResolution4x3);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
|
|
|
|
// TODO(juberti): Restore this test once we support sending 0 fps.
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_DISABLED_BASE_TEST(AdaptDropAllFrames);
|
2014-05-13 11:07:01 +00:00
|
|
|
// TODO(juberti): Understand why we get decode errors on this test.
|
2014-07-20 14:40:23 +00:00
|
|
|
WEBRTC_DISABLED_BASE_TEST(AdaptFramerate);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-09-03 15:25:49 +00:00
|
|
|
WEBRTC_BASE_TEST(SendsLowerResolutionOnSmallerFrames);
|
|
|
|
|
|
|
|
|
|
WEBRTC_BASE_TEST(MultipleSendStreams);
|
|
|
|
|
|
2014-07-23 15:44:48 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Vga) {
|
2016-04-13 10:07:16 -07:00
|
|
|
SendAndReceive(cricket::VideoCodec(100, "VP8", 640, 400, 30));
|
2014-07-23 15:44:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8Qvga) {
|
2016-04-13 10:07:16 -07:00
|
|
|
SendAndReceive(cricket::VideoCodec(100, "VP8", 320, 200, 30));
|
2014-07-23 15:44:48 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2BaseTest, SendAndReceiveVp8SvcQqvga) {
|
2016-04-13 10:07:16 -07:00
|
|
|
SendAndReceive(cricket::VideoCodec(100, "VP8", 160, 100, 30));
|
2014-07-23 15:44:48 +00:00
|
|
|
}
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2BaseTest, TwoStreamsSendAndReceive) {
|
2016-04-20 16:31:53 +02:00
|
|
|
// Set a high bitrate to not be downscaled by VP8 due to low initial start
|
|
|
|
|
// bitrates. This currently happens at <250k, and two streams sharing 300k
|
|
|
|
|
// initially will use QVGA instead of VGA.
|
|
|
|
|
// TODO(pbos): Set up the quality scaler so that both senders reliably start
|
|
|
|
|
// at QVGA, then verify that instead.
|
|
|
|
|
cricket::VideoCodec codec = kVp8Codec;
|
|
|
|
|
codec.params[kCodecParamStartBitrate] = "1000000";
|
|
|
|
|
Base::TwoStreamsSendAndReceive(codec);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
class WebRtcVideoChannel2Test : public WebRtcVideoEngine2Test {
|
2014-05-13 11:07:01 +00:00
|
|
|
public:
|
2015-10-15 07:26:07 -07:00
|
|
|
WebRtcVideoChannel2Test() : WebRtcVideoChannel2Test("") {}
|
|
|
|
|
explicit WebRtcVideoChannel2Test(const char* field_trials)
|
|
|
|
|
: WebRtcVideoEngine2Test(field_trials), last_ssrc_(0) {}
|
2015-03-04 12:58:35 +00:00
|
|
|
void SetUp() override {
|
2015-09-15 12:26:33 +02:00
|
|
|
fake_call_.reset(new FakeCall(webrtc::Call::Config()));
|
2015-05-22 09:04:09 +02:00
|
|
|
engine_.Init();
|
2015-09-15 12:26:33 +02:00
|
|
|
channel_.reset(
|
2016-02-12 02:27:06 -08:00
|
|
|
engine_.CreateChannel(fake_call_.get(), MediaConfig(), VideoOptions()));
|
2014-05-13 11:07:01 +00:00
|
|
|
last_ssrc_ = 123;
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.codecs = engine_.codecs();
|
|
|
|
|
recv_parameters_.codecs = engine_.codecs();
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
FakeVideoSendStream* AddSendStream() {
|
2014-10-03 11:25:45 +00:00
|
|
|
return AddSendStream(StreamParams::CreateLegacy(++last_ssrc_));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
|
2014-10-03 11:25:45 +00:00
|
|
|
size_t num_streams = fake_call_->GetVideoSendStreams().size();
|
2014-05-13 11:07:01 +00:00
|
|
|
EXPECT_TRUE(channel_->AddSendStream(sp));
|
|
|
|
|
std::vector<FakeVideoSendStream*> streams =
|
2014-10-03 11:25:45 +00:00
|
|
|
fake_call_->GetVideoSendStreams();
|
2014-05-13 11:07:01 +00:00
|
|
|
EXPECT_EQ(num_streams + 1, streams.size());
|
|
|
|
|
return streams[streams.size() - 1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
|
2014-10-03 11:25:45 +00:00
|
|
|
return fake_call_->GetVideoSendStreams();
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FakeVideoReceiveStream* AddRecvStream() {
|
2014-10-03 11:25:45 +00:00
|
|
|
return AddRecvStream(StreamParams::CreateLegacy(++last_ssrc_));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
|
2014-10-03 11:25:45 +00:00
|
|
|
size_t num_streams = fake_call_->GetVideoReceiveStreams().size();
|
2014-05-13 11:07:01 +00:00
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
std::vector<FakeVideoReceiveStream*> streams =
|
2014-10-03 11:25:45 +00:00
|
|
|
fake_call_->GetVideoReceiveStreams();
|
2014-05-13 11:07:01 +00:00
|
|
|
EXPECT_EQ(num_streams + 1, streams.size());
|
|
|
|
|
return streams[streams.size() - 1];
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-25 14:03:34 +00:00
|
|
|
void SetSendCodecsShouldWorkForBitrates(const char* min_bitrate_kbps,
|
|
|
|
|
int expected_min_bitrate_bps,
|
|
|
|
|
const char* start_bitrate_kbps,
|
|
|
|
|
int expected_start_bitrate_bps,
|
|
|
|
|
const char* max_bitrate_kbps,
|
|
|
|
|
int expected_max_bitrate_bps) {
|
2015-09-17 16:42:56 +02:00
|
|
|
auto& codecs = send_parameters_.codecs;
|
|
|
|
|
codecs.clear();
|
2014-05-13 11:07:01 +00:00
|
|
|
codecs.push_back(kVp8Codec);
|
2014-11-25 14:03:34 +00:00
|
|
|
codecs[0].params[kCodecParamMinBitrate] = min_bitrate_kbps;
|
|
|
|
|
codecs[0].params[kCodecParamStartBitrate] = start_bitrate_kbps;
|
|
|
|
|
codecs[0].params[kCodecParamMaxBitrate] = max_bitrate_kbps;
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2014-11-25 14:03:34 +00:00
|
|
|
EXPECT_EQ(expected_min_bitrate_bps,
|
2015-03-26 11:11:06 +01:00
|
|
|
fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
|
2014-11-25 14:03:34 +00:00
|
|
|
EXPECT_EQ(expected_start_bitrate_bps,
|
2015-03-26 11:11:06 +01:00
|
|
|
fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
|
2014-11-25 14:03:34 +00:00
|
|
|
EXPECT_EQ(expected_max_bitrate_bps,
|
2015-03-26 11:11:06 +01:00
|
|
|
fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2016-05-26 11:24:55 -07:00
|
|
|
void TestSetSendRtpHeaderExtensions(const std::string& ext_uri) {
|
2014-06-16 17:32:02 +00:00
|
|
|
// Enable extension.
|
|
|
|
|
const int id = 1;
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters = send_parameters_;
|
2016-05-26 11:24:55 -07:00
|
|
|
parameters.extensions.push_back(RtpExtension(ext_uri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-16 17:32:02 +00:00
|
|
|
FakeVideoSendStream* send_stream =
|
|
|
|
|
AddSendStream(cricket::StreamParams::CreateLegacy(123));
|
|
|
|
|
|
|
|
|
|
// Verify the send extension id.
|
|
|
|
|
ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
|
|
|
|
|
EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
|
2016-05-26 11:24:55 -07:00
|
|
|
EXPECT_EQ(ext_uri, send_stream->GetConfig().rtp.extensions[0].uri);
|
2014-06-16 17:32:02 +00:00
|
|
|
// Verify call with same set of extensions returns true.
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-16 17:32:02 +00:00
|
|
|
// Verify that SetSendRtpHeaderExtensions doesn't implicitly add them for
|
|
|
|
|
// receivers.
|
|
|
|
|
EXPECT_TRUE(AddRecvStream(cricket::StreamParams::CreateLegacy(123))
|
|
|
|
|
->GetConfig()
|
|
|
|
|
.rtp.extensions.empty());
|
|
|
|
|
|
2014-07-18 09:35:58 +00:00
|
|
|
// Verify that existing RTP header extensions can be removed.
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-09-15 12:26:33 +02:00
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
|
|
|
|
|
send_stream = fake_call_->GetVideoSendStreams()[0];
|
2014-07-18 09:35:58 +00:00
|
|
|
EXPECT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
|
|
|
|
|
|
|
|
|
|
// Verify that adding receive RTP header extensions adds them for existing
|
|
|
|
|
// streams.
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-09-15 12:26:33 +02:00
|
|
|
send_stream = fake_call_->GetVideoSendStreams()[0];
|
2014-07-18 09:35:58 +00:00
|
|
|
ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
|
|
|
|
|
EXPECT_EQ(id, send_stream->GetConfig().rtp.extensions[0].id);
|
2016-05-26 11:24:55 -07:00
|
|
|
EXPECT_EQ(ext_uri, send_stream->GetConfig().rtp.extensions[0].uri);
|
2014-06-16 17:32:02 +00:00
|
|
|
}
|
|
|
|
|
|
2016-05-26 11:24:55 -07:00
|
|
|
void TestSetRecvRtpHeaderExtensions(const std::string& ext_uri) {
|
2014-06-16 17:32:02 +00:00
|
|
|
// Enable extension.
|
|
|
|
|
const int id = 1;
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters = recv_parameters_;
|
2016-05-26 11:24:55 -07:00
|
|
|
parameters.extensions.push_back(RtpExtension(ext_uri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-06-16 17:32:02 +00:00
|
|
|
|
|
|
|
|
FakeVideoReceiveStream* recv_stream =
|
|
|
|
|
AddRecvStream(cricket::StreamParams::CreateLegacy(123));
|
|
|
|
|
|
|
|
|
|
// Verify the recv extension id.
|
|
|
|
|
ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
|
|
|
|
|
EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
|
2016-05-26 11:24:55 -07:00
|
|
|
EXPECT_EQ(ext_uri, recv_stream->GetConfig().rtp.extensions[0].uri);
|
2014-06-16 17:32:02 +00:00
|
|
|
// Verify call with same set of extensions returns true.
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-07-18 09:35:58 +00:00
|
|
|
|
2014-06-16 17:32:02 +00:00
|
|
|
// Verify that SetRecvRtpHeaderExtensions doesn't implicitly add them for
|
|
|
|
|
// senders.
|
|
|
|
|
EXPECT_TRUE(AddSendStream(cricket::StreamParams::CreateLegacy(123))
|
|
|
|
|
->GetConfig()
|
|
|
|
|
.rtp.extensions.empty());
|
|
|
|
|
|
2014-07-18 09:35:58 +00:00
|
|
|
// Verify that existing RTP header extensions can be removed.
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2015-09-15 12:26:33 +02:00
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
|
|
|
|
|
recv_stream = fake_call_->GetVideoReceiveStreams()[0];
|
2014-07-18 09:35:58 +00:00
|
|
|
EXPECT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
|
|
|
|
|
|
|
|
|
|
// Verify that adding receive RTP header extensions adds them for existing
|
|
|
|
|
// streams.
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2015-09-15 12:26:33 +02:00
|
|
|
recv_stream = fake_call_->GetVideoReceiveStreams()[0];
|
2014-07-18 09:35:58 +00:00
|
|
|
ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
|
|
|
|
|
EXPECT_EQ(id, recv_stream->GetConfig().rtp.extensions[0].id);
|
2016-05-26 11:24:55 -07:00
|
|
|
EXPECT_EQ(ext_uri, recv_stream->GetConfig().rtp.extensions[0].uri);
|
2014-06-16 17:32:02 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-29 18:53:23 +01:00
|
|
|
void TestExtensionFilter(const std::vector<std::string>& extensions,
|
|
|
|
|
const std::string& expected_extension) {
|
|
|
|
|
cricket::VideoSendParameters parameters = send_parameters_;
|
|
|
|
|
int expected_id = -1;
|
|
|
|
|
int id = 1;
|
|
|
|
|
for (const std::string& extension : extensions) {
|
|
|
|
|
if (extension == expected_extension)
|
|
|
|
|
expected_id = id;
|
2016-05-26 11:24:55 -07:00
|
|
|
parameters.extensions.push_back(RtpExtension(extension, id++));
|
2015-10-29 18:53:23 +01:00
|
|
|
}
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
FakeVideoSendStream* send_stream =
|
|
|
|
|
AddSendStream(cricket::StreamParams::CreateLegacy(123));
|
|
|
|
|
|
|
|
|
|
// Verify that only one of them has been set, and that it is the one with
|
|
|
|
|
// highest priority (transport sequence number).
|
|
|
|
|
ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
|
|
|
|
|
EXPECT_EQ(expected_id, send_stream->GetConfig().rtp.extensions[0].id);
|
|
|
|
|
EXPECT_EQ(expected_extension,
|
2016-05-26 11:24:55 -07:00
|
|
|
send_stream->GetConfig().rtp.extensions[0].uri);
|
2015-10-29 18:53:23 +01:00
|
|
|
}
|
|
|
|
|
|
2015-04-29 16:21:28 +02:00
|
|
|
void TestCpuAdaptation(bool enable_overuse, bool is_screenshare);
|
2015-05-22 18:48:36 +02:00
|
|
|
void TestReceiverLocalSsrcConfiguration(bool receiver_first);
|
2015-07-10 11:27:55 -07:00
|
|
|
void TestReceiveUnsignalledSsrcPacket(uint8_t payload_type,
|
|
|
|
|
bool expect_created_receive_stream);
|
2014-10-03 11:25:45 +00:00
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
FakeVideoSendStream* SetDenoisingOption(
|
2016-03-16 02:22:50 -07:00
|
|
|
uint32_t ssrc,
|
2016-03-01 04:29:59 -08:00
|
|
|
cricket::FakeVideoCapturer* capturer,
|
|
|
|
|
bool enabled) {
|
2016-03-16 02:22:50 -07:00
|
|
|
cricket::VideoOptions options;
|
|
|
|
|
options.video_noise_reduction = rtc::Optional<bool>(enabled);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(ssrc, true, &options, capturer));
|
2016-03-01 04:29:59 -08:00
|
|
|
// Options only take effect on the next frame.
|
|
|
|
|
EXPECT_TRUE(capturer->CaptureFrame());
|
|
|
|
|
|
2015-04-28 10:01:41 +02:00
|
|
|
return fake_call_->GetVideoSendStreams().back();
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-09 14:32:14 +02:00
|
|
|
FakeVideoSendStream* SetUpSimulcast(bool enabled, bool with_rtx) {
|
|
|
|
|
const int kRtxSsrcOffset = 0xDEADBEEF;
|
2015-04-28 10:01:41 +02:00
|
|
|
last_ssrc_ += 3;
|
2015-09-09 14:32:14 +02:00
|
|
|
std::vector<uint32_t> ssrcs;
|
|
|
|
|
std::vector<uint32_t> rtx_ssrcs;
|
|
|
|
|
uint32_t num_streams = enabled ? 3 : 1;
|
|
|
|
|
for (uint32_t i = 0; i < num_streams; ++i) {
|
|
|
|
|
uint32_t ssrc = last_ssrc_ + i;
|
|
|
|
|
ssrcs.push_back(ssrc);
|
|
|
|
|
if (with_rtx) {
|
|
|
|
|
rtx_ssrcs.push_back(ssrc + kRtxSsrcOffset);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (with_rtx) {
|
|
|
|
|
return AddSendStream(
|
|
|
|
|
cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
|
2015-04-28 10:01:41 +02:00
|
|
|
}
|
2015-09-09 14:32:14 +02:00
|
|
|
return AddSendStream(CreateSimStreamParams("cname", ssrcs));
|
2015-04-28 10:01:41 +02:00
|
|
|
}
|
|
|
|
|
|
2016-03-16 19:07:43 -07:00
|
|
|
int GetMaxEncoderBitrate(cricket::FakeVideoCapturer& capturer) {
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
|
|
|
|
std::vector<FakeVideoSendStream*> streams =
|
|
|
|
|
fake_call_->GetVideoSendStreams();
|
|
|
|
|
EXPECT_TRUE(streams.size() > 0);
|
|
|
|
|
FakeVideoSendStream* stream = streams[streams.size() - 1];
|
|
|
|
|
|
|
|
|
|
webrtc::VideoEncoderConfig encoder_config = stream->GetEncoderConfig();
|
|
|
|
|
EXPECT_EQ(1, encoder_config.streams.size());
|
|
|
|
|
return encoder_config.streams[0].max_bitrate_bps;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SetAndExpectMaxBitrate(cricket::FakeVideoCapturer& capturer,
|
|
|
|
|
int global_max,
|
|
|
|
|
int stream_max,
|
|
|
|
|
int expected_encoder_bitrate) {
|
|
|
|
|
VideoSendParameters limited_send_params = send_parameters_;
|
|
|
|
|
limited_send_params.max_bandwidth_bps = global_max;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(limited_send_params));
|
2016-05-16 11:40:30 -07:00
|
|
|
webrtc::RtpParameters parameters =
|
|
|
|
|
channel_->GetRtpSendParameters(last_ssrc_);
|
2016-03-16 19:07:43 -07:00
|
|
|
EXPECT_EQ(1UL, parameters.encodings.size());
|
|
|
|
|
parameters.encodings[0].max_bitrate_bps = stream_max;
|
2016-05-16 11:40:30 -07:00
|
|
|
EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
|
2016-03-16 19:07:43 -07:00
|
|
|
// Read back the parameteres and verify they have the correct value
|
2016-05-16 11:40:30 -07:00
|
|
|
parameters = channel_->GetRtpSendParameters(last_ssrc_);
|
2016-03-16 19:07:43 -07:00
|
|
|
EXPECT_EQ(1UL, parameters.encodings.size());
|
|
|
|
|
EXPECT_EQ(stream_max, parameters.encodings[0].max_bitrate_bps);
|
|
|
|
|
// Verify that the new value propagated down to the encoder
|
|
|
|
|
EXPECT_EQ(expected_encoder_bitrate, GetMaxEncoderBitrate(capturer));
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<FakeCall> fake_call_;
|
|
|
|
|
std::unique_ptr<VideoMediaChannel> channel_;
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters send_parameters_;
|
|
|
|
|
cricket::VideoRecvParameters recv_parameters_;
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
uint32_t last_ssrc_;
|
2014-05-13 11:07:01 +00:00
|
|
|
};
|
|
|
|
|
|
2015-07-15 08:02:58 -07:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetsSyncGroupFromSyncLabel) {
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
const uint32_t kVideoSsrc = 123;
|
2015-07-15 08:02:58 -07:00
|
|
|
const std::string kSyncLabel = "AvSyncLabel";
|
|
|
|
|
|
|
|
|
|
cricket::StreamParams sp = cricket::StreamParams::CreateLegacy(kVideoSsrc);
|
|
|
|
|
sp.sync_label = kSyncLabel;
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1, fake_call_->GetVideoReceiveStreams().size());
|
|
|
|
|
EXPECT_EQ(kSyncLabel,
|
|
|
|
|
fake_call_->GetVideoReceiveStreams()[0]->GetConfig().sync_group)
|
|
|
|
|
<< "SyncGroup should be set based on sync_label";
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-13 11:47:28 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RecvStreamWithSimAndRtx) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs = engine_.codecs();
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
2016-02-17 05:25:36 -08:00
|
|
|
parameters.conference_mode = true;
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
|
|
|
|
|
// Send side.
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
|
|
|
|
|
const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
|
2014-05-13 11:07:01 +00:00
|
|
|
FakeVideoSendStream* send_stream = AddSendStream(
|
|
|
|
|
cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(rtx_ssrcs.size(), send_stream->GetConfig().rtp.rtx.ssrcs.size());
|
|
|
|
|
for (size_t i = 0; i < rtx_ssrcs.size(); ++i)
|
|
|
|
|
EXPECT_EQ(rtx_ssrcs[i], send_stream->GetConfig().rtp.rtx.ssrcs[i]);
|
|
|
|
|
|
|
|
|
|
// Receiver side.
|
|
|
|
|
FakeVideoReceiveStream* recv_stream = AddRecvStream(
|
|
|
|
|
cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
|
2016-05-12 16:44:36 +02:00
|
|
|
EXPECT_FALSE(recv_stream->GetConfig().rtp.rtx.empty());
|
|
|
|
|
EXPECT_EQ(recv_stream->GetConfig().decoders.size(),
|
|
|
|
|
recv_stream->GetConfig().rtp.rtx.size())
|
|
|
|
|
<< "RTX should be mapped for all decoders/payload types.";
|
|
|
|
|
for (const auto& kv : recv_stream->GetConfig().rtp.rtx) {
|
|
|
|
|
EXPECT_EQ(rtx_ssrcs[0], kv.second.ssrc);
|
|
|
|
|
}
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-06-13 11:47:28 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RecvStreamWithRtx) {
|
|
|
|
|
// Setup one channel with an associated RTX stream.
|
|
|
|
|
cricket::StreamParams params =
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
|
|
|
|
|
params.AddFidSsrc(kSsrcs1[0], kRtxSsrcs1[0]);
|
|
|
|
|
FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
|
|
|
|
|
EXPECT_EQ(kRtxSsrcs1[0],
|
|
|
|
|
recv_stream->GetConfig().rtp.rtx.begin()->second.ssrc);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-06-13 11:47:28 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RecvStreamNoRtx) {
|
|
|
|
|
// Setup one channel without an associated RTX stream.
|
|
|
|
|
cricket::StreamParams params =
|
|
|
|
|
cricket::StreamParams::CreateLegacy(kSsrcs1[0]);
|
|
|
|
|
FakeVideoReceiveStream* recv_stream = AddRecvStream(params);
|
|
|
|
|
ASSERT_TRUE(recv_stream->GetConfig().rtp.rtx.empty());
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-06-16 17:32:02 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, NoHeaderExtesionsByDefault) {
|
|
|
|
|
FakeVideoSendStream* send_stream =
|
|
|
|
|
AddSendStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
|
|
|
|
|
ASSERT_TRUE(send_stream->GetConfig().rtp.extensions.empty());
|
|
|
|
|
|
|
|
|
|
FakeVideoReceiveStream* recv_stream =
|
|
|
|
|
AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrcs1[0]));
|
|
|
|
|
ASSERT_TRUE(recv_stream->GetConfig().rtp.extensions.empty());
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-06-16 17:32:02 +00:00
|
|
|
// Test support for RTP timestamp offset header extension.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SendRtpTimestampOffsetHeaderExtensions) {
|
2016-05-26 11:24:55 -07:00
|
|
|
TestSetSendRtpHeaderExtensions(RtpExtension::kTimestampOffsetUri);
|
2014-06-16 17:32:02 +00:00
|
|
|
}
|
2016-05-26 11:24:55 -07:00
|
|
|
|
2014-06-16 17:32:02 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RecvRtpTimestampOffsetHeaderExtensions) {
|
2016-05-26 11:24:55 -07:00
|
|
|
TestSetRecvRtpHeaderExtensions(RtpExtension::kTimestampOffsetUri);
|
2014-06-16 17:32:02 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test support for absolute send time header extension.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SendAbsoluteSendTimeHeaderExtensions) {
|
2016-05-26 11:24:55 -07:00
|
|
|
TestSetSendRtpHeaderExtensions(RtpExtension::kAbsSendTimeUri);
|
2014-06-16 17:32:02 +00:00
|
|
|
}
|
2016-05-26 11:24:55 -07:00
|
|
|
|
2014-06-16 17:32:02 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RecvAbsoluteSendTimeHeaderExtensions) {
|
2016-05-26 11:24:55 -07:00
|
|
|
TestSetRecvRtpHeaderExtensions(RtpExtension::kAbsSendTimeUri);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-29 18:53:23 +01:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, FiltersExtensionsPicksTransportSeqNum) {
|
|
|
|
|
// Enable three redundant extensions.
|
|
|
|
|
std::vector<std::string> extensions;
|
2016-05-26 11:24:55 -07:00
|
|
|
extensions.push_back(RtpExtension::kAbsSendTimeUri);
|
|
|
|
|
extensions.push_back(RtpExtension::kTimestampOffsetUri);
|
|
|
|
|
extensions.push_back(RtpExtension::kTransportSequenceNumberUri);
|
|
|
|
|
TestExtensionFilter(extensions, RtpExtension::kTransportSequenceNumberUri);
|
2015-10-29 18:53:23 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, FiltersExtensionsPicksAbsSendTime) {
|
|
|
|
|
// Enable two redundant extensions.
|
|
|
|
|
std::vector<std::string> extensions;
|
2016-05-26 11:24:55 -07:00
|
|
|
extensions.push_back(RtpExtension::kAbsSendTimeUri);
|
|
|
|
|
extensions.push_back(RtpExtension::kTimestampOffsetUri);
|
|
|
|
|
TestExtensionFilter(extensions, RtpExtension::kAbsSendTimeUri);
|
2015-10-29 18:53:23 +01:00
|
|
|
}
|
|
|
|
|
|
2015-10-15 07:26:07 -07:00
|
|
|
class WebRtcVideoChannel2WithSendSideBweTest : public WebRtcVideoChannel2Test {
|
|
|
|
|
public:
|
|
|
|
|
WebRtcVideoChannel2WithSendSideBweTest()
|
|
|
|
|
: WebRtcVideoChannel2Test("WebRTC-SendSideBwe/Enabled/") {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Test support for transport sequence number header extension.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2WithSendSideBweTest,
|
|
|
|
|
SendTransportSequenceNumberHeaderExtensions) {
|
2016-05-26 11:24:55 -07:00
|
|
|
TestSetSendRtpHeaderExtensions(RtpExtension::kTransportSequenceNumberUri);
|
2015-10-15 07:26:07 -07:00
|
|
|
}
|
|
|
|
|
TEST_F(WebRtcVideoChannel2WithSendSideBweTest,
|
|
|
|
|
RecvTransportSequenceNumberHeaderExtensions) {
|
2016-05-26 11:24:55 -07:00
|
|
|
TestSetRecvRtpHeaderExtensions(RtpExtension::kTransportSequenceNumberUri);
|
2015-10-15 07:26:07 -07:00
|
|
|
}
|
|
|
|
|
|
2015-04-01 15:33:06 -07:00
|
|
|
// Test support for video rotation header extension.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SendVideoRotationHeaderExtensions) {
|
2016-05-26 11:24:55 -07:00
|
|
|
TestSetSendRtpHeaderExtensions(RtpExtension::kVideoRotationUri);
|
2015-04-01 15:33:06 -07:00
|
|
|
}
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, RecvVideoRotationHeaderExtensions) {
|
2016-05-26 11:24:55 -07:00
|
|
|
TestSetRecvRtpHeaderExtensions(RtpExtension::kVideoRotationUri);
|
2015-04-01 15:33:06 -07:00
|
|
|
}
|
|
|
|
|
|
2015-01-05 18:51:13 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, IdenticalSendExtensionsDoesntRecreateStream) {
|
2015-10-29 18:53:23 +01:00
|
|
|
const int kAbsSendTimeId = 1;
|
|
|
|
|
const int kVideoRotationId = 2;
|
2016-05-26 11:24:55 -07:00
|
|
|
send_parameters_.extensions.push_back(
|
|
|
|
|
RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
|
|
|
|
|
send_parameters_.extensions.push_back(
|
|
|
|
|
RtpExtension(RtpExtension::kVideoRotationUri, kVideoRotationId));
|
2015-01-05 18:51:13 +00:00
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-01-05 18:51:13 +00:00
|
|
|
FakeVideoSendStream* send_stream =
|
|
|
|
|
AddSendStream(cricket::StreamParams::CreateLegacy(123));
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
|
2015-10-29 18:53:23 +01:00
|
|
|
ASSERT_EQ(2u, send_stream->GetConfig().rtp.extensions.size());
|
2015-01-05 18:51:13 +00:00
|
|
|
|
|
|
|
|
// Setting the same extensions (even if in different order) shouldn't
|
|
|
|
|
// reallocate the stream.
|
2015-09-17 16:42:56 +02:00
|
|
|
std::reverse(send_parameters_.extensions.begin(),
|
|
|
|
|
send_parameters_.extensions.end());
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-01-05 18:51:13 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
|
|
|
|
|
|
|
|
|
|
// Setting different extensions should recreate the stream.
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.extensions.resize(1);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-01-05 18:51:13 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(2, fake_call_->GetNumCreatedSendStreams());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, IdenticalRecvExtensionsDoesntRecreateStream) {
|
|
|
|
|
const int kTOffsetId = 1;
|
|
|
|
|
const int kAbsSendTimeId = 2;
|
2015-04-01 15:33:06 -07:00
|
|
|
const int kVideoRotationId = 3;
|
2016-05-26 11:24:55 -07:00
|
|
|
recv_parameters_.extensions.push_back(
|
|
|
|
|
RtpExtension(RtpExtension::kAbsSendTimeUri, kAbsSendTimeId));
|
|
|
|
|
recv_parameters_.extensions.push_back(
|
|
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
|
|
|
|
|
recv_parameters_.extensions.push_back(
|
|
|
|
|
RtpExtension(RtpExtension::kVideoRotationUri, kVideoRotationId));
|
2015-01-05 18:51:13 +00:00
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2015-05-25 15:04:24 +02:00
|
|
|
FakeVideoReceiveStream* recv_stream =
|
2015-01-05 18:51:13 +00:00
|
|
|
AddRecvStream(cricket::StreamParams::CreateLegacy(123));
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
|
2015-05-25 15:04:24 +02:00
|
|
|
ASSERT_EQ(3u, recv_stream->GetConfig().rtp.extensions.size());
|
2015-01-05 18:51:13 +00:00
|
|
|
|
|
|
|
|
// Setting the same extensions (even if in different order) shouldn't
|
|
|
|
|
// reallocate the stream.
|
2015-09-17 16:42:56 +02:00
|
|
|
std::reverse(recv_parameters_.extensions.begin(),
|
|
|
|
|
recv_parameters_.extensions.end());
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2015-01-05 18:51:13 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
|
|
|
|
|
|
|
|
|
|
// Setting different extensions should recreate the stream.
|
2015-09-17 16:42:56 +02:00
|
|
|
recv_parameters_.extensions.resize(1);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2015-01-05 18:51:13 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(2, fake_call_->GetNumCreatedReceiveStreams());
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-20 15:27:35 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
2014-10-03 11:25:45 +00:00
|
|
|
SetSendRtpHeaderExtensionsExcludeUnsupportedExtensions) {
|
2014-07-20 15:27:35 +00:00
|
|
|
const int kUnsupportedId = 1;
|
|
|
|
|
const int kTOffsetId = 2;
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(kUnsupportedExtensionName, kUnsupportedId));
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2014-07-20 15:27:35 +00:00
|
|
|
FakeVideoSendStream* send_stream =
|
|
|
|
|
AddSendStream(cricket::StreamParams::CreateLegacy(123));
|
|
|
|
|
|
|
|
|
|
// Only timestamp offset extension is set to send stream,
|
|
|
|
|
// unsupported rtp extension is ignored.
|
|
|
|
|
ASSERT_EQ(1u, send_stream->GetConfig().rtp.extensions.size());
|
2016-05-26 11:24:55 -07:00
|
|
|
EXPECT_STREQ(RtpExtension::kTimestampOffsetUri,
|
|
|
|
|
send_stream->GetConfig().rtp.extensions[0].uri.c_str());
|
2014-07-20 15:27:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
2014-10-03 11:25:45 +00:00
|
|
|
SetRecvRtpHeaderExtensionsExcludeUnsupportedExtensions) {
|
2014-07-20 15:27:35 +00:00
|
|
|
const int kUnsupportedId = 1;
|
|
|
|
|
const int kTOffsetId = 2;
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
recv_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(kUnsupportedExtensionName, kUnsupportedId));
|
2015-09-17 16:42:56 +02:00
|
|
|
recv_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, kTOffsetId));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2014-07-20 15:27:35 +00:00
|
|
|
FakeVideoReceiveStream* recv_stream =
|
|
|
|
|
AddRecvStream(cricket::StreamParams::CreateLegacy(123));
|
|
|
|
|
|
|
|
|
|
// Only timestamp offset extension is set to receive stream,
|
|
|
|
|
// unsupported rtp extension is ignored.
|
|
|
|
|
ASSERT_EQ(1u, recv_stream->GetConfig().rtp.extensions.size());
|
2016-05-26 11:24:55 -07:00
|
|
|
EXPECT_STREQ(RtpExtension::kTimestampOffsetUri,
|
|
|
|
|
recv_stream->GetConfig().rtp.extensions[0].uri.c_str());
|
2014-07-20 15:27:35 +00:00
|
|
|
}
|
|
|
|
|
|
2014-10-03 11:25:45 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsIncorrectIds) {
|
2015-03-31 15:08:04 +02:00
|
|
|
const int kIncorrectIds[] = {-2, -1, 0, 15, 16};
|
2015-01-28 21:36:55 +00:00
|
|
|
for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
|
2016-05-26 11:24:55 -07:00
|
|
|
send_parameters_.extensions.push_back(
|
|
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, kIncorrectIds[i]));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(send_parameters_))
|
2014-07-20 15:27:35 +00:00
|
|
|
<< "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-03 11:25:45 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsIncorrectIds) {
|
2015-03-31 15:08:04 +02:00
|
|
|
const int kIncorrectIds[] = {-2, -1, 0, 15, 16};
|
2015-01-28 21:36:55 +00:00
|
|
|
for (size_t i = 0; i < arraysize(kIncorrectIds); ++i) {
|
2016-05-26 11:24:55 -07:00
|
|
|
recv_parameters_.extensions.push_back(
|
|
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, kIncorrectIds[i]));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_))
|
2014-07-20 15:27:35 +00:00
|
|
|
<< "Bad extension id '" << kIncorrectIds[i] << "' accepted.";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-03 11:25:45 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendRtpHeaderExtensionsRejectsDuplicateIds) {
|
2014-07-20 15:27:35 +00:00
|
|
|
const int id = 1;
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kAbsSendTimeUri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
|
2014-07-20 15:27:35 +00:00
|
|
|
|
|
|
|
|
// Duplicate entries are also not supported.
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.extensions.clear();
|
|
|
|
|
send_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.extensions.push_back(send_parameters_.extensions.back());
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
|
2014-07-20 15:27:35 +00:00
|
|
|
}
|
|
|
|
|
|
2014-10-03 11:25:45 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvRtpHeaderExtensionsRejectsDuplicateIds) {
|
2014-07-20 15:27:35 +00:00
|
|
|
const int id = 1;
|
2015-09-17 16:42:56 +02:00
|
|
|
recv_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
recv_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kAbsSendTimeUri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_));
|
2014-07-20 15:27:35 +00:00
|
|
|
|
|
|
|
|
// Duplicate entries are also not supported.
|
2015-09-17 16:42:56 +02:00
|
|
|
recv_parameters_.extensions.clear();
|
|
|
|
|
recv_parameters_.extensions.push_back(
|
2016-05-26 11:24:55 -07:00
|
|
|
RtpExtension(RtpExtension::kTimestampOffsetUri, id));
|
2015-09-17 16:42:56 +02:00
|
|
|
recv_parameters_.extensions.push_back(recv_parameters_.extensions.back());
|
|
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(recv_parameters_));
|
2014-07-20 15:27:35 +00:00
|
|
|
}
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, AddRecvStreamOnlyUsesOneReceiveStream) {
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(cricket::StreamParams::CreateLegacy(1)));
|
2014-10-03 11:25:45 +00:00
|
|
|
EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size());
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-06-05 14:09:38 +02:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RtcpIsCompoundByDefault) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
2015-10-02 02:36:56 -07:00
|
|
|
EXPECT_EQ(webrtc::RtcpMode::kCompound, stream->GetConfig().rtp.rtcp_mode);
|
2015-06-05 14:09:38 +02:00
|
|
|
}
|
|
|
|
|
|
2014-07-25 19:01:32 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RembIsEnabledByDefault) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
EXPECT_TRUE(stream->GetConfig().rtp.remb);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-11-20 18:05:48 -08:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, TransportCcIsEnabledByDefault) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
EXPECT_TRUE(stream->GetConfig().rtp.transport_cc);
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-25 19:01:32 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RembCanBeEnabledAndDisabled) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
EXPECT_TRUE(stream->GetConfig().rtp.remb);
|
|
|
|
|
|
2015-05-11 12:48:12 +02:00
|
|
|
// Verify that REMB is turned off when send(!) codecs without REMB are set.
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
EXPECT_TRUE(parameters.codecs[0].feedback_params.params().empty());
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-03 11:25:45 +00:00
|
|
|
stream = fake_call_->GetVideoReceiveStreams()[0];
|
2014-07-25 19:01:32 +00:00
|
|
|
EXPECT_FALSE(stream->GetConfig().rtp.remb);
|
|
|
|
|
|
|
|
|
|
// Verify that REMB is turned on when setting default codecs since the
|
|
|
|
|
// default codecs have REMB enabled.
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs = engine_.codecs();
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-03 11:25:45 +00:00
|
|
|
stream = fake_call_->GetVideoReceiveStreams()[0];
|
2014-07-25 19:01:32 +00:00
|
|
|
EXPECT_TRUE(stream->GetConfig().rtp.remb);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-11-20 18:05:48 -08:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, TransportCcCanBeEnabledAndDisabled) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
EXPECT_TRUE(stream->GetConfig().rtp.transport_cc);
|
|
|
|
|
|
|
|
|
|
// Verify that transport cc feedback is turned off when send(!) codecs without
|
|
|
|
|
// transport cc feedback are set.
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
EXPECT_TRUE(parameters.codecs[0].feedback_params.params().empty());
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
stream = fake_call_->GetVideoReceiveStreams()[0];
|
|
|
|
|
EXPECT_FALSE(stream->GetConfig().rtp.transport_cc);
|
|
|
|
|
|
|
|
|
|
// Verify that transport cc feedback is turned on when setting default codecs
|
|
|
|
|
// since the default codecs have transport cc feedback enabled.
|
|
|
|
|
parameters.codecs = engine_.codecs();
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
stream = fake_call_->GetVideoReceiveStreams()[0];
|
|
|
|
|
EXPECT_TRUE(stream->GetConfig().rtp.transport_cc);
|
|
|
|
|
}
|
|
|
|
|
|
2014-06-13 12:27:38 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, NackIsEnabledByDefault) {
|
|
|
|
|
VerifyCodecHasDefaultFeedbackParams(default_codec_);
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs = engine_.codecs();
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-05-30 07:35:47 +00:00
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
// Send side.
|
|
|
|
|
FakeVideoSendStream* send_stream =
|
|
|
|
|
AddSendStream(cricket::StreamParams::CreateLegacy(1));
|
|
|
|
|
EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
|
|
|
|
|
|
|
|
|
|
// Receiver side.
|
|
|
|
|
FakeVideoReceiveStream* recv_stream =
|
|
|
|
|
AddRecvStream(cricket::StreamParams::CreateLegacy(1));
|
|
|
|
|
EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
|
|
|
|
|
|
|
|
|
|
// Nack history size should match between sender and receiver.
|
|
|
|
|
EXPECT_EQ(send_stream->GetConfig().rtp.nack.rtp_history_ms,
|
|
|
|
|
recv_stream->GetConfig().rtp.nack.rtp_history_ms);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-05-11 14:34:58 +02:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, NackCanBeEnabledAndDisabled) {
|
|
|
|
|
FakeVideoSendStream* send_stream = AddSendStream();
|
2015-05-22 18:48:36 +02:00
|
|
|
FakeVideoReceiveStream* recv_stream = AddRecvStream();
|
2015-05-11 14:34:58 +02:00
|
|
|
|
|
|
|
|
EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
|
|
|
|
|
EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
|
|
|
|
|
|
|
|
|
|
// Verify that NACK is turned off when send(!) codecs without NACK are set.
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
EXPECT_TRUE(parameters.codecs[0].feedback_params.params().empty());
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-05-11 14:34:58 +02:00
|
|
|
recv_stream = fake_call_->GetVideoReceiveStreams()[0];
|
|
|
|
|
EXPECT_EQ(0, recv_stream->GetConfig().rtp.nack.rtp_history_ms);
|
|
|
|
|
send_stream = fake_call_->GetVideoSendStreams()[0];
|
2014-06-13 12:27:38 +00:00
|
|
|
EXPECT_EQ(0, send_stream->GetConfig().rtp.nack.rtp_history_ms);
|
|
|
|
|
|
2015-05-11 14:34:58 +02:00
|
|
|
// Verify that NACK is turned on when setting default codecs since the
|
|
|
|
|
// default codecs have NACK enabled.
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs = engine_.codecs();
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-05-11 14:34:58 +02:00
|
|
|
recv_stream = fake_call_->GetVideoReceiveStreams()[0];
|
|
|
|
|
EXPECT_GT(recv_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
|
|
|
|
|
send_stream = fake_call_->GetVideoSendStreams()[0];
|
|
|
|
|
EXPECT_GT(send_stream->GetConfig().rtp.nack.rtp_history_ms, 0);
|
2014-06-13 12:27:38 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-12 00:02:28 +01:00
|
|
|
// This test verifies that new frame sizes reconfigures encoders even though not
|
|
|
|
|
// (yet) sending. The purpose of this is to permit encoding as quickly as
|
|
|
|
|
// possible once we start sending. Likely the frames being input are from the
|
|
|
|
|
// same source that will be sent later, which just means that we're ready
|
|
|
|
|
// earlier.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, ReconfiguresEncodersWhenNotSending) {
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec720p);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
channel_->SetSend(false);
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
|
|
|
|
|
// No frames entered, using default dimensions.
|
|
|
|
|
std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
|
|
|
|
|
EXPECT_EQ(176u, streams[0].width);
|
|
|
|
|
EXPECT_EQ(144u, streams[0].height);
|
|
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2016-03-12 00:02:28 +01:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
|
|
|
|
// Frame entered, should be reconfigured to new dimensions.
|
|
|
|
|
streams = stream->GetVideoStreams();
|
|
|
|
|
EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
|
|
|
|
|
EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
|
|
|
|
|
// No frames should have been actually put in there though.
|
|
|
|
|
EXPECT_EQ(0, stream->GetNumberOfSwappedFrames());
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2016-03-12 00:02:28 +01:00
|
|
|
}
|
|
|
|
|
|
2014-10-27 13:58:00 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
|
|
|
|
|
static const int kScreenshareMinBitrateKbps = 800;
|
|
|
|
|
cricket::VideoCodec codec = kVp8Codec360p;
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-27 13:58:00 +00:00
|
|
|
AddSendStream();
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-03-16 02:22:50 -07:00
|
|
|
VideoOptions min_bitrate_options;
|
|
|
|
|
min_bitrate_options.screencast_min_bitrate_kbps =
|
|
|
|
|
rtc::Optional<int>(kScreenshareMinBitrateKbps);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &min_bitrate_options,
|
|
|
|
|
&capturer));
|
2014-10-27 13:58:00 +00:00
|
|
|
cricket::VideoFormat capture_format_hd =
|
|
|
|
|
capturer.GetSupportedFormats()->front();
|
|
|
|
|
EXPECT_EQ(1280, capture_format_hd.width);
|
|
|
|
|
EXPECT_EQ(720, capture_format_hd.height);
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
|
|
|
|
|
FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
|
|
|
|
|
// Verify non-screencast settings.
|
|
|
|
|
webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
|
2015-04-28 10:01:41 +02:00
|
|
|
EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo,
|
2014-10-27 13:58:00 +00:00
|
|
|
encoder_config.content_type);
|
|
|
|
|
EXPECT_EQ(codec.width, encoder_config.streams.front().width);
|
|
|
|
|
EXPECT_EQ(codec.height, encoder_config.streams.front().height);
|
|
|
|
|
EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
|
|
|
|
|
<< "Non-screenshare shouldn't use min-transmit bitrate.";
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2016-02-29 00:04:41 -08:00
|
|
|
// Removing a capturer triggers a black frame to be sent.
|
|
|
|
|
EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
|
2016-03-16 02:22:50 -07:00
|
|
|
VideoOptions screencast_options;
|
|
|
|
|
screencast_options.is_screencast = rtc::Optional<bool>(true);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel_->SetVideoSend(last_ssrc_, true, &screencast_options, &capturer));
|
2014-10-27 13:58:00 +00:00
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
New flag is_screencast in VideoOptions.
This cl copies the value of cricket::VideoCapturer::IsScreencast into
a flag in VideoOptions. It is passed on via the chain
VideortpSender::SetVideoSend
WebRtcVideoChannel2::SetVideoSend
WebRtcVideoChannel2::SetOptions
WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions
Where it's used, in
WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame, we can look it up
in parameters_, instead of calling capturer_->IsScreencast().
Doesn't touch screencast logic related to cpu adaptation, since that
code is in flux in a different cl.
Also drop the is_screencast flag from the Dimensions struct, and drop separate options argument from ConfigureVideoEncoderSettings and SetCodecAndOptions, instead always using the options recorded in VideoSendStreamParameters::options.
In the tests, changed FakeVideoCapturer::is_screencast to be a construction time flag. Generally, unittests of screencast have to both use a capturer configured for screencast, and set the screencast flag using SetSendParameters. Since the automatic connection via VideoSource and VideoRtpSender isn't involved in the unit tests.
Note that using SetSendParameters to set the screencast flag doesn't make sense, since it's not per-stream. SetVideoSend would be more appropriate. That should be fixed if/when we drop VideoOptions from SetSendParameters.
BUG=webrtc:5426
R=pbos@webrtc.org, perkj@webrtc.org, pthatcher@webrtc.org
Review URL: https://codereview.webrtc.org/1711763003 .
Cr-Commit-Position: refs/heads/master@{#11837}
2016-03-02 11:41:36 +01:00
|
|
|
// Send stream not recreated after option change.
|
|
|
|
|
ASSERT_EQ(send_stream, fake_call_->GetVideoSendStreams().front());
|
2016-02-29 00:04:41 -08:00
|
|
|
EXPECT_EQ(3, send_stream->GetNumberOfSwappedFrames());
|
2014-10-27 13:58:00 +00:00
|
|
|
|
|
|
|
|
// Verify screencast settings.
|
|
|
|
|
encoder_config = send_stream->GetEncoderConfig();
|
2015-04-28 10:01:41 +02:00
|
|
|
EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kScreen,
|
2014-10-27 13:58:00 +00:00
|
|
|
encoder_config.content_type);
|
|
|
|
|
EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
|
|
|
|
|
encoder_config.min_transmit_bitrate_bps);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
|
|
|
|
|
EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
|
2014-10-31 13:08:10 +00:00
|
|
|
EXPECT_TRUE(encoder_config.streams[0].temporal_layer_thresholds_bps.empty());
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2014-10-31 13:08:10 +00:00
|
|
|
}
|
|
|
|
|
|
New flag is_screencast in VideoOptions.
This cl copies the value of cricket::VideoCapturer::IsScreencast into
a flag in VideoOptions. It is passed on via the chain
VideortpSender::SetVideoSend
WebRtcVideoChannel2::SetVideoSend
WebRtcVideoChannel2::SetOptions
WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions
Where it's used, in
WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame, we can look it up
in parameters_, instead of calling capturer_->IsScreencast().
Doesn't touch screencast logic related to cpu adaptation, since that
code is in flux in a different cl.
Also drop the is_screencast flag from the Dimensions struct, and drop separate options argument from ConfigureVideoEncoderSettings and SetCodecAndOptions, instead always using the options recorded in VideoSendStreamParameters::options.
In the tests, changed FakeVideoCapturer::is_screencast to be a construction time flag. Generally, unittests of screencast have to both use a capturer configured for screencast, and set the screencast flag using SetSendParameters. Since the automatic connection via VideoSource and VideoRtpSender isn't involved in the unit tests.
Note that using SetSendParameters to set the screencast flag doesn't make sense, since it's not per-stream. SetVideoSend would be more appropriate. That should be fixed if/when we drop VideoOptions from SetSendParameters.
BUG=webrtc:5426
R=pbos@webrtc.org, perkj@webrtc.org, pthatcher@webrtc.org
Review URL: https://codereview.webrtc.org/1711763003 .
Cr-Commit-Position: refs/heads/master@{#11837}
2016-03-02 11:41:36 +01:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, NoRecreateStreamForScreencast) {
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
ASSERT_TRUE(
|
|
|
|
|
channel_->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc)));
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr, &capturer));
|
New flag is_screencast in VideoOptions.
This cl copies the value of cricket::VideoCapturer::IsScreencast into
a flag in VideoOptions. It is passed on via the chain
VideortpSender::SetVideoSend
WebRtcVideoChannel2::SetVideoSend
WebRtcVideoChannel2::SetOptions
WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions
Where it's used, in
WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame, we can look it up
in parameters_, instead of calling capturer_->IsScreencast().
Doesn't touch screencast logic related to cpu adaptation, since that
code is in flux in a different cl.
Also drop the is_screencast flag from the Dimensions struct, and drop separate options argument from ConfigureVideoEncoderSettings and SetCodecAndOptions, instead always using the options recorded in VideoSendStreamParameters::options.
In the tests, changed FakeVideoCapturer::is_screencast to be a construction time flag. Generally, unittests of screencast have to both use a capturer configured for screencast, and set the screencast flag using SetSendParameters. Since the automatic connection via VideoSource and VideoRtpSender isn't involved in the unit tests.
Note that using SetSendParameters to set the screencast flag doesn't make sense, since it's not per-stream. SetVideoSend would be more appropriate. That should be fixed if/when we drop VideoOptions from SetSendParameters.
BUG=webrtc:5426
R=pbos@webrtc.org, perkj@webrtc.org, pthatcher@webrtc.org
Review URL: https://codereview.webrtc.org/1711763003 .
Cr-Commit-Position: refs/heads/master@{#11837}
2016-03-02 11:41:36 +01:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(1, fake_call_->GetNumCreatedSendStreams());
|
|
|
|
|
FakeVideoSendStream* stream = fake_call_->GetVideoSendStreams().front();
|
|
|
|
|
webrtc::VideoEncoderConfig encoder_config = stream->GetEncoderConfig();
|
|
|
|
|
EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo,
|
|
|
|
|
encoder_config.content_type);
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(1, stream->GetNumberOfSwappedFrames());
|
|
|
|
|
|
|
|
|
|
/* Switch to screencast source. We expect a reconfigure of the
|
|
|
|
|
* encoder, but no change of the send stream. */
|
|
|
|
|
struct VideoOptions video_options;
|
|
|
|
|
video_options.is_screencast = rtc::Optional<bool>(true);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, &video_options, &capturer));
|
New flag is_screencast in VideoOptions.
This cl copies the value of cricket::VideoCapturer::IsScreencast into
a flag in VideoOptions. It is passed on via the chain
VideortpSender::SetVideoSend
WebRtcVideoChannel2::SetVideoSend
WebRtcVideoChannel2::SetOptions
WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions
Where it's used, in
WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame, we can look it up
in parameters_, instead of calling capturer_->IsScreencast().
Doesn't touch screencast logic related to cpu adaptation, since that
code is in flux in a different cl.
Also drop the is_screencast flag from the Dimensions struct, and drop separate options argument from ConfigureVideoEncoderSettings and SetCodecAndOptions, instead always using the options recorded in VideoSendStreamParameters::options.
In the tests, changed FakeVideoCapturer::is_screencast to be a construction time flag. Generally, unittests of screencast have to both use a capturer configured for screencast, and set the screencast flag using SetSendParameters. Since the automatic connection via VideoSource and VideoRtpSender isn't involved in the unit tests.
Note that using SetSendParameters to set the screencast flag doesn't make sense, since it's not per-stream. SetVideoSend would be more appropriate. That should be fixed if/when we drop VideoOptions from SetSendParameters.
BUG=webrtc:5426
R=pbos@webrtc.org, perkj@webrtc.org, pthatcher@webrtc.org
Review URL: https://codereview.webrtc.org/1711763003 .
Cr-Commit-Position: refs/heads/master@{#11837}
2016-03-02 11:41:36 +01:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
ASSERT_EQ(1, fake_call_->GetNumCreatedSendStreams());
|
|
|
|
|
ASSERT_EQ(stream, fake_call_->GetVideoSendStreams().front());
|
|
|
|
|
EXPECT_EQ(2, stream->GetNumberOfSwappedFrames());
|
|
|
|
|
|
|
|
|
|
encoder_config = stream->GetEncoderConfig();
|
|
|
|
|
EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kScreen,
|
|
|
|
|
encoder_config.content_type);
|
|
|
|
|
|
|
|
|
|
/* Switch back. */
|
|
|
|
|
video_options.is_screencast = rtc::Optional<bool>(false);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, &video_options, &capturer));
|
New flag is_screencast in VideoOptions.
This cl copies the value of cricket::VideoCapturer::IsScreencast into
a flag in VideoOptions. It is passed on via the chain
VideortpSender::SetVideoSend
WebRtcVideoChannel2::SetVideoSend
WebRtcVideoChannel2::SetOptions
WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions
Where it's used, in
WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame, we can look it up
in parameters_, instead of calling capturer_->IsScreencast().
Doesn't touch screencast logic related to cpu adaptation, since that
code is in flux in a different cl.
Also drop the is_screencast flag from the Dimensions struct, and drop separate options argument from ConfigureVideoEncoderSettings and SetCodecAndOptions, instead always using the options recorded in VideoSendStreamParameters::options.
In the tests, changed FakeVideoCapturer::is_screencast to be a construction time flag. Generally, unittests of screencast have to both use a capturer configured for screencast, and set the screencast flag using SetSendParameters. Since the automatic connection via VideoSource and VideoRtpSender isn't involved in the unit tests.
Note that using SetSendParameters to set the screencast flag doesn't make sense, since it's not per-stream. SetVideoSend would be more appropriate. That should be fixed if/when we drop VideoOptions from SetSendParameters.
BUG=webrtc:5426
R=pbos@webrtc.org, perkj@webrtc.org, pthatcher@webrtc.org
Review URL: https://codereview.webrtc.org/1711763003 .
Cr-Commit-Position: refs/heads/master@{#11837}
2016-03-02 11:41:36 +01:00
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
ASSERT_EQ(1, fake_call_->GetNumCreatedSendStreams());
|
|
|
|
|
ASSERT_EQ(stream, fake_call_->GetVideoSendStreams().front());
|
|
|
|
|
EXPECT_EQ(3, stream->GetNumberOfSwappedFrames());
|
|
|
|
|
|
|
|
|
|
encoder_config = stream->GetEncoderConfig();
|
|
|
|
|
EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kRealtimeVideo,
|
|
|
|
|
encoder_config.content_type);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrc, true, nullptr, nullptr));
|
New flag is_screencast in VideoOptions.
This cl copies the value of cricket::VideoCapturer::IsScreencast into
a flag in VideoOptions. It is passed on via the chain
VideortpSender::SetVideoSend
WebRtcVideoChannel2::SetVideoSend
WebRtcVideoChannel2::SetOptions
WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions
Where it's used, in
WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame, we can look it up
in parameters_, instead of calling capturer_->IsScreencast().
Doesn't touch screencast logic related to cpu adaptation, since that
code is in flux in a different cl.
Also drop the is_screencast flag from the Dimensions struct, and drop separate options argument from ConfigureVideoEncoderSettings and SetCodecAndOptions, instead always using the options recorded in VideoSendStreamParameters::options.
In the tests, changed FakeVideoCapturer::is_screencast to be a construction time flag. Generally, unittests of screencast have to both use a capturer configured for screencast, and set the screencast flag using SetSendParameters. Since the automatic connection via VideoSource and VideoRtpSender isn't involved in the unit tests.
Note that using SetSendParameters to set the screencast flag doesn't make sense, since it's not per-stream. SetVideoSend would be more appropriate. That should be fixed if/when we drop VideoOptions from SetSendParameters.
BUG=webrtc:5426
R=pbos@webrtc.org, perkj@webrtc.org, pthatcher@webrtc.org
Review URL: https://codereview.webrtc.org/1711763003 .
Cr-Commit-Position: refs/heads/master@{#11837}
2016-03-02 11:41:36 +01:00
|
|
|
}
|
|
|
|
|
|
2014-10-31 13:08:10 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
ConferenceModeScreencastConfiguresTemporalLayer) {
|
2015-06-24 11:24:44 +02:00
|
|
|
static const int kConferenceScreencastTemporalBitrateBps =
|
|
|
|
|
ScreenshareLayerConfig::GetDefault().tl0_bitrate_kbps * 1000;
|
2016-02-17 05:25:36 -08:00
|
|
|
send_parameters_.conference_mode = true;
|
2015-09-17 16:42:56 +02:00
|
|
|
channel_->SetSendParameters(send_parameters_);
|
2014-10-31 13:08:10 +00:00
|
|
|
|
|
|
|
|
AddSendStream();
|
2016-03-16 02:22:50 -07:00
|
|
|
VideoOptions options;
|
|
|
|
|
options.is_screencast = rtc::Optional<bool>(true);
|
2014-10-31 13:08:10 +00:00
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
|
2014-10-31 13:08:10 +00:00
|
|
|
cricket::VideoFormat capture_format_hd =
|
|
|
|
|
capturer.GetSupportedFormats()->front();
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
|
|
|
|
|
FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
|
|
|
|
|
|
|
|
|
|
webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
|
|
|
|
|
|
|
|
|
|
// Verify screencast settings.
|
|
|
|
|
encoder_config = send_stream->GetEncoderConfig();
|
2015-04-28 10:01:41 +02:00
|
|
|
EXPECT_EQ(webrtc::VideoEncoderConfig::ContentType::kScreen,
|
2014-10-31 13:08:10 +00:00
|
|
|
encoder_config.content_type);
|
|
|
|
|
ASSERT_EQ(1u, encoder_config.streams.size());
|
|
|
|
|
ASSERT_EQ(1u, encoder_config.streams[0].temporal_layer_thresholds_bps.size());
|
|
|
|
|
EXPECT_EQ(kConferenceScreencastTemporalBitrateBps,
|
|
|
|
|
encoder_config.streams[0].temporal_layer_thresholds_bps[0]);
|
2014-10-27 13:58:00 +00:00
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-07-23 07:28:56 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SuspendBelowMinBitrateDisabledByDefault) {
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-01 04:29:59 -08:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetMediaConfigSuspendBelowMinBitrate) {
|
|
|
|
|
MediaConfig media_config = MediaConfig();
|
|
|
|
|
media_config.video.suspend_below_min_bitrate = true;
|
|
|
|
|
|
|
|
|
|
channel_.reset(
|
|
|
|
|
engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
channel_->SetSendParameters(send_parameters_);
|
2014-07-23 07:28:56 +00:00
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
EXPECT_TRUE(stream->GetConfig().suspend_below_min_bitrate);
|
|
|
|
|
|
2016-03-01 04:29:59 -08:00
|
|
|
media_config.video.suspend_below_min_bitrate = false;
|
|
|
|
|
channel_.reset(
|
|
|
|
|
engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
channel_->SetSendParameters(send_parameters_);
|
2014-07-23 07:28:56 +00:00
|
|
|
|
2016-03-01 04:29:59 -08:00
|
|
|
stream = AddSendStream();
|
2014-07-23 07:28:56 +00:00
|
|
|
EXPECT_FALSE(stream->GetConfig().suspend_below_min_bitrate);
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-22 16:29:54 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, Vp8DenoisingEnabledByDefault) {
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoCodecVP8 vp8_settings;
|
|
|
|
|
ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
|
|
|
|
|
EXPECT_TRUE(vp8_settings.denoisingOn);
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-28 10:01:41 +02:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, VerifyVp8SpecificSettings) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec720p);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2015-04-28 10:01:41 +02:00
|
|
|
|
2015-09-09 14:32:14 +02:00
|
|
|
// Single-stream settings should apply with RTX as well (verifies that we
|
|
|
|
|
// check number of regular SSRCs and not StreamParams::ssrcs which contains
|
|
|
|
|
// both RTX and regular SSRCs).
|
|
|
|
|
FakeVideoSendStream* stream = SetUpSimulcast(false, true);
|
2015-04-28 10:01:41 +02:00
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2015-04-28 10:01:41 +02:00
|
|
|
channel_->SetSend(true);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
2015-10-26 11:18:18 -07:00
|
|
|
webrtc::VideoCodecVP8 vp8_settings;
|
|
|
|
|
ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
|
|
|
|
|
EXPECT_TRUE(vp8_settings.denoisingOn)
|
|
|
|
|
<< "VP8 denoising should be on by default.";
|
|
|
|
|
|
2016-03-16 02:22:50 -07:00
|
|
|
stream = SetDenoisingOption(last_ssrc_, &capturer, false);
|
2014-07-22 16:29:54 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
|
|
|
|
|
EXPECT_FALSE(vp8_settings.denoisingOn);
|
2015-04-28 10:01:41 +02:00
|
|
|
EXPECT_TRUE(vp8_settings.automaticResizeOn);
|
|
|
|
|
EXPECT_TRUE(vp8_settings.frameDroppingOn);
|
2014-07-22 16:29:54 +00:00
|
|
|
|
2016-03-16 02:22:50 -07:00
|
|
|
stream = SetDenoisingOption(last_ssrc_, &capturer, true);
|
2014-07-22 16:29:54 +00:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
|
|
|
|
|
EXPECT_TRUE(vp8_settings.denoisingOn);
|
2015-04-28 10:01:41 +02:00
|
|
|
EXPECT_TRUE(vp8_settings.automaticResizeOn);
|
|
|
|
|
EXPECT_TRUE(vp8_settings.frameDroppingOn);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2015-09-09 14:32:14 +02:00
|
|
|
stream = SetUpSimulcast(true, false);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2015-04-28 10:01:41 +02:00
|
|
|
channel_->SetSend(true);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(3, stream->GetVideoStreams().size());
|
|
|
|
|
ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
|
|
|
|
|
// Autmatic resize off when using simulcast.
|
|
|
|
|
EXPECT_FALSE(vp8_settings.automaticResizeOn);
|
|
|
|
|
EXPECT_TRUE(vp8_settings.frameDroppingOn);
|
|
|
|
|
|
|
|
|
|
// In screen-share mode, denoising is forced off and simulcast disabled.
|
2016-03-16 02:22:50 -07:00
|
|
|
VideoOptions options;
|
|
|
|
|
options.is_screencast = rtc::Optional<bool>(true);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
|
New flag is_screencast in VideoOptions.
This cl copies the value of cricket::VideoCapturer::IsScreencast into
a flag in VideoOptions. It is passed on via the chain
VideortpSender::SetVideoSend
WebRtcVideoChannel2::SetVideoSend
WebRtcVideoChannel2::SetOptions
WebRtcVideoChannel2::WebRtcVideoSendStream::SetOptions
Where it's used, in
WebRtcVideoChannel2::WebRtcVideoSendStream::OnFrame, we can look it up
in parameters_, instead of calling capturer_->IsScreencast().
Doesn't touch screencast logic related to cpu adaptation, since that
code is in flux in a different cl.
Also drop the is_screencast flag from the Dimensions struct, and drop separate options argument from ConfigureVideoEncoderSettings and SetCodecAndOptions, instead always using the options recorded in VideoSendStreamParameters::options.
In the tests, changed FakeVideoCapturer::is_screencast to be a construction time flag. Generally, unittests of screencast have to both use a capturer configured for screencast, and set the screencast flag using SetSendParameters. Since the automatic connection via VideoSource and VideoRtpSender isn't involved in the unit tests.
Note that using SetSendParameters to set the screencast flag doesn't make sense, since it's not per-stream. SetVideoSend would be more appropriate. That should be fixed if/when we drop VideoOptions from SetSendParameters.
BUG=webrtc:5426
R=pbos@webrtc.org, perkj@webrtc.org, pthatcher@webrtc.org
Review URL: https://codereview.webrtc.org/1711763003 .
Cr-Commit-Position: refs/heads/master@{#11837}
2016-03-02 11:41:36 +01:00
|
|
|
|
2016-03-16 02:22:50 -07:00
|
|
|
stream = SetDenoisingOption(last_ssrc_, &capturer, false);
|
2015-04-28 10:01:41 +02:00
|
|
|
|
|
|
|
|
EXPECT_EQ(1, stream->GetVideoStreams().size());
|
|
|
|
|
ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
|
|
|
|
|
EXPECT_FALSE(vp8_settings.denoisingOn);
|
|
|
|
|
// Resizing and frame dropping always off for screen sharing.
|
|
|
|
|
EXPECT_FALSE(vp8_settings.automaticResizeOn);
|
|
|
|
|
EXPECT_FALSE(vp8_settings.frameDroppingOn);
|
|
|
|
|
|
2016-03-16 02:22:50 -07:00
|
|
|
stream = SetDenoisingOption(last_ssrc_, &capturer, true);
|
2015-04-28 10:01:41 +02:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(stream->GetVp8Settings(&vp8_settings)) << "No VP8 config set.";
|
|
|
|
|
EXPECT_FALSE(vp8_settings.denoisingOn);
|
|
|
|
|
EXPECT_FALSE(vp8_settings.automaticResizeOn);
|
|
|
|
|
EXPECT_FALSE(vp8_settings.frameDroppingOn);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2015-04-28 10:01:41 +02:00
|
|
|
}
|
|
|
|
|
|
2016-04-04 11:43:27 -07:00
|
|
|
// Test that setting the same options doesn't result in the encoder being
|
|
|
|
|
// reconfigured.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetIdenticalOptionsDoesntReconfigureEncoder) {
|
|
|
|
|
VideoOptions options;
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* send_stream = AddSendStream();
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
|
2016-04-04 11:43:27 -07:00
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
// Expect 2 reconfigurations at this point, from the initial configuration
|
|
|
|
|
// and from the dimensions of the first frame.
|
|
|
|
|
EXPECT_EQ(2, send_stream->num_encoder_reconfigurations());
|
|
|
|
|
|
|
|
|
|
// Set the options one more time and expect no additional reconfigurations.
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
|
2016-04-04 11:43:27 -07:00
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
EXPECT_EQ(2, send_stream->num_encoder_reconfigurations());
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2016-04-04 11:43:27 -07:00
|
|
|
}
|
|
|
|
|
|
2015-04-28 10:01:41 +02:00
|
|
|
class Vp9SettingsTest : public WebRtcVideoChannel2Test {
|
|
|
|
|
public:
|
2016-03-21 04:15:50 -07:00
|
|
|
Vp9SettingsTest() : Vp9SettingsTest("") {}
|
|
|
|
|
explicit Vp9SettingsTest(const char* field_trials)
|
|
|
|
|
: WebRtcVideoChannel2Test(field_trials) {
|
2015-04-28 10:01:41 +02:00
|
|
|
encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP9, "VP9");
|
|
|
|
|
}
|
|
|
|
|
virtual ~Vp9SettingsTest() {}
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
void SetUp() override {
|
|
|
|
|
engine_.SetExternalEncoderFactory(&encoder_factory_);
|
|
|
|
|
|
|
|
|
|
WebRtcVideoChannel2Test::SetUp();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void TearDown() override {
|
|
|
|
|
// Remove references to encoder_factory_ since this will be destroyed
|
|
|
|
|
// before channel_ and engine_.
|
2015-09-17 16:42:56 +02:00
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-04-28 10:01:41 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
cricket::FakeWebRtcVideoEncoderFactory encoder_factory_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2015-04-28 10:01:41 +02:00
|
|
|
|
2015-09-09 14:32:14 +02:00
|
|
|
FakeVideoSendStream* stream = SetUpSimulcast(false, false);
|
2015-04-28 10:01:41 +02:00
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2015-04-28 10:01:41 +02:00
|
|
|
channel_->SetSend(true);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
2015-10-26 11:18:18 -07:00
|
|
|
webrtc::VideoCodecVP9 vp9_settings;
|
|
|
|
|
ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
|
|
|
|
|
EXPECT_FALSE(vp9_settings.denoisingOn)
|
|
|
|
|
<< "VP9 denoising should be off by default.";
|
|
|
|
|
|
2016-03-16 02:22:50 -07:00
|
|
|
stream = SetDenoisingOption(last_ssrc_, &capturer, false);
|
2015-04-28 10:01:41 +02:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
|
|
|
|
|
EXPECT_FALSE(vp9_settings.denoisingOn);
|
|
|
|
|
// Frame dropping always on for real time video.
|
|
|
|
|
EXPECT_TRUE(vp9_settings.frameDroppingOn);
|
|
|
|
|
|
2016-03-16 02:22:50 -07:00
|
|
|
stream = SetDenoisingOption(last_ssrc_, &capturer, true);
|
2015-04-28 10:01:41 +02:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
|
|
|
|
|
EXPECT_TRUE(vp9_settings.denoisingOn);
|
|
|
|
|
EXPECT_TRUE(vp9_settings.frameDroppingOn);
|
|
|
|
|
|
|
|
|
|
// In screen-share mode, denoising is forced off.
|
2016-03-16 02:22:50 -07:00
|
|
|
VideoOptions options;
|
|
|
|
|
options.is_screencast = rtc::Optional<bool>(true);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
|
2016-02-29 00:04:41 -08:00
|
|
|
|
2016-03-16 02:22:50 -07:00
|
|
|
stream = SetDenoisingOption(last_ssrc_, &capturer, false);
|
2015-04-28 10:01:41 +02:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
|
|
|
|
|
EXPECT_FALSE(vp9_settings.denoisingOn);
|
|
|
|
|
// Frame dropping always off for screen sharing.
|
|
|
|
|
EXPECT_FALSE(vp9_settings.frameDroppingOn);
|
|
|
|
|
|
2016-03-16 02:22:50 -07:00
|
|
|
stream = SetDenoisingOption(last_ssrc_, &capturer, false);
|
2015-04-28 10:01:41 +02:00
|
|
|
|
|
|
|
|
ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
|
|
|
|
|
EXPECT_FALSE(vp9_settings.denoisingOn);
|
|
|
|
|
EXPECT_FALSE(vp9_settings.frameDroppingOn);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2016-03-21 04:15:50 -07:00
|
|
|
class Vp9SettingsTestWithFieldTrial : public Vp9SettingsTest {
|
|
|
|
|
public:
|
|
|
|
|
Vp9SettingsTestWithFieldTrial(const char* field_trials)
|
|
|
|
|
: Vp9SettingsTest(field_trials) {}
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
void VerifySettings(int num_spatial_layers, int num_temporal_layers) {
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream = SetUpSimulcast(false, false);
|
|
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2016-03-21 04:15:50 -07:00
|
|
|
channel_->SetSend(true);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
|
|
|
|
webrtc::VideoCodecVP9 vp9_settings;
|
|
|
|
|
ASSERT_TRUE(stream->GetVp9Settings(&vp9_settings)) << "No VP9 config set.";
|
|
|
|
|
EXPECT_EQ(num_spatial_layers, vp9_settings.numberOfSpatialLayers);
|
|
|
|
|
EXPECT_EQ(num_temporal_layers, vp9_settings.numberOfTemporalLayers);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2016-03-21 04:15:50 -07:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class Vp9SettingsTestWithNoFlag : public Vp9SettingsTestWithFieldTrial {
|
|
|
|
|
public:
|
|
|
|
|
Vp9SettingsTestWithNoFlag() : Vp9SettingsTestWithFieldTrial("") {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(Vp9SettingsTestWithNoFlag, VerifySettings) {
|
|
|
|
|
const int kNumSpatialLayers = 1;
|
|
|
|
|
const int kNumTemporalLayers = 1;
|
|
|
|
|
VerifySettings(kNumSpatialLayers, kNumTemporalLayers);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class Vp9SettingsTestWithInvalidFlag : public Vp9SettingsTestWithFieldTrial {
|
|
|
|
|
public:
|
|
|
|
|
Vp9SettingsTestWithInvalidFlag()
|
|
|
|
|
: Vp9SettingsTestWithFieldTrial("WebRTC-SupportVP9SVC/Default/") {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(Vp9SettingsTestWithInvalidFlag, VerifySettings) {
|
|
|
|
|
const int kNumSpatialLayers = 1;
|
|
|
|
|
const int kNumTemporalLayers = 1;
|
|
|
|
|
VerifySettings(kNumSpatialLayers, kNumTemporalLayers);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
class Vp9SettingsTestWith2SL3TLFlag : public Vp9SettingsTestWithFieldTrial {
|
|
|
|
|
public:
|
|
|
|
|
Vp9SettingsTestWith2SL3TLFlag()
|
|
|
|
|
: Vp9SettingsTestWithFieldTrial(
|
|
|
|
|
"WebRTC-SupportVP9SVC/EnabledByFlag_2SL3TL/") {}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(Vp9SettingsTestWith2SL3TLFlag, VerifySettings) {
|
|
|
|
|
const int kNumSpatialLayers = 2;
|
|
|
|
|
const int kNumTemporalLayers = 3;
|
|
|
|
|
VerifySettings(kNumSpatialLayers, kNumTemporalLayers);
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-03 11:25:45 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruse) {
|
2015-04-29 16:21:28 +02:00
|
|
|
TestCpuAdaptation(true, false);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-10-03 11:25:45 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenDisabled) {
|
2015-04-29 16:21:28 +02:00
|
|
|
TestCpuAdaptation(false, false);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-04-29 16:21:28 +02:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, DoesNotAdaptOnOveruseWhenScreensharing) {
|
|
|
|
|
TestCpuAdaptation(true, true);
|
|
|
|
|
}
|
|
|
|
|
|
2016-02-29 00:04:41 -08:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, AdaptsOnOveruseAndChangeResolution) {
|
|
|
|
|
cricket::VideoCodec codec = kVp8Codec720p;
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(codec);
|
|
|
|
|
|
|
|
|
|
MediaConfig media_config = MediaConfig();
|
|
|
|
|
channel_.reset(
|
|
|
|
|
engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
|
|
|
|
|
AddSendStream();
|
|
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
ASSERT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2016-02-29 00:04:41 -08:00
|
|
|
ASSERT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
ASSERT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
|
|
|
|
|
FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
|
|
|
|
|
webrtc::LoadObserver* overuse_callback =
|
|
|
|
|
send_stream->GetConfig().overuse_callback;
|
|
|
|
|
ASSERT_TRUE(overuse_callback != NULL);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
|
|
|
|
|
EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
EXPECT_EQ(1280, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(720, send_stream->GetLastHeight());
|
|
|
|
|
|
|
|
|
|
// Trigger overuse.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
|
|
|
|
|
EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight());
|
|
|
|
|
|
|
|
|
|
// Trigger overuse again.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
|
|
|
|
|
EXPECT_EQ(3, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
EXPECT_EQ(1280 * 2 / 4, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(720 * 2 / 4, send_stream->GetLastHeight());
|
|
|
|
|
|
2016-04-05 15:23:49 +02:00
|
|
|
// Trigger overuse again. This should not decrease the resolution since we
|
|
|
|
|
// should only adapt the resolution down max two steps.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
|
|
|
|
|
EXPECT_EQ(4, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
EXPECT_EQ(1280 * 2 / 4, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(720 * 2 / 4, send_stream->GetLastHeight());
|
|
|
|
|
|
2016-02-29 00:04:41 -08:00
|
|
|
// Change input resolution.
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420));
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(5, send_stream->GetNumberOfSwappedFrames());
|
2016-02-29 00:04:41 -08:00
|
|
|
EXPECT_EQ(1284 / 2, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(724 / 2, send_stream->GetLastHeight());
|
|
|
|
|
|
|
|
|
|
// Trigger underuse which should go back up in resolution.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420));
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(6, send_stream->GetNumberOfSwappedFrames());
|
2016-02-29 00:04:41 -08:00
|
|
|
EXPECT_EQ(1284 * 3 / 4, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(724 * 3 / 4, send_stream->GetLastHeight());
|
|
|
|
|
|
|
|
|
|
// Trigger underuse which should go back up in resolution.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420));
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(7, send_stream->GetNumberOfSwappedFrames());
|
2016-02-29 00:04:41 -08:00
|
|
|
EXPECT_EQ(1284, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(724, send_stream->GetLastHeight());
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2016-02-29 00:04:41 -08:00
|
|
|
}
|
|
|
|
|
|
2016-04-05 15:23:49 +02:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, PreviousAdaptationDoesNotApplyToScreenshare) {
|
|
|
|
|
cricket::VideoCodec codec = kVp8Codec720p;
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(codec);
|
|
|
|
|
|
|
|
|
|
MediaConfig media_config = MediaConfig();
|
|
|
|
|
channel_.reset(
|
|
|
|
|
engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
|
|
|
|
|
AddSendStream();
|
|
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
|
|
|
|
ASSERT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
ASSERT_TRUE(channel_->SetSend(true));
|
|
|
|
|
cricket::VideoOptions camera_options;
|
2016-06-02 16:23:38 -07:00
|
|
|
channel_->SetVideoSend(last_ssrc_, true /* enable */, &camera_options,
|
|
|
|
|
&capturer);
|
2016-04-05 15:23:49 +02:00
|
|
|
|
|
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
|
|
|
|
|
FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
|
|
|
|
|
webrtc::LoadObserver* overuse_callback =
|
|
|
|
|
send_stream->GetConfig().overuse_callback;
|
|
|
|
|
ASSERT_TRUE(overuse_callback != NULL);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
|
|
|
|
|
EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
EXPECT_EQ(1280, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(720, send_stream->GetLastHeight());
|
|
|
|
|
|
|
|
|
|
// Trigger overuse.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
|
|
|
|
|
EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight());
|
|
|
|
|
|
|
|
|
|
// Switch to screen share. Expect no CPU adaptation.
|
|
|
|
|
cricket::FakeVideoCapturer screen_share(true);
|
|
|
|
|
ASSERT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
screen_share.Start(screen_share.GetSupportedFormats()->front()));
|
|
|
|
|
cricket::VideoOptions screenshare_options;
|
|
|
|
|
screenshare_options.is_screencast = rtc::Optional<bool>(true);
|
2016-06-02 16:23:38 -07:00
|
|
|
channel_->SetVideoSend(last_ssrc_, true /* enable */, &screenshare_options,
|
|
|
|
|
&screen_share);
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_TRUE(screen_share.CaptureCustomFrame(1284, 724, cricket::FOURCC_I420));
|
|
|
|
|
EXPECT_EQ(3, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
EXPECT_EQ(1284, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(724, send_stream->GetLastHeight());
|
|
|
|
|
|
|
|
|
|
// Switch back to the normal capturer. Expect the frame to be CPU adapted.
|
2016-06-02 16:23:38 -07:00
|
|
|
channel_->SetVideoSend(last_ssrc_, true /* enable */, &camera_options,
|
|
|
|
|
&capturer);
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_TRUE(capturer.CaptureCustomFrame(1280, 720, cricket::FOURCC_I420));
|
|
|
|
|
EXPECT_EQ(4, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
EXPECT_EQ(1280 * 3 / 4, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(720 * 3 / 4, send_stream->GetLastHeight());
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2016-04-05 15:23:49 +02:00
|
|
|
}
|
|
|
|
|
|
2015-04-29 16:21:28 +02:00
|
|
|
void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse,
|
|
|
|
|
bool is_screenshare) {
|
2014-10-27 13:58:00 +00:00
|
|
|
cricket::VideoCodec codec = kVp8Codec720p;
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(codec);
|
2016-02-12 02:27:06 -08:00
|
|
|
|
|
|
|
|
MediaConfig media_config = MediaConfig();
|
2015-04-14 22:45:29 +02:00
|
|
|
if (!enable_overuse) {
|
2016-03-01 04:29:59 -08:00
|
|
|
media_config.video.enable_cpu_overuse_detection = false;
|
2014-10-03 11:25:45 +00:00
|
|
|
}
|
2016-02-12 02:27:06 -08:00
|
|
|
channel_.reset(
|
|
|
|
|
engine_.CreateChannel(fake_call_.get(), media_config, VideoOptions()));
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-03 11:25:45 +00:00
|
|
|
|
|
|
|
|
AddSendStream();
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-03-16 02:22:50 -07:00
|
|
|
VideoOptions options;
|
|
|
|
|
options.is_screencast = rtc::Optional<bool>(is_screenshare);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, &options, &capturer));
|
2014-10-03 11:25:45 +00:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
// Trigger overuse.
|
2015-09-08 05:13:22 -07:00
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
|
|
|
|
|
FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
|
2014-10-03 11:25:45 +00:00
|
|
|
webrtc::LoadObserver* overuse_callback =
|
2015-09-08 05:13:22 -07:00
|
|
|
send_stream->GetConfig().overuse_callback;
|
2016-02-29 00:04:41 -08:00
|
|
|
|
|
|
|
|
if (!enable_overuse) {
|
|
|
|
|
ASSERT_TRUE(overuse_callback == NULL);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(codec.width, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(codec.height, send_stream->GetLastHeight());
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2016-02-29 00:04:41 -08:00
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-03 11:25:45 +00:00
|
|
|
ASSERT_TRUE(overuse_callback != NULL);
|
2016-02-29 00:04:41 -08:00
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
|
2014-10-03 11:25:45 +00:00
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2016-02-29 00:04:41 -08:00
|
|
|
EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
|
2014-10-03 11:25:45 +00:00
|
|
|
|
2016-02-29 00:04:41 -08:00
|
|
|
if (is_screenshare) {
|
|
|
|
|
// Do not adapt screen share.
|
2014-10-03 11:25:45 +00:00
|
|
|
EXPECT_EQ(codec.width, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(codec.height, send_stream->GetLastHeight());
|
2016-02-29 00:04:41 -08:00
|
|
|
} else {
|
|
|
|
|
EXPECT_LT(send_stream->GetLastWidth(), codec.width);
|
|
|
|
|
EXPECT_LT(send_stream->GetLastHeight(), codec.height);
|
2014-10-03 11:25:45 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Trigger underuse which should go back to normal resolution.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2016-02-29 00:04:41 -08:00
|
|
|
EXPECT_EQ(3, send_stream->GetNumberOfSwappedFrames());
|
2014-10-03 11:25:45 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(codec.width, send_stream->GetLastWidth());
|
|
|
|
|
EXPECT_EQ(codec.height, send_stream->GetLastHeight());
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-10-01 03:02:44 -07:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, EstimatesNtpStartTimeCorrectly) {
|
2015-01-27 09:57:01 +00:00
|
|
|
// Start at last timestamp to verify that wraparounds are estimated correctly.
|
|
|
|
|
static const uint32_t kInitialTimestamp = 0xFFFFFFFFu;
|
|
|
|
|
static const int64_t kInitialNtpTimeMs = 1247891230;
|
|
|
|
|
static const int kFrameOffsetMs = 20;
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2015-01-23 14:55:00 +00:00
|
|
|
|
2015-01-27 09:57:01 +00:00
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
cricket::FakeVideoRenderer renderer;
|
2016-02-04 01:24:52 -08:00
|
|
|
EXPECT_TRUE(channel_->SetSink(last_ssrc_, &renderer));
|
2015-01-27 09:57:01 +00:00
|
|
|
|
2015-05-29 17:21:40 -07:00
|
|
|
webrtc::VideoFrame video_frame;
|
2015-01-27 09:57:01 +00:00
|
|
|
CreateBlackFrame(&video_frame, 4, 4);
|
|
|
|
|
video_frame.set_timestamp(kInitialTimestamp);
|
|
|
|
|
// Initial NTP time is not available on the first frame, but should still be
|
|
|
|
|
// able to be estimated.
|
2016-03-21 01:27:56 -07:00
|
|
|
stream->InjectFrame(video_frame);
|
2015-01-27 09:57:01 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(1, renderer.num_rendered_frames());
|
|
|
|
|
|
|
|
|
|
// This timestamp is kInitialTimestamp (-1) + kFrameOffsetMs * 90, which
|
|
|
|
|
// triggers a constant-overflow warning, hence we're calculating it explicitly
|
|
|
|
|
// here.
|
|
|
|
|
video_frame.set_timestamp(kFrameOffsetMs * 90 - 1);
|
|
|
|
|
video_frame.set_ntp_time_ms(kInitialNtpTimeMs + kFrameOffsetMs);
|
2016-03-21 01:27:56 -07:00
|
|
|
stream->InjectFrame(video_frame);
|
2015-01-27 09:57:01 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(2, renderer.num_rendered_frames());
|
|
|
|
|
|
|
|
|
|
// Verify that NTP time has been correctly deduced.
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2015-01-27 09:57:01 +00:00
|
|
|
ASSERT_EQ(1u, info.receivers.size());
|
|
|
|
|
EXPECT_EQ(kInitialNtpTimeMs, info.receivers[0].capture_start_ntp_time_ms);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetDefaultSendCodecs) {
|
2015-09-17 16:42:56 +02:00
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2014-05-13 11:07:01 +00:00
|
|
|
|
|
|
|
|
VideoCodec codec;
|
|
|
|
|
EXPECT_TRUE(channel_->GetSendCodec(&codec));
|
2014-06-13 09:34:13 +00:00
|
|
|
EXPECT_TRUE(codec.Matches(engine_.codecs()[0]));
|
2014-05-13 11:07:01 +00:00
|
|
|
|
|
|
|
|
// Using a RTX setup to verify that the default RTX payload type is good.
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
|
|
|
|
|
const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
|
2014-05-13 11:07:01 +00:00
|
|
|
FakeVideoSendStream* stream = AddSendStream(
|
|
|
|
|
cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs));
|
|
|
|
|
webrtc::VideoSendStream::Config config = stream->GetConfig();
|
|
|
|
|
|
|
|
|
|
// Make sure NACK and FEC are enabled on the correct payload types.
|
|
|
|
|
EXPECT_EQ(1000, config.rtp.nack.rtp_history_ms);
|
|
|
|
|
EXPECT_EQ(default_ulpfec_codec_.id, config.rtp.fec.ulpfec_payload_type);
|
|
|
|
|
EXPECT_EQ(default_red_codec_.id, config.rtp.fec.red_payload_type);
|
2014-06-26 08:49:03 +00:00
|
|
|
|
|
|
|
|
EXPECT_EQ(1u, config.rtp.rtx.ssrcs.size());
|
|
|
|
|
EXPECT_EQ(kRtxSsrcs1[0], config.rtp.rtx.ssrcs[0]);
|
2015-04-21 20:24:50 +08:00
|
|
|
VerifySendStreamHasRtxTypes(config, default_apt_rtx_types_);
|
2014-05-13 11:07:01 +00:00
|
|
|
// TODO(juberti): Check RTCP, PLI, TMMBR.
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFec) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Config config = stream->GetConfig();
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type);
|
|
|
|
|
EXPECT_EQ(-1, config.rtp.fec.red_payload_type);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
2014-06-26 08:49:03 +00:00
|
|
|
SetSendCodecRejectsRtxWithoutAssociatedPayloadType) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
2016-04-13 10:07:16 -07:00
|
|
|
cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0);
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs.push_back(rtx_codec);
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters))
|
2014-06-26 08:49:03 +00:00
|
|
|
<< "RTX codec without associated payload type should be rejected.";
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
2014-06-26 08:49:03 +00:00
|
|
|
SetSendCodecRejectsRtxWithoutMatchingVideoCodec) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
2014-06-26 08:49:03 +00:00
|
|
|
cricket::VideoCodec rtx_codec =
|
|
|
|
|
cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id);
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(rtx_codec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-26 08:49:03 +00:00
|
|
|
|
|
|
|
|
cricket::VideoCodec rtx_codec2 =
|
|
|
|
|
cricket::VideoCodec::CreateRtxCodec(96, kVp8Codec.id + 1);
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs.pop_back();
|
|
|
|
|
parameters.codecs.push_back(rtx_codec2);
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters))
|
2014-06-26 08:49:03 +00:00
|
|
|
<< "RTX without matching video codec should be rejected.";
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-06-26 08:49:03 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithoutFecDisablesFec) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kUlpfecCodec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-26 08:49:03 +00:00
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Config config = stream->GetConfig();
|
|
|
|
|
|
|
|
|
|
EXPECT_EQ(kUlpfecCodec.id, config.rtp.fec.ulpfec_payload_type);
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs.pop_back();
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-03 11:25:45 +00:00
|
|
|
stream = fake_call_->GetVideoSendStreams()[0];
|
2014-06-26 08:49:03 +00:00
|
|
|
ASSERT_TRUE(stream != NULL);
|
|
|
|
|
config = stream->GetConfig();
|
|
|
|
|
EXPECT_EQ(-1, config.rtp.fec.ulpfec_payload_type)
|
|
|
|
|
<< "SetSendCodec without FEC should disable current FEC.";
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-07-16 08:01:38 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsChangesExistingStreams) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec720p);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2015-02-16 21:02:00 +00:00
|
|
|
channel_->SetSend(true);
|
2014-07-16 08:01:38 +00:00
|
|
|
|
2015-02-16 21:02:00 +00:00
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2015-02-16 21:02:00 +00:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
|
|
|
|
std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
|
2014-07-16 08:01:38 +00:00
|
|
|
EXPECT_EQ(kVp8Codec720p.width, streams[0].width);
|
|
|
|
|
EXPECT_EQ(kVp8Codec720p.height, streams[0].height);
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs.clear();
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec360p);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2014-10-03 11:25:45 +00:00
|
|
|
streams = fake_call_->GetVideoSendStreams()[0]->GetVideoStreams();
|
2014-07-16 08:01:38 +00:00
|
|
|
EXPECT_EQ(kVp8Codec360p.width, streams[0].width);
|
|
|
|
|
EXPECT_EQ(kVp8Codec360p.height, streams[0].height);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-11-25 14:03:34 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitrates) {
|
|
|
|
|
SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
|
|
|
|
|
200000);
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-23 22:29:39 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithHighMaxBitrate) {
|
|
|
|
|
SetSendCodecsShouldWorkForBitrates("", 0, "", -1, "10000", 10000000);
|
|
|
|
|
std::vector<webrtc::VideoStream> streams = AddSendStream()->GetVideoStreams();
|
|
|
|
|
ASSERT_EQ(1u, streams.size());
|
|
|
|
|
EXPECT_EQ(10000000, streams[0].max_bitrate_bps);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-25 14:03:34 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
SetSendCodecsWithoutBitratesUsesCorrectDefaults) {
|
|
|
|
|
SetSendCodecsShouldWorkForBitrates(
|
|
|
|
|
"", 0, "", -1, "", -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsCapsMinAndStartBitrate) {
|
|
|
|
|
SetSendCodecsShouldWorkForBitrates("-1", 0, "-100", -1, "", -1);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectsMaxLessThanMinBitrate) {
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "300";
|
|
|
|
|
send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "200";
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(send_parameters_));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2016-04-26 17:15:23 -07:00
|
|
|
// Test that when both the codec-specific bitrate params and max_bandwidth_bps
|
|
|
|
|
// are present in the same send parameters, the settings are combined correctly.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithBitratesAndMaxSendBandwidth) {
|
|
|
|
|
send_parameters_.codecs[0].params[kCodecParamMinBitrate] = "100";
|
|
|
|
|
send_parameters_.codecs[0].params[kCodecParamStartBitrate] = "200";
|
|
|
|
|
send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "300";
|
|
|
|
|
send_parameters_.max_bandwidth_bps = 400000;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
|
|
|
|
|
EXPECT_EQ(200000, fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
|
|
|
|
|
// We expect max_bandwidth_bps to take priority, if set.
|
|
|
|
|
EXPECT_EQ(400000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
|
|
|
|
|
|
|
|
|
|
// Decrease max_bandwidth_bps.
|
|
|
|
|
send_parameters_.max_bandwidth_bps = 350000;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
|
|
|
|
|
// Since the codec isn't changing, start_bitrate_bps should be -1.
|
|
|
|
|
EXPECT_EQ(-1, fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
|
|
|
|
|
EXPECT_EQ(350000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
|
|
|
|
|
|
|
|
|
|
// Now try again with the values flipped around.
|
|
|
|
|
send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "400";
|
|
|
|
|
send_parameters_.max_bandwidth_bps = 300000;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
|
|
|
|
|
EXPECT_EQ(200000, fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
|
|
|
|
|
EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
|
|
|
|
|
|
|
|
|
|
// If we change the codec max, max_bandwidth_bps should still apply.
|
|
|
|
|
send_parameters_.codecs[0].params[kCodecParamMaxBitrate] = "350";
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps);
|
|
|
|
|
EXPECT_EQ(200000, fake_call_->GetConfig().bitrate_config.start_bitrate_bps);
|
|
|
|
|
EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-25 14:03:34 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
SetMaxSendBandwidthShouldPreserveOtherBitrates) {
|
|
|
|
|
SetSendCodecsShouldWorkForBitrates("100", 100000, "150", 150000, "200",
|
|
|
|
|
200000);
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.max_bandwidth_bps = 300000;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-26 11:11:06 +01:00
|
|
|
EXPECT_EQ(100000, fake_call_->GetConfig().bitrate_config.min_bitrate_bps)
|
2014-11-25 14:03:34 +00:00
|
|
|
<< "Setting max bitrate should keep previous min bitrate.";
|
2015-03-26 11:11:06 +01:00
|
|
|
EXPECT_EQ(-1, fake_call_->GetConfig().bitrate_config.start_bitrate_bps)
|
2014-11-25 14:03:34 +00:00
|
|
|
<< "Setting max bitrate should not reset start bitrate.";
|
2015-03-26 11:11:06 +01:00
|
|
|
EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
|
2014-11-25 14:03:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetMaxSendBandwidthShouldBeRemovable) {
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.max_bandwidth_bps = 300000;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-26 11:11:06 +01:00
|
|
|
EXPECT_EQ(300000, fake_call_->GetConfig().bitrate_config.max_bitrate_bps);
|
2014-11-25 14:03:34 +00:00
|
|
|
// <= 0 means disable (infinite) max bitrate.
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters_.max_bandwidth_bps = 0;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-26 11:11:06 +01:00
|
|
|
EXPECT_EQ(-1, fake_call_->GetConfig().bitrate_config.max_bitrate_bps)
|
2014-11-25 14:03:34 +00:00
|
|
|
<< "Setting zero max bitrate did not reset start bitrate.";
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-03-27 15:58:11 +01:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetMaxSendBitrateCanIncreaseSenderBitrate) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec720p);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-27 15:58:11 +01:00
|
|
|
channel_->SetSend(true);
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
|
2016-01-27 16:45:21 +01:00
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2016-01-27 16:45:21 +01:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
|
2015-03-27 15:58:11 +01:00
|
|
|
std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
|
|
|
|
|
int initial_max_bitrate_bps = streams[0].max_bitrate_bps;
|
|
|
|
|
EXPECT_GT(initial_max_bitrate_bps, 0);
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.max_bandwidth_bps = initial_max_bitrate_bps * 2;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2016-01-27 16:45:21 +01:00
|
|
|
// Insert a frame to update the encoder config.
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2015-03-27 15:58:11 +01:00
|
|
|
streams = stream->GetVideoStreams();
|
|
|
|
|
EXPECT_EQ(initial_max_bitrate_bps * 2, streams[0].max_bitrate_bps);
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2015-03-27 15:58:11 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
SetMaxSendBitrateCanIncreaseSimulcastSenderBitrate) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec720p);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-27 15:58:11 +01:00
|
|
|
channel_->SetSend(true);
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream(
|
|
|
|
|
cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3)));
|
|
|
|
|
|
|
|
|
|
// Send a frame to make sure this scales up to >1 stream (simulcast).
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrcs3[0], true, nullptr, &capturer));
|
2015-03-27 15:58:11 +01:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING,
|
|
|
|
|
capturer.Start(capturer.GetSupportedFormats()->front()));
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
|
|
|
|
|
|
|
|
|
std::vector<webrtc::VideoStream> streams = stream->GetVideoStreams();
|
|
|
|
|
ASSERT_GT(streams.size(), 1u)
|
|
|
|
|
<< "Without simulcast this test doesn't make sense.";
|
2015-10-16 12:49:39 -07:00
|
|
|
int initial_max_bitrate_bps = GetTotalMaxBitrateBps(streams);
|
2015-03-27 15:58:11 +01:00
|
|
|
EXPECT_GT(initial_max_bitrate_bps, 0);
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.max_bandwidth_bps = initial_max_bitrate_bps * 2;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2016-01-27 16:45:21 +01:00
|
|
|
// Insert a frame to update the encoder config.
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2015-03-27 15:58:11 +01:00
|
|
|
streams = stream->GetVideoStreams();
|
2015-10-16 12:49:39 -07:00
|
|
|
int increased_max_bitrate_bps = GetTotalMaxBitrateBps(streams);
|
2015-03-27 15:58:11 +01:00
|
|
|
EXPECT_EQ(initial_max_bitrate_bps * 2, increased_max_bitrate_bps);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrcs3[0], true, nullptr, nullptr));
|
2015-03-27 15:58:11 +01:00
|
|
|
}
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsWithMaxQuantization) {
|
|
|
|
|
static const char* kMaxQuantization = "21";
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs[0].params[kCodecParamMaxQuantization] = kMaxQuantization;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2014-06-06 10:49:19 +00:00
|
|
|
EXPECT_EQ(static_cast<unsigned int>(atoi(kMaxQuantization)),
|
|
|
|
|
AddSendStream()->GetVideoStreams().back().max_qp);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
|
|
|
|
VideoCodec codec;
|
|
|
|
|
EXPECT_TRUE(channel_->GetSendCodec(&codec));
|
|
|
|
|
EXPECT_EQ(kMaxQuantization, codec.params[kCodecParamMaxQuantization]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadDimensions) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2014-05-13 11:07:01 +00:00
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs[0].width = 0;
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters))
|
2014-05-13 11:07:01 +00:00
|
|
|
<< "Codec set though codec width is zero.";
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs[0].width = kVp8Codec.width;
|
|
|
|
|
parameters.codecs[0].height = 0;
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters))
|
2014-05-13 11:07:01 +00:00
|
|
|
<< "Codec set though codec height is zero.";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectBadPayloadTypes) {
|
|
|
|
|
// TODO(pbos): Should we only allow the dynamic range?
|
2015-01-28 21:36:55 +00:00
|
|
|
static const int kIncorrectPayloads[] = {-2, -1, 128, 129};
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2015-01-28 21:36:55 +00:00
|
|
|
for (size_t i = 0; i < arraysize(kIncorrectPayloads); ++i) {
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs[0].id = kIncorrectPayloads[i];
|
|
|
|
|
EXPECT_FALSE(channel_->SetSendParameters(parameters))
|
2015-02-23 21:28:22 +00:00
|
|
|
<< "Bad payload type '" << kIncorrectPayloads[i] << "' accepted.";
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsAcceptAllValidPayloadTypes) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2014-05-13 11:07:01 +00:00
|
|
|
for (int payload_type = 0; payload_type <= 127; ++payload_type) {
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs[0].id = payload_type;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters))
|
2014-05-13 11:07:01 +00:00
|
|
|
<< "Payload type '" << payload_type << "' rejected.";
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-04-13 10:07:16 -07:00
|
|
|
// Test that setting the a different set of codecs but with an identical front
|
|
|
|
|
// codec doesn't result in the stream being recreated.
|
|
|
|
|
// This may happen when a subsequent negotiation includes fewer codecs, as a
|
|
|
|
|
// result of one of the codecs being rejected.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
SetSendCodecsIdenticalFirstCodecDoesntRecreateStream) {
|
|
|
|
|
cricket::VideoSendParameters parameters1;
|
|
|
|
|
parameters1.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters1.codecs.push_back(kVp9Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters1));
|
|
|
|
|
|
|
|
|
|
AddSendStream();
|
|
|
|
|
EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
|
|
|
|
|
|
|
|
|
|
cricket::VideoSendParameters parameters2;
|
|
|
|
|
parameters2.codecs.push_back(kVp8Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters2));
|
|
|
|
|
EXPECT_EQ(1, fake_call_->GetNumCreatedSendStreams());
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithOnlyVp8) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-06-13 11:47:28 +00:00
|
|
|
// Test that we set our inbound RTX codecs properly.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithRtx) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2016-04-13 10:07:16 -07:00
|
|
|
cricket::VideoCodec rtx_codec(96, "rtx", 0, 0, 0);
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs.push_back(rtx_codec);
|
|
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters))
|
2014-06-13 11:47:28 +00:00
|
|
|
<< "RTX codec without associated payload should be rejected.";
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs[1].SetParam("apt", kVp8Codec.id + 1);
|
|
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters))
|
2014-06-13 11:47:28 +00:00
|
|
|
<< "RTX codec with invalid associated payload type should be rejected.";
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs[1].SetParam("apt", kVp8Codec.id);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-06-13 11:47:28 +00:00
|
|
|
|
2016-04-13 10:07:16 -07:00
|
|
|
cricket::VideoCodec rtx_codec2(97, "rtx", 0, 0, 0);
|
2014-06-13 11:47:28 +00:00
|
|
|
rtx_codec2.SetParam("apt", rtx_codec.id);
|
2015-09-17 16:42:56 +02:00
|
|
|
parameters.codecs.push_back(rtx_codec2);
|
2014-06-13 11:47:28 +00:00
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters)) <<
|
|
|
|
|
"RTX codec with another RTX as associated payload type should be "
|
|
|
|
|
"rejected.";
|
2014-06-13 11:47:28 +00:00
|
|
|
}
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsDifferentPayloadType) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs[0].id = 99;
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2014-07-11 13:02:54 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsAcceptDefaultCodecs) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs = engine_.codecs();
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-07-11 13:02:54 +00:00
|
|
|
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
2016-06-10 17:58:01 +02:00
|
|
|
const webrtc::VideoReceiveStream::Config& config = stream->GetConfig();
|
2014-10-29 15:28:39 +00:00
|
|
|
EXPECT_EQ(engine_.codecs()[0].name, config.decoders[0].payload_name);
|
|
|
|
|
EXPECT_EQ(engine_.codecs()[0].id, config.decoders[0].payload_type);
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectUnsupportedCodec) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
2016-04-13 10:07:16 -07:00
|
|
|
parameters.codecs.push_back(VideoCodec(101, "WTF3", 640, 400, 30));
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO(pbos): Enable VP9 through external codec support
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
DISABLED_SetRecvCodecsAcceptsMultipleVideoCodecs) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
DISABLED_SetRecvCodecsSetsFecForAllVideoCodecs) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
FAIL(); // TODO(pbos): Verify that the FEC parameters are set for all codecs.
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-18 09:35:58 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsWithoutFecDisablesFec) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters send_parameters;
|
|
|
|
|
send_parameters.codecs.push_back(kVp8Codec);
|
2016-05-17 16:33:30 +02:00
|
|
|
send_parameters.codecs.push_back(kRedCodec);
|
2015-09-17 16:42:56 +02:00
|
|
|
send_parameters.codecs.push_back(kUlpfecCodec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(send_parameters));
|
2014-07-18 09:35:58 +00:00
|
|
|
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
|
2016-06-10 17:58:01 +02:00
|
|
|
EXPECT_EQ(kUlpfecCodec.id, stream->GetConfig().rtp.fec.ulpfec_payload_type);
|
2014-07-18 09:35:58 +00:00
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters recv_parameters;
|
|
|
|
|
recv_parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
|
2014-10-03 11:25:45 +00:00
|
|
|
stream = fake_call_->GetVideoReceiveStreams()[0];
|
2014-07-18 09:35:58 +00:00
|
|
|
ASSERT_TRUE(stream != NULL);
|
2016-06-10 17:58:01 +02:00
|
|
|
EXPECT_EQ(-1, stream->GetConfig().rtp.fec.ulpfec_payload_type)
|
2014-07-18 09:35:58 +00:00
|
|
|
<< "SetSendCodec without FEC should disable current FEC.";
|
2014-06-26 08:49:03 +00:00
|
|
|
}
|
|
|
|
|
|
2016-05-17 16:33:30 +02:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendParamsWithoutFecDisablesReceivingFec) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
2016-06-10 17:58:01 +02:00
|
|
|
EXPECT_EQ(kUlpfecCodec.id, stream->GetConfig().rtp.fec.ulpfec_payload_type);
|
2016-05-17 16:33:30 +02:00
|
|
|
|
|
|
|
|
cricket::VideoRecvParameters recv_parameters;
|
|
|
|
|
recv_parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
recv_parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
recv_parameters.codecs.push_back(kUlpfecCodec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetRecvParameters(recv_parameters));
|
|
|
|
|
stream = fake_call_->GetVideoReceiveStreams()[0];
|
|
|
|
|
ASSERT_TRUE(stream != NULL);
|
2016-06-10 17:58:01 +02:00
|
|
|
EXPECT_EQ(kUlpfecCodec.id, stream->GetConfig().rtp.fec.ulpfec_payload_type)
|
2016-05-17 16:33:30 +02:00
|
|
|
<< "FEC should be enabled on the recieve stream.";
|
|
|
|
|
|
|
|
|
|
cricket::VideoSendParameters send_parameters;
|
|
|
|
|
send_parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(send_parameters));
|
|
|
|
|
stream = fake_call_->GetVideoReceiveStreams()[0];
|
2016-06-10 17:58:01 +02:00
|
|
|
EXPECT_EQ(-1, stream->GetConfig().rtp.fec.ulpfec_payload_type)
|
2016-05-17 16:33:30 +02:00
|
|
|
<< "FEC should have been disabled when we know the other side won't do "
|
|
|
|
|
"FEC.";
|
|
|
|
|
|
|
|
|
|
send_parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
send_parameters.codecs.push_back(kUlpfecCodec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(send_parameters));
|
|
|
|
|
stream = fake_call_->GetVideoReceiveStreams()[0];
|
2016-06-10 17:58:01 +02:00
|
|
|
EXPECT_EQ(kUlpfecCodec.id, stream->GetConfig().rtp.fec.ulpfec_payload_type)
|
2016-05-17 16:33:30 +02:00
|
|
|
<< "FEC should be enabled on the recieve stream.";
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSendCodecsRejectDuplicateFecPayloads) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kRedCodec);
|
|
|
|
|
parameters.codecs[1].id = parameters.codecs[0].id;
|
|
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRecvCodecsRejectDuplicateCodecPayloads) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
parameters.codecs[1].id = parameters.codecs[0].id;
|
|
|
|
|
EXPECT_FALSE(channel_->SetRecvParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
SetRecvCodecsAcceptSameCodecOnMultiplePayloadTypes) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs[1].id += 1;
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2016-04-13 10:07:16 -07:00
|
|
|
// Test that setting the same codecs but with a different order
|
2015-08-20 17:19:20 -07:00
|
|
|
// doesn't result in the stream being recreated.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
2016-04-13 10:07:16 -07:00
|
|
|
SetRecvCodecsDifferentOrderDoesntRecreateStream) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters1;
|
|
|
|
|
parameters1.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters1.codecs.push_back(kRedCodec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters1));
|
2015-08-20 17:19:20 -07:00
|
|
|
|
|
|
|
|
AddRecvStream(cricket::StreamParams::CreateLegacy(123));
|
|
|
|
|
EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
|
|
|
|
|
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoRecvParameters parameters2;
|
|
|
|
|
parameters2.codecs.push_back(kRedCodec);
|
|
|
|
|
parameters2.codecs.push_back(kVp8Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters2));
|
2015-08-20 17:19:20 -07:00
|
|
|
EXPECT_EQ(1, fake_call_->GetNumCreatedReceiveStreams());
|
|
|
|
|
}
|
|
|
|
|
|
2014-05-13 11:07:01 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SendStreamNotSendingByDefault) {
|
|
|
|
|
EXPECT_FALSE(AddSendStream()->IsSending());
|
|
|
|
|
}
|
|
|
|
|
|
2014-07-22 09:14:58 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, ReceiveStreamReceivingByDefault) {
|
|
|
|
|
EXPECT_TRUE(AddRecvStream()->IsReceiving());
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetSend) {
|
2014-07-17 08:51:46 +00:00
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
2014-05-13 11:07:01 +00:00
|
|
|
EXPECT_FALSE(stream->IsSending());
|
|
|
|
|
|
|
|
|
|
// false->true
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
EXPECT_TRUE(stream->IsSending());
|
|
|
|
|
// true->true
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
EXPECT_TRUE(stream->IsSending());
|
|
|
|
|
// true->false
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(false));
|
|
|
|
|
EXPECT_FALSE(stream->IsSending());
|
|
|
|
|
// false->false
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(false));
|
|
|
|
|
EXPECT_FALSE(stream->IsSending());
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
FakeVideoSendStream* new_stream = AddSendStream();
|
|
|
|
|
EXPECT_TRUE(new_stream->IsSending())
|
|
|
|
|
<< "Send stream created after SetSend(true) not sending initially.";
|
|
|
|
|
}
|
|
|
|
|
|
2014-11-10 14:41:43 +00:00
|
|
|
// This test verifies DSCP settings are properly applied on video media channel.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, TestSetDscpOptions) {
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<cricket::FakeNetworkInterface> network_interface(
|
2014-11-10 14:41:43 +00:00
|
|
|
new cricket::FakeNetworkInterface);
|
2016-02-12 02:27:06 -08:00
|
|
|
MediaConfig config;
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel;
|
2016-02-12 02:27:06 -08:00
|
|
|
|
|
|
|
|
channel.reset(engine_.CreateChannel(call_.get(), config, VideoOptions()));
|
|
|
|
|
channel->SetInterface(network_interface.get());
|
|
|
|
|
// Default value when DSCP is disabled should be DSCP_DEFAULT.
|
|
|
|
|
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
|
|
|
|
|
|
|
|
|
|
config.enable_dscp = true;
|
|
|
|
|
channel.reset(engine_.CreateChannel(call_.get(), config, VideoOptions()));
|
|
|
|
|
channel->SetInterface(network_interface.get());
|
2014-11-10 14:41:43 +00:00
|
|
|
EXPECT_EQ(rtc::DSCP_AF41, network_interface->dscp());
|
2016-02-12 02:27:06 -08:00
|
|
|
|
|
|
|
|
// Verify that setting the option to false resets the
|
|
|
|
|
// DiffServCodePoint.
|
|
|
|
|
config.enable_dscp = false;
|
|
|
|
|
channel.reset(engine_.CreateChannel(call_.get(), config, VideoOptions()));
|
|
|
|
|
channel->SetInterface(network_interface.get());
|
2014-11-10 14:41:43 +00:00
|
|
|
EXPECT_EQ(rtc::DSCP_DEFAULT, network_interface->dscp());
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-12-09 12:37:51 -08:00
|
|
|
// This test verifies that the RTCP reduced size mode is properly applied to
|
|
|
|
|
// send video streams.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, TestSetSendRtcpReducedSize) {
|
|
|
|
|
// Create stream, expecting that default mode is "compound".
|
|
|
|
|
FakeVideoSendStream* stream1 = AddSendStream();
|
|
|
|
|
EXPECT_EQ(webrtc::RtcpMode::kCompound, stream1->GetConfig().rtp.rtcp_mode);
|
|
|
|
|
|
|
|
|
|
// Now enable reduced size mode.
|
|
|
|
|
send_parameters_.rtcp.reduced_size = true;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
|
|
|
|
stream1 = fake_call_->GetVideoSendStreams()[0];
|
|
|
|
|
EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream1->GetConfig().rtp.rtcp_mode);
|
|
|
|
|
|
|
|
|
|
// Create a new stream and ensure it picks up the reduced size mode.
|
|
|
|
|
FakeVideoSendStream* stream2 = AddSendStream();
|
|
|
|
|
EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream2->GetConfig().rtp.rtcp_mode);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// This test verifies that the RTCP reduced size mode is properly applied to
|
|
|
|
|
// receive video streams.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, TestSetRecvRtcpReducedSize) {
|
|
|
|
|
// Create stream, expecting that default mode is "compound".
|
|
|
|
|
FakeVideoReceiveStream* stream1 = AddRecvStream();
|
|
|
|
|
EXPECT_EQ(webrtc::RtcpMode::kCompound, stream1->GetConfig().rtp.rtcp_mode);
|
|
|
|
|
|
|
|
|
|
// Now enable reduced size mode.
|
2016-03-18 15:02:07 -07:00
|
|
|
// TODO(deadbeef): Once "recv_parameters" becomes "receiver_parameters",
|
|
|
|
|
// the reduced_size flag should come from that.
|
|
|
|
|
send_parameters_.rtcp.reduced_size = true;
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-12-09 12:37:51 -08:00
|
|
|
stream1 = fake_call_->GetVideoReceiveStreams()[0];
|
|
|
|
|
EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream1->GetConfig().rtp.rtcp_mode);
|
|
|
|
|
|
|
|
|
|
// Create a new stream and ensure it picks up the reduced size mode.
|
|
|
|
|
FakeVideoReceiveStream* stream2 = AddRecvStream();
|
|
|
|
|
EXPECT_EQ(webrtc::RtcpMode::kReducedSize, stream2->GetConfig().rtp.rtcp_mode);
|
|
|
|
|
}
|
|
|
|
|
|
2014-09-03 16:17:12 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, OnReadyToSendSignalsNetworkState) {
|
2016-03-22 15:32:27 -07:00
|
|
|
EXPECT_EQ(webrtc::kNetworkUp,
|
|
|
|
|
fake_call_->GetNetworkState(webrtc::MediaType::VIDEO));
|
|
|
|
|
EXPECT_EQ(webrtc::kNetworkUp,
|
|
|
|
|
fake_call_->GetNetworkState(webrtc::MediaType::AUDIO));
|
2014-09-03 16:17:12 +00:00
|
|
|
|
|
|
|
|
channel_->OnReadyToSend(false);
|
2016-03-22 15:32:27 -07:00
|
|
|
EXPECT_EQ(webrtc::kNetworkDown,
|
|
|
|
|
fake_call_->GetNetworkState(webrtc::MediaType::VIDEO));
|
|
|
|
|
EXPECT_EQ(webrtc::kNetworkUp,
|
|
|
|
|
fake_call_->GetNetworkState(webrtc::MediaType::AUDIO));
|
2014-09-03 16:17:12 +00:00
|
|
|
|
|
|
|
|
channel_->OnReadyToSend(true);
|
2016-03-22 15:32:27 -07:00
|
|
|
EXPECT_EQ(webrtc::kNetworkUp,
|
|
|
|
|
fake_call_->GetNetworkState(webrtc::MediaType::VIDEO));
|
|
|
|
|
EXPECT_EQ(webrtc::kNetworkUp,
|
|
|
|
|
fake_call_->GetNetworkState(webrtc::MediaType::AUDIO));
|
2014-05-13 11:07:01 +00:00
|
|
|
}
|
|
|
|
|
|
2015-03-26 16:28:31 +01:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetStatsReportsSentCodecName) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-03-26 16:28:31 +01:00
|
|
|
|
|
|
|
|
AddSendStream();
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
|
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
EXPECT_EQ(kVp8Codec.name, info.senders[0].codec_name);
|
|
|
|
|
}
|
|
|
|
|
|
2015-12-18 16:01:11 +01:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetStatsReportsEncoderImplementationName) {
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Stats stats;
|
|
|
|
|
stats.encoder_implementation_name = "encoder_implementation_name";
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
|
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
EXPECT_EQ(stats.encoder_implementation_name,
|
|
|
|
|
info.senders[0].encoder_implementation_name);
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-26 12:19:31 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetStatsReportsCpuOveruseMetrics) {
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Stats stats;
|
|
|
|
|
stats.avg_encode_time_ms = 13;
|
|
|
|
|
stats.encode_usage_percent = 42;
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2015-02-26 12:19:31 +00:00
|
|
|
EXPECT_EQ(stats.avg_encode_time_ms, info.senders[0].avg_encode_ms);
|
|
|
|
|
EXPECT_EQ(stats.encode_usage_percent, info.senders[0].encode_usage_percent);
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-01 15:23:21 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetStatsReportsUpperResolution) {
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Stats stats;
|
2015-02-25 10:42:16 +00:00
|
|
|
stats.substreams[17].width = 123;
|
|
|
|
|
stats.substreams[17].height = 40;
|
|
|
|
|
stats.substreams[42].width = 80;
|
|
|
|
|
stats.substreams[42].height = 31;
|
|
|
|
|
stats.substreams[11].width = 20;
|
|
|
|
|
stats.substreams[11].height = 90;
|
2014-12-01 15:23:21 +00:00
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2014-12-01 15:23:21 +00:00
|
|
|
ASSERT_EQ(1u, info.senders.size());
|
|
|
|
|
EXPECT_EQ(123, info.senders[0].send_frame_width);
|
|
|
|
|
EXPECT_EQ(90, info.senders[0].send_frame_height);
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-26 10:03:39 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationStats) {
|
|
|
|
|
AddSendStream(cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3)));
|
|
|
|
|
|
|
|
|
|
// Capture format VGA.
|
|
|
|
|
cricket::FakeVideoCapturer video_capturer_vga;
|
|
|
|
|
const std::vector<cricket::VideoFormat>* formats =
|
|
|
|
|
video_capturer_vga.GetSupportedFormats();
|
|
|
|
|
cricket::VideoFormat capture_format_vga = (*formats)[1];
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING, video_capturer_vga.Start(capture_format_vga));
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel_->SetVideoSend(kSsrcs3[0], true, nullptr, &video_capturer_vga));
|
2015-02-26 10:03:39 +00:00
|
|
|
EXPECT_TRUE(video_capturer_vga.CaptureFrame());
|
|
|
|
|
|
2016-04-13 10:07:16 -07:00
|
|
|
cricket::VideoCodec send_codec(100, "VP8", 640, 480, 30);
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(send_codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
2015-02-26 10:03:39 +00:00
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
// Verify that the CpuOveruseObserver is registered and trigger downgrade.
|
2015-09-08 05:13:22 -07:00
|
|
|
|
2015-02-26 10:03:39 +00:00
|
|
|
// Trigger overuse.
|
2015-09-08 05:13:22 -07:00
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
|
2015-02-26 10:03:39 +00:00
|
|
|
webrtc::LoadObserver* overuse_callback =
|
2015-09-08 05:13:22 -07:00
|
|
|
fake_call_->GetVideoSendStreams().front()->GetConfig().overuse_callback;
|
|
|
|
|
ASSERT_TRUE(overuse_callback != NULL);
|
2015-02-26 10:03:39 +00:00
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
|
|
|
|
|
|
|
|
|
|
// Capture format VGA -> adapt (OnCpuResolutionRequest downgrade) -> VGA/2.
|
|
|
|
|
EXPECT_TRUE(video_capturer_vga.CaptureFrame());
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
2015-02-26 10:03:39 +00:00
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
|
|
|
|
EXPECT_EQ(1, info.senders[0].adapt_changes);
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU, info.senders[0].adapt_reason);
|
2015-02-26 10:03:39 +00:00
|
|
|
|
|
|
|
|
// Trigger upgrade and verify that we adapt back up to VGA.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
|
|
|
|
|
EXPECT_TRUE(video_capturer_vga.CaptureFrame());
|
|
|
|
|
info.Clear();
|
2015-03-04 08:54:32 +00:00
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
2015-02-26 10:03:39 +00:00
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
|
|
|
|
EXPECT_EQ(2, info.senders[0].adapt_changes);
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_NONE,
|
2015-02-26 10:03:39 +00:00
|
|
|
info.senders[0].adapt_reason);
|
|
|
|
|
|
|
|
|
|
// No capturer (no adapter). Adapt changes from old adapter should be kept.
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrcs3[0], true, nullptr, nullptr));
|
2015-02-26 10:03:39 +00:00
|
|
|
info.Clear();
|
2015-03-04 08:54:32 +00:00
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
2015-02-26 10:03:39 +00:00
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
|
|
|
|
EXPECT_EQ(2, info.senders[0].adapt_changes);
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_NONE,
|
2015-02-26 10:03:39 +00:00
|
|
|
info.senders[0].adapt_reason);
|
|
|
|
|
|
|
|
|
|
// Set new capturer, capture format HD.
|
|
|
|
|
cricket::FakeVideoCapturer video_capturer_hd;
|
|
|
|
|
cricket::VideoFormat capture_format_hd = (*formats)[0];
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING, video_capturer_hd.Start(capture_format_hd));
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel_->SetVideoSend(kSsrcs3[0], true, nullptr, &video_capturer_hd));
|
2015-02-26 10:03:39 +00:00
|
|
|
EXPECT_TRUE(video_capturer_hd.CaptureFrame());
|
|
|
|
|
|
|
|
|
|
// Trigger overuse, HD -> adapt (OnCpuResolutionRequest downgrade) -> HD/2.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
|
|
|
|
|
EXPECT_TRUE(video_capturer_hd.CaptureFrame());
|
|
|
|
|
info.Clear();
|
2015-03-04 08:54:32 +00:00
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
2015-02-26 10:03:39 +00:00
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
|
|
|
|
EXPECT_EQ(3, info.senders[0].adapt_changes);
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU, info.senders[0].adapt_reason);
|
2015-02-26 10:03:39 +00:00
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrcs3[0], true, nullptr, nullptr));
|
2015-02-26 10:03:39 +00:00
|
|
|
}
|
|
|
|
|
|
2015-12-14 02:08:12 -08:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetStatsTracksAdaptationAndBandwidthStats) {
|
|
|
|
|
AddSendStream(cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kSsrcs3)));
|
|
|
|
|
|
|
|
|
|
// Capture format VGA.
|
|
|
|
|
cricket::FakeVideoCapturer video_capturer_vga;
|
|
|
|
|
const std::vector<cricket::VideoFormat>* formats =
|
|
|
|
|
video_capturer_vga.GetSupportedFormats();
|
|
|
|
|
cricket::VideoFormat capture_format_vga = (*formats)[1];
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING, video_capturer_vga.Start(capture_format_vga));
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel_->SetVideoSend(kSsrcs3[0], true, nullptr, &video_capturer_vga));
|
2015-12-14 02:08:12 -08:00
|
|
|
EXPECT_TRUE(video_capturer_vga.CaptureFrame());
|
|
|
|
|
|
2016-04-13 10:07:16 -07:00
|
|
|
cricket::VideoCodec send_codec(100, "VP8", 640, 480, 30);
|
2015-12-14 02:08:12 -08:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(send_codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
// Verify that the CpuOveruseObserver is registered and trigger downgrade.
|
|
|
|
|
|
|
|
|
|
// Trigger overuse -> adapt CPU.
|
|
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
|
|
|
|
|
webrtc::LoadObserver* overuse_callback =
|
|
|
|
|
fake_call_->GetVideoSendStreams().front()->GetConfig().overuse_callback;
|
|
|
|
|
ASSERT_TRUE(overuse_callback != NULL);
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kOveruse);
|
|
|
|
|
EXPECT_TRUE(video_capturer_vga.CaptureFrame());
|
|
|
|
|
cricket::VideoMediaInfo info;
|
|
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU, info.senders[0].adapt_reason);
|
2015-12-14 02:08:12 -08:00
|
|
|
|
|
|
|
|
// Set bandwidth limitation stats for the stream -> adapt CPU + BW.
|
|
|
|
|
webrtc::VideoSendStream::Stats stats;
|
|
|
|
|
stats.bw_limited_resolution = true;
|
|
|
|
|
fake_call_->GetVideoSendStreams().front()->SetStats(stats);
|
|
|
|
|
info.Clear();
|
|
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_CPU |
|
|
|
|
|
WebRtcVideoChannel2::ADAPTREASON_BANDWIDTH,
|
2015-12-14 02:08:12 -08:00
|
|
|
info.senders[0].adapt_reason);
|
|
|
|
|
|
|
|
|
|
// Trigger upgrade -> adapt BW.
|
|
|
|
|
overuse_callback->OnLoadUpdate(webrtc::LoadObserver::kUnderuse);
|
|
|
|
|
EXPECT_TRUE(video_capturer_vga.CaptureFrame());
|
|
|
|
|
info.Clear();
|
|
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_BANDWIDTH,
|
2015-12-14 02:08:12 -08:00
|
|
|
info.senders[0].adapt_reason);
|
|
|
|
|
|
|
|
|
|
// Reset bandwidth limitation state -> adapt NONE.
|
|
|
|
|
stats.bw_limited_resolution = false;
|
|
|
|
|
fake_call_->GetVideoSendStreams().front()->SetStats(stats);
|
|
|
|
|
info.Clear();
|
|
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_NONE,
|
2015-12-14 02:08:12 -08:00
|
|
|
info.senders[0].adapt_reason);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(kSsrcs3[0], true, nullptr, nullptr));
|
2015-12-14 02:08:12 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
GetStatsTranslatesBandwidthLimitedResolutionCorrectly) {
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Stats stats;
|
|
|
|
|
stats.bw_limited_resolution = true;
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
|
|
|
|
EXPECT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
ASSERT_EQ(1U, info.senders.size());
|
2016-04-05 15:23:49 +02:00
|
|
|
EXPECT_EQ(WebRtcVideoChannel2::ADAPTREASON_BANDWIDTH,
|
2015-12-14 02:08:12 -08:00
|
|
|
info.senders[0].adapt_reason);
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-19 12:47:00 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
GetStatsTranslatesSendRtcpPacketTypesCorrectly) {
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Stats stats;
|
|
|
|
|
stats.substreams[17].rtcp_packet_type_counts.fir_packets = 2;
|
|
|
|
|
stats.substreams[17].rtcp_packet_type_counts.nack_packets = 3;
|
|
|
|
|
stats.substreams[17].rtcp_packet_type_counts.pli_packets = 4;
|
|
|
|
|
|
|
|
|
|
stats.substreams[42].rtcp_packet_type_counts.fir_packets = 5;
|
|
|
|
|
stats.substreams[42].rtcp_packet_type_counts.nack_packets = 7;
|
|
|
|
|
stats.substreams[42].rtcp_packet_type_counts.pli_packets = 9;
|
|
|
|
|
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2015-02-19 12:47:00 +00:00
|
|
|
EXPECT_EQ(7, info.senders[0].firs_rcvd);
|
|
|
|
|
EXPECT_EQ(10, info.senders[0].nacks_rcvd);
|
|
|
|
|
EXPECT_EQ(13, info.senders[0].plis_rcvd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
GetStatsTranslatesReceiveRtcpPacketTypesCorrectly) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
webrtc::VideoReceiveStream::Stats stats;
|
|
|
|
|
stats.rtcp_packet_type_counts.fir_packets = 2;
|
|
|
|
|
stats.rtcp_packet_type_counts.nack_packets = 3;
|
|
|
|
|
stats.rtcp_packet_type_counts.pli_packets = 4;
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2015-02-19 12:47:00 +00:00
|
|
|
EXPECT_EQ(stats.rtcp_packet_type_counts.fir_packets,
|
|
|
|
|
info.receivers[0].firs_sent);
|
|
|
|
|
EXPECT_EQ(stats.rtcp_packet_type_counts.nack_packets,
|
|
|
|
|
info.receivers[0].nacks_sent);
|
|
|
|
|
EXPECT_EQ(stats.rtcp_packet_type_counts.pli_packets,
|
|
|
|
|
info.receivers[0].plis_sent);
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-25 10:42:16 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetStatsTranslatesDecodeStatsCorrectly) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
webrtc::VideoReceiveStream::Stats stats;
|
2015-12-18 16:01:11 +01:00
|
|
|
stats.decoder_implementation_name = "decoder_implementation_name";
|
2015-02-25 10:42:16 +00:00
|
|
|
stats.decode_ms = 2;
|
|
|
|
|
stats.max_decode_ms = 3;
|
|
|
|
|
stats.current_delay_ms = 4;
|
|
|
|
|
stats.target_delay_ms = 5;
|
|
|
|
|
stats.jitter_buffer_ms = 6;
|
|
|
|
|
stats.min_playout_delay_ms = 7;
|
|
|
|
|
stats.render_delay_ms = 8;
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2015-12-18 16:01:11 +01:00
|
|
|
EXPECT_EQ(stats.decoder_implementation_name,
|
|
|
|
|
info.receivers[0].decoder_implementation_name);
|
2015-02-25 10:42:16 +00:00
|
|
|
EXPECT_EQ(stats.decode_ms, info.receivers[0].decode_ms);
|
|
|
|
|
EXPECT_EQ(stats.max_decode_ms, info.receivers[0].max_decode_ms);
|
|
|
|
|
EXPECT_EQ(stats.current_delay_ms, info.receivers[0].current_delay_ms);
|
|
|
|
|
EXPECT_EQ(stats.target_delay_ms, info.receivers[0].target_delay_ms);
|
|
|
|
|
EXPECT_EQ(stats.jitter_buffer_ms, info.receivers[0].jitter_buffer_ms);
|
|
|
|
|
EXPECT_EQ(stats.min_playout_delay_ms, info.receivers[0].min_playout_delay_ms);
|
|
|
|
|
EXPECT_EQ(stats.render_delay_ms, info.receivers[0].render_delay_ms);
|
|
|
|
|
}
|
|
|
|
|
|
2015-04-22 14:52:45 +02:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetStatsTranslatesReceivePacketStatsCorrectly) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
webrtc::VideoReceiveStream::Stats stats;
|
|
|
|
|
stats.rtp_stats.transmitted.payload_bytes = 2;
|
|
|
|
|
stats.rtp_stats.transmitted.header_bytes = 3;
|
|
|
|
|
stats.rtp_stats.transmitted.padding_bytes = 4;
|
|
|
|
|
stats.rtp_stats.transmitted.packets = 5;
|
|
|
|
|
stats.rtcp_stats.cumulative_lost = 6;
|
|
|
|
|
stats.rtcp_stats.fraction_lost = 7;
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
|
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
EXPECT_EQ(stats.rtp_stats.transmitted.payload_bytes +
|
|
|
|
|
stats.rtp_stats.transmitted.header_bytes +
|
|
|
|
|
stats.rtp_stats.transmitted.padding_bytes,
|
|
|
|
|
info.receivers[0].bytes_rcvd);
|
|
|
|
|
EXPECT_EQ(stats.rtp_stats.transmitted.packets,
|
|
|
|
|
info.receivers[0].packets_rcvd);
|
|
|
|
|
EXPECT_EQ(stats.rtcp_stats.cumulative_lost, info.receivers[0].packets_lost);
|
|
|
|
|
EXPECT_EQ(static_cast<float>(stats.rtcp_stats.fraction_lost) / (1 << 8),
|
|
|
|
|
info.receivers[0].fraction_lost);
|
|
|
|
|
}
|
|
|
|
|
|
2014-12-11 13:26:09 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, TranslatesCallStatsCorrectly) {
|
|
|
|
|
AddSendStream();
|
|
|
|
|
AddSendStream();
|
|
|
|
|
webrtc::Call::Stats stats;
|
|
|
|
|
stats.rtt_ms = 123;
|
|
|
|
|
fake_call_->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2014-12-11 13:26:09 +00:00
|
|
|
ASSERT_EQ(2u, info.senders.size());
|
|
|
|
|
EXPECT_EQ(stats.rtt_ms, info.senders[0].rtt_ms);
|
|
|
|
|
EXPECT_EQ(stats.rtt_ms, info.senders[1].rtt_ms);
|
|
|
|
|
}
|
|
|
|
|
|
2015-02-23 16:39:07 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, TranslatesSenderBitrateStatsCorrectly) {
|
|
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Stats stats;
|
2015-02-26 13:15:22 +00:00
|
|
|
stats.target_media_bitrate_bps = 156;
|
2015-02-23 16:39:07 +00:00
|
|
|
stats.media_bitrate_bps = 123;
|
|
|
|
|
stats.substreams[17].total_bitrate_bps = 1;
|
|
|
|
|
stats.substreams[17].retransmit_bitrate_bps = 2;
|
|
|
|
|
stats.substreams[42].total_bitrate_bps = 3;
|
|
|
|
|
stats.substreams[42].retransmit_bitrate_bps = 4;
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream2 = AddSendStream();
|
|
|
|
|
webrtc::VideoSendStream::Stats stats2;
|
2015-02-26 13:15:22 +00:00
|
|
|
stats2.target_media_bitrate_bps = 200;
|
2015-02-23 16:39:07 +00:00
|
|
|
stats2.media_bitrate_bps = 321;
|
|
|
|
|
stats2.substreams[13].total_bitrate_bps = 5;
|
|
|
|
|
stats2.substreams[13].retransmit_bitrate_bps = 6;
|
|
|
|
|
stats2.substreams[21].total_bitrate_bps = 7;
|
|
|
|
|
stats2.substreams[21].retransmit_bitrate_bps = 8;
|
|
|
|
|
stream2->SetStats(stats2);
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2015-02-23 16:39:07 +00:00
|
|
|
ASSERT_EQ(2u, info.senders.size());
|
|
|
|
|
// Assuming stream and stream2 corresponds to senders[0] and [1] respectively
|
|
|
|
|
// is OK as std::maps are sorted and AddSendStream() gives increasing SSRCs.
|
|
|
|
|
EXPECT_EQ(stats.media_bitrate_bps, info.senders[0].nominal_bitrate);
|
|
|
|
|
EXPECT_EQ(stats2.media_bitrate_bps, info.senders[1].nominal_bitrate);
|
2015-02-26 13:15:22 +00:00
|
|
|
EXPECT_EQ(stats.target_media_bitrate_bps + stats2.target_media_bitrate_bps,
|
|
|
|
|
info.bw_estimations[0].target_enc_bitrate);
|
2015-02-23 16:39:07 +00:00
|
|
|
EXPECT_EQ(stats.media_bitrate_bps + stats2.media_bitrate_bps,
|
|
|
|
|
info.bw_estimations[0].actual_enc_bitrate);
|
|
|
|
|
EXPECT_EQ(1 + 3 + 5 + 7, info.bw_estimations[0].transmit_bitrate)
|
|
|
|
|
<< "Bandwidth stats should take all streams into account.";
|
|
|
|
|
EXPECT_EQ(2 + 4 + 6 + 8, info.bw_estimations[0].retransmit_bitrate)
|
|
|
|
|
<< "Bandwidth stats should take all streams into account.";
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-06 15:35:19 +00:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, DefaultReceiveStreamReconfiguresToUseRtx) {
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-06 15:35:19 +00:00
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
|
|
|
|
|
const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
|
2015-03-06 15:35:19 +00:00
|
|
|
|
|
|
|
|
ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
|
|
|
|
|
const size_t kDataLength = 12;
|
|
|
|
|
uint8_t data[kDataLength];
|
|
|
|
|
memset(data, 0, sizeof(data));
|
|
|
|
|
rtc::SetBE32(&data[8], ssrcs[0]);
|
2016-03-20 06:15:43 -07:00
|
|
|
rtc::CopyOnWriteBuffer packet(data, kDataLength);
|
2015-03-06 15:35:19 +00:00
|
|
|
rtc::PacketTime packet_time;
|
|
|
|
|
channel_->OnPacketReceived(&packet, packet_time);
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
|
|
|
|
|
<< "No default receive stream created.";
|
|
|
|
|
FakeVideoReceiveStream* recv_stream = fake_call_->GetVideoReceiveStreams()[0];
|
2016-05-12 16:44:36 +02:00
|
|
|
EXPECT_TRUE(recv_stream->GetConfig().rtp.rtx.empty())
|
2015-03-06 15:35:19 +00:00
|
|
|
<< "Default receive stream should not have configured RTX";
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(
|
|
|
|
|
cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs)));
|
|
|
|
|
ASSERT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
|
|
|
|
|
<< "AddRecvStream should've reconfigured, not added a new receiver.";
|
|
|
|
|
recv_stream = fake_call_->GetVideoReceiveStreams()[0];
|
2016-05-12 16:44:36 +02:00
|
|
|
EXPECT_FALSE(recv_stream->GetConfig().rtp.rtx.empty());
|
|
|
|
|
EXPECT_EQ(recv_stream->GetConfig().decoders.size(),
|
|
|
|
|
recv_stream->GetConfig().rtp.rtx.size())
|
|
|
|
|
<< "RTX should be mapped for all decoders/payload types.";
|
|
|
|
|
for (const auto& kv : recv_stream->GetConfig().rtp.rtx) {
|
|
|
|
|
EXPECT_EQ(rtx_ssrcs[0], kv.second.ssrc);
|
|
|
|
|
}
|
2015-03-06 15:35:19 +00:00
|
|
|
}
|
|
|
|
|
|
2015-03-25 14:17:23 +01:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RejectsAddingStreamsWithMissingSsrcsForRtx) {
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2014-12-10 09:01:18 +00:00
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
|
|
|
|
|
const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
|
2014-12-10 09:01:18 +00:00
|
|
|
|
2015-03-25 14:17:23 +01:00
|
|
|
StreamParams sp =
|
|
|
|
|
cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs);
|
|
|
|
|
sp.ssrcs = ssrcs; // Without RTXs, this is the important part.
|
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(channel_->AddSendStream(sp));
|
|
|
|
|
EXPECT_FALSE(channel_->AddRecvStream(sp));
|
|
|
|
|
}
|
|
|
|
|
|
2015-03-26 16:23:04 +01:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, RejectsAddingStreamsWithOverlappingRtxSsrcs) {
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-26 16:23:04 +01:00
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
const std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs1);
|
|
|
|
|
const std::vector<uint32_t> rtx_ssrcs = MAKE_VECTOR(kRtxSsrcs1);
|
2015-03-26 16:23:04 +01:00
|
|
|
|
|
|
|
|
StreamParams sp =
|
|
|
|
|
cricket::CreateSimWithRtxStreamParams("cname", ssrcs, rtx_ssrcs);
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(sp));
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
|
|
|
|
|
// The RTX SSRC is already used in previous streams, using it should fail.
|
|
|
|
|
sp = cricket::StreamParams::CreateLegacy(rtx_ssrcs[0]);
|
|
|
|
|
EXPECT_FALSE(channel_->AddSendStream(sp));
|
|
|
|
|
EXPECT_FALSE(channel_->AddRecvStream(sp));
|
|
|
|
|
|
|
|
|
|
// After removing the original stream this should be fine to add (makes sure
|
|
|
|
|
// that RTX ssrcs are not forever taken).
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveSendStream(ssrcs[0]));
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(ssrcs[0]));
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(sp));
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
|
|
|
|
RejectsAddingStreamsWithOverlappingSimulcastSsrcs) {
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
static const uint32_t kFirstStreamSsrcs[] = {1, 2, 3};
|
|
|
|
|
static const uint32_t kOverlappingStreamSsrcs[] = {4, 3, 5};
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-03-26 16:23:04 +01:00
|
|
|
|
|
|
|
|
StreamParams sp =
|
|
|
|
|
cricket::CreateSimStreamParams("cname", MAKE_VECTOR(kFirstStreamSsrcs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(sp));
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
|
|
|
|
|
// One of the SSRCs is already used in previous streams, using it should fail.
|
|
|
|
|
sp = cricket::CreateSimStreamParams("cname",
|
|
|
|
|
MAKE_VECTOR(kOverlappingStreamSsrcs));
|
|
|
|
|
EXPECT_FALSE(channel_->AddSendStream(sp));
|
|
|
|
|
EXPECT_FALSE(channel_->AddRecvStream(sp));
|
|
|
|
|
|
|
|
|
|
// After removing the original stream this should be fine to add (makes sure
|
|
|
|
|
// that RTX ssrcs are not forever taken).
|
2015-05-22 18:48:36 +02:00
|
|
|
EXPECT_TRUE(channel_->RemoveSendStream(kFirstStreamSsrcs[0]));
|
|
|
|
|
EXPECT_TRUE(channel_->RemoveRecvStream(kFirstStreamSsrcs[0]));
|
2015-03-26 16:23:04 +01:00
|
|
|
EXPECT_TRUE(channel_->AddSendStream(sp));
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
}
|
|
|
|
|
|
2015-05-28 13:39:50 +02:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, ReportsSsrcGroupsInStats) {
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-05-28 13:39:50 +02:00
|
|
|
|
|
|
|
|
static const uint32_t kSenderSsrcs[] = {4, 7, 10};
|
|
|
|
|
static const uint32_t kSenderRtxSsrcs[] = {5, 8, 11};
|
|
|
|
|
|
|
|
|
|
StreamParams sender_sp = cricket::CreateSimWithRtxStreamParams(
|
|
|
|
|
"cname", MAKE_VECTOR(kSenderSsrcs), MAKE_VECTOR(kSenderRtxSsrcs));
|
|
|
|
|
|
|
|
|
|
EXPECT_TRUE(channel_->AddSendStream(sender_sp));
|
|
|
|
|
|
|
|
|
|
static const uint32_t kReceiverSsrcs[] = {3};
|
|
|
|
|
static const uint32_t kReceiverRtxSsrcs[] = {2};
|
|
|
|
|
|
|
|
|
|
StreamParams receiver_sp = cricket::CreateSimWithRtxStreamParams(
|
|
|
|
|
"cname", MAKE_VECTOR(kReceiverSsrcs), MAKE_VECTOR(kReceiverRtxSsrcs));
|
|
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(receiver_sp));
|
|
|
|
|
|
|
|
|
|
cricket::VideoMediaInfo info;
|
|
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(1u, info.senders.size());
|
|
|
|
|
ASSERT_EQ(1u, info.receivers.size());
|
|
|
|
|
|
|
|
|
|
EXPECT_NE(sender_sp.ssrc_groups, receiver_sp.ssrc_groups);
|
|
|
|
|
EXPECT_EQ(sender_sp.ssrc_groups, info.senders[0].ssrc_groups);
|
|
|
|
|
EXPECT_EQ(receiver_sp.ssrc_groups, info.receivers[0].ssrc_groups);
|
|
|
|
|
}
|
|
|
|
|
|
2015-08-28 07:35:32 -07:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, MapsReceivedPayloadTypeToCodecName) {
|
|
|
|
|
FakeVideoReceiveStream* stream = AddRecvStream();
|
|
|
|
|
webrtc::VideoReceiveStream::Stats stats;
|
|
|
|
|
cricket::VideoMediaInfo info;
|
|
|
|
|
|
|
|
|
|
// Report no codec name before receiving.
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
EXPECT_STREQ("", info.receivers[0].codec_name.c_str());
|
|
|
|
|
|
|
|
|
|
// Report VP8 if we're receiving it.
|
|
|
|
|
stats.current_payload_type = kDefaultVp8PlType;
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
EXPECT_STREQ(kVp8CodecName, info.receivers[0].codec_name.c_str());
|
|
|
|
|
|
|
|
|
|
// Report no codec name for unknown playload types.
|
|
|
|
|
stats.current_payload_type = 3;
|
|
|
|
|
stream->SetStats(stats);
|
|
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
|
|
|
|
EXPECT_STREQ("", info.receivers[0].codec_name.c_str());
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-10 11:27:55 -07:00
|
|
|
void WebRtcVideoChannel2Test::TestReceiveUnsignalledSsrcPacket(
|
|
|
|
|
uint8_t payload_type,
|
|
|
|
|
bool expect_created_receive_stream) {
|
|
|
|
|
// Add a RED RTX codec.
|
|
|
|
|
VideoCodec red_rtx_codec =
|
|
|
|
|
VideoCodec::CreateRtxCodec(kRedRtxPayloadType, kDefaultRedPlType);
|
2015-09-17 16:42:56 +02:00
|
|
|
recv_parameters_.codecs.push_back(red_rtx_codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(recv_parameters_));
|
2015-07-10 11:27:55 -07:00
|
|
|
|
|
|
|
|
ASSERT_EQ(0u, fake_call_->GetVideoReceiveStreams().size());
|
|
|
|
|
const size_t kDataLength = 12;
|
|
|
|
|
uint8_t data[kDataLength];
|
|
|
|
|
memset(data, 0, sizeof(data));
|
|
|
|
|
|
|
|
|
|
rtc::Set8(data, 1, payload_type);
|
|
|
|
|
rtc::SetBE32(&data[8], kIncomingUnsignalledSsrc);
|
2016-03-20 06:15:43 -07:00
|
|
|
rtc::CopyOnWriteBuffer packet(data, kDataLength);
|
2015-07-10 11:27:55 -07:00
|
|
|
rtc::PacketTime packet_time;
|
|
|
|
|
channel_->OnPacketReceived(&packet, packet_time);
|
|
|
|
|
|
|
|
|
|
if (expect_created_receive_stream) {
|
|
|
|
|
EXPECT_EQ(1u, fake_call_->GetVideoReceiveStreams().size())
|
|
|
|
|
<< "Should have created a receive stream for payload type: "
|
|
|
|
|
<< payload_type;
|
|
|
|
|
} else {
|
|
|
|
|
EXPECT_EQ(0u, fake_call_->GetVideoReceiveStreams().size())
|
|
|
|
|
<< "Shouldn't have created a receive stream for payload type: "
|
|
|
|
|
<< payload_type;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, Vp8PacketCreatesUnsignalledStream) {
|
|
|
|
|
TestReceiveUnsignalledSsrcPacket(kDefaultVp8PlType, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, Vp9PacketCreatesUnsignalledStream) {
|
|
|
|
|
TestReceiveUnsignalledSsrcPacket(kDefaultVp9PlType, true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, RtxPacketDoesntCreateUnsignalledStream) {
|
|
|
|
|
TestReceiveUnsignalledSsrcPacket(kDefaultRtxVp8PlType, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, UlpfecPacketDoesntCreateUnsignalledStream) {
|
|
|
|
|
TestReceiveUnsignalledSsrcPacket(kDefaultUlpfecType, false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, RedRtxPacketDoesntCreateUnsignalledStream) {
|
|
|
|
|
TestReceiveUnsignalledSsrcPacket(kRedRtxPayloadType, false);
|
|
|
|
|
}
|
|
|
|
|
|
2016-03-16 19:07:43 -07:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, CanSentMaxBitrateForExistingStream) {
|
|
|
|
|
AddSendStream();
|
|
|
|
|
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, &capturer));
|
2016-03-16 19:07:43 -07:00
|
|
|
cricket::VideoFormat capture_format_hd =
|
|
|
|
|
capturer.GetSupportedFormats()->front();
|
|
|
|
|
EXPECT_EQ(1280, capture_format_hd.width);
|
|
|
|
|
EXPECT_EQ(720, capture_format_hd.height);
|
|
|
|
|
EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
|
|
|
|
|
int default_encoder_bitrate = GetMaxEncoderBitrate(capturer);
|
|
|
|
|
EXPECT_TRUE(default_encoder_bitrate > 1000);
|
|
|
|
|
|
|
|
|
|
// TODO(skvlad): Resolve the inconsistency between the interpretation
|
|
|
|
|
// of the global bitrate limit for audio and video:
|
|
|
|
|
// - Audio: max_bandwidth_bps = 0 - fail the operation,
|
|
|
|
|
// max_bandwidth_bps = -1 - remove the bandwidth limit
|
|
|
|
|
// - Video: max_bandwidth_bps = 0 - remove the bandwidth limit,
|
|
|
|
|
// max_bandwidth_bps = -1 - do not change the previously set
|
|
|
|
|
// limit.
|
|
|
|
|
|
|
|
|
|
SetAndExpectMaxBitrate(capturer, 1000, 0, 1000);
|
|
|
|
|
SetAndExpectMaxBitrate(capturer, 1000, 800, 800);
|
|
|
|
|
SetAndExpectMaxBitrate(capturer, 600, 800, 600);
|
|
|
|
|
SetAndExpectMaxBitrate(capturer, 0, 800, 800);
|
|
|
|
|
SetAndExpectMaxBitrate(capturer, 0, 0, default_encoder_bitrate);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(last_ssrc_, true, nullptr, nullptr));
|
2016-03-16 19:07:43 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, CannotSetMaxBitrateForNonexistentStream) {
|
|
|
|
|
webrtc::RtpParameters nonexistent_parameters =
|
2016-05-16 11:40:30 -07:00
|
|
|
channel_->GetRtpSendParameters(last_ssrc_);
|
2016-03-16 19:07:43 -07:00
|
|
|
EXPECT_EQ(0, nonexistent_parameters.encodings.size());
|
|
|
|
|
|
|
|
|
|
nonexistent_parameters.encodings.push_back(webrtc::RtpEncodingParameters());
|
2016-05-16 11:40:30 -07:00
|
|
|
EXPECT_FALSE(
|
|
|
|
|
channel_->SetRtpSendParameters(last_ssrc_, nonexistent_parameters));
|
2016-03-16 19:07:43 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test,
|
2016-05-16 11:40:30 -07:00
|
|
|
CannotSetRtpSendParametersWithIncorrectNumberOfEncodings) {
|
2016-03-16 19:07:43 -07:00
|
|
|
// This test verifies that setting RtpParameters succeeds only if
|
|
|
|
|
// the structure contains exactly one encoding.
|
2016-03-22 15:42:00 -07:00
|
|
|
// TODO(skvlad): Update this test when we start supporting setting parameters
|
2016-03-16 19:07:43 -07:00
|
|
|
// for each encoding individually.
|
|
|
|
|
|
|
|
|
|
AddSendStream();
|
|
|
|
|
// Setting RtpParameters with no encoding is expected to fail.
|
2016-05-16 11:40:30 -07:00
|
|
|
webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(last_ssrc_);
|
|
|
|
|
parameters.encodings.clear();
|
|
|
|
|
EXPECT_FALSE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
|
2016-03-16 19:07:43 -07:00
|
|
|
// Setting RtpParameters with exactly one encoding should succeed.
|
|
|
|
|
parameters.encodings.push_back(webrtc::RtpEncodingParameters());
|
2016-05-16 11:40:30 -07:00
|
|
|
EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
|
2016-03-16 19:07:43 -07:00
|
|
|
// Two or more encodings should result in failure.
|
|
|
|
|
parameters.encodings.push_back(webrtc::RtpEncodingParameters());
|
2016-05-16 11:40:30 -07:00
|
|
|
EXPECT_FALSE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
|
2016-03-16 19:07:43 -07:00
|
|
|
}
|
|
|
|
|
|
2016-03-22 15:42:00 -07:00
|
|
|
// Test that a stream will not be sending if its encoding is made
|
2016-05-16 11:40:30 -07:00
|
|
|
// inactive through SetRtpSendParameters.
|
2016-03-22 15:42:00 -07:00
|
|
|
// TODO(deadbeef): Update this test when we start supporting setting parameters
|
|
|
|
|
// for each encoding individually.
|
2016-05-16 11:40:30 -07:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetRtpSendParametersEncodingsActive) {
|
2016-03-22 15:42:00 -07:00
|
|
|
FakeVideoSendStream* stream = AddSendStream();
|
|
|
|
|
EXPECT_TRUE(channel_->SetSend(true));
|
|
|
|
|
EXPECT_TRUE(stream->IsSending());
|
|
|
|
|
|
|
|
|
|
// Get current parameters and change "active" to false.
|
2016-05-16 11:40:30 -07:00
|
|
|
webrtc::RtpParameters parameters = channel_->GetRtpSendParameters(last_ssrc_);
|
2016-03-22 15:42:00 -07:00
|
|
|
ASSERT_EQ(1u, parameters.encodings.size());
|
|
|
|
|
ASSERT_TRUE(parameters.encodings[0].active);
|
|
|
|
|
parameters.encodings[0].active = false;
|
2016-05-16 11:40:30 -07:00
|
|
|
EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
|
2016-03-22 15:42:00 -07:00
|
|
|
EXPECT_FALSE(stream->IsSending());
|
|
|
|
|
|
|
|
|
|
// Now change it back to active and verify we resume sending.
|
|
|
|
|
parameters.encodings[0].active = true;
|
2016-05-16 11:40:30 -07:00
|
|
|
EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, parameters));
|
2016-03-22 15:42:00 -07:00
|
|
|
EXPECT_TRUE(stream->IsSending());
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-16 11:40:30 -07:00
|
|
|
// Test that GetRtpSendParameters returns the currently configured codecs.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetRtpSendParametersCodecs) {
|
2016-04-20 16:23:10 -07:00
|
|
|
AddSendStream();
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
|
2016-05-16 11:40:30 -07:00
|
|
|
webrtc::RtpParameters rtp_parameters =
|
|
|
|
|
channel_->GetRtpSendParameters(last_ssrc_);
|
2016-04-20 16:23:10 -07:00
|
|
|
ASSERT_EQ(2u, rtp_parameters.codecs.size());
|
2016-05-16 11:40:30 -07:00
|
|
|
EXPECT_EQ(kVp8Codec.ToCodecParameters(), rtp_parameters.codecs[0]);
|
|
|
|
|
EXPECT_EQ(kVp9Codec.ToCodecParameters(), rtp_parameters.codecs[1]);
|
2016-04-20 16:23:10 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that if we set/get parameters multiple times, we get the same results.
|
2016-05-16 11:40:30 -07:00
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetAndGetRtpSendParameters) {
|
2016-04-20 16:23:10 -07:00
|
|
|
AddSendStream();
|
|
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(parameters));
|
|
|
|
|
|
2016-05-16 11:40:30 -07:00
|
|
|
webrtc::RtpParameters initial_params =
|
|
|
|
|
channel_->GetRtpSendParameters(last_ssrc_);
|
2016-04-20 16:23:10 -07:00
|
|
|
|
|
|
|
|
// We should be able to set the params we just got.
|
2016-05-16 11:40:30 -07:00
|
|
|
EXPECT_TRUE(channel_->SetRtpSendParameters(last_ssrc_, initial_params));
|
2016-04-20 16:23:10 -07:00
|
|
|
|
2016-05-16 11:40:30 -07:00
|
|
|
// ... And this shouldn't change the params returned by GetRtpSendParameters.
|
|
|
|
|
EXPECT_EQ(initial_params, channel_->GetRtpSendParameters(last_ssrc_));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that GetRtpReceiveParameters returns the currently configured codecs.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, GetRtpReceiveParametersCodecs) {
|
|
|
|
|
AddRecvStream();
|
|
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
|
|
|
|
|
|
|
|
|
webrtc::RtpParameters rtp_parameters =
|
|
|
|
|
channel_->GetRtpReceiveParameters(last_ssrc_);
|
|
|
|
|
ASSERT_EQ(2u, rtp_parameters.codecs.size());
|
|
|
|
|
EXPECT_EQ(kVp8Codec.ToCodecParameters(), rtp_parameters.codecs[0]);
|
|
|
|
|
EXPECT_EQ(kVp9Codec.ToCodecParameters(), rtp_parameters.codecs[1]);
|
|
|
|
|
}
|
|
|
|
|
|
2016-06-22 00:46:15 -07:00
|
|
|
// Test that RtpParameters for receive stream has one encoding and it has
|
|
|
|
|
// the correct SSRC.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, RtpEncodingParametersSsrcIsSet) {
|
|
|
|
|
AddRecvStream();
|
|
|
|
|
|
|
|
|
|
webrtc::RtpParameters rtp_parameters =
|
|
|
|
|
channel_->GetRtpReceiveParameters(last_ssrc_);
|
|
|
|
|
ASSERT_EQ(1u, rtp_parameters.encodings.size());
|
|
|
|
|
EXPECT_EQ(rtc::Optional<uint32_t>(last_ssrc_),
|
|
|
|
|
rtp_parameters.encodings[0].ssrc);
|
|
|
|
|
}
|
|
|
|
|
|
2016-05-16 11:40:30 -07:00
|
|
|
// Test that if we set/get parameters multiple times, we get the same results.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, SetAndGetRtpReceiveParameters) {
|
|
|
|
|
AddRecvStream();
|
|
|
|
|
cricket::VideoRecvParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(kVp8Codec);
|
|
|
|
|
parameters.codecs.push_back(kVp9Codec);
|
|
|
|
|
EXPECT_TRUE(channel_->SetRecvParameters(parameters));
|
|
|
|
|
|
|
|
|
|
webrtc::RtpParameters initial_params =
|
|
|
|
|
channel_->GetRtpReceiveParameters(last_ssrc_);
|
|
|
|
|
|
|
|
|
|
// We should be able to set the params we just got.
|
|
|
|
|
EXPECT_TRUE(channel_->SetRtpReceiveParameters(last_ssrc_, initial_params));
|
|
|
|
|
|
|
|
|
|
// ... And this shouldn't change the params returned by
|
|
|
|
|
// GetRtpReceiveParameters.
|
|
|
|
|
EXPECT_EQ(initial_params, channel_->GetRtpReceiveParameters(last_ssrc_));
|
2016-04-20 16:23:10 -07:00
|
|
|
}
|
|
|
|
|
|
2015-05-22 18:48:36 +02:00
|
|
|
void WebRtcVideoChannel2Test::TestReceiverLocalSsrcConfiguration(
|
|
|
|
|
bool receiver_first) {
|
2015-09-17 16:42:56 +02:00
|
|
|
EXPECT_TRUE(channel_->SetSendParameters(send_parameters_));
|
2015-05-22 18:48:36 +02:00
|
|
|
|
|
|
|
|
const uint32_t kSenderSsrc = 0xC0FFEE;
|
2015-10-21 17:21:10 +02:00
|
|
|
const uint32_t kSecondSenderSsrc = 0xBADCAFE;
|
2015-05-22 18:48:36 +02:00
|
|
|
const uint32_t kReceiverSsrc = 0x4711;
|
2015-10-21 17:21:10 +02:00
|
|
|
const uint32_t kExpectedDefaultReceiverSsrc = 1;
|
2015-05-22 18:48:36 +02:00
|
|
|
|
|
|
|
|
if (receiver_first) {
|
|
|
|
|
AddRecvStream(StreamParams::CreateLegacy(kReceiverSsrc));
|
|
|
|
|
std::vector<FakeVideoReceiveStream*> receive_streams =
|
|
|
|
|
fake_call_->GetVideoReceiveStreams();
|
|
|
|
|
ASSERT_EQ(1u, receive_streams.size());
|
2015-10-21 17:21:10 +02:00
|
|
|
// Default local SSRC when we have no sender.
|
|
|
|
|
EXPECT_EQ(kExpectedDefaultReceiverSsrc,
|
|
|
|
|
receive_streams[0]->GetConfig().rtp.local_ssrc);
|
2015-05-22 18:48:36 +02:00
|
|
|
}
|
|
|
|
|
AddSendStream(StreamParams::CreateLegacy(kSenderSsrc));
|
|
|
|
|
if (!receiver_first)
|
|
|
|
|
AddRecvStream(StreamParams::CreateLegacy(kReceiverSsrc));
|
|
|
|
|
std::vector<FakeVideoReceiveStream*> receive_streams =
|
|
|
|
|
fake_call_->GetVideoReceiveStreams();
|
|
|
|
|
ASSERT_EQ(1u, receive_streams.size());
|
|
|
|
|
EXPECT_EQ(kSenderSsrc, receive_streams[0]->GetConfig().rtp.local_ssrc);
|
2015-10-21 17:21:10 +02:00
|
|
|
|
|
|
|
|
// Removing first sender should fall back to another (in this case the second)
|
|
|
|
|
// local send stream's SSRC.
|
|
|
|
|
AddSendStream(StreamParams::CreateLegacy(kSecondSenderSsrc));
|
|
|
|
|
ASSERT_TRUE(channel_->RemoveSendStream(kSenderSsrc));
|
|
|
|
|
receive_streams =
|
|
|
|
|
fake_call_->GetVideoReceiveStreams();
|
|
|
|
|
ASSERT_EQ(1u, receive_streams.size());
|
|
|
|
|
EXPECT_EQ(kSecondSenderSsrc, receive_streams[0]->GetConfig().rtp.local_ssrc);
|
|
|
|
|
|
|
|
|
|
// Removing the last sender should fall back to default local SSRC.
|
|
|
|
|
ASSERT_TRUE(channel_->RemoveSendStream(kSecondSenderSsrc));
|
|
|
|
|
receive_streams =
|
|
|
|
|
fake_call_->GetVideoReceiveStreams();
|
|
|
|
|
ASSERT_EQ(1u, receive_streams.size());
|
|
|
|
|
EXPECT_EQ(kExpectedDefaultReceiverSsrc,
|
|
|
|
|
receive_streams[0]->GetConfig().rtp.local_ssrc);
|
2015-05-22 18:48:36 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, ConfiguresLocalSsrc) {
|
|
|
|
|
TestReceiverLocalSsrcConfiguration(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2Test, ConfiguresLocalSsrcOnExistingReceivers) {
|
|
|
|
|
TestReceiverLocalSsrcConfiguration(true);
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
class WebRtcVideoChannel2SimulcastTest : public testing::Test {
|
2014-12-10 09:01:18 +00:00
|
|
|
public:
|
2015-09-15 12:26:33 +02:00
|
|
|
WebRtcVideoChannel2SimulcastTest() : fake_call_(webrtc::Call::Config()) {}
|
2014-12-10 09:01:18 +00:00
|
|
|
|
2015-03-04 12:58:35 +00:00
|
|
|
void SetUp() override {
|
2015-05-22 09:04:09 +02:00
|
|
|
engine_.Init();
|
2016-02-12 02:27:06 -08:00
|
|
|
channel_.reset(
|
|
|
|
|
engine_.CreateChannel(&fake_call_, MediaConfig(), VideoOptions()));
|
2014-12-10 09:01:18 +00:00
|
|
|
last_ssrc_ = 123;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
void VerifySimulcastSettings(const VideoCodec& codec,
|
|
|
|
|
size_t num_configured_streams,
|
2015-10-16 12:49:39 -07:00
|
|
|
size_t expected_num_streams) {
|
2015-09-17 16:42:56 +02:00
|
|
|
cricket::VideoSendParameters parameters;
|
|
|
|
|
parameters.codecs.push_back(codec);
|
|
|
|
|
ASSERT_TRUE(channel_->SetSendParameters(parameters));
|
2014-12-10 09:01:18 +00:00
|
|
|
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
std::vector<uint32_t> ssrcs = MAKE_VECTOR(kSsrcs3);
|
2015-09-17 00:24:34 -07:00
|
|
|
RTC_DCHECK(num_configured_streams <= ssrcs.size());
|
2014-12-10 09:01:18 +00:00
|
|
|
ssrcs.resize(num_configured_streams);
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* stream =
|
|
|
|
|
AddSendStream(CreateSimStreamParams("cname", ssrcs));
|
2015-02-16 21:02:00 +00:00
|
|
|
// Send a full-size frame to trigger a stream reconfiguration to use all
|
|
|
|
|
// expected simulcast layers.
|
|
|
|
|
cricket::FakeVideoCapturer capturer;
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(
|
|
|
|
|
channel_->SetVideoSend(ssrcs.front(), true, nullptr, &capturer));
|
2015-02-16 21:02:00 +00:00
|
|
|
EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(cricket::VideoFormat(
|
|
|
|
|
codec.width, codec.height,
|
|
|
|
|
cricket::VideoFormat::FpsToInterval(30),
|
|
|
|
|
cricket::FOURCC_I420)));
|
|
|
|
|
channel_->SetSend(true);
|
|
|
|
|
EXPECT_TRUE(capturer.CaptureFrame());
|
2014-12-10 09:01:18 +00:00
|
|
|
|
|
|
|
|
std::vector<webrtc::VideoStream> video_streams = stream->GetVideoStreams();
|
|
|
|
|
ASSERT_EQ(expected_num_streams, video_streams.size());
|
|
|
|
|
|
|
|
|
|
std::vector<webrtc::VideoStream> expected_streams = GetSimulcastConfig(
|
2015-10-16 12:49:39 -07:00
|
|
|
num_configured_streams, codec.width, codec.height, 0, kDefaultQpMax,
|
2014-12-10 09:01:18 +00:00
|
|
|
codec.framerate != 0 ? codec.framerate : kDefaultFramerate);
|
|
|
|
|
|
|
|
|
|
ASSERT_EQ(expected_streams.size(), video_streams.size());
|
|
|
|
|
|
|
|
|
|
size_t num_streams = video_streams.size();
|
2015-02-23 16:39:07 +00:00
|
|
|
int total_max_bitrate_bps = 0;
|
2014-12-10 09:01:18 +00:00
|
|
|
for (size_t i = 0; i < num_streams; ++i) {
|
|
|
|
|
EXPECT_EQ(expected_streams[i].width, video_streams[i].width);
|
|
|
|
|
EXPECT_EQ(expected_streams[i].height, video_streams[i].height);
|
|
|
|
|
|
|
|
|
|
EXPECT_GT(video_streams[i].max_framerate, 0);
|
|
|
|
|
EXPECT_EQ(expected_streams[i].max_framerate,
|
|
|
|
|
video_streams[i].max_framerate);
|
|
|
|
|
|
|
|
|
|
EXPECT_GT(video_streams[i].min_bitrate_bps, 0);
|
|
|
|
|
EXPECT_EQ(expected_streams[i].min_bitrate_bps,
|
|
|
|
|
video_streams[i].min_bitrate_bps);
|
|
|
|
|
|
|
|
|
|
EXPECT_GT(video_streams[i].target_bitrate_bps, 0);
|
|
|
|
|
EXPECT_EQ(expected_streams[i].target_bitrate_bps,
|
|
|
|
|
video_streams[i].target_bitrate_bps);
|
|
|
|
|
|
|
|
|
|
EXPECT_GT(video_streams[i].max_bitrate_bps, 0);
|
|
|
|
|
EXPECT_EQ(expected_streams[i].max_bitrate_bps,
|
|
|
|
|
video_streams[i].max_bitrate_bps);
|
|
|
|
|
|
|
|
|
|
EXPECT_GT(video_streams[i].max_qp, 0);
|
|
|
|
|
EXPECT_EQ(expected_streams[i].max_qp, video_streams[i].max_qp);
|
|
|
|
|
|
|
|
|
|
EXPECT_FALSE(expected_streams[i].temporal_layer_thresholds_bps.empty());
|
|
|
|
|
EXPECT_EQ(expected_streams[i].temporal_layer_thresholds_bps,
|
|
|
|
|
video_streams[i].temporal_layer_thresholds_bps);
|
2015-02-23 16:39:07 +00:00
|
|
|
|
|
|
|
|
if (i == num_streams - 1) {
|
|
|
|
|
total_max_bitrate_bps += video_streams[i].max_bitrate_bps;
|
|
|
|
|
} else {
|
|
|
|
|
total_max_bitrate_bps += video_streams[i].target_bitrate_bps;
|
|
|
|
|
}
|
2014-12-10 09:01:18 +00:00
|
|
|
}
|
2015-02-23 16:39:07 +00:00
|
|
|
cricket::VideoMediaInfo info;
|
2015-03-04 08:54:32 +00:00
|
|
|
ASSERT_TRUE(channel_->GetStats(&info));
|
2015-02-23 16:39:07 +00:00
|
|
|
ASSERT_EQ(1u, info.senders.size());
|
|
|
|
|
EXPECT_EQ(total_max_bitrate_bps, info.senders[0].preferred_bitrate);
|
|
|
|
|
|
2016-06-02 16:23:38 -07:00
|
|
|
EXPECT_TRUE(channel_->SetVideoSend(ssrcs.front(), true, nullptr, nullptr));
|
2014-12-10 09:01:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* AddSendStream() {
|
|
|
|
|
return AddSendStream(StreamParams::CreateLegacy(last_ssrc_++));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FakeVideoSendStream* AddSendStream(const StreamParams& sp) {
|
|
|
|
|
size_t num_streams =
|
2015-09-15 12:26:33 +02:00
|
|
|
fake_call_.GetVideoSendStreams().size();
|
2014-12-10 09:01:18 +00:00
|
|
|
EXPECT_TRUE(channel_->AddSendStream(sp));
|
|
|
|
|
std::vector<FakeVideoSendStream*> streams =
|
2015-09-15 12:26:33 +02:00
|
|
|
fake_call_.GetVideoSendStreams();
|
2014-12-10 09:01:18 +00:00
|
|
|
EXPECT_EQ(num_streams + 1, streams.size());
|
|
|
|
|
return streams[streams.size() - 1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::vector<FakeVideoSendStream*> GetFakeSendStreams() {
|
2015-09-15 12:26:33 +02:00
|
|
|
return fake_call_.GetVideoSendStreams();
|
2014-12-10 09:01:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FakeVideoReceiveStream* AddRecvStream() {
|
|
|
|
|
return AddRecvStream(StreamParams::CreateLegacy(last_ssrc_++));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FakeVideoReceiveStream* AddRecvStream(const StreamParams& sp) {
|
|
|
|
|
size_t num_streams =
|
2015-09-15 12:26:33 +02:00
|
|
|
fake_call_.GetVideoReceiveStreams().size();
|
2014-12-10 09:01:18 +00:00
|
|
|
EXPECT_TRUE(channel_->AddRecvStream(sp));
|
|
|
|
|
std::vector<FakeVideoReceiveStream*> streams =
|
2015-09-15 12:26:33 +02:00
|
|
|
fake_call_.GetVideoReceiveStreams();
|
2014-12-10 09:01:18 +00:00
|
|
|
EXPECT_EQ(num_streams + 1, streams.size());
|
|
|
|
|
return streams[streams.size() - 1];
|
|
|
|
|
}
|
|
|
|
|
|
2015-09-15 12:26:33 +02:00
|
|
|
FakeCall fake_call_;
|
|
|
|
|
WebRtcVideoEngine2 engine_;
|
2016-02-26 03:00:35 -08:00
|
|
|
std::unique_ptr<VideoMediaChannel> channel_;
|
Use suffixed {uint,int}{8,16,32,64}_t types.
Removes the use of uint8, etc. in favor of uint8_t.
BUG=webrtc:5024
R=henrik.lundin@webrtc.org, henrikg@webrtc.org, perkj@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org, tina.legrand@webrtc.org
Review URL: https://codereview.webrtc.org/1362503003 .
Cr-Commit-Position: refs/heads/master@{#10196}
2015-10-07 12:23:21 +02:00
|
|
|
uint32_t last_ssrc_;
|
2014-12-10 09:01:18 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith2SimulcastStreams) {
|
2015-10-16 12:49:39 -07:00
|
|
|
VerifySimulcastSettings(kVp8Codec, 2, 2);
|
2014-12-10 09:01:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWith3SimulcastStreams) {
|
2015-10-16 12:49:39 -07:00
|
|
|
VerifySimulcastSettings(kVp8Codec720p, 3, 3);
|
2014-12-10 09:01:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Test that we normalize send codec format size in simulcast.
|
|
|
|
|
TEST_F(WebRtcVideoChannel2SimulcastTest, SetSendCodecsWithOddSizeInSimulcast) {
|
|
|
|
|
cricket::VideoCodec codec(kVp8Codec270p);
|
|
|
|
|
codec.width += 1;
|
|
|
|
|
codec.height += 1;
|
2015-10-16 12:49:39 -07:00
|
|
|
VerifySimulcastSettings(codec, 2, 2);
|
2014-12-10 09:01:18 +00:00
|
|
|
}
|
2014-05-13 11:07:01 +00:00
|
|
|
} // namespace cricket
|