98 lines
2.6 KiB
C
98 lines
2.6 KiB
C
#pragma once
|
|
|
|
#include "device/links.h"
|
|
#include "device/device.h"
|
|
|
|
#define MAX_DEVICES 20
|
|
#define MAX_RESCALLERS 4
|
|
#define MAX_HTTP_METHODS 20
|
|
|
|
#define CAMERA_DEVICE_CAMERA 0
|
|
#define CAMERA_OPTIONS_LENGTH 4096
|
|
|
|
typedef enum {
|
|
CAMERA_V4L2 = 0,
|
|
CAMERA_LIBCAMERA
|
|
} camera_type_t;
|
|
|
|
typedef struct camera_output_options_s {
|
|
bool disabled;
|
|
unsigned height;
|
|
char options[CAMERA_OPTIONS_LENGTH];
|
|
} camera_output_options_t;
|
|
|
|
typedef struct camera_options_s {
|
|
char path[256];
|
|
unsigned width, height, format;
|
|
unsigned nbufs, fps;
|
|
camera_type_t type;
|
|
bool allow_dma;
|
|
float high_res_factor;
|
|
float low_res_factor;
|
|
bool auto_focus;
|
|
unsigned auto_reconnect;
|
|
union {
|
|
bool vflip;
|
|
unsigned vflip_align;
|
|
};
|
|
union {
|
|
bool hflip;
|
|
unsigned hflip_align;
|
|
};
|
|
|
|
char options[CAMERA_OPTIONS_LENGTH];
|
|
bool list_options;
|
|
|
|
struct {
|
|
char options[CAMERA_OPTIONS_LENGTH];
|
|
} isp;
|
|
|
|
camera_output_options_t snapshot;
|
|
camera_output_options_t stream;
|
|
camera_output_options_t video;
|
|
} camera_options_t;
|
|
|
|
typedef struct camera_s {
|
|
const char *name;
|
|
|
|
camera_options_t options;
|
|
|
|
union {
|
|
device_t *devices[MAX_DEVICES];
|
|
struct {
|
|
device_t *camera;
|
|
device_t *decoder; // decode JPEG/H264 into YUVU
|
|
device_t *isp;
|
|
device_t *rescallers[3];
|
|
device_t *codec_snapshot;
|
|
device_t *codec_stream;
|
|
device_t *codec_video;
|
|
};
|
|
};
|
|
|
|
struct device_list_s *device_list;
|
|
|
|
link_t links[MAX_DEVICES];
|
|
int nlinks;
|
|
} camera_t;
|
|
|
|
#define CAMERA(DEVICE) camera->devices[DEVICE]
|
|
|
|
camera_t *camera_open(camera_options_t *camera);
|
|
int camera_set_params(camera_t *camera);
|
|
void camera_close(camera_t **camera);
|
|
int camera_run(camera_t *camera);
|
|
|
|
link_t *camera_ensure_capture(camera_t *camera, buffer_list_t *capture);
|
|
void camera_capture_add_output(camera_t *camera, buffer_list_t *capture, buffer_list_t *output);
|
|
void camera_capture_add_callbacks(camera_t *camera, buffer_list_t *capture, link_callbacks_t callbacks);
|
|
|
|
int camera_configure_input(camera_t *camera);
|
|
int camera_configure_pipeline(camera_t *camera, buffer_list_t *camera_capture);
|
|
|
|
buffer_list_t *camera_configure_isp(camera_t *camera, buffer_list_t *src_capture);
|
|
buffer_list_t *camera_configure_decoder(camera_t *camera, buffer_list_t *src_capture);
|
|
unsigned camera_rescaller_align_size(unsigned target_height);
|
|
buffer_list_t *camera_configure_rescaller(camera_t *camera, buffer_list_t *src_capture, const char *name, unsigned target_height, unsigned formats[]);
|
|
int camera_configure_output(camera_t *camera, const char *name, unsigned target_height, unsigned formats[], link_callbacks_t callbacks, device_t **device);
|