/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * ipu3-unpack - Unpack IPU3 raw Bayer format to 16-bit Bayer * * Copyright 2018 Laurent Pinchart */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include static void usage(const char *argv0) { printf("Usage: %s input-file output-file\n", basename(argv0)); printf("Unpack the IPU3 raw Bayer format to 16-bit Bayer\n"); } int main(int argc, char *argv[]) { int in_fd; int out_fd; int ret; if (argc != 3) { usage(argv[0]); return 1; } in_fd = open(argv[1], O_RDONLY); if (in_fd == -1) { fprintf(stderr, "Failed to open input file '%s': %s\n", argv[1], strerror(errno)); return 1; } out_fd = open(argv[2], O_WRONLY | O_TRUNC | O_CREAT, 0644); if (out_fd == -1) { fprintf(stderr, "Failed to open output file '%s': %s\n", argv[2], strerror(errno)); return 1; } while (1) { uint8_t in_data[32]; uint8_t out_data[50]; unsigned int i; ret = read(in_fd, in_data, 32); if (ret == -1) { fprintf(stderr, "Failed to read input data: %s\n", strerror(errno)); goto done; } if (ret < 32) { if (ret != 0) fprintf(stderr, "%u bytes of stray data at end of input\n", ret); break; } for (i = 0; i < 25; ++i) { unsigned int index = (i * 10) / 8; unsigned int lsb_shift = (i * 10) % 8; unsigned int msb_shift = 8 - lsb_shift; uint16_t pixel; pixel = ((in_data[index+1] << msb_shift) & 0x3ff) | ((in_data[index+0] >> lsb_shift) & 0x3ff); out_data[i*2+0] = (pixel >> 0) & 0xff; out_data[i*2+1] = (pixel >> 8) & 0xff; } ret = write(out_fd, out_data, 50); if (ret < -1) { fprintf(stderr, "Failed to read input data: %s\n", strerror(errno)); goto done; } } done: close(in_fd); close(out_fd); return ret ? 1 : 0; } href='/libcamera/pinchartl/libcamera.git/diff/test/object.cpp?id=3200bb635ccd64d5997bc372d9fa6bc894b2f9d0'>diff
blob: cbd0d3ececab63c5a30eea5ee58bcff7eec17e6d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2019, Google Inc.
 *
 * object.cpp - Object tests
 */

#include <iostream>

#include <libcamera/base/message.h>
#include <libcamera/base/object.h>
#include <libcamera/base/thread.h>

#include "test.h"

using namespace std;
using namespace libcamera;

class InstrumentedObject : public Object
{
public:
	enum Status {
		NoMessage,
		MessageReceived,
	};

	InstrumentedObject(Object *parent = nullptr)
		: Object(parent), status_(NoMessage)
	{
	}

	Status status() const { return status_; }
	void reset() { status_ = NoMessage; }

protected:
	void message(Message *msg) override
	{
		if (msg->type() == Message::ThreadMoveMessage)
			status_ = MessageReceived;

		Object::message(msg);
	}

private:
	Status status_;
};

class ObjectTest : public Test
{
protected:
	int init()
	{
		/*
		 * Create a hierarchy of objects:
		 * A -> B -> C
		 *   \->D
		 * E
		 */
		a_ = new InstrumentedObject();
		b_ = new InstrumentedObject(a_);
		c_ = new InstrumentedObject(b_);
		d_ = new InstrumentedObject(a_);
		e_ = new InstrumentedObject();
		f_ = nullptr;

		return TestPass;
	}

	int run()
	{
		/* Verify the parent-child relationships. */
		if (a_->parent() != nullptr || b_->parent() != a_ ||
		    c_->parent() != b_ || d_->parent() != a_ ||
		    e_->parent() != nullptr) {
			cout << "Incorrect parent-child relationships" << endl;
			return TestFail;
		}

		/*
		 * Verify that moving an object with no parent to a different
		 * thread succeeds.
		 */
		e_->moveToThread(&thread_);

		if (e_->thread() != &thread_ || e_->thread() == Thread::current()) {
			cout << "Failed to move object to thread" << endl;
			return TestFail;
		}

		/*
		 * Verify that moving an object with a parent to a different
		 * thread fails. This results in an undefined behaviour, the
		 * test thus depends on the internal implementation returning
		 * without performing any change.
		 */
		b_->moveToThread(&thread_);

		if (b_->thread() != Thread::current()) {
			cout << "Moving object with parent to thread shouldn't succeed" << endl;