diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 14:29:10 +0000 |
commit | 2aa4a82499d4becd2284cdb482213d541b8804dd (patch) | |
tree | b80bf8bf13c3766139fbacc530efd0dd9d54394c /third_party/libwebrtc/webrtc/modules/video_coding/test | |
parent | Initial commit. (diff) | |
download | firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.tar.xz firefox-2aa4a82499d4becd2284cdb482213d541b8804dd.zip |
Adding upstream version 86.0.1.upstream/86.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/webrtc/modules/video_coding/test')
3 files changed, 234 insertions, 0 deletions
diff --git a/third_party/libwebrtc/webrtc/modules/video_coding/test/stream_generator.cc b/third_party/libwebrtc/webrtc/modules/video_coding/test/stream_generator.cc new file mode 100644 index 0000000000..9933c21e78 --- /dev/null +++ b/third_party/libwebrtc/webrtc/modules/video_coding/test/stream_generator.cc @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * 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. + */ + +#include "modules/video_coding/test/stream_generator.h" + +#include <string.h> + +#include <list> + +#include "modules/video_coding/packet.h" +#include "system_wrappers/include/clock.h" +#include "test/gtest.h" + +namespace webrtc { + +StreamGenerator::StreamGenerator(uint16_t start_seq_num, int64_t current_time) + : packets_(), sequence_number_(start_seq_num), start_time_(current_time) {} + +void StreamGenerator::Init(uint16_t start_seq_num, int64_t current_time) { + packets_.clear(); + sequence_number_ = start_seq_num; + start_time_ = current_time; + memset(packet_buffer_, 0, sizeof(packet_buffer_)); +} + +void StreamGenerator::GenerateFrame(FrameType type, + int num_media_packets, + int num_empty_packets, + int64_t time_ms) { + uint32_t timestamp = 90 * (time_ms - start_time_); + for (int i = 0; i < num_media_packets; ++i) { + const int packet_size = + (kFrameSize + num_media_packets / 2) / num_media_packets; + bool marker_bit = (i == num_media_packets - 1); + packets_.push_back(GeneratePacket(sequence_number_, timestamp, packet_size, + (i == 0), marker_bit, type)); + ++sequence_number_; + } + for (int i = 0; i < num_empty_packets; ++i) { + packets_.push_back(GeneratePacket(sequence_number_, timestamp, 0, false, + false, kEmptyFrame)); + ++sequence_number_; + } +} + +VCMPacket StreamGenerator::GeneratePacket(uint16_t sequence_number, + uint32_t timestamp, + unsigned int size, + bool first_packet, + bool marker_bit, + FrameType type) { + EXPECT_LT(size, kMaxPacketSize); + VCMPacket packet; + packet.seqNum = sequence_number; + packet.timestamp = timestamp; + packet.frameType = type; + packet.is_first_packet_in_frame = first_packet; + packet.markerBit = marker_bit; + packet.sizeBytes = size; + packet.dataPtr = packet_buffer_; + if (packet.is_first_packet_in_frame) + packet.completeNALU = kNaluStart; + else if (packet.markerBit) + packet.completeNALU = kNaluEnd; + else + packet.completeNALU = kNaluIncomplete; + return packet; +} + +bool StreamGenerator::PopPacket(VCMPacket* packet, int index) { + std::list<VCMPacket>::iterator it = GetPacketIterator(index); + if (it == packets_.end()) + return false; + if (packet) + *packet = (*it); + packets_.erase(it); + return true; +} + +bool StreamGenerator::GetPacket(VCMPacket* packet, int index) { + std::list<VCMPacket>::iterator it = GetPacketIterator(index); + if (it == packets_.end()) + return false; + if (packet) + *packet = (*it); + return true; +} + +bool StreamGenerator::NextPacket(VCMPacket* packet) { + if (packets_.empty()) + return false; + if (packet != NULL) + *packet = packets_.front(); + packets_.pop_front(); + return true; +} + +void StreamGenerator::DropLastPacket() { + packets_.pop_back(); +} + +uint16_t StreamGenerator::NextSequenceNumber() const { + if (packets_.empty()) + return sequence_number_; + return packets_.front().seqNum; +} + +int StreamGenerator::PacketsRemaining() const { + return packets_.size(); +} + +std::list<VCMPacket>::iterator StreamGenerator::GetPacketIterator(int index) { + std::list<VCMPacket>::iterator it = packets_.begin(); + for (int i = 0; i < index; ++i) { + ++it; + if (it == packets_.end()) + break; + } + return it; +} + +} // namespace webrtc diff --git a/third_party/libwebrtc/webrtc/modules/video_coding/test/stream_generator.h b/third_party/libwebrtc/webrtc/modules/video_coding/test/stream_generator.h new file mode 100644 index 0000000000..894df5e615 --- /dev/null +++ b/third_party/libwebrtc/webrtc/modules/video_coding/test/stream_generator.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. + * + * 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. + */ +#ifndef MODULES_VIDEO_CODING_TEST_STREAM_GENERATOR_H_ +#define MODULES_VIDEO_CODING_TEST_STREAM_GENERATOR_H_ + +#include <list> + +#include "modules/video_coding/packet.h" +#include "rtc_base/constructormagic.h" +#include "typedefs.h" // NOLINT(build/include) + +namespace webrtc { + +const unsigned int kDefaultBitrateKbps = 1000; +const unsigned int kDefaultFrameRate = 25; +const unsigned int kMaxPacketSize = 1500; +const unsigned int kFrameSize = + (kDefaultBitrateKbps + kDefaultFrameRate * 4) / (kDefaultFrameRate * 8); +const int kDefaultFramePeriodMs = 1000 / kDefaultFrameRate; + +class StreamGenerator { + public: + StreamGenerator(uint16_t start_seq_num, int64_t current_time); + void Init(uint16_t start_seq_num, int64_t current_time); + + // |time_ms| denotes the timestamp you want to put on the frame, and the unit + // is millisecond. GenerateFrame will translate |time_ms| into a 90kHz + // timestamp and put it on the frame. + void GenerateFrame(FrameType type, + int num_media_packets, + int num_empty_packets, + int64_t time_ms); + + bool PopPacket(VCMPacket* packet, int index); + void DropLastPacket(); + + bool GetPacket(VCMPacket* packet, int index); + + bool NextPacket(VCMPacket* packet); + + uint16_t NextSequenceNumber() const; + + int PacketsRemaining() const; + + private: + VCMPacket GeneratePacket(uint16_t sequence_number, + uint32_t timestamp, + unsigned int size, + bool first_packet, + bool marker_bit, + FrameType type); + + std::list<VCMPacket>::iterator GetPacketIterator(int index); + + std::list<VCMPacket> packets_; + uint16_t sequence_number_; + int64_t start_time_; + uint8_t packet_buffer_[kMaxPacketSize]; + + RTC_DISALLOW_COPY_AND_ASSIGN(StreamGenerator); +}; + +} // namespace webrtc + +#endif // MODULES_VIDEO_CODING_TEST_STREAM_GENERATOR_H_ diff --git a/third_party/libwebrtc/webrtc/modules/video_coding/test/test_util.h b/third_party/libwebrtc/webrtc/modules/video_coding/test/test_util.h new file mode 100644 index 0000000000..404e49ebcf --- /dev/null +++ b/third_party/libwebrtc/webrtc/modules/video_coding/test/test_util.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. + * + * 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. + */ + +#ifndef MODULES_VIDEO_CODING_TEST_TEST_UTIL_H_ +#define MODULES_VIDEO_CODING_TEST_TEST_UTIL_H_ + +#include "system_wrappers/include/event_wrapper.h" + +class NullEventFactory : public webrtc::EventFactory { + public: + virtual ~NullEventFactory() {} + + webrtc::EventWrapper* CreateEvent() override { return new NullEvent; } + private: + // Private class to avoid more dependencies on it in tests. + class NullEvent : public webrtc::EventWrapper { + public: + ~NullEvent() override {} + bool Set() override { return true; } + webrtc::EventTypeWrapper Wait(unsigned long max_time) override { // NOLINT + return webrtc::kEventTimeout; + } + }; +}; + +#endif // MODULES_VIDEO_CODING_TEST_TEST_UTIL_H_ |