blob: 01f3db64aa95dd7bc7371d00f5aa70a9b103d429 [file] [log] [blame]
Benjamin Wright150a9072018-10-26 22:43:061/*
2 * Copyright 2018 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "api/test/fake_frame_decryptor.h"
12#include "api/test/fake_frame_encryptor.h"
Steve Anton10542f22019-01-11 17:11:0013#include "media/engine/internal_decoder_factory.h"
Danil Chapovalovce515f72020-02-24 13:29:2714#include "modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h"
Benjamin Wright150a9072018-10-26 22:43:0615#include "modules/video_coding/codecs/vp8/include/vp8.h"
16#include "test/call_test.h"
Benjamin Wright150a9072018-10-26 22:43:0617#include "test/gtest.h"
Artem Titov8a9f3a82023-04-25 07:56:4918#include "test/video_test_constants.h"
Benjamin Wright150a9072018-10-26 22:43:0619
20namespace webrtc {
Elad Alond8d32482019-02-18 22:45:5721namespace {
Danil Chapovalovce515f72020-02-24 13:29:2722
23using FrameEncryptionEndToEndTest = test::CallTest;
24
Elad Alond8d32482019-02-18 22:45:5725enum : int { // The first valid value is 1.
26 kGenericDescriptorExtensionId = 1,
27};
Benjamin Wright150a9072018-10-26 22:43:0628
Danil Chapovalovce515f72020-02-24 13:29:2729class DecryptedFrameObserver : public test::EndToEndTest,
30 public rtc::VideoSinkInterface<VideoFrame> {
Benjamin Wright150a9072018-10-26 22:43:0631 public:
Danil Chapovalovce515f72020-02-24 13:29:2732 DecryptedFrameObserver()
Artem Titov8a9f3a82023-04-25 07:56:4933 : EndToEndTest(test::VideoTestConstants::kDefaultTimeout),
Danil Chapovalovce515f72020-02-24 13:29:2734 encoder_factory_([] { return VP8Encoder::Create(); }) {}
Benjamin Wright150a9072018-10-26 22:43:0635
36 private:
Danil Chapovalovce515f72020-02-24 13:29:2737 void ModifyVideoConfigs(
38 VideoSendStream::Config* send_config,
Tommif6f45432022-05-20 13:21:2039 std::vector<VideoReceiveStreamInterface::Config>* receive_configs,
Danil Chapovalovce515f72020-02-24 13:29:2740 VideoEncoderConfig* encoder_config) override {
41 // Use VP8 instead of FAKE.
42 send_config->encoder_settings.encoder_factory = &encoder_factory_;
43 send_config->rtp.payload_name = "VP8";
Artem Titov8a9f3a82023-04-25 07:56:4944 send_config->rtp.payload_type =
45 test::VideoTestConstants::kVideoSendPayloadType;
Danil Chapovalovce515f72020-02-24 13:29:2746 send_config->frame_encryptor = new FakeFrameEncryptor();
47 send_config->crypto_options.sframe.require_frame_encryption = true;
48 encoder_config->codec_type = kVideoCodecVP8;
Tommif6f45432022-05-20 13:21:2049 VideoReceiveStreamInterface::Decoder decoder =
Danil Chapovalovce515f72020-02-24 13:29:2750 test::CreateMatchingDecoder(*send_config);
Danil Chapovalovce515f72020-02-24 13:29:2751 for (auto& recv_config : *receive_configs) {
Philip Eliasson2b068ce2020-08-03 15:55:1052 recv_config.decoder_factory = &decoder_factory_;
Danil Chapovalovce515f72020-02-24 13:29:2753 recv_config.decoders.clear();
54 recv_config.decoders.push_back(decoder);
55 recv_config.renderer = this;
Tomas Gunnarssonb3517fe2022-03-18 18:32:3856 recv_config.frame_decryptor = rtc::make_ref_counted<FakeFrameDecryptor>();
Danil Chapovalovce515f72020-02-24 13:29:2757 recv_config.crypto_options.sframe.require_frame_encryption = true;
58 }
59 }
60
61 void OnFrame(const VideoFrame& video_frame) override {
62 observation_complete_.Set();
63 }
64
65 void PerformTest() override {
66 EXPECT_TRUE(Wait())
67 << "Timed out waiting for decrypted frames to be rendered.";
68 }
69
70 std::unique_ptr<VideoEncoder> encoder_;
71 test::FunctionVideoEncoderFactory encoder_factory_;
72 InternalDecoderFactory decoder_factory_;
Benjamin Wright150a9072018-10-26 22:43:0673};
74
75// Validates that payloads cannot be sent without a frame encryptor and frame
76// decryptor attached.
Danil Chapovalovce515f72020-02-24 13:29:2777TEST_F(FrameEncryptionEndToEndTest,
78 WithGenericFrameDescriptorRequireFrameEncryptionEnforced) {
79 RegisterRtpExtension(RtpExtension(RtpExtension::kGenericFrameDescriptorUri00,
80 kGenericDescriptorExtensionId));
81 DecryptedFrameObserver test;
Benjamin Wright150a9072018-10-26 22:43:0682 RunBaseTest(&test);
83}
Danil Chapovalovce515f72020-02-24 13:29:2784
85TEST_F(FrameEncryptionEndToEndTest,
86 WithDependencyDescriptorRequireFrameEncryptionEnforced) {
87 RegisterRtpExtension(RtpExtension(RtpExtension::kDependencyDescriptorUri,
88 kGenericDescriptorExtensionId));
89 DecryptedFrameObserver test;
90 RunBaseTest(&test);
91}
92} // namespace
Benjamin Wright150a9072018-10-26 22:43:0693} // namespace webrtc