175 lines
5 KiB
C
175 lines
5 KiB
C
/*
|
|
* Broadcom BM2835 V4L2 driver
|
|
*
|
|
* Copyright © 2013 Raspberry Pi (Trading) Ltd.
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file COPYING in the main directory of this archive
|
|
* for more details.
|
|
*
|
|
* Authors: Vincent Sanders <vincent.sanders@collabora.co.uk>
|
|
* Dave Stevenson <dsteve@broadcom.com>
|
|
* Simon Mellor <simellor@broadcom.com>
|
|
* Luke Diamand <luked@broadcom.com>
|
|
*
|
|
* MMAL interface to VCHIQ message passing
|
|
*/
|
|
|
|
#ifndef MMAL_VCHIQ_H
|
|
#define MMAL_VCHIQ_H
|
|
|
|
#include "mmal-msg-format.h"
|
|
|
|
#define MAX_PORT_COUNT 4
|
|
|
|
/* Maximum size of the format extradata. */
|
|
#define MMAL_FORMAT_EXTRADATA_MAX_SIZE 128
|
|
|
|
struct vchiq_mmal_instance;
|
|
|
|
enum vchiq_mmal_es_type {
|
|
MMAL_ES_TYPE_UNKNOWN, /**< Unknown elementary stream type */
|
|
MMAL_ES_TYPE_CONTROL, /**< Elementary stream of control commands */
|
|
MMAL_ES_TYPE_AUDIO, /**< Audio elementary stream */
|
|
MMAL_ES_TYPE_VIDEO, /**< Video elementary stream */
|
|
MMAL_ES_TYPE_SUBPICTURE /**< Sub-picture elementary stream */
|
|
};
|
|
|
|
/* rectangle, used lots so it gets its own struct */
|
|
struct vchiq_mmal_rect {
|
|
s32 x;
|
|
s32 y;
|
|
s32 width;
|
|
s32 height;
|
|
};
|
|
|
|
struct vchiq_mmal_port_buffer {
|
|
unsigned int num; /* number of buffers */
|
|
u32 size; /* size of buffers */
|
|
u32 alignment; /* alignment of buffers */
|
|
};
|
|
|
|
struct vchiq_mmal_port;
|
|
|
|
typedef void (*vchiq_mmal_buffer_cb)(
|
|
struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_port *port,
|
|
int status, struct mmal_buffer *buffer,
|
|
unsigned long length, u32 mmal_flags, s64 dts, s64 pts);
|
|
|
|
struct vchiq_mmal_port {
|
|
bool enabled;
|
|
u32 handle;
|
|
u32 type; /* port type, cached to use on port info set */
|
|
u32 index; /* port index, cached to use on port info set */
|
|
|
|
/* component port belongs to, allows simple deref */
|
|
struct vchiq_mmal_component *component;
|
|
|
|
struct vchiq_mmal_port *connected; /* port conencted to */
|
|
|
|
/* buffer info */
|
|
struct vchiq_mmal_port_buffer minimum_buffer;
|
|
struct vchiq_mmal_port_buffer recommended_buffer;
|
|
struct vchiq_mmal_port_buffer current_buffer;
|
|
|
|
/* stream format */
|
|
struct mmal_es_format_local format;
|
|
/* elementary stream format */
|
|
union mmal_es_specific_format es;
|
|
|
|
/* data buffers to fill */
|
|
struct list_head buffers;
|
|
/* lock to serialise adding and removing buffers from list */
|
|
spinlock_t slock;
|
|
/* count of how many buffer header refils have failed because
|
|
* there was no buffer to satisfy them
|
|
*/
|
|
int buffer_underflow;
|
|
/* callback on buffer completion */
|
|
vchiq_mmal_buffer_cb buffer_cb;
|
|
/* callback context */
|
|
void *cb_ctx;
|
|
};
|
|
|
|
struct vchiq_mmal_component {
|
|
bool enabled;
|
|
u32 handle; /* VideoCore handle for component */
|
|
u32 inputs; /* Number of input ports */
|
|
u32 outputs; /* Number of output ports */
|
|
u32 clocks; /* Number of clock ports */
|
|
struct vchiq_mmal_port control; /* control port */
|
|
struct vchiq_mmal_port input[MAX_PORT_COUNT]; /* input ports */
|
|
struct vchiq_mmal_port output[MAX_PORT_COUNT]; /* output ports */
|
|
struct vchiq_mmal_port clock[MAX_PORT_COUNT]; /* clock ports */
|
|
};
|
|
|
|
int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance);
|
|
int vchiq_mmal_finalise(struct vchiq_mmal_instance *instance);
|
|
|
|
/* Initialise a mmal component and its ports
|
|
*
|
|
*/
|
|
int vchiq_mmal_component_init(
|
|
struct vchiq_mmal_instance *instance,
|
|
const char *name,
|
|
struct vchiq_mmal_component **component_out);
|
|
|
|
int vchiq_mmal_component_finalise(
|
|
struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_component *component);
|
|
|
|
int vchiq_mmal_component_enable(
|
|
struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_component *component);
|
|
|
|
int vchiq_mmal_component_disable(
|
|
struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_component *component);
|
|
|
|
/* enable a mmal port
|
|
*
|
|
* enables a port and if a buffer callback provided enque buffer
|
|
* headers as apropriate for the port.
|
|
*/
|
|
int vchiq_mmal_port_enable(
|
|
struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_port *port,
|
|
vchiq_mmal_buffer_cb buffer_cb);
|
|
|
|
/* disable a port
|
|
*
|
|
* disable a port will dequeue any pending buffers
|
|
*/
|
|
int vchiq_mmal_port_disable(struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_port *port);
|
|
|
|
int vchiq_mmal_port_parameter_set(struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_port *port,
|
|
u32 parameter,
|
|
void *value,
|
|
u32 value_size);
|
|
|
|
int vchiq_mmal_port_parameter_get(struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_port *port,
|
|
u32 parameter,
|
|
void *value,
|
|
u32 *value_size);
|
|
|
|
int vchiq_mmal_port_set_format(struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_port *port);
|
|
|
|
int vchiq_mmal_port_connect_tunnel(struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_port *src,
|
|
struct vchiq_mmal_port *dst);
|
|
|
|
int vchiq_mmal_version(struct vchiq_mmal_instance *instance,
|
|
u32 *major_out,
|
|
u32 *minor_out);
|
|
|
|
int vchiq_mmal_submit_buffer(struct vchiq_mmal_instance *instance,
|
|
struct vchiq_mmal_port *port,
|
|
struct mmal_buffer *buf);
|
|
|
|
#endif /* MMAL_VCHIQ_H */
|