140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org/* 240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org * 440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org * Use of this source code is governed by a BSD-style license 540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org * that can be found in the LICENSE file in the root of the source 640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org * tree. An additional intellectual property rights grant can be found 740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org * in the file PATENTS. All contributing project authors may 840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org * be found in the AUTHORS file in the root of the source tree. 940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org */ 1040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 11a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org#include "webrtc/modules/video_coding/main/source/test/stream_generator.h" 1240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 1340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org#include <string.h> 1440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 1540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org#include <list> 1640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 1740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 1840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org#include "webrtc/modules/video_coding/main/source/packet.h" 1940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org#include "webrtc/modules/video_coding/main/test/test_util.h" 2040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org#include "webrtc/system_wrappers/interface/clock.h" 2140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 2240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orgnamespace webrtc { 2340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 2440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orgStreamGenerator::StreamGenerator(uint16_t start_seq_num, 2540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org uint32_t start_timestamp, 2640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org int64_t current_time) 2740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org : packets_(), 2840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org sequence_number_(start_seq_num), 2940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org timestamp_(start_timestamp), 3040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org start_time_(current_time) {} 3140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 32a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.orgvoid StreamGenerator::Init(uint16_t start_seq_num, 33a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org uint32_t start_timestamp, 3440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org int64_t current_time) { 3540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packets_.clear(); 3640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org sequence_number_ = start_seq_num; 3740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org timestamp_ = start_timestamp; 3840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org start_time_ = current_time; 3940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org memset(&packet_buffer, 0, sizeof(packet_buffer)); 4040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} 4140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 4240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orgvoid StreamGenerator::GenerateFrame(FrameType type, 4340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org int num_media_packets, 4440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org int num_empty_packets, 4540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org int64_t current_time) { 46933f88591c8593007a8186f75d5e941310fb4051mikhal@webrtc.org timestamp_ = 90 * (current_time - start_time_); 4740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org for (int i = 0; i < num_media_packets; ++i) { 48a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org const int packet_size = 49a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org (kFrameSize + num_media_packets / 2) / num_media_packets; 5040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org bool marker_bit = (i == num_media_packets - 1); 51a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org packets_.push_back(GeneratePacket( 52a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org sequence_number_, timestamp_, packet_size, (i == 0), marker_bit, type)); 5340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org ++sequence_number_; 5440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org } 5540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org for (int i = 0; i < num_empty_packets; ++i) { 56a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org packets_.push_back(GeneratePacket( 57a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org sequence_number_, timestamp_, 0, false, false, kFrameEmpty)); 5840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org ++sequence_number_; 5940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org } 6040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} 6140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 6240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orgVCMPacket StreamGenerator::GeneratePacket(uint16_t sequence_number, 6340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org uint32_t timestamp, 6440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org unsigned int size, 6540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org bool first_packet, 6640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org bool marker_bit, 6740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org FrameType type) { 6840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org EXPECT_LT(size, kMaxPacketSize); 6940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org VCMPacket packet; 7040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.seqNum = sequence_number; 7140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.timestamp = timestamp; 7240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.frameType = type; 7340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.isFirstPacket = first_packet; 7440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.markerBit = marker_bit; 7540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.sizeBytes = size; 7640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.dataPtr = packet_buffer; 7740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org if (packet.isFirstPacket) 7840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.completeNALU = kNaluStart; 7940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org else if (packet.markerBit) 8040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.completeNALU = kNaluEnd; 8140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org else 8240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packet.completeNALU = kNaluIncomplete; 8340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return packet; 8440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} 8540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 8640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orgbool StreamGenerator::PopPacket(VCMPacket* packet, int index) { 8740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org std::list<VCMPacket>::iterator it = GetPacketIterator(index); 8840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org if (it == packets_.end()) 8940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return false; 9040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org if (packet) 9140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org *packet = (*it); 9240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packets_.erase(it); 9340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return true; 9440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} 9540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 9640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orgbool StreamGenerator::GetPacket(VCMPacket* packet, int index) { 9740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org std::list<VCMPacket>::iterator it = GetPacketIterator(index); 9840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org if (it == packets_.end()) 9940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return false; 10040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org if (packet) 10140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org *packet = (*it); 10240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return true; 10340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} 10440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 10540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orgbool StreamGenerator::NextPacket(VCMPacket* packet) { 10640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org if (packets_.empty()) 10740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return false; 10840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org if (packet != NULL) 10940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org *packet = packets_.front(); 11040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org packets_.pop_front(); 11140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return true; 11240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} 11340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 114a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.orgvoid StreamGenerator::DropLastPacket() { packets_.pop_back(); } 115376ae3eaeb3751c41f2e2640b692a657e0e2d78dstefan@webrtc.org 11640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orguint16_t StreamGenerator::NextSequenceNumber() const { 11740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org if (packets_.empty()) 11840bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return sequence_number_; 11940bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return packets_.front().seqNum; 12040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} 12140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 122a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.orgint StreamGenerator::PacketsRemaining() const { return packets_.size(); } 12340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 12440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.orgstd::list<VCMPacket>::iterator StreamGenerator::GetPacketIterator(int index) { 12540bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org std::list<VCMPacket>::iterator it = packets_.begin(); 12640bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org for (int i = 0; i < index; ++i) { 12740bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org ++it; 128a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org if (it == packets_.end()) 129a26a7f6b69525de3a935c79eb24be6f0bc871930andresp@webrtc.org break; 13040bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org } 13140bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org return it; 13240bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} 13340bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org 13440bd7448cb81dea34512c6970864a710a75da666mikhal@webrtc.org} // namespace webrtc 135