An attempt at getting image data back

This commit is contained in:
2024-07-14 00:27:33 +02:00
parent e026bc93f7
commit 6452d2e774
1314 changed files with 218350 additions and 38 deletions

View File

@@ -0,0 +1,181 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2020, Google Inc.
*
* Test generated serializer
*/
#include <algorithm>
#include <tuple>
#include <vector>
#include "test.h"
#include "test_ipa_interface.h"
#include "test_ipa_serializer.h"
using namespace std;
using namespace libcamera;
class IPAGeneratedSerializerTest : public Test
{
protected:
int init() override
{
return TestPass;
}
int run() override
{
#define TEST_FIELD_EQUALITY(struct1, struct2, field) \
if (struct1.field != struct2.field) { \
cerr << #field << " field incorrect: expected \"" \
<< t.field << "\", got \"" << u.field << "\"" << endl;\
return TestFail; \
}
#define TEST_SCOPED_ENUM_EQUALITY(struct1, struct2, field) \
if (struct1.field != struct2.field) { \
cerr << #field << " field incorrect" << endl; \
return TestFail; \
}
ipa::test::TestStruct t, u;
t.m = {
{ "a", "z" },
{ "b", "z" },
{ "c", "z" },
{ "d", "z" },
{ "e", "z" },
};
t.a = { "a", "b", "c", "d", "e" };
t.s1 = "hello world";
t.s2 = "goodbye";
t.s3 = "lorem ipsum";
t.i = 58527;
t.c = ipa::test::IPAOperationInit;
t.e = ipa::test::ErrorFlags::Error1;
Flags<ipa::test::ErrorFlags> flags;
flags |= ipa::test::ErrorFlags::Error1;
flags |= ipa::test::ErrorFlags::Error2;
t.f = flags;
std::vector<uint8_t> serialized;
std::tie(serialized, ignore) =
IPADataSerializer<ipa::test::TestStruct>::serialize(t);
u = IPADataSerializer<ipa::test::TestStruct>::deserialize(serialized);
if (!equals(t.m, u.m))
return TestFail;
if (!equals(t.a, u.a))
return TestFail;
TEST_FIELD_EQUALITY(t, u, s1);
TEST_FIELD_EQUALITY(t, u, s2);
TEST_FIELD_EQUALITY(t, u, s3);
TEST_FIELD_EQUALITY(t, u, i);
TEST_FIELD_EQUALITY(t, u, c);
TEST_SCOPED_ENUM_EQUALITY(t, u, e);
TEST_SCOPED_ENUM_EQUALITY(t, u, f);
/* Test vector of generated structs */
std::vector<ipa::test::TestStruct> v = { t, u };
std::vector<ipa::test::TestStruct> w;
std::tie(serialized, ignore) =
IPADataSerializer<vector<ipa::test::TestStruct>>::serialize(v);
w = IPADataSerializer<vector<ipa::test::TestStruct>>::deserialize(serialized);
if (!equals(v[0].m, w[0].m) ||
!equals(v[1].m, w[1].m))
return TestFail;
if (!equals(v[0].a, w[0].a) ||
!equals(v[1].a, w[1].a))
return TestFail;
TEST_FIELD_EQUALITY(v[0], w[0], s1);
TEST_FIELD_EQUALITY(v[0], w[0], s2);
TEST_FIELD_EQUALITY(v[0], w[0], s3);
TEST_FIELD_EQUALITY(v[0], w[0], i);
TEST_FIELD_EQUALITY(v[0], w[0], c);
TEST_SCOPED_ENUM_EQUALITY(v[0], w[0], e);
TEST_SCOPED_ENUM_EQUALITY(v[0], w[0], f);
TEST_FIELD_EQUALITY(v[1], w[1], s1);
TEST_FIELD_EQUALITY(v[1], w[1], s2);
TEST_FIELD_EQUALITY(v[1], w[1], s3);
TEST_FIELD_EQUALITY(v[1], w[1], i);
TEST_FIELD_EQUALITY(v[1], w[1], c);
TEST_SCOPED_ENUM_EQUALITY(v[1], w[1], e);
TEST_SCOPED_ENUM_EQUALITY(v[1], w[1], f);
return TestPass;
}
private:
bool equals(const map<string, string> &lhs, const map<string, string> &rhs)
{
bool eq = lhs.size() == rhs.size() &&
equal(lhs.begin(), lhs.end(), rhs.begin(),
[](auto &a, auto &b) { return a.first == b.first &&
a.second == b.second; });
if (eq)
return true;
cerr << "lhs:" << endl;
for (const auto &pair : lhs)
cerr << "- " << pair.first << ": "
<< pair.second << endl;
cerr << "rhs:" << endl;
for (const auto &pair : rhs)
cerr << "- " << pair.first << ": "
<< pair.second << endl;
return false;
}
bool equals(const vector<string> &lhs, const vector<string> &rhs)
{
bool eq = lhs.size() == rhs.size();
if (!eq) {
cerr << "sizes not equal" << endl;
return false;
}
for (unsigned int i = 0; i < lhs.size(); i++)
if (lhs[i] != rhs[i])
eq = false;
if (eq)
return true;
cerr << "lhs:" << endl;
for (const auto &str : lhs)
cerr << "- " << str << endl;
cerr << "rhs:" << endl;
for (const auto &str : rhs)
cerr << "- " << str << endl;
return false;
}
};
TEST_REGISTER(IPAGeneratedSerializerTest)

View File

@@ -0,0 +1,40 @@
# SPDX-License-Identifier: CC0-1.0
# test.mojom-module
mojom = custom_target('test_mojom_module',
input : 'test.mojom',
output : 'test.mojom-module',
command : [
mojom_parser,
'--output-root', meson.project_build_root(),
'--input-root', meson.project_source_root(),
'--mojoms', '@INPUT@'
])
# test_ipa_interface.h
generated_test_header = custom_target('test_ipa_interface_h',
input : mojom,
output : 'test_ipa_interface.h',
depends : mojom_templates,
command : [
mojom_generator, 'generate',
'-g', 'libcamera',
'--bytecode_path', mojom_templates_dir,
'--libcamera_generate_header',
'--libcamera_output_path=@OUTPUT@',
'./' +'@INPUT@'
])
# test_ipa_serializer.h
generated_test_serializer = custom_target('test_ipa_serializer_h',
input : mojom,
output : 'test_ipa_serializer.h',
depends : mojom_templates,
command : [
mojom_generator, 'generate',
'-g', 'libcamera',
'--bytecode_path', mojom_templates_dir,
'--libcamera_generate_serializer',
'--libcamera_output_path=@OUTPUT@',
'./' +'@INPUT@'
])

View File

@@ -0,0 +1,43 @@
/* SPDX-License-Identifier: LGPL-2.1-or-later */
module ipa.test;
enum IPAOperationCode {
IPAOperationNone,
IPAOperationInit,
IPAOperationStart,
IPAOperationStop,
};
[scopedEnum] enum ErrorFlags {
Error1 = 0x1,
Error2 = 0x2,
Error3 = 0x4,
Error4 = 0x8,
};
struct IPASettings {};
struct TestStruct {
map<string, string> m;
array<string> a;
string s1;
string s2;
int32 i;
string s3;
IPAOperationCode c;
ErrorFlags e;
[flags] ErrorFlags f;
};
interface IPATestInterface {
init(IPASettings settings) => (int32 ret);
start() => (int32 ret);
stop();
test(TestStruct s);
};
interface IPATestEventInterface {
dummyEvent(uint32 val);
};

View File

@@ -0,0 +1,19 @@
# SPDX-License-Identifier: CC0-1.0
subdir('include/libcamera/ipa')
exe = executable('generated_serializer_test',
[
'generated_serializer_test.cpp',
generated_test_header,
generated_test_serializer,
],
dependencies : libcamera_private,
link_with : test_libraries,
include_directories : [
test_includes_internal,
'./include',
])
test('generated_serializer_test', exe,
suite : 'generated_serializer', is_parallel : false)