summaryrefslogtreecommitdiff
path: root/test/pipeline
AgeCommit message (Expand)Author
2019-08-19libcamera: camera_manager: Construct CameraManager instances manuallyLaurent Pinchart
2019-05-23meson: Create and use a dependency for libcamera and its headersLaurent Pinchart
2019-05-23meson: Fix coding style in meson.build filesLaurent Pinchart
2019-05-17libcamera: media_device: Open and close media device inside populate()Niklas Söderlund
2019-01-24libcamera: device_enumerator: Reference-count MediaDevice instancesLaurent Pinchart
2019-01-22libcamera: Global s/devnode/deviceNode renameJacopo Mondi
2019-01-22test: pipeline: IPU3: Add IPU3 pipeline testJacopo Mondi
f='#n70'>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
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2019, Google Inc.
 *
 * ipa_vimc.cpp - Vimc Image Processing Algorithm module
 */

#include <libcamera/ipa/vimc.h>

#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

#include <iostream>

#include <libcamera/ipa/ipa_interface.h>
#include <libcamera/ipa/ipa_module_info.h>

#include <libipa/ipa_interface_wrapper.h>

#include "libcamera/internal/file.h"
#include "libcamera/internal/log.h"

namespace libcamera {

LOG_DEFINE_CATEGORY(IPAVimc)

class IPAVimc : public IPAInterface
{
public:
	IPAVimc();
	~IPAVimc();

	int init(const IPASettings &settings) override;

	int start(const IPAOperationData &data,
		  IPAOperationData *result) override;
	void stop() override;

	void configure([[maybe_unused]] const CameraSensorInfo &sensorInfo,
		       [[maybe_unused]] const std::map<unsigned int, IPAStream> &streamConfig,
		       [[maybe_unused]] const std::map<unsigned int, const ControlInfoMap &> &entityControls,
		       [[maybe_unused]] const IPAOperationData &ipaConfig,
		       [[maybe_unused]] IPAOperationData *result) override {}
	void mapBuffers([[maybe_unused]] const std::vector<IPABuffer> &buffers) override {}
	void unmapBuffers([[maybe_unused]] const std::vector<unsigned int> &ids) override {}
	void processEvent([[maybe_unused]] const IPAOperationData &event) override {}

private:
	void initTrace();
	void trace(enum IPAOperationCode operation);

	int fd_;
};

IPAVimc::IPAVimc()
	: fd_(-1)
{
	initTrace();
}

IPAVimc::~IPAVimc()
{
	if (fd_ != -1)
		::close(fd_);
}

int IPAVimc::init(const IPASettings &settings)
{
	trace(IPAOperationInit);

	LOG(IPAVimc, Debug)
		<< "initializing vimc IPA with configuration file "
		<< settings.configurationFile;

	File conf(settings.configurationFile);
	if (!conf.open(File::ReadOnly)) {
		LOG(IPAVimc, Error) << "Failed to open configuration file";
		return -EINVAL;
	}

	return 0;
}

int IPAVimc::start([[maybe_unused]] const IPAOperationData &data,
		   [[maybe_unused]] IPAOperationData *result)
{
	trace(IPAOperationStart);

	LOG(IPAVimc, Debug) << "start vimc IPA!";

	return 0;
}

void IPAVimc::stop()
{
	trace(IPAOperationStop);

	LOG(IPAVimc, Debug) << "stop vimc IPA!";
}

void IPAVimc::initTrace()
{
	struct stat fifoStat;
	int ret = stat(VIMC_IPA_FIFO_PATH, &fifoStat);
	if (ret)
		return;

	ret = ::open(VIMC_IPA_FIFO_PATH, O_WRONLY);
	if (ret < 0) {
		ret = errno;
		LOG(IPAVimc, Error) << "Failed to open vimc IPA test FIFO: "
				    << strerror(ret);
		return;
	}

	fd_ = ret;
}

void IPAVimc::trace(enum IPAOperationCode operation)
{
	if (fd_ < 0)
		return;

	int ret = ::write(fd_, &operation, sizeof(operation));
	if (ret < 0) {
		ret = errno;
		LOG(IPAVimc, Error) << "Failed to write to vimc IPA test FIFO: "
				    << strerror(ret);
	}
}

/*
 * External IPA module interface
 */

extern "C" {
const struct IPAModuleInfo ipaModuleInfo = {
	IPA_MODULE_API_VERSION,
	0,
	"PipelineHandlerVimc",
	"vimc",
};

struct ipa_context *ipaCreate()
{
	return new IPAInterfaceWrapper(std::make_unique<IPAVimc>());
}
}

} /* namespace libcamera */