Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Media entity
  3 *
  4 * Copyright (C) 2010 Nokia Corporation
  5 *
  6 * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  7 *	     Sakari Ailus <sakari.ailus@iki.fi>
  8 *
  9 * This program is free software; you can redistribute it and/or modify
 10 * it under the terms of the GNU General Public License version 2 as
 11 * published by the Free Software Foundation.
 12 *
 13 * This program is distributed in the hope that it will be useful,
 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 16 * GNU General Public License for more details.
 17 *
 18 * You should have received a copy of the GNU General Public License
 19 * along with this program; if not, write to the Free Software
 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 21 */
 22
 23#ifndef _MEDIA_ENTITY_H
 24#define _MEDIA_ENTITY_H
 25
 26#include <linux/list.h>
 27#include <linux/media.h>
 28
 29struct media_pipeline {
 30};
 31
 32struct media_link {
 33	struct media_pad *source;	/* Source pad */
 34	struct media_pad *sink;		/* Sink pad  */
 35	struct media_link *reverse;	/* Link in the reverse direction */
 36	unsigned long flags;		/* Link flags (MEDIA_LNK_FL_*) */
 37};
 38
 39struct media_pad {
 40	struct media_entity *entity;	/* Entity this pad belongs to */
 41	u16 index;			/* Pad index in the entity pads array */
 42	unsigned long flags;		/* Pad flags (MEDIA_PAD_FL_*) */
 43};
 44
 45struct media_entity_operations {
 46	int (*link_setup)(struct media_entity *entity,
 47			  const struct media_pad *local,
 48			  const struct media_pad *remote, u32 flags);
 
 49};
 50
 51struct media_entity {
 52	struct list_head list;
 53	struct media_device *parent;	/* Media device this entity belongs to*/
 54	u32 id;				/* Entity ID, unique in the parent media
 55					 * device context */
 56	const char *name;		/* Entity name */
 57	u32 type;			/* Entity type (MEDIA_ENT_T_*) */
 58	u32 revision;			/* Entity revision, driver specific */
 59	unsigned long flags;		/* Entity flags (MEDIA_ENT_FL_*) */
 60	u32 group_id;			/* Entity group ID */
 61
 62	u16 num_pads;			/* Number of sink and source pads */
 63	u16 num_links;			/* Number of existing links, both
 64					 * enabled and disabled */
 65	u16 num_backlinks;		/* Number of backlinks */
 66	u16 max_links;			/* Maximum number of links */
 67
 68	struct media_pad *pads;		/* Pads array (num_pads elements) */
 69	struct media_link *links;	/* Links array (max_links elements)*/
 70
 71	const struct media_entity_operations *ops;	/* Entity operations */
 72
 73	/* Reference counts must never be negative, but are signed integers on
 74	 * purpose: a simple WARN_ON(<0) check can be used to detect reference
 75	 * count bugs that would make them negative.
 76	 */
 77	int stream_count;		/* Stream count for the entity. */
 78	int use_count;			/* Use count for the entity. */
 79
 80	struct media_pipeline *pipe;	/* Pipeline this entity belongs to. */
 81
 82	union {
 83		/* Node specifications */
 84		struct {
 85			u32 major;
 86			u32 minor;
 87		} v4l;
 88		struct {
 89			u32 major;
 90			u32 minor;
 91		} fb;
 92		struct {
 93			u32 card;
 94			u32 device;
 95			u32 subdevice;
 96		} alsa;
 97		int dvb;
 98
 99		/* Sub-device specifications */
100		/* Nothing needed yet */
101	};
102};
103
104static inline u32 media_entity_type(struct media_entity *entity)
105{
106	return entity->type & MEDIA_ENT_TYPE_MASK;
107}
108
109static inline u32 media_entity_subtype(struct media_entity *entity)
110{
111	return entity->type & MEDIA_ENT_SUBTYPE_MASK;
112}
113
114#define MEDIA_ENTITY_ENUM_MAX_DEPTH	16
115
116struct media_entity_graph {
117	struct {
118		struct media_entity *entity;
119		int link;
120	} stack[MEDIA_ENTITY_ENUM_MAX_DEPTH];
121	int top;
122};
123
124int media_entity_init(struct media_entity *entity, u16 num_pads,
125		struct media_pad *pads, u16 extra_links);
126void media_entity_cleanup(struct media_entity *entity);
127
128int media_entity_create_link(struct media_entity *source, u16 source_pad,
129		struct media_entity *sink, u16 sink_pad, u32 flags);
130int __media_entity_setup_link(struct media_link *link, u32 flags);
131int media_entity_setup_link(struct media_link *link, u32 flags);
132struct media_link *media_entity_find_link(struct media_pad *source,
133		struct media_pad *sink);
134struct media_pad *media_entity_remote_source(struct media_pad *pad);
135
136struct media_entity *media_entity_get(struct media_entity *entity);
137void media_entity_put(struct media_entity *entity);
138
139void media_entity_graph_walk_start(struct media_entity_graph *graph,
140		struct media_entity *entity);
141struct media_entity *
142media_entity_graph_walk_next(struct media_entity_graph *graph);
143void media_entity_pipeline_start(struct media_entity *entity,
144		struct media_pipeline *pipe);
145void media_entity_pipeline_stop(struct media_entity *entity);
146
147#define media_entity_call(entity, operation, args...)			\
148	(((entity)->ops && (entity)->ops->operation) ?			\
149	 (entity)->ops->operation((entity) , ##args) : -ENOIOCTLCMD)
150
151#endif
v3.5.6
  1/*
  2 * Media entity
  3 *
  4 * Copyright (C) 2010 Nokia Corporation
  5 *
  6 * Contacts: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
  7 *	     Sakari Ailus <sakari.ailus@iki.fi>
  8 *
  9 * This program is free software; you can redistribute it and/or modify
 10 * it under the terms of the GNU General Public License version 2 as
 11 * published by the Free Software Foundation.
 12 *
 13 * This program is distributed in the hope that it will be useful,
 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 16 * GNU General Public License for more details.
 17 *
 18 * You should have received a copy of the GNU General Public License
 19 * along with this program; if not, write to the Free Software
 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 21 */
 22
 23#ifndef _MEDIA_ENTITY_H
 24#define _MEDIA_ENTITY_H
 25
 26#include <linux/list.h>
 27#include <linux/media.h>
 28
 29struct media_pipeline {
 30};
 31
 32struct media_link {
 33	struct media_pad *source;	/* Source pad */
 34	struct media_pad *sink;		/* Sink pad  */
 35	struct media_link *reverse;	/* Link in the reverse direction */
 36	unsigned long flags;		/* Link flags (MEDIA_LNK_FL_*) */
 37};
 38
 39struct media_pad {
 40	struct media_entity *entity;	/* Entity this pad belongs to */
 41	u16 index;			/* Pad index in the entity pads array */
 42	unsigned long flags;		/* Pad flags (MEDIA_PAD_FL_*) */
 43};
 44
 45struct media_entity_operations {
 46	int (*link_setup)(struct media_entity *entity,
 47			  const struct media_pad *local,
 48			  const struct media_pad *remote, u32 flags);
 49	int (*link_validate)(struct media_link *link);
 50};
 51
 52struct media_entity {
 53	struct list_head list;
 54	struct media_device *parent;	/* Media device this entity belongs to*/
 55	u32 id;				/* Entity ID, unique in the parent media
 56					 * device context */
 57	const char *name;		/* Entity name */
 58	u32 type;			/* Entity type (MEDIA_ENT_T_*) */
 59	u32 revision;			/* Entity revision, driver specific */
 60	unsigned long flags;		/* Entity flags (MEDIA_ENT_FL_*) */
 61	u32 group_id;			/* Entity group ID */
 62
 63	u16 num_pads;			/* Number of sink and source pads */
 64	u16 num_links;			/* Number of existing links, both
 65					 * enabled and disabled */
 66	u16 num_backlinks;		/* Number of backlinks */
 67	u16 max_links;			/* Maximum number of links */
 68
 69	struct media_pad *pads;		/* Pads array (num_pads elements) */
 70	struct media_link *links;	/* Links array (max_links elements)*/
 71
 72	const struct media_entity_operations *ops;	/* Entity operations */
 73
 74	/* Reference counts must never be negative, but are signed integers on
 75	 * purpose: a simple WARN_ON(<0) check can be used to detect reference
 76	 * count bugs that would make them negative.
 77	 */
 78	int stream_count;		/* Stream count for the entity. */
 79	int use_count;			/* Use count for the entity. */
 80
 81	struct media_pipeline *pipe;	/* Pipeline this entity belongs to. */
 82
 83	union {
 84		/* Node specifications */
 85		struct {
 86			u32 major;
 87			u32 minor;
 88		} v4l;
 89		struct {
 90			u32 major;
 91			u32 minor;
 92		} fb;
 93		struct {
 94			u32 card;
 95			u32 device;
 96			u32 subdevice;
 97		} alsa;
 98		int dvb;
 99
100		/* Sub-device specifications */
101		/* Nothing needed yet */
102	} info;
103};
104
105static inline u32 media_entity_type(struct media_entity *entity)
106{
107	return entity->type & MEDIA_ENT_TYPE_MASK;
108}
109
110static inline u32 media_entity_subtype(struct media_entity *entity)
111{
112	return entity->type & MEDIA_ENT_SUBTYPE_MASK;
113}
114
115#define MEDIA_ENTITY_ENUM_MAX_DEPTH	16
116
117struct media_entity_graph {
118	struct {
119		struct media_entity *entity;
120		int link;
121	} stack[MEDIA_ENTITY_ENUM_MAX_DEPTH];
122	int top;
123};
124
125int media_entity_init(struct media_entity *entity, u16 num_pads,
126		struct media_pad *pads, u16 extra_links);
127void media_entity_cleanup(struct media_entity *entity);
128
129int media_entity_create_link(struct media_entity *source, u16 source_pad,
130		struct media_entity *sink, u16 sink_pad, u32 flags);
131int __media_entity_setup_link(struct media_link *link, u32 flags);
132int media_entity_setup_link(struct media_link *link, u32 flags);
133struct media_link *media_entity_find_link(struct media_pad *source,
134		struct media_pad *sink);
135struct media_pad *media_entity_remote_source(struct media_pad *pad);
136
137struct media_entity *media_entity_get(struct media_entity *entity);
138void media_entity_put(struct media_entity *entity);
139
140void media_entity_graph_walk_start(struct media_entity_graph *graph,
141		struct media_entity *entity);
142struct media_entity *
143media_entity_graph_walk_next(struct media_entity_graph *graph);
144__must_check int media_entity_pipeline_start(struct media_entity *entity,
145					     struct media_pipeline *pipe);
146void media_entity_pipeline_stop(struct media_entity *entity);
147
148#define media_entity_call(entity, operation, args...)			\
149	(((entity)->ops && (entity)->ops->operation) ?			\
150	 (entity)->ops->operation((entity) , ##args) : -ENOIOCTLCMD)
151
152#endif