blob: 7b3a4b9d905b92afc17ef8180e00ff91f6041b62 [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>
Jonas Olssona4d87372019-07-05 19:08:33 +020014
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000015#include <list>
16
Yves Gerey3e707812018-11-28 16:47:49 +010017#include "modules/include/module_common_types.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "modules/video_coding/packet.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "test/gtest.h"
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000020
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000021namespace webrtc {
22
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -070023StreamGenerator::StreamGenerator(uint16_t start_seq_num, int64_t current_time)
philipel5908c712015-12-21 08:23:20 -080024 : packets_(), sequence_number_(start_seq_num), start_time_(current_time) {}
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000025
Wan-Teh Chang349c2bb2015-06-05 14:45:05 -070026void StreamGenerator::Init(uint16_t start_seq_num, int64_t current_time) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000027 packets_.clear();
28 sequence_number_ = start_seq_num;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000029 start_time_ = current_time;
Wan-Teh Chang55b6acb2015-06-05 15:02:36 -070030 memset(packet_buffer_, 0, sizeof(packet_buffer_));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000031}
32
Niels Möller87e2d782019-03-07 10:18:23 +010033void StreamGenerator::GenerateFrame(VideoFrameType type,
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000034 int num_media_packets,
35 int num_empty_packets,
Qiang Chend4cec152015-06-19 09:17:00 -070036 int64_t time_ms) {
37 uint32_t timestamp = 90 * (time_ms - start_time_);
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000038 for (int i = 0; i < num_media_packets; ++i) {
andresp@webrtc.org1f09dbe2013-09-13 19:17:54 +000039 const int packet_size =
40 (kFrameSize + num_media_packets / 2) / num_media_packets;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000041 bool marker_bit = (i == num_media_packets - 1);
philipel5908c712015-12-21 08:23:20 -080042 packets_.push_back(GeneratePacket(sequence_number_, timestamp, packet_size,
43 (i == 0), marker_bit, type));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000044 ++sequence_number_;
45 }
46 for (int i = 0; i < num_empty_packets; ++i) {
pbos22993e12015-10-19 02:39:06 -070047 packets_.push_back(GeneratePacket(sequence_number_, timestamp, 0, false,
Niels Möller8f7ce222019-03-21 15:43:58 +010048 false, VideoFrameType::kEmptyFrame));
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000049 ++sequence_number_;
50 }
51}
52
53VCMPacket StreamGenerator::GeneratePacket(uint16_t sequence_number,
54 uint32_t timestamp,
55 unsigned int size,
56 bool first_packet,
57 bool marker_bit,
Niels Möller87e2d782019-03-07 10:18:23 +010058 VideoFrameType type) {
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000059 EXPECT_LT(size, kMaxPacketSize);
60 VCMPacket packet;
61 packet.seqNum = sequence_number;
62 packet.timestamp = timestamp;
Niels Möllerabbc50e2019-04-24 09:41:16 +020063 packet.video_header.frame_type = type;
Niels Möllerd5e02f02019-02-20 13:12:21 +010064 packet.video_header.is_first_packet_in_frame = first_packet;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000065 packet.markerBit = marker_bit;
66 packet.sizeBytes = size;
Wan-Teh Chang55b6acb2015-06-05 15:02:36 -070067 packet.dataPtr = packet_buffer_;
Niels Möllerd5e02f02019-02-20 13:12:21 +010068 if (packet.is_first_packet_in_frame())
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +000069 packet.completeNALU = kNaluStart;
70 else if (packet.markerBit)
71 packet.completeNALU = kNaluEnd;
72 else
73 packet.completeNALU = kNaluIncomplete;
74 return packet;
75}
76
77bool StreamGenerator::PopPacket(VCMPacket* packet, int index) {
78 std::list<VCMPacket>::iterator it = GetPacketIterator(index);
79 if (it == packets_.end())
80 return false;
81 if (packet)
82 *packet = (*it);
83 packets_.erase(it);
84 return true;
85}
86
87bool StreamGenerator::GetPacket(VCMPacket* packet, int index) {
88 std::list<VCMPacket>::iterator it = GetPacketIterator(index);
89 if (it == packets_.end())
90 return false;
91 if (packet)
92 *packet = (*it);
93 return true;
94}
95
96bool StreamGenerator::NextPacket(VCMPacket* packet) {
97 if (packets_.empty())
98 return false;
99 if (packet != NULL)
100 *packet = packets_.front();
101 packets_.pop_front();
102 return true;
103}
104
philipel5908c712015-12-21 08:23:20 -0800105void StreamGenerator::DropLastPacket() {
106 packets_.pop_back();
107}
stefan@webrtc.orgc8b29a22013-06-17 07:13:16 +0000108
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000109uint16_t StreamGenerator::NextSequenceNumber() const {
110 if (packets_.empty())
111 return sequence_number_;
112 return packets_.front().seqNum;
113}
114
philipel5908c712015-12-21 08:23:20 -0800115int StreamGenerator::PacketsRemaining() const {
116 return packets_.size();
117}
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000118
119std::list<VCMPacket>::iterator StreamGenerator::GetPacketIterator(int index) {
120 std::list<VCMPacket>::iterator it = packets_.begin();
121 for (int i = 0; i < index; ++i) {
122 ++it;
andresp@webrtc.org1f09dbe2013-09-13 19:17:54 +0000123 if (it == packets_.end())
124 break;
mikhal@webrtc.org381da4b2013-04-25 21:45:29 +0000125 }
126 return it;
127}
128
129} // namespace webrtc