]> git.sesse.net Git - mlt/commitdiff
+ Top field first correction (original approach would not have worked [mea culpa...
authorlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Wed, 12 Apr 2006 22:00:31 +0000 (22:00 +0000)
committerlilo_booter <lilo_booter@d19143bc-622f-0410-bfdd-b5b2a6649095>
Wed, 12 Apr 2006 22:00:31 +0000 (22:00 +0000)
git-svn-id: https://mlt.svn.sourceforge.net/svnroot/mlt/trunk/mlt@907 d19143bc-622f-0410-bfdd-b5b2a6649095

src/modules/core/filter_resize.c

index 81e850d5d73741cce78520eb874a28e626b04caa..f9f80dfe4875bf6ccfc3d5224b13171f0fa27b10 100644 (file)
 #include <stdlib.h>
 #include <math.h>
 
+/** Swapbytes inline.
+*/
+
+static inline void swap_bytes( uint8_t *upper, uint8_t *lower )
+{
+       uint8_t t = *lower;
+       *lower = *upper;
+       *upper = t;
+}
+
 /** Do it :-).
 */
 
@@ -115,22 +125,26 @@ static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *
                        // Get the input image, width and height
                        int size;
                        uint8_t *image = mlt_properties_get_data( properties, "image", &size );
-
-                       // Keep the original image around to be destroyed on frame close
-                       mlt_properties_rename( properties, "image", "original_image" );
-
-                       // Duplicate the last line in the field to avoid artifact
-                       memcpy( image + oheight * owidth * 2, image + oheight * owidth * 2 - owidth * 4, owidth * 2 );
-
-                       // Offset the image pointer by one line
-                       image += owidth * 2;
-                       size -= owidth * 2;
-                       
-                       // Set the new image pointer with no destructor
-                       mlt_properties_set_data( properties, "image", image, size, NULL, NULL );
+                       uint8_t *ptr = image + owidth * 2;
+                       int h = oheight / 2;
+                       int w = owidth;
+
+                       // Swap the lines around
+                       while( h -- )
+                       {
+                               w = owidth;
+                               while( w -- )
+                               {
+                                       swap_bytes( image ++, ptr ++ );
+                                       swap_bytes( image ++, ptr ++ );
+                               }
+                               image += owidth * 2;
+                               ptr += owidth * 2;
+                       }
 
                        // Set the normalised field order
                        mlt_properties_set_int( properties, "top_field_first", 0 );
+                       mlt_properties_set_int( properties, "meta.top_field_first", 0 );
                }
 
                if ( !strcmp( op, "affine" ) )