All pastes #1035239 Raw Edit

threaded yadif

public diff v1 · immutable
#1035239 ·published 2008-05-31 20:18 UTC
rendered paste body
Index: libhb/deinterlace.c===================================================================--- libhb/deinterlace.c	(revision 1474)+++ libhb/deinterlace.c	(working copy)@@ -34,6 +34,7 @@  struct hb_filter_private_s {+    int              cpu_count;     int              pix_fmt;     int              width[3];     int              height[3];@@ -84,6 +85,17 @@     hb_deinterlace_close, }; +struct yadif_arguments{+    uint8_t **dst;+    int parity;+    int tff;+    int plane;+    hb_filter_private_t * pv;+    int y;+};++struct yadif_arguments yadif_arguments_array[4];+ static void yadif_store_ref( const uint8_t ** pic,                              hb_filter_private_t * pv ) {@@ -185,11 +197,61 @@     } } +void yadif_filter_segment( void *yadif_args )+{+    struct yadif_arguments *segment_data;+    segment_data = (struct yadif_arguments *) yadif_args;++    uint8_t **dst = segment_data->dst;+    int parity = segment_data->parity;+    int tff = segment_data->tff;+    int i = segment_data->plane;+    hb_filter_private_t * pv = segment_data->pv;+    int y;++    int w = pv->width[i];+    int h = pv->height[i];+    int ref_stride = pv->yadif_ref_stride[i];++    for( y = 0 ; y < h; y =  y++ )+    {+        if( (y ^ parity) &  1 )+        {+            uint8_t *prev = &pv->yadif_ref[0][i][y*ref_stride];+            uint8_t *cur  = &pv->yadif_ref[1][i][y*ref_stride];+            uint8_t *next = &pv->yadif_ref[2][i][y*ref_stride];+            uint8_t *dst2 = &dst[i][y*w];++            yadif_filter_line( dst2, prev, cur, next, i, parity ^ tff, pv );++        }+        else+        {+            memcpy( &dst[i][y*w],+                    &pv->yadif_ref[1][i][y*ref_stride],+                    w * sizeof(uint8_t) );+        }+    }+}+ static void yadif_filter( uint8_t ** dst,                           int parity,                           int tff,                           hb_filter_private_t * pv ) {++    int thread_count = 3;+    hb_thread_t * yadif_threads[thread_count];++    int j;+    for( j = 0; j < thread_count; j++)+    {+        yadif_arguments_array[j].parity = parity;+        yadif_arguments_array[j].pv = pv;+        yadif_arguments_array[j].tff = tff;+        yadif_arguments_array[j].dst = dst;+    }+     int i;     for( i = 0; i < 3; i++ )     {@@ -197,26 +259,15 @@         int h = pv->height[i];         int ref_stride = pv->yadif_ref_stride[i]; -        int y;-        for( y = 0; y < h; y++ )-        {-            if( (y ^ parity) &  1 )-            {-                uint8_t *prev = &pv->yadif_ref[0][i][y*ref_stride];-                uint8_t *cur  = &pv->yadif_ref[1][i][y*ref_stride];-                uint8_t *next = &pv->yadif_ref[2][i][y*ref_stride];-                uint8_t *dst2 = &dst[i][y*w];+        yadif_arguments_array[i].plane = i; -                yadif_filter_line( dst2, prev, cur, next, i, parity ^ tff, pv );-            }-            else-            {-                memcpy( &dst[i][y*w],-                        &pv->yadif_ref[1][i][y*ref_stride],-                        w * sizeof(uint8_t) );-            }-        }+        yadif_threads[i] = hb_thread_init( "yadif_segment", yadif_filter_segment, &yadif_arguments_array[i], HB_NORMAL_PRIORITY );     }++    for(j = 0; j < thread_count; j++)+    {+        hb_thread_close( &yadif_threads[j]);+    } }  static void mcdeint_filter( uint8_t ** dst,@@ -344,6 +395,8 @@      hb_filter_private_t * pv = calloc( 1, sizeof(struct hb_filter_private_s) ); +    pv->cpu_count      = hb_get_cpu_count();+     pv->pix_fmt = pix_fmt;      pv->width[0]  = width;