blob: 9f4fae11e72b57feb0aea34819f5acbe7d43ff0f [file] [log] [blame]
/*
* Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/video_engine/test/common/frame_generator.h"
#include <math.h>
#include <string.h>
#include "webrtc/system_wrappers/interface/clock.h"
#include "webrtc/video_engine/new_include/video_send_stream.h"
namespace webrtc {
namespace test {
FrameGenerator* FrameGenerator::Create(size_t width,
size_t height,
Clock* clock) {
return new ChromaFrameGenerator(width, height, clock);
}
void FrameGenerator::InsertFrame(VideoSendStreamInput* input) {
int64_t time_before = clock_->CurrentNtpInMilliseconds();
frame_.set_render_time_ms(time_before);
GenerateNextFrame();
int64_t time_after = clock_->CurrentNtpInMilliseconds();
input->PutFrame(frame_, static_cast<uint32_t>(time_after - time_before));
}
FrameGenerator::FrameGenerator(size_t width, size_t height, Clock* clock)
: width_(width), height_(height), clock_(clock) {
// Generate frame by constructor arguments
assert(width > 0);
assert(height > 0);
frame_.CreateEmptyFrame(static_cast<int>(width),
static_cast<int>(height),
static_cast<int>(width),
static_cast<int>((width + 1) / 2),
static_cast<int>((width + 1) / 2));
}
BlackFrameGenerator::BlackFrameGenerator(size_t width,
size_t height,
Clock* clock)
: FrameGenerator(width, height, clock) {
memset(frame_.buffer(kYPlane), 0x00, frame_.allocated_size(kYPlane));
memset(frame_.buffer(kUPlane), 0x80, frame_.allocated_size(kUPlane));
memset(frame_.buffer(kVPlane), 0x80, frame_.allocated_size(kVPlane));
}
void BlackFrameGenerator::GenerateNextFrame() {}
WhiteFrameGenerator::WhiteFrameGenerator(size_t width,
size_t height,
Clock* clock)
: FrameGenerator(width, height, clock) {
memset(frame_.buffer(kYPlane), 0xFF, frame_.allocated_size(kYPlane));
memset(frame_.buffer(kUPlane), 0x80, frame_.allocated_size(kUPlane));
memset(frame_.buffer(kVPlane), 0x80, frame_.allocated_size(kVPlane));
}
void WhiteFrameGenerator::GenerateNextFrame() {}
ChromaFrameGenerator::ChromaFrameGenerator(size_t width,
size_t height,
Clock* clock)
: FrameGenerator(width, height, clock) {
memset(frame_.buffer(kYPlane), 0x80, frame_.allocated_size(kYPlane));
}
void ChromaFrameGenerator::GenerateNextFrame() {
double angle = static_cast<double>(frame_.render_time_ms()) / 1000.0;
uint8_t u = fabs(sin(angle)) * 0xFF;
uint8_t v = fabs(cos(angle)) * 0xFF;
memset(frame_.buffer(kUPlane), u, frame_.allocated_size(kUPlane));
memset(frame_.buffer(kVPlane), v, frame_.allocated_size(kVPlane));
}
} // test
} // webrtc