blob: 9933c21e786211f6733c1da67baf35195e4f21fb [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>
14
15#include <list>
16
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020017#include "modules/video_coding/packet.h"
18#include "system_wrappers/include/clock.h"
19#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
33void StreamGenerator::GenerateFrame(FrameType type,
34 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,
48 false, 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,
58 FrameType type) {
59 EXPECT_LT(size, kMaxPacketSize);
60 VCMPacket packet;
61 packet.seqNum = sequence_number;
62 packet.timestamp = timestamp;
63 packet.frameType = type;
johan0d1b2b62017-01-10 04:21:35 -080064 packet.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_;
johan0d1b2b62017-01-10 04:21:35 -080068 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