blob: 0e9b7a174c366abb633160f8fe2e57c6147f7597 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "amlogic-video.h"
#include "gtest/gtest.h"
#include "tests/test_support.h"
#include "vp9_decoder.h"
namespace {
class FakeDecoderCore : public DecoderCore {
public:
zx_status_t LoadFirmware(const uint8_t* data, uint32_t len) override {
return ZX_OK;
}
void PowerOn() override {}
void PowerOff() override {}
void StartDecoding() override {}
void StopDecoding() override {}
void WaitForIdle() override {}
void InitializeStreamInput(bool use_parser, uint32_t buffer_address,
uint32_t buffer_size) override {}
void InitializeParserInput() override {}
void InitializeDirectInput() override {}
void UpdateWritePointer(uint32_t write_pointer) override {}
uint32_t GetStreamInputOffset() override { return 0; }
uint32_t GetReadOffset() override { return 0; }
};
class FakeOwner : public VideoDecoder::Owner {
public:
FakeOwner(DosRegisterIo* dosbus) : dosbus_(dosbus) {
blob_.LoadFakeFirmwareForTesting(FirmwareBlob::FirmwareType::kVp9Mmu,
nullptr, 0);
}
DosRegisterIo* dosbus() override { return dosbus_; }
zx_handle_t bti() override { return ZX_HANDLE_INVALID; }
DeviceType device_type() override { return DeviceType::kGXM; }
FirmwareBlob* firmware_blob() override { return &blob_; }
std::unique_ptr<CanvasEntry> ConfigureCanvas(io_buffer_t* io_buffer,
uint32_t offset, uint32_t width,
uint32_t height, uint32_t wrap,
uint32_t blockmode) override {
return nullptr;
}
DecoderCore* core() override { return &core_; }
zx_status_t AllocateIoBuffer(io_buffer_t* buffer, size_t size,
uint32_t alignment_log2,
uint32_t flags) override {
zx_status_t status = io_buffer_init(buffer, ZX_HANDLE_INVALID, size,
flags & ~IO_BUFFER_CONTIG);
if (status != ZX_OK)
return status;
if (flags & IO_BUFFER_CONTIG) {
if (alignment_log2 == 0)
alignment_log2 = 12;
phys_map_start_ = fbl::round_up(phys_map_start_, 1ul << alignment_log2);
buffer->phys = phys_map_start_;
phys_map_start_ += size;
}
return ZX_OK;
}
bool IsDecoderCurrent(VideoDecoder* decoder) override { return true; }
private:
DosRegisterIo* dosbus_;
FakeDecoderCore core_;
uint64_t phys_map_start_ = 0x1000;
FirmwareBlob blob_;
};
constexpr uint32_t kDosbusMemorySize = 0x10000;
} // namespace
class Vp9UnitTest {
public:
static void LoopFilter() {
auto dosbus_memory = fbl::unique_ptr<uint32_t[]>(new uint32_t[kDosbusMemorySize]);
memset(dosbus_memory.get(), 0, kDosbusMemorySize);
mmio_buffer_t dosbus_mmio = {.vaddr = dosbus_memory.get(),
.size = kDosbusMemorySize,
.vmo = ZX_HANDLE_INVALID};
DosRegisterIo dosbus(dosbus_mmio);
FakeOwner fake_owner(&dosbus);
auto decoder = std::make_unique<Vp9Decoder>(
&fake_owner, Vp9Decoder::InputType::kSingleStream);
decoder->InitLoopFilter();
// This should be the 32nd value written to this register.
EXPECT_EQ(0x3fc13ebeu,
HevcDblkCfg9::Get().ReadFrom(fake_owner.dosbus()).reg_value());
}
static void InitializeMemory() {
auto zeroed_memory = fbl::unique_ptr<uint32_t[]>(new uint32_t[kDosbusMemorySize]);
auto dosbus_memory = fbl::unique_ptr<uint32_t[]>(new uint32_t[kDosbusMemorySize]);
memset(zeroed_memory.get(), 0, kDosbusMemorySize);
memset(dosbus_memory.get(), 0, kDosbusMemorySize);
mmio_buffer_t dosbus_mmio = {.vaddr = dosbus_memory.get(),
.size = kDosbusMemorySize,
.vmo = ZX_HANDLE_INVALID};
DosRegisterIo dosbus(dosbus_mmio);
FakeOwner fake_owner(&dosbus);
auto decoder = std::make_unique<Vp9Decoder>(
&fake_owner, Vp9Decoder::InputType::kSingleStream);
EXPECT_EQ(ZX_OK, decoder->InitializeBuffers());
EXPECT_EQ(0, memcmp(dosbus_memory.get(), zeroed_memory.get(), kDosbusMemorySize));
EXPECT_EQ(ZX_OK, decoder->InitializeHardware());
EXPECT_NE(0, memcmp(dosbus_memory.get(), zeroed_memory.get(), kDosbusMemorySize));
auto dosbus_memory_copy = fbl::unique_ptr<uint32_t[]>(new uint32_t[kDosbusMemorySize]);
memcpy(dosbus_memory_copy.get(), dosbus_memory.get(), kDosbusMemorySize);
memset(dosbus_memory.get(), 0, kDosbusMemorySize);
decoder->state_ = Vp9Decoder::DecoderState::kSwappedOut;
EXPECT_EQ(ZX_OK, decoder->InitializeHardware());
EXPECT_EQ(0, memcmp(dosbus_memory.get(), dosbus_memory_copy.get(),
kDosbusMemorySize));
}
};
TEST(Vp9UnitTest, LoopFilter) { Vp9UnitTest::LoopFilter(); }
TEST(Vp9UnitTest, InitializeMemory) { Vp9UnitTest::InitializeMemory(); }