diff options
author | phintuka <phintuka> | 2006-08-26 16:52:26 +0000 |
---|---|---|
committer | phintuka <phintuka> | 2006-08-26 16:52:26 +0000 |
commit | 076e50fdcd5a489ed2269e5e5705e731667e51fc (patch) | |
tree | a7272c6374831231a0546c8e8b937fd26b8145ff | |
parent | 0c6de0a299220f47ca0d9c0d33d9cf7015e82911 (diff) | |
download | xineliboutput-076e50fdcd5a489ed2269e5e5705e731667e51fc.tar.gz xineliboutput-076e50fdcd5a489ed2269e5e5705e731667e51fc.tar.bz2 |
Added re-ordering of video filter post plugins for special cases:
if enabled, autocrop and tvtime deinterlacer should be first ones,
and in this order.
-rw-r--r-- | xine/post.c | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/xine/post.c b/xine/post.c index 37525f35..fc0a27f6 100644 --- a/xine/post.c +++ b/xine/post.c @@ -423,11 +423,12 @@ static void _vpplugin_rewire_from_post_elements(fe_t *fe, post_element_t **post_ if(post_elements_num) { xine_post_out_t *vo_source; int i = 0; - + for(i = (post_elements_num - 1); i >= 0; i--) { const char *const *outs = xine_post_list_outputs(post_elements[i]->post); const xine_post_out_t *vo_out = xine_post_output(post_elements[i]->post, (char *) *outs); if(i == (post_elements_num - 1)) { + LOGDBG(" wiring %10s[out] -> [in]video_out", post_elements[i]->name); xine_post_wire_video_port((xine_post_out_t *) vo_out, fe->video_port); } else { @@ -438,6 +439,7 @@ static void _vpplugin_rewire_from_post_elements(fe_t *fe, post_element_t **post_ vo_in = xine_post_input(post_elements[i + 1]->post, "video"); if( !vo_in ) vo_in = xine_post_input(post_elements[i + 1]->post, "video in"); + LOGDBG(" wiring %10s[out] -> [in]%-10s ", post_elements[i]->name, post_elements[i+1]->name); err = xine_post_wire((xine_post_out_t *) vo_out, (xine_post_in_t *) vo_in); } @@ -454,6 +456,7 @@ static void _vpplugin_rewire_from_post_elements(fe_t *fe, post_element_t **post_ vo_source = xine_get_video_source(fe->slave_stream); else vo_source = xine_get_video_source(fe->stream); + LOGDBG(" wiring %10s[out] -> [in]%-10s", "stream", post_elements[0]->name); xine_post_wire_video_port(vo_source, post_elements[0]->post->video_input[0]); } @@ -497,7 +500,8 @@ static void _applugin_rewire_from_post_elements(fe_t *fe, post_element_t **post_ static post_element_t **_pplugin_join_deinterlace_and_post_elements(fe_t *fe, int *post_elements_num) { post_element_t **post_elements; - int i = 0, j = 0, n = 0; + int i = 0, j = 0, n = 0, p = 0; + static const char *order[] = {"autocrop", "tvtime", "NULL"}; *post_elements_num = 0; if( fe->post_video_enable ) @@ -522,17 +526,46 @@ static post_element_t **_pplugin_join_deinterlace_and_post_elements(fe_t *fe, in if(fe->post_video_enable) for( j = 0; j < fe->post_video_elements_num; j++ ) { - if(fe->post_video_elements[j]->enable) + if(fe->post_video_elements[j]->enable) { post_elements[i+j-n] = fe->post_video_elements[j]; - else + } else n++; } - + *post_elements_num -= n; if( *post_elements_num == 0 ) { free(post_elements); return NULL; } + + /* in some special cases order is important. By default plugin order + * in post plugin chain is post plugin loading order. + * But, we want: + * + * 1. autocrop - less data to process for other plugins + * - accepts only YV12 + * 2. deinterlace - blur etc. makes deinterlacing difficult. + * - upscales chroma (YV12->YUY2) in some modes. + * 3. anything else + * + * So let's move those two to beginning ... + */ + n = 0; + while(order[p]) { + for(i = 0; i<*post_elements_num; i++) + if(!strcmp(post_elements[i]->name, order[p])) { + if(i != n) { + post_element_t *tmp = post_elements[i]; + for(j=i; j>n; j--) + post_elements[j] = post_elements[j-1]; + post_elements[n] = tmp; + LOGMSG(" moved %s to post slot %d", order[p], n); + } + n++; + break; + } + p++; + } return post_elements; } |