Home | History | Annotate | Download | only in test
      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