// SPDX-License-Identifier: GPL-2.0+ /* * vimc-streamer.c Virtual Media Controller Driver * * Copyright (C) 2018 Lucas A. M. Magalhães <[email protected]> * */ #include <linux/init.h> #include <linux/freezer.h> #include <linux/kthread.h> #include "vimc-streamer.h" /** * vimc_get_source_entity - get the entity connected with the first sink pad * * @ent: reference media_entity * * Helper function that returns the media entity containing the source pad * linked with the first sink pad from the given media entity pad list. * * Return: The source pad or NULL, if it wasn't found. */ static struct media_entity *vimc_get_source_entity(struct media_entity *ent) { … } /** * vimc_streamer_pipeline_terminate - Disable stream in all ved in stream * * @stream: the pointer to the stream structure with the pipeline to be * disabled. * * Calls s_stream to disable the stream in each entity of the pipeline * */ static void vimc_streamer_pipeline_terminate(struct vimc_stream *stream) { … } /** * vimc_streamer_pipeline_init - Initializes the stream structure * * @stream: the pointer to the stream structure to be initialized * @ved: the pointer to the vimc entity initializing the stream * * Initializes the stream structure. Walks through the entity graph to * construct the pipeline used later on the streamer thread. * Calls vimc_streamer_s_stream() to enable stream in all entities of * the pipeline. * * Return: 0 if success, error code otherwise. */ static int vimc_streamer_pipeline_init(struct vimc_stream *stream, struct vimc_ent_device *ved) { … } /** * vimc_streamer_thread - Process frames through the pipeline * * @data: vimc_stream struct of the current stream * * From the source to the sink, gets a frame from each subdevice and send to * the next one of the pipeline at a fixed framerate. * * Return: * Always zero (created as ``int`` instead of ``void`` to comply with * kthread API). */ static int vimc_streamer_thread(void *data) { … } /** * vimc_streamer_s_stream - Start/stop the streaming on the media pipeline * * @stream: the pointer to the stream structure of the current stream * @ved: pointer to the vimc entity of the entity of the stream * @enable: flag to determine if stream should start/stop * * When starting, check if there is no ``stream->kthread`` allocated. This * should indicate that a stream is already running. Then, it initializes the * pipeline, creates and runs a kthread to consume buffers through the pipeline. * When stopping, analogously check if there is a stream running, stop the * thread and terminates the pipeline. * * Return: 0 if success, error code otherwise. */ int vimc_streamer_s_stream(struct vimc_stream *stream, struct vimc_ent_device *ved, int enable) { … }