blob: 33cb9f658f00d0bff5411c707657538dfef97760 [file] [log] [blame]
Dichen Zhang4a66b3c2022-10-19 18:04:47 +00001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Dichen Zhangdbceb0e2023-04-14 19:03:18 +000017#include <ultrahdr/jpegencoderhelper.h>
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000018#include <gtest/gtest.h>
19#include <utils/Log.h>
20
21#include <fcntl.h>
22
Dichen Zhangdbceb0e2023-04-14 19:03:18 +000023namespace android::ultrahdr {
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000024
Dichen Zhang56a7d592023-04-14 16:57:34 +000025#define ALIGNED_IMAGE "/sdcard/Documents/minnie-320x240.yu12"
26#define ALIGNED_IMAGE_WIDTH 320
27#define ALIGNED_IMAGE_HEIGHT 240
Dichen Zhanga4819142022-10-21 04:12:30 +000028#define SINGLE_CHANNEL_IMAGE "/sdcard/Documents/minnie-320x240.y"
Dichen Zhang56a7d592023-04-14 16:57:34 +000029#define SINGLE_CHANNEL_IMAGE_WIDTH ALIGNED_IMAGE_WIDTH
30#define SINGLE_CHANNEL_IMAGE_HEIGHT ALIGNED_IMAGE_HEIGHT
31#define UNALIGNED_IMAGE "/sdcard/Documents/minnie-318x240.yu12"
32#define UNALIGNED_IMAGE_WIDTH 318
33#define UNALIGNED_IMAGE_HEIGHT 240
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000034#define JPEG_QUALITY 90
35
Dichen Zhang02dd0592023-02-10 20:16:57 +000036class JpegEncoderHelperTest : public testing::Test {
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000037public:
38 struct Image {
39 std::unique_ptr<uint8_t[]> buffer;
40 size_t width;
41 size_t height;
42 };
Dichen Zhang02dd0592023-02-10 20:16:57 +000043 JpegEncoderHelperTest();
44 ~JpegEncoderHelperTest();
Ram Mohaneca81942023-07-29 14:41:48 +053045
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000046protected:
47 virtual void SetUp();
48 virtual void TearDown();
49
Dichen Zhang56a7d592023-04-14 16:57:34 +000050 Image mAlignedImage, mUnalignedImage, mSingleChannelImage;
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000051};
52
Dichen Zhang02dd0592023-02-10 20:16:57 +000053JpegEncoderHelperTest::JpegEncoderHelperTest() {}
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000054
Dichen Zhang02dd0592023-02-10 20:16:57 +000055JpegEncoderHelperTest::~JpegEncoderHelperTest() {}
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000056
57static size_t getFileSize(int fd) {
58 struct stat st;
59 if (fstat(fd, &st) < 0) {
60 ALOGW("%s : fstat failed", __func__);
61 return 0;
62 }
63 return st.st_size; // bytes
64}
65
Dichen Zhang02dd0592023-02-10 20:16:57 +000066static bool loadFile(const char filename[], JpegEncoderHelperTest::Image* result) {
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000067 int fd = open(filename, O_CLOEXEC);
68 if (fd < 0) {
69 return false;
70 }
71 int length = getFileSize(fd);
72 if (length == 0) {
73 close(fd);
74 return false;
75 }
76 result->buffer.reset(new uint8_t[length]);
77 if (read(fd, result->buffer.get(), length) != static_cast<ssize_t>(length)) {
78 close(fd);
79 return false;
80 }
81 close(fd);
82 return true;
83}
84
Dichen Zhang02dd0592023-02-10 20:16:57 +000085void JpegEncoderHelperTest::SetUp() {
Dichen Zhang56a7d592023-04-14 16:57:34 +000086 if (!loadFile(ALIGNED_IMAGE, &mAlignedImage)) {
87 FAIL() << "Load file " << ALIGNED_IMAGE << " failed";
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000088 }
Dichen Zhang56a7d592023-04-14 16:57:34 +000089 mAlignedImage.width = ALIGNED_IMAGE_WIDTH;
90 mAlignedImage.height = ALIGNED_IMAGE_HEIGHT;
91 if (!loadFile(UNALIGNED_IMAGE, &mUnalignedImage)) {
92 FAIL() << "Load file " << UNALIGNED_IMAGE << " failed";
Dichen Zhang4a66b3c2022-10-19 18:04:47 +000093 }
Dichen Zhang56a7d592023-04-14 16:57:34 +000094 mUnalignedImage.width = UNALIGNED_IMAGE_WIDTH;
95 mUnalignedImage.height = UNALIGNED_IMAGE_HEIGHT;
Dichen Zhanga4819142022-10-21 04:12:30 +000096 if (!loadFile(SINGLE_CHANNEL_IMAGE, &mSingleChannelImage)) {
97 FAIL() << "Load file " << SINGLE_CHANNEL_IMAGE << " failed";
98 }
99 mSingleChannelImage.width = SINGLE_CHANNEL_IMAGE_WIDTH;
100 mSingleChannelImage.height = SINGLE_CHANNEL_IMAGE_HEIGHT;
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000101}
102
Dichen Zhang02dd0592023-02-10 20:16:57 +0000103void JpegEncoderHelperTest::TearDown() {}
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000104
Dichen Zhang56a7d592023-04-14 16:57:34 +0000105TEST_F(JpegEncoderHelperTest, encodeAlignedImage) {
Dichen Zhang02dd0592023-02-10 20:16:57 +0000106 JpegEncoderHelper encoder;
Ram Mohaneca81942023-07-29 14:41:48 +0530107 EXPECT_TRUE(encoder.compressImage(mAlignedImage.buffer.get(),
108 mAlignedImage.buffer.get() +
109 mAlignedImage.width * mAlignedImage.height,
110 mAlignedImage.width, mAlignedImage.height,
111 mAlignedImage.width, mAlignedImage.width / 2, JPEG_QUALITY,
112 NULL, 0));
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000113 ASSERT_GT(encoder.getCompressedImageSize(), static_cast<uint32_t>(0));
114}
115
Dichen Zhang56a7d592023-04-14 16:57:34 +0000116TEST_F(JpegEncoderHelperTest, encodeUnalignedImage) {
Dichen Zhang02dd0592023-02-10 20:16:57 +0000117 JpegEncoderHelper encoder;
Ram Mohaneca81942023-07-29 14:41:48 +0530118 EXPECT_TRUE(encoder.compressImage(mUnalignedImage.buffer.get(),
119 mUnalignedImage.buffer.get() +
120 mUnalignedImage.width * mUnalignedImage.height,
121 mUnalignedImage.width, mUnalignedImage.height,
122 mUnalignedImage.width, mUnalignedImage.width / 2,
123 JPEG_QUALITY, NULL, 0));
Dichen Zhang56a7d592023-04-14 16:57:34 +0000124 ASSERT_GT(encoder.getCompressedImageSize(), static_cast<uint32_t>(0));
Dichen Zhang4a66b3c2022-10-19 18:04:47 +0000125}
126
Dichen Zhang56a7d592023-04-14 16:57:34 +0000127TEST_F(JpegEncoderHelperTest, encodeSingleChannelImage) {
Dichen Zhang02dd0592023-02-10 20:16:57 +0000128 JpegEncoderHelper encoder;
Ram Mohaneca81942023-07-29 14:41:48 +0530129 EXPECT_TRUE(encoder.compressImage(mSingleChannelImage.buffer.get(), nullptr,
130 mSingleChannelImage.width, mSingleChannelImage.height,
131 mSingleChannelImage.width, 0, JPEG_QUALITY, NULL, 0));
Dichen Zhanga4819142022-10-21 04:12:30 +0000132 ASSERT_GT(encoder.getCompressedImageSize(), static_cast<uint32_t>(0));
133}
134
Ram Mohaneca81942023-07-29 14:41:48 +0530135} // namespace android::ultrahdr