1 /* 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 11 #include "webrtc/modules/video_coding/main/source/test/stream_generator.h" 12 13 #include <string.h> 14 15 #include <list> 16 17 #include "testing/gtest/include/gtest/gtest.h" 18 #include "webrtc/modules/video_coding/main/source/packet.h" 19 #include "webrtc/modules/video_coding/main/test/test_util.h" 20 #include "webrtc/system_wrappers/interface/clock.h" 21 22 namespace webrtc { 23 24 StreamGenerator::StreamGenerator(uint16_t start_seq_num, 25 uint32_t start_timestamp, 26 int64_t current_time) 27 : packets_(), 28 sequence_number_(start_seq_num), 29 timestamp_(start_timestamp), 30 start_time_(current_time) {} 31 32 void StreamGenerator::Init(uint16_t start_seq_num, 33 uint32_t start_timestamp, 34 int64_t current_time) { 35 packets_.clear(); 36 sequence_number_ = start_seq_num; 37 timestamp_ = start_timestamp; 38 start_time_ = current_time; 39 memset(&packet_buffer, 0, sizeof(packet_buffer)); 40 } 41 42 void StreamGenerator::GenerateFrame(FrameType type, 43 int num_media_packets, 44 int num_empty_packets, 45 int64_t current_time) { 46 timestamp_ = 90 * (current_time - start_time_); 47 for (int i = 0; i < num_media_packets; ++i) { 48 const int packet_size = 49 (kFrameSize + num_media_packets / 2) / num_media_packets; 50 bool marker_bit = (i == num_media_packets - 1); 51 packets_.push_back(GeneratePacket( 52 sequence_number_, timestamp_, packet_size, (i == 0), marker_bit, type)); 53 ++sequence_number_; 54 } 55 for (int i = 0; i < num_empty_packets; ++i) { 56 packets_.push_back(GeneratePacket( 57 sequence_number_, timestamp_, 0, false, false, kFrameEmpty)); 58 ++sequence_number_; 59 } 60 } 61 62 VCMPacket StreamGenerator::GeneratePacket(uint16_t sequence_number, 63 uint32_t timestamp, 64 unsigned int size, 65 bool first_packet, 66 bool marker_bit, 67 FrameType type) { 68 EXPECT_LT(size, kMaxPacketSize); 69 VCMPacket packet; 70 packet.seqNum = sequence_number; 71 packet.timestamp = timestamp; 72 packet.frameType = type; 73 packet.isFirstPacket = first_packet; 74 packet.markerBit = marker_bit; 75 packet.sizeBytes = size; 76 packet.dataPtr = packet_buffer; 77 if (packet.isFirstPacket) 78 packet.completeNALU = kNaluStart; 79 else if (packet.markerBit) 80 packet.completeNALU = kNaluEnd; 81 else 82 packet.completeNALU = kNaluIncomplete; 83 return packet; 84 } 85 86 bool StreamGenerator::PopPacket(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 packets_.erase(it); 93 return true; 94 } 95 96 bool StreamGenerator::GetPacket(VCMPacket* packet, int index) { 97 std::list<VCMPacket>::iterator it = GetPacketIterator(index); 98 if (it == packets_.end()) 99 return false; 100 if (packet) 101 *packet = (*it); 102 return true; 103 } 104 105 bool StreamGenerator::NextPacket(VCMPacket* packet) { 106 if (packets_.empty()) 107 return false; 108 if (packet != NULL) 109 *packet = packets_.front(); 110 packets_.pop_front(); 111 return true; 112 } 113 114 void StreamGenerator::DropLastPacket() { packets_.pop_back(); } 115 116 uint16_t StreamGenerator::NextSequenceNumber() const { 117 if (packets_.empty()) 118 return sequence_number_; 119 return packets_.front().seqNum; 120 } 121 122 int StreamGenerator::PacketsRemaining() const { return packets_.size(); } 123 124 std::list<VCMPacket>::iterator StreamGenerator::GetPacketIterator(int index) { 125 std::list<VCMPacket>::iterator it = packets_.begin(); 126 for (int i = 0; i < index; ++i) { 127 ++it; 128 if (it == packets_.end()) 129 break; 130 } 131 return it; 132 } 133 134 } // namespace webrtc 135