media: mc: entity: Add pad iterator for media_pipeline
Add a media_pipeline_for_each_pad() macro to iterate over pads in a pipeline. This should be used by driver as a replacement of the media_graph_walk API, as iterating over the media_pipeline uses the cached list of pads and is thus more efficient. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:
parent
d7ff691399
commit
d10ac51e8a
@ -945,6 +945,24 @@ out:
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(media_pipeline_alloc_start);
|
EXPORT_SYMBOL_GPL(media_pipeline_alloc_start);
|
||||||
|
|
||||||
|
struct media_pad *
|
||||||
|
__media_pipeline_pad_iter_next(struct media_pipeline *pipe,
|
||||||
|
struct media_pipeline_pad_iter *iter,
|
||||||
|
struct media_pad *pad)
|
||||||
|
{
|
||||||
|
if (!pad)
|
||||||
|
iter->cursor = pipe->pads.next;
|
||||||
|
|
||||||
|
if (iter->cursor == &pipe->pads)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
pad = list_entry(iter->cursor, struct media_pipeline_pad, list)->pad;
|
||||||
|
iter->cursor = iter->cursor->next;
|
||||||
|
|
||||||
|
return pad;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(__media_pipeline_pad_iter_next);
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
* Links management
|
* Links management
|
||||||
*/
|
*/
|
||||||
|
@ -130,6 +130,15 @@ struct media_pipeline_pad {
|
|||||||
struct media_pad *pad;
|
struct media_pad *pad;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* struct media_pipeline_pad_iter - Iterator for media_pipeline_for_each_pad
|
||||||
|
*
|
||||||
|
* @cursor: The current element
|
||||||
|
*/
|
||||||
|
struct media_pipeline_pad_iter {
|
||||||
|
struct list_head *cursor;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct media_link - A link object part of a media graph.
|
* struct media_link - A link object part of a media graph.
|
||||||
*
|
*
|
||||||
@ -1165,6 +1174,26 @@ void media_pipeline_stop(struct media_pad *pad);
|
|||||||
*/
|
*/
|
||||||
void __media_pipeline_stop(struct media_pad *pad);
|
void __media_pipeline_stop(struct media_pad *pad);
|
||||||
|
|
||||||
|
struct media_pad *
|
||||||
|
__media_pipeline_pad_iter_next(struct media_pipeline *pipe,
|
||||||
|
struct media_pipeline_pad_iter *iter,
|
||||||
|
struct media_pad *pad);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* media_pipeline_for_each_pad - Iterate on all pads in a media pipeline
|
||||||
|
* @pipe: The pipeline
|
||||||
|
* @iter: The iterator (struct media_pipeline_pad_iter)
|
||||||
|
* @pad: The iterator pad
|
||||||
|
*
|
||||||
|
* Iterate on all pads in a media pipeline. This is only valid after the
|
||||||
|
* pipeline has been built with media_pipeline_start() and before it gets
|
||||||
|
* destroyed with media_pipeline_stop().
|
||||||
|
*/
|
||||||
|
#define media_pipeline_for_each_pad(pipe, iter, pad) \
|
||||||
|
for (pad = __media_pipeline_pad_iter_next((pipe), iter, NULL); \
|
||||||
|
pad != NULL; \
|
||||||
|
pad = __media_pipeline_pad_iter_next((pipe), iter, pad))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* media_pipeline_alloc_start - Mark a pipeline as streaming
|
* media_pipeline_alloc_start - Mark a pipeline as streaming
|
||||||
* @pad: Starting pad
|
* @pad: Starting pad
|
||||||
|
Loading…
x
Reference in New Issue
Block a user