128631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org/* 228631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org * 428631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org * Use of this source code is governed by a BSD-style license 528631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org * that can be found in the LICENSE file in the root of the source 628631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org * tree. An additional intellectual property rights grant can be found 728631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org * in the file PATENTS. All contributing project authors may 828631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org * be found in the AUTHORS file in the root of the source tree. 928631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org */ 10c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org#include "webrtc/test/frame_generator.h" 1128631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 12e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org#include <math.h> 1328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org#include <stdio.h> 14e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org#include <string.h> 1528631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 1628631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org#include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" 1728631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 1828631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.orgnamespace webrtc { 1928631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.orgnamespace test { 2028631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.orgnamespace { 2128631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 22e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.orgclass ChromaGenerator : public FrameGenerator { 23e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org public: 24c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org ChromaGenerator(size_t width, size_t height) 25c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org : angle_(0.0), width_(width), height_(height) { 26e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org assert(width > 0); 27e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org assert(height > 0); 28e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org } 29e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org 30c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org virtual I420VideoFrame* NextFrame() OVERRIDE { 31c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org frame_.CreateEmptyFrame(static_cast<int>(width_), 32c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org static_cast<int>(height_), 33c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org static_cast<int>(width_), 34c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org static_cast<int>((width_ + 1) / 2), 35c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org static_cast<int>((width_ + 1) / 2)); 36e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org angle_ += 30.0; 37e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org uint8_t u = fabs(sin(angle_)) * 0xFF; 38e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org uint8_t v = fabs(cos(angle_)) * 0xFF; 39e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org 40c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org memset(frame_.buffer(kYPlane), 0x80, frame_.allocated_size(kYPlane)); 41e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org memset(frame_.buffer(kUPlane), u, frame_.allocated_size(kUPlane)); 42e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org memset(frame_.buffer(kVPlane), v, frame_.allocated_size(kVPlane)); 43c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org return &frame_; 44e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org } 45e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org 46e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org private: 47e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org double angle_; 48c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org size_t width_; 49c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org size_t height_; 50e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org I420VideoFrame frame_; 51e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org}; 52e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org 5328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.orgclass YuvFileGenerator : public FrameGenerator { 5428631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org public: 5528631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org YuvFileGenerator(FILE* file, size_t width, size_t height) 5628631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org : file_(file), width_(width), height_(height) { 5728631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org assert(file); 5828631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org assert(width > 0); 5928631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org assert(height > 0); 6028631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org frame_size_ = CalcBufferSize( 6128631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org kI420, static_cast<int>(width_), static_cast<int>(height_)); 6228631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org frame_buffer_ = new uint8_t[frame_size_]; 6328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org } 6428631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 6528631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org virtual ~YuvFileGenerator() { 6628631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org fclose(file_); 6728631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org delete[] frame_buffer_; 6828631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org } 6928631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 70c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org virtual I420VideoFrame* NextFrame() OVERRIDE { 7128631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org size_t count = fread(frame_buffer_, 1, frame_size_, file_); 7228631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org if (count < frame_size_) { 7328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org rewind(file_); 7428631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org return NextFrame(); 7528631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org } 7628631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 77c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org frame_.CreateEmptyFrame(static_cast<int>(width_), 78c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org static_cast<int>(height_), 79c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org static_cast<int>(width_), 80c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org static_cast<int>((width_ + 1) / 2), 81c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org static_cast<int>((width_ + 1) / 2)); 82c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org 8328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org ConvertToI420(kI420, 8428631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org frame_buffer_, 8528631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 0, 8628631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 0, 8728631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org static_cast<int>(width_), 8828631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org static_cast<int>(height_), 8928631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 0, 9028631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org kRotateNone, 9128631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org &frame_); 92c33d37ce205e22c0e090b0b285ed963686bf24dcpbos@webrtc.org return &frame_; 9328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org } 9428631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 9528631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org private: 9628631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org FILE* file_; 9728631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org size_t width_; 9828631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org size_t height_; 9928631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org size_t frame_size_; 10028631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org uint8_t* frame_buffer_; 10128631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org I420VideoFrame frame_; 10228631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org}; 10328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org} // namespace 10428631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 105e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.orgFrameGenerator* FrameGenerator::Create(size_t width, size_t height) { 106e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org return new ChromaGenerator(width, height); 107e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org} 108e2c52d725d7af76fc84e6bd1443c4bd7632c7331pbos@webrtc.org 10928631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.orgFrameGenerator* FrameGenerator::CreateFromYuvFile(const char* file, 11028631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org size_t width, 11128631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org size_t height) { 112f2e99be19be2ba5631a938ccc2f8703ce83637f8pbos@webrtc.org FILE* file_handle = fopen(file, "rb"); 11328631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org assert(file_handle); 11428631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org return new YuvFileGenerator(file_handle, width, height); 11528631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org} 11628631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org 11728631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org} // namespace test 11828631e76cf7bcb40532069eecfe65f6290c05cd4andresp@webrtc.org} // namespace webrtc 119