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