libhevc-mirror/tests/decoder/DecHelper.h
Harish Mahendrakar 4a8c3163e3
Some checks failed
CMake / build (cmake, aarch64-linux-gnu-gcc, -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/aarch64_toolchain.cmake, aarch64-linux-gnu-g++, ubuntu-latest-cross-aarch64-cmake, ubuntu-latest) (push) Has been cancelled
CMake / build (cmake, arm-linux-gnueabihf-gcc, -DCMAKE_TOOLCHAIN_FILE=../cmake/toolchains/aarch32_toolchain.cmake, arm-linux-gnueabihf-g++, ubuntu-latest-cross-aarch32-cmake, ubuntu-latest) (push) Has been cancelled
CMake / build (cmake, clang, , clang++, macos-latest-clang-cmake, macos-latest) (push) Has been cancelled
CMake / build (cmake, clang, , clang++, ubuntu-24.04-arm-clang-cmake, ubuntu-24.04-arm) (push) Has been cancelled
CMake / build (cmake, clang, , clang++, ubuntu-latest-clang-cmake, ubuntu-latest) (push) Has been cancelled
CMake / build (cmake, clang, -DSANITIZE=fuzzer-no-link,address, clang++, ubuntu-latest-clang-cmake-asan-fuzzer, ubuntu-latest) (push) Has been cancelled
CMake / build (cmake, clang, -G Ninja, clang++, ubuntu-latest-clang-cmake-ninja, ubuntu-latest) (push) Has been cancelled
CMake / build (cmake, gcc, , g++, ubuntu-latest-gcc-cmake, ubuntu-latest) (push) Has been cancelled
Add initial tests for decoder and encoder
Encoder tests currently do not dump recon as ihevce_plugin doesn't yet support recon dump.
This will be enabled once the recon dump is supported.

Decoder tests currently validate just a few files from big buck bunny.

Use "ctest" run all the tests when using cmake.
This downloads the required media files and uses them in the tests.

If running the tests directly using the test binaries, then download the media files
and export HEVC_TEST_DIR to the extracted folder before running the binaries directly.
2026-07-27 13:15:45 -07:00

124 lines
3.6 KiB
C++

/******************************************************************************
*
* Copyright (C) 2026 Ittiam Systems Pvt Ltd, Bangalore
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
#pragma once
#include <cstddef>
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "BitsBuf.h"
#include "BitsFile.h"
#include "RawBuf.h"
#include "RawFile.h"
#include "TestCommon.h"
class DecHelper {
public:
class Builder {
public:
Builder() = default;
~Builder() = default;
Builder& setFormat(libhevc::test::Format format) {
mFormat = format;
return *this;
}
Builder& setCores(size_t cores) {
mCores = cores;
return *this;
}
Builder& setArch(libhevc::test::Arch arch) {
mArch = arch;
return *this;
}
Builder& setInputFilePath(const std::string& path) {
mInputFilePath = path;
return *this;
}
Builder& setOutputFilePath(const std::string& path) {
mOutputFilePath = path;
return *this;
}
Builder& setRefMd5Path(const std::string& path) {
mRefMd5Path = path;
return *this;
}
// Validates parameters and returns an initialized DecHelper instance
std::unique_ptr<DecHelper> build();
private:
libhevc::test::Format mFormat = libhevc::test::Format::yuv420p;
size_t mCores = 1;
libhevc::test::Arch mArch = libhevc::test::Arch::defaultArch;
std::optional<std::string> mInputFilePath;
std::optional<std::string> mOutputFilePath;
std::optional<std::string> mRefMd5Path;
friend class DecHelper;
};
~DecHelper() { deinitDecoder(); }
// Executes the entire decoding process using the configured input/output
// files. Uses inline GTest assertions to validate frame MD5 checksums.
bool decodeFile();
// Low-level chunk-based frame decoding
bool decodeHeader(size_t& bytesConsumed);
bool decodeFrame(size_t& bytesConsumed, bool& frameReady, size_t& frameIndex,
bool noInput = false);
bool flushDecoder(size_t& frameIndex);
void deinitDecoder();
// Computes plane-by-plane MD5 checksum of a raw frame (ignoring stride
// padding row-by-row)
std::string computeFrameMd5(const RawBuf& buf);
size_t width() const { return mWidth; }
size_t height() const { return mHeight; }
bool isHeaderDecoded() const { return mHeaderDecoded; }
private:
DecHelper() = default; // Private constructor, instantiated only via Builder
bool initDecoder();
void processDecodedFrame(RawBuf& buf, size_t& frameIndex);
void* mCodec = nullptr; // Opaque pointer to internal iv_obj_t
bool mHeaderDecoded = false;
bool mInFlushMode = false;
size_t mWidth = 0;
size_t mHeight = 0;
libhevc::test::Format mFormat = libhevc::test::Format::yuv420p;
size_t mCores = 1;
libhevc::test::Arch mArch = libhevc::test::Arch::defaultArch;
std::optional<std::string> mInputFilePath;
std::optional<std::string> mOutputFilePath;
std::optional<std::string> mRefMd5Path;
std::vector<std::string> mRefMd5s;
BitsFile mBitsFile;
RawFile mOutFile;
BitsBuf mInputBuf;
RawBuf mOutputBuf;
};