All pastes #896753 Raw Edit

Anonymous

public diff v1 · immutable
·published 2008-02-08 22:49 UTC
rendered paste body
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; j<block; ++j)+    {+        off=0;+        +        for(n=0; n<(height-4); n=n+2)+        {+            s1 = (buf->data[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; }