blob: 8858812e3d46020d64a3c86ff841c74a6d830eb2 [file] [log] [blame]
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +00001/*
2 * Copyright (c) 2013 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/video_coding/test/stream_generator.h"
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000012
13#include <string.h>
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000014#include <list>
15
Yves Gerey3e707812018-11-28 16:47:49 +010016#include "modules/include/module_common_types.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "modules/video_coding/packet.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "test/gtest.h"
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000019
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000020namespace webrtc {
21
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -070022StreamGenerator::StreamGenerator(uint16_t start_seq_num, int64_t current_time)
philipel5908c712015-12-21 08:23:20 -080023 : packets_(), sequence_number_(start_seq_num), start_time_(current_time) {}
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000024
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -070025void StreamGenerator::Init(uint16_t start_seq_num, int64_t current_time) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000026 packets_.clear();
27 sequence_number_ = start_seq_num;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000028 start_time_ = current_time;
Wan-Teh Chang55b6acb2015-06-05 15:02:36 -070029 memset(packet_buffer_, 0, sizeof(packet_buffer_));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000030}
31
Niels Möller87e2d782019-03-07 10:18:23 +010032void StreamGenerator::GenerateFrame(VideoFrameType type,
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000033 int num_media_packets,
34 int num_empty_packets,
Qiang Chend4cec152015-06-19 09:17:00 -070035 int64_t time_ms) {
36 uint32_t timestamp = 90 * (time_ms - start_time_);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000037 for (int i = 0; i < num_media_packets; ++i) {
andresp@webrtc.org1f09dbe2013-09-13 19:17:54 +000038 const int packet_size =
39 (kFrameSize + num_media_packets / 2) / num_media_packets;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000040 bool marker_bit = (i == num_media_packets - 1);
philipel5908c712015-12-21 08:23:20 -080041 packets_.push_back(GeneratePacket(sequence_number_, timestamp, packet_size,
42 (i == 0), marker_bit, type));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000043 ++sequence_number_;
44 }
45 for (int i = 0; i < num_empty_packets; ++i) {
pbos22993e12015-10-19 02:39:06 -070046 packets_.push_back(GeneratePacket(sequence_number_, timestamp, 0, false,
Niels Möller8f7ce222019-03-21 15:43:58 +010047 false, VideoFrameType::kEmptyFrame));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000048 ++sequence_number_;
49 }
50}
51
52VCMPacket StreamGenerator::GeneratePacket(uint16_t sequence_number,
53 uint32_t timestamp,
54 unsigned int size,
55 bool first_packet,
56 bool marker_bit,
Niels Möller87e2d782019-03-07 10:18:23 +010057 VideoFrameType type) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000058 EXPECT_LT(size, kMaxPacketSize);
59 VCMPacket packet;
60 packet.seqNum = sequence_number;
61 packet.timestamp = timestamp;
62 packet.frameType = type;
Niels Möllerd5e02f02019-02-20 13:12:21 +010063 packet.video_header.is_first_packet_in_frame = first_packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000064 packet.markerBit = marker_bit;
65 packet.sizeBytes = size;
Wan-Teh Chang55b6acb2015-06-05 15:02:36 -070066 packet.dataPtr = packet_buffer_;
Niels Möllerd5e02f02019-02-20 13:12:21 +010067 if (packet.is_first_packet_in_frame())
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000068 packet.completeNALU = kNaluStart;
69 else if (packet.markerBit)
70 packet.completeNALU = kNaluEnd;
71 else
72 packet.completeNALU = kNaluIncomplete;
73 return packet;
74}
75
76bool StreamGenerator::PopPacket(VCMPacket* packet, int index) {
77 std::list<VCMPacket>::iterator it = GetPacketIterator(index);
78 if (it == packets_.end())
79 return false;
80 if (packet)
81 *packet = (*it);
82 packets_.erase(it);
83 return true;
84}
85
86bool StreamGenerator::GetPacket(VCMPacket* packet, int index) {
87 std::list<VCMPacket>::iterator it = GetPacketIterator(index);
88 if (it == packets_.end())
89 return false;
90 if (packet)
91 *packet = (*it);
92 return true;
93}
94
95bool StreamGenerator::NextPacket(VCMPacket* packet) {
96 if (packets_.empty())
97 return false;
98 if (packet != NULL)
99 *packet = packets_.front();
100 packets_.pop_front();
101 return true;
102}
103
philipel5908c712015-12-21 08:23:20 -0800104void StreamGenerator::DropLastPacket() {
105 packets_.pop_back();
106}
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000107
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000108uint16_t StreamGenerator::NextSequenceNumber() const {
109 if (packets_.empty())
110 return sequence_number_;
111 return packets_.front().seqNum;
112}
113
philipel5908c712015-12-21 08:23:20 -0800114int StreamGenerator::PacketsRemaining() const {
115 return packets_.size();
116}
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000117
118std::list<VCMPacket>::iterator StreamGenerator::GetPacketIterator(int index) {
119 std::list<VCMPacket>::iterator it = packets_.begin();
120 for (int i = 0; i < index; ++i) {
121 ++it;
andresp@webrtc.org1f09dbe2013-09-13 19:17:54 +0000122 if (it == packets_.end())
123 break;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000124 }
125 return it;
126}
127
128} // namespace webrtc