@@ -55,7 +55,7 @@ static int BuildTransformChain( filter_t *p_filter );
55
55
static int BuildChromaResize ( filter_t * );
56
56
static int BuildChromaChain ( filter_t * p_filter );
57
57
58
- static int CreateChain ( filter_t * p_parent , es_format_t * p_fmt_mid , config_chain_t * );
58
+ static int CreateChain ( filter_t * p_parent , es_format_t * p_fmt_mid );
59
59
static filter_t * AppendTransform ( filter_chain_t * p_chain , es_format_t * p_fmt_in , es_format_t * p_fmt_out );
60
60
static void EsFormatMergeSize ( es_format_t * p_dst ,
61
61
const es_format_t * p_base ,
@@ -124,7 +124,18 @@ static int Activate( vlc_object_t *p_this )
124
124
return VLC_EGENERIC ;
125
125
}
126
126
127
- if ( b_transform )
127
+ int type = VLC_VAR_INTEGER ;
128
+ if ( var_Type ( p_filter -> obj .parent , MODULE_STRING "-level" ) != 0 )
129
+ type |= VLC_VAR_DOINHERIT ;
130
+
131
+ var_Create ( p_filter , MODULE_STRING "-level" , type );
132
+ /* Note: atomicity is not actually needed here. */
133
+ var_IncInteger ( p_filter , MODULE_STRING "-level" );
134
+
135
+ int level = var_GetInteger ( p_filter , MODULE_STRING "-level" );
136
+ if ( level < 0 || level > CHAIN_LEVEL_MAX )
137
+ msg_Err ( p_filter , "Too high level of recursion (%d)" , level );
138
+ else if ( b_transform )
128
139
i_ret = BuildTransformChain ( p_filter );
129
140
else if ( b_chroma && b_resize )
130
141
i_ret = BuildChromaResize ( p_filter );
@@ -136,6 +147,7 @@ static int Activate( vlc_object_t *p_this )
136
147
if ( i_ret )
137
148
{
138
149
/* Hum ... looks like this really isn't going to work. Too bad. */
150
+ var_Destroy ( p_filter , MODULE_STRING "-level" );
139
151
filter_chain_Delete ( p_sys -> p_chain );
140
152
free ( p_sys );
141
153
return VLC_EGENERIC ;
@@ -148,6 +160,8 @@ static int Activate( vlc_object_t *p_this )
148
160
static void Destroy ( vlc_object_t * p_this )
149
161
{
150
162
filter_t * p_filter = (filter_t * )p_this ;
163
+
164
+ var_Destroy ( p_filter , MODULE_STRING "-level" );
151
165
filter_chain_Delete ( p_filter -> p_sys -> p_chain );
152
166
free ( p_filter -> p_sys );
153
167
}
@@ -174,15 +188,15 @@ static int BuildTransformChain( filter_t *p_filter )
174
188
msg_Dbg ( p_filter , "Trying to build transform, then chroma+resize" );
175
189
es_format_Copy ( & fmt_mid , & p_filter -> fmt_in );
176
190
video_format_TransformTo (& fmt_mid .video , p_filter -> fmt_out .video .orientation );
177
- i_ret = CreateChain ( p_filter , & fmt_mid , NULL );
191
+ i_ret = CreateChain ( p_filter , & fmt_mid );
178
192
es_format_Clean ( & fmt_mid );
179
193
if ( i_ret == VLC_SUCCESS )
180
194
return VLC_SUCCESS ;
181
195
182
196
/* Lets try resize+chroma first, then transform */
183
197
msg_Dbg ( p_filter , "Trying to build chroma+resize" );
184
198
EsFormatMergeSize ( & fmt_mid , & p_filter -> fmt_out , & p_filter -> fmt_in );
185
- i_ret = CreateChain ( p_filter , & fmt_mid , NULL );
199
+ i_ret = CreateChain ( p_filter , & fmt_mid );
186
200
es_format_Clean ( & fmt_mid );
187
201
if ( i_ret == VLC_SUCCESS )
188
202
return VLC_SUCCESS ;
@@ -198,15 +212,15 @@ static int BuildChromaResize( filter_t *p_filter )
198
212
/* Lets try resizing and then doing the chroma conversion */
199
213
msg_Dbg ( p_filter , "Trying to build resize+chroma" );
200
214
EsFormatMergeSize ( & fmt_mid , & p_filter -> fmt_in , & p_filter -> fmt_out );
201
- i_ret = CreateChain ( p_filter , & fmt_mid , NULL );
215
+ i_ret = CreateChain ( p_filter , & fmt_mid );
202
216
es_format_Clean ( & fmt_mid );
203
217
if ( i_ret == VLC_SUCCESS )
204
218
return VLC_SUCCESS ;
205
219
206
220
/* Lets try it the other way arround (chroma and then resize) */
207
221
msg_Dbg ( p_filter , "Trying to build chroma+resize" );
208
222
EsFormatMergeSize ( & fmt_mid , & p_filter -> fmt_out , & p_filter -> fmt_in );
209
- i_ret = CreateChain ( p_filter , & fmt_mid , NULL );
223
+ i_ret = CreateChain ( p_filter , & fmt_mid );
210
224
es_format_Clean ( & fmt_mid );
211
225
if ( i_ret == VLC_SUCCESS )
212
226
return VLC_SUCCESS ;
@@ -217,35 +231,7 @@ static int BuildChromaResize( filter_t *p_filter )
217
231
static int BuildChromaChain ( filter_t * p_filter )
218
232
{
219
233
es_format_t fmt_mid ;
220
-
221
- /* We have to protect ourself against a too high recursion */
222
- const char * psz_option = MODULE_STRING "-level" ;
223
- int i_level = 0 ;
224
- for ( const config_chain_t * c = p_filter -> p_cfg ; c != NULL ; c = c -> p_next )
225
- {
226
- if ( c -> psz_name && c -> psz_value && !strcmp (c -> psz_name , psz_option ) )
227
- {
228
- i_level = atoi (c -> psz_value );
229
- if ( i_level < 0 || i_level > CHAIN_LEVEL_MAX )
230
- {
231
- msg_Err ( p_filter , "Too high level of recursion (%d)" , i_level );
232
- return VLC_EGENERIC ;
233
- }
234
- break ;
235
- }
236
- }
237
-
238
- /* */
239
- int i_ret = VLC_EGENERIC ;
240
-
241
- /* */
242
- config_chain_t cfg_level ;
243
- memset (& cfg_level , 0 , sizeof (cfg_level ));
244
- cfg_level .psz_name = strdup (psz_option );
245
- if ( asprintf ( & cfg_level .psz_value , "%d" , i_level + 1 ) < 0 )
246
- cfg_level .psz_value = NULL ;
247
- if ( !cfg_level .psz_name || !cfg_level .psz_value )
248
- goto exit ;
234
+ int i_ret ;
249
235
250
236
/* Now try chroma format list */
251
237
for ( int i = 0 ; pi_allowed_chromas [i ]; i ++ )
@@ -266,23 +252,21 @@ static int BuildChromaChain( filter_t *p_filter )
266
252
fmt_mid .video .i_bmask = 0 ;
267
253
video_format_FixRgb (& fmt_mid .video );
268
254
269
- i_ret = CreateChain ( p_filter , & fmt_mid , & cfg_level );
255
+ i_ret = CreateChain ( p_filter , & fmt_mid );
270
256
es_format_Clean ( & fmt_mid );
271
257
272
258
if ( i_ret == VLC_SUCCESS )
273
259
break ;
274
260
}
275
261
276
- exit :
277
- free ( cfg_level .psz_name );
278
- free ( cfg_level .psz_value );
262
+ var_Destroy ( p_filter , MODULE_STRING "-level" );
279
263
return i_ret ;
280
264
}
281
265
282
266
/*****************************************************************************
283
267
*
284
268
*****************************************************************************/
285
- static int CreateChain ( filter_t * p_parent , es_format_t * p_fmt_mid , config_chain_t * p_cfg )
269
+ static int CreateChain ( filter_t * p_parent , es_format_t * p_fmt_mid )
286
270
{
287
271
filter_chain_Reset ( p_parent -> p_sys -> p_chain , & p_parent -> fmt_in , & p_parent -> fmt_out );
288
272
@@ -294,7 +278,7 @@ static int CreateChain( filter_t *p_parent, es_format_t *p_fmt_mid, config_chain
294
278
}
295
279
else
296
280
{
297
- p_filter = filter_chain_AppendFilter ( p_parent -> p_sys -> p_chain , NULL , p_cfg , NULL , p_fmt_mid );
281
+ p_filter = filter_chain_AppendFilter ( p_parent -> p_sys -> p_chain , NULL , NULL , NULL , p_fmt_mid );
298
282
}
299
283
300
284
if ( !p_filter )
@@ -310,7 +294,7 @@ static int CreateChain( filter_t *p_parent, es_format_t *p_fmt_mid, config_chain
310
294
}
311
295
else
312
296
{
313
- p_filter = filter_chain_AppendFilter ( p_parent -> p_sys -> p_chain , NULL , p_cfg , p_fmt_mid , NULL );
297
+ p_filter = filter_chain_AppendFilter ( p_parent -> p_sys -> p_chain , NULL , NULL , p_fmt_mid , NULL );
314
298
}
315
299
316
300
if ( !p_filter )
0 commit comments