| /* |
| * Copyright (c) 2012 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 <stdio.h> |
| |
| #include <string> |
| |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "webrtc/common_video/interface/video_image.h" |
| #include "webrtc/common_video/jpeg/include/jpeg.h" |
| #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" |
| #include "webrtc/modules/interface/module_common_types.h" |
| #include "webrtc/test/testsupport/fileutils.h" |
| |
| namespace webrtc { |
| |
| const int kImageWidth = 640; |
| const int kImageHeight = 480; |
| |
| class JpegTest: public testing::Test { |
| protected: |
| JpegTest() |
| : input_filename_(webrtc::test::ProjectRootPath() + |
| "data/common_video/jpeg/webrtc_logo.jpg"), |
| decoded_filename_(webrtc::test::OutputPath() + "TestJpegDec.yuv"), |
| encoded_filename_(webrtc::test::OutputPath() + "TestJpegEnc.jpg"), |
| encoded_buffer_(NULL) {} |
| virtual ~JpegTest() {} |
| |
| void SetUp() { |
| encoder_ = new JpegEncoder(); |
| } |
| |
| void TearDown() { |
| if (encoded_buffer_ != NULL) { |
| if (encoded_buffer_->_buffer != NULL) { |
| delete [] encoded_buffer_->_buffer; |
| } |
| delete encoded_buffer_; |
| } |
| delete encoder_; |
| } |
| |
| // Reads an encoded image. Caller will have to deallocate the memory of this |
| // object and it's _buffer byte array. |
| EncodedImage* ReadEncodedImage(std::string input_filename) { |
| FILE* open_file = fopen(input_filename.c_str(), "rb"); |
| assert(open_file != NULL); |
| size_t length = webrtc::test::GetFileSize(input_filename); |
| EncodedImage* encoded_buffer = new EncodedImage(); |
| encoded_buffer->_buffer = new uint8_t[length]; |
| encoded_buffer->_size = length; |
| encoded_buffer->_length = length; |
| if (fread(encoded_buffer->_buffer, 1, length, open_file) != length) { |
| ADD_FAILURE() << "Error reading file:" << input_filename; |
| } |
| fclose(open_file); |
| return encoded_buffer; |
| } |
| |
| std::string input_filename_; |
| std::string decoded_filename_; |
| std::string encoded_filename_; |
| EncodedImage* encoded_buffer_; |
| JpegEncoder* encoder_; |
| }; |
| |
| TEST_F(JpegTest, Decode) { |
| encoded_buffer_ = ReadEncodedImage(input_filename_); |
| I420VideoFrame image_buffer; |
| EXPECT_EQ(0, ConvertJpegToI420(*encoded_buffer_, &image_buffer)); |
| EXPECT_FALSE(image_buffer.IsZeroSize()); |
| EXPECT_EQ(kImageWidth, image_buffer.width()); |
| EXPECT_EQ(kImageHeight, image_buffer.height()); |
| } |
| |
| TEST_F(JpegTest, EncodeInvalidInputs) { |
| I420VideoFrame empty; |
| empty.set_width(164); |
| empty.set_height(164); |
| EXPECT_EQ(-1, encoder_->SetFileName(0)); |
| // Test empty (null) frame. |
| EXPECT_EQ(-1, encoder_->Encode(empty)); |
| // Create empty frame (allocate memory) - arbitrary dimensions. |
| empty.CreateEmptyFrame(10, 10, 10, 5, 5); |
| empty.ResetSize(); |
| EXPECT_EQ(-1, encoder_->Encode(empty)); |
| } |
| |
| TEST_F(JpegTest, Encode) { |
| // Decode our input image then encode it again to a new file: |
| encoded_buffer_ = ReadEncodedImage(input_filename_); |
| I420VideoFrame image_buffer; |
| EXPECT_EQ(0, ConvertJpegToI420(*encoded_buffer_, &image_buffer)); |
| |
| EXPECT_EQ(0, encoder_->SetFileName(encoded_filename_.c_str())); |
| EXPECT_EQ(0, encoder_->Encode(image_buffer)); |
| |
| // Save decoded image to file. |
| FILE* save_file = fopen(decoded_filename_.c_str(), "wb"); |
| if (PrintI420VideoFrame(image_buffer, save_file)) { |
| return; |
| } |
| fclose(save_file); |
| |
| } |
| |
| } // namespace webrtc |