blob: 75201a9a9c13469dc340dcda1e3579c62a549177 [file] [log] [blame]
// Copyright 2019 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 <zircon/compiler.h>
#include <gtest/gtest.h>
#include "amlogic-video.h"
#include "macros.h"
#include "tests/test_support.h"
class TestParser {
public:
static void MemoryCopy(uint32_t input_data_size) {
auto video = std::make_unique<AmlogicVideo>();
ASSERT_TRUE(video);
EXPECT_EQ(ZX_OK, video->InitRegisters(TestSupport::parent_device()));
video->UngateParserClock();
io_buffer_t output_buffer = {};
constexpr uint32_t kOutputDataPadding = 0x80;
uint32_t output_buffer_size = input_data_size + kOutputDataPadding;
ASSERT_EQ(ZX_OK, video->AllocateIoBuffer(&output_buffer, output_buffer_size, 0,
IO_BUFFER_CONTIG | IO_BUFFER_RW, "testoutput"));
uint8_t* output_data = static_cast<uint8_t*>(io_buffer_virt(&output_buffer));
memset(output_data + input_data_size, 0xff, kOutputDataPadding);
io_buffer_cache_flush(&output_buffer, 0, output_buffer_size);
EXPECT_EQ(ZX_OK, video->InitializeEsParser());
video->parser()->SetOutputLocation(io_buffer_phys(&output_buffer), output_buffer_size);
uint8_t input_data[input_data_size];
for (uint32_t i = 0; i < input_data_size; i++) {
input_data[i] = i & 0xff;
}
EXPECT_EQ(ZX_OK, video->parser()->ParseVideo(input_data, input_data_size));
EXPECT_EQ(ZX_OK, video->parser()->WaitForParsingCompleted(ZX_SEC(10)));
io_buffer_cache_flush_invalidate(&output_buffer, 0, input_data_size);
for (uint32_t i = 0; i < input_data_size; i++) {
if (input_data[i] != output_data[i]) {
EXPECT_EQ(input_data[i], output_data[i])
<< "Input " << input_data[i] << " not equal to " << output_data[i] << " location " << i;
break;
}
}
for (uint32_t i = input_data_size; i < output_buffer_size; i++) {
if (output_data[i] != 0xff) {
EXPECT_EQ(0xff, output_data[i])
<< "Location " << i << " incorrectly modified " << output_data[i];
break;
}
}
io_buffer_release(&output_buffer);
video.reset();
}
};
TEST(Parser, MemoryCopy4079) { TestParser::MemoryCopy(4079); }
TEST(Parser, MemoryCopy4080) { TestParser::MemoryCopy(4080); }
TEST(Parser, MemoryCopy4096) { TestParser::MemoryCopy(4096); }