3 * @brief VP Api. Pipeline definition
4 * @author Sylvain Gaeremynck <sylvain.gaeremynck@parrot.fr>
5 * @author Aurelien Morelle <aurelien.morelle@parrot.fr>
6 * @author Thomas Landais <thomas.landais@parrot.fr>
7 * @author Julien Floret <julien.floret.ext@parrot.com>
9 * @date first release 16/03/2007
10 * @date modification 24/05/2007
13 ///////////////////////////////////////////////
16 #include <VP_Api/vp_api.h>
17 #include <VP_Api/vp_api_stage.h>
18 #include <VP_Api/vp_api_supervisor.h>
19 #include <VP_Api/vp_api_error.h>
20 #include <VP_Os/vp_os_malloc.h>
21 #include <VP_Os/vp_os_assert.h>
22 #include <VP_Os/vp_os_print.h>
24 ///////////////////////////////////////////////
28 vp_api_iteration(vp_api_io_pipeline_t *pipeline, vp_api_io_stage_t* previousStage, vp_api_io_stage_t* stage);
31 ///////////////////////////////////////////////
35 vp_api_open(vp_api_io_pipeline_t *pipeline, PIPELINE_HANDLE *handle)
39 vp_api_io_stage_t *stage;
44 VP_OS_ASSERT(pipeline);
45 VP_OS_ASSERT(pipeline->nb_stages > 0 && pipeline->nb_stages <= VP_API_MAX_NUM_STAGES);
46 VP_OS_ASSERT(pipeline->stages);
48 pipeline->nb_still_running = 0;
50 for(i = 0 ; i < pipeline->nb_stages && VP_SUCCEEDED(res); i++)
52 stage = &pipeline->stages[i];
54 VP_OS_ASSERT(stage->funcs.open);
55 VP_OS_ASSERT(stage->funcs.transform);
56 VP_OS_ASSERT(stage->funcs.close);
58 vp_os_mutex_init(&stage->data.lock);
59 vp_os_mutex_lock(&stage->data.lock);
61 res = stage->funcs.open(stage->cfg);
63 if( VP_SUCCEEDED(res) )
66 // Set all data fields to 0
67 stage->data.numBuffers=0;
68 stage->data.buffers=NULL;
69 stage->data.indexBuffer=0;
72 stage->data.lineSize=0;
74 stage->data.status = VP_API_STATUS_INIT;
75 /* stage->data.lock = Be_careful_not_to_erase_it; */
77 //vp_os_memset(&stage->data, 0, sizeof(vp_api_io_data_t));
82 // To avoid problems on vp_api_close
83 pipeline->nb_stages=i+1;
87 pipeline->fifo.pbase = (char *) vp_os_malloc(VP_API_PIPELINE_FIFO_SIZE);
88 pipeline->fifo.pget = pipeline->fifo.pbase;
89 pipeline->fifo.ppost = pipeline->fifo.pbase;
90 pipeline->fifo.nb_waiting = 0;
91 vp_os_memset(pipeline->fifo.pbase, 0, VP_API_PIPELINE_FIFO_SIZE);
92 vp_os_mutex_init(&pipeline->fifo.mutex);
94 if( VP_SUCCEEDED(res) )
96 res = vp_api_add_pipeline(pipeline, handle);
104 vp_api_run(vp_api_io_pipeline_t *pipeline, vp_api_io_data_t *out_data)
106 vp_api_io_stage_t* previousStage = NULL;
107 vp_api_io_stage_t* currentStage = NULL;
108 C_RESULT res = VP_SUCCESS;
111 if(pipeline->fifo.nb_waiting > 0)
112 if(VP_FAILED(vp_api_handle_messages(pipeline)))
115 if(pipeline->nb_still_running != 0)
117 for(i = pipeline->nb_stages-1 ; pipeline->stages[i].data.status != VP_API_STATUS_STILL_RUNNING ; i--)
119 VP_OS_ASSERT(i >= 0);
121 pipeline->nb_still_running--;
123 currentStage = &pipeline->stages[i-1];
126 for(; i < pipeline->nb_stages ; i++)
128 previousStage = currentStage;
129 currentStage = &pipeline->stages[i];
131 RTMON_UVAL(SDK_STAGE_INDEX_UVAL, i);
132 if(VP_SUCCEEDED(res) && VP_FAILED(vp_api_iteration(pipeline, previousStage, currentStage)))
137 //do not execute next stages if no data is given
138 if(pipeline->stages[i].data.size == 0)
144 if(currentStage!=NULL)
145 *out_data = currentStage->data;
153 vp_api_flush(vp_api_io_pipeline_t *pipeline)
155 vp_api_io_data_t data;
156 C_RESULT res = VP_SUCCESS;
158 while(pipeline->nb_still_running != 0)
159 if(VP_FAILED(vp_api_run(pipeline, &data)))
166 vp_api_close(vp_api_io_pipeline_t *pipeline, PIPELINE_HANDLE *handle)
168 vp_api_io_stage_t *stage;
169 C_RESULT res = VP_SUCCESS;
172 VP_OS_ASSERT(pipeline->nb_stages > 0 && pipeline->nb_stages <= VP_API_MAX_NUM_STAGES);
174 res = vp_api_remove_pipeline(pipeline, handle);
177 if( pipeline->fifo.pbase != NULL )
179 vp_os_free(pipeline->fifo.pbase);
181 for(i = 0 ; i < pipeline->nb_stages ; i++)
183 stage = &pipeline->stages[i];
184 if(VP_FAILED(stage->funcs.close(stage->cfg)))
187 vp_os_mutex_unlock(&stage->data.lock);
188 vp_os_mutex_destroy(&stage->data.lock);
195 vp_api_iteration(vp_api_io_pipeline_t *pipeline, vp_api_io_stage_t* previousStage, vp_api_io_stage_t* stage)
197 C_RESULT res = VP_SUCCESS;
198 vp_api_io_data_t *previousData = NULL;
202 previousData = &previousStage->data;
205 vp_os_mutex_unlock(&stage->data.lock);
206 RTMON_USTART(SDK_STAGE_TRANSFORM_UEVENT);
207 res = stage->funcs.transform(stage->cfg, previousData, &stage->data);
208 RTMON_USTOP(SDK_STAGE_TRANSFORM_UEVENT);
210 if(stage->data.status == VP_API_STATUS_STILL_RUNNING)
212 pipeline->nb_still_running++;
214 vp_os_mutex_lock(&stage->data.lock);