Index: libhb/deinterlace.c =================================================================== --- libhb/deinterlace.c (revision 1252) +++ libhb/deinterlace.c (working copy) @@ -84,6 +84,53 @@ hb_deinterlace_close, }; +int detect_comb( hb_buffer_t * buf, int width, int height); + +int detect_comb( hb_buffer_t * buf, int width, int height) +{ + /* See if frame shows interlacing */ + int j, n, off, block, cc_1, cc_2, cc, flag, eq, diff, thres; + uint16_t s1, s2, s3, s4; + cc_1 = 0; cc_2 = 0; + eq = 10; diff = 30; thres = 0; + + block = width; + flag = 0; + + for(j=0; jdata[off+j ] & 0xff); + s2 = (buf->data[off+j+ block] & 0xff); + s3 = (buf->data[off+j+2*block] & 0xff); + s4 = (buf->data[off+j+3*block] & 0xff); + + if((abs(s1 - s3) < eq) && + (abs(s1 - s2) > diff)) ++cc_1; + + if((abs(s2 - s4) < eq) && + (abs(s2 - s3) > diff)) ++cc_2; + + off +=2*block; + } + } + + // compare results + + cc = (int)((cc_1 + cc_2)*1000.0/(width*height)); + + flag = (cc > thres) ? 1:0; + + if(cc) + hb_log("flag: %i | cc: %i | cc1: %i | cc2: %i", flag, cc, cc_1, cc_2); + + return flag; +} + + static void yadif_store_ref( const uint8_t ** pic, hb_filter_private_t * pv ) { @@ -520,13 +567,25 @@ { avpicture_fill( &pv->pic_out, pv->buf_out[0]->data, pix_fmt, width, height ); - - avpicture_deinterlace( &pv->pic_out, &pv->pic_in, + + if( detect_comb(buf_in, width, height) ) + { + hb_log("found combing!"); + + avpicture_deinterlace( &pv->pic_out, &pv->pic_in, pix_fmt, width, height ); - - hb_buffer_copy_settings( pv->buf_out[0], buf_in ); + + hb_buffer_copy_settings( pv->buf_out[0], buf_in ); + + *buf_out = pv->buf_out[0]; - *buf_out = pv->buf_out[0]; + } + else + { + hb_buffer_copy_settings( pv->buf_out[0], buf_in ); + + *buf_out = buf_in; + } return FILTER_OK; } @@ -551,50 +610,59 @@ yadif_store_ref( (const uint8_t**)pv->pic_in.data, pv ); hb_buffer_copy_settings( pv->buf_settings, buf_in ); - - /* don't let 'work_loop' send a chapter mark upstream */ - buf_in->new_chap = 0; + /* don't let 'work_loop' send a chapter mark upstream */ + buf_in->new_chap = 0; + pv->yadif_ready = 1; return FILTER_DELAY; } - /* Perform yadif and mcdeint filtering */ - int frame; - for( frame = 0; frame <= (pv->yadif_mode & 1); frame++ ) + if( detect_comb(buf_in, width, height) ) { - int parity = frame ^ tff ^ 1; - - avpicture_fill( &pv->pic_out, pv->buf_out[!(frame^1)]->data, - pix_fmt, width, height ); - - yadif_filter( pv->pic_out.data, parity, tff, pv ); + /* Perform yadif and mcdeint filtering */ + hb_log("combing detected, passing to yadif"); - if( pv->mcdeint_mode >= 0 ) + int frame; + for( frame = 0; frame <= (pv->yadif_mode & 1); frame++ ) { - avpicture_fill( &pv->pic_in, pv->buf_out[(frame^1)]->data, + int parity = frame ^ tff ^ 1; + + avpicture_fill( &pv->pic_out, pv->buf_out[!(frame^1)]->data, pix_fmt, width, height ); - - mcdeint_filter( pv->pic_in.data, pv->pic_out.data, parity, pv ); - - *buf_out = pv->buf_out[ (frame^1)]; + + yadif_filter( pv->pic_out.data, parity, tff, pv ); + + if( pv->mcdeint_mode >= 0 ) + { + avpicture_fill( &pv->pic_in, pv->buf_out[(frame^1)]->data, + pix_fmt, width, height ); + + mcdeint_filter( pv->pic_in.data, pv->pic_out.data, parity, pv ); + + *buf_out = pv->buf_out[ (frame^1)]; + } + else + { + *buf_out = pv->buf_out[!(frame^1)]; + } } - else - { - *buf_out = pv->buf_out[!(frame^1)]; - } } - + else + { + *buf_out = buf_in; + } + /* Copy buffered settings to output buffer settings */ hb_buffer_copy_settings( *buf_out, pv->buf_settings ); /* Replace buffered settings with input buffer settings */ hb_buffer_copy_settings( pv->buf_settings, buf_in ); - - /* don't let 'work_loop' send a chapter mark upstream */ - buf_in->new_chap = 0; + /* don't let 'work_loop' send a chapter mark upstream */ + buf_in->new_chap = 0; + return FILTER_OK; }