blob: fbd93c4567c906dc23840cc44d65225788f206fd [file] [log] [blame] [edit]
/* Copyright 2023 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/* Wrapper class capturing a snapshot of the description and and child nodes
* of a V4L2 media controller.
*
* If fd_ is set, this class owns it and will close it upon destruction.
*/
#ifndef CAMERA_TOOLS_MCTK_MCDEV_H_
#define CAMERA_TOOLS_MCTK_MCDEV_H_
#include <stdio.h>
#include <memory>
#include <optional>
#include <string>
#include <vector>
#include "tools/mctk/entity.h"
#include "tools/mctk/link.h"
#include "tools/mctk/pad.h"
#include "tools/mctk/yaml_tree.h"
class V4lMcDev {
public:
/* Public functions */
/* This constructor should be private, but that forces hacks to make
* unique_ptr work. So let's keep it public, but please use the
* factory functions instead of the constructor directly!
*/
V4lMcDev() : info_({}) {}
~V4lMcDev();
bool ResetLinks();
V4lMcEntity* EntityById(__u32 id);
V4lMcEntity* EntityByName(std::string name);
V4lMcEntity* EntityByNameRegex(std::string regex);
static std::unique_ptr<V4lMcDev> CreateFromKernel(int fd_mc);
static std::unique_ptr<V4lMcDev> CreateFromYamlNode(YamlNode& node_mc);
void ToYamlFile(FILE& file);
/* Public variables */
struct media_device_info info_;
std::vector<std::unique_ptr<V4lMcEntity>> entities_;
std::vector<V4lMcPad*> all_pads_;
std::vector<V4lMcLink*> all_links_;
private:
/* Private functions */
void BuildCrosslinks();
/* Private variables */
std::optional<int> fd_;
};
#endif // CAMERA_TOOLS_MCTK_MCDEV_H_