X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fmodules%2Fcore%2Ffilter_mirror.c;h=813aeef87b54b72593ae734b40f28fe449418b21;hb=b2737f448f85593413049ae846fa27e6ecc5bf35;hp=66b88720ac43aeed4773c6ea3b2fa0eaba7247d0;hpb=cc7993dc7fdb45803bbd689573b623aa554929ec;p=mlt diff --git a/src/modules/core/filter_mirror.c b/src/modules/core/filter_mirror.c index 66b88720..813aeef8 100644 --- a/src/modules/core/filter_mirror.c +++ b/src/modules/core/filter_mirror.c @@ -3,23 +3,22 @@ * Copyright (C) 2003-2004 Ushodaya Enterprises Limited * Author: Charles Yates * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, + * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include "filter_mirror.h" - +#include #include #include @@ -35,7 +34,7 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format mlt_filter this = mlt_frame_pop_service( frame ); // Get the mirror type - mlt_properties properties = mlt_filter_properties( this ); + mlt_properties properties = MLT_FILTER_PROPERTIES( this ); // Get the properties char *mirror = mlt_properties_get( properties, "mirror" ); @@ -44,10 +43,14 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format int reverse = mlt_properties_get_int( properties, "reverse" ); // Get the image + *format = mlt_image_yuv422; int error = mlt_frame_get_image( frame, image, format, width, height, 1 ); + // Get the alpha + uint8_t *alpha = mlt_frame_get_alpha_mask( frame ); + // If we have an image of the right colour space - if ( error == 0 && *format == mlt_image_yuv422 ) + if ( error == 0 ) { // We'll KISS here int hh = *height / 2; @@ -56,20 +59,27 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format { uint8_t *p = NULL; uint8_t *q = NULL; + uint8_t *a = NULL; + uint8_t *b = NULL; int i; + int uneven_w = ( *width % 2 ) * 2; for ( i = 0; i < *height; i ++ ) { p = ( uint8_t * )*image + i * *width * 2; q = p + *width * 2; + a = alpha + i * *width; + b = a + *width - 1; if ( !reverse ) { while ( p < q ) { *p ++ = *( q - 2 ); - *p ++ = *( q - 3 ); + *p ++ = *( q - 3 - uneven_w ); *p ++ = *( q - 4 ); - *p ++ = *( q - 1 ); + *p ++ = *( q - 1 - uneven_w ); q -= 4; + *a ++ = *b --; + *a ++ = *b --; } } else @@ -77,10 +87,12 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format while ( p < q ) { *( q - 2 ) = *p ++; - *( q - 3 ) = *p ++; + *( q - 3 - uneven_w ) = *p ++; *( q - 4 ) = *p ++; - *( q - 1 ) = *p ++; + *( q - 1 - uneven_w ) = *p ++; q -= 4; + *b -- = *a ++; + *b -- = *a ++; } } } @@ -90,6 +102,8 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format uint16_t *end = ( uint16_t *)*image + *width * *height; uint16_t *p = NULL; uint16_t *q = NULL; + uint8_t *a = NULL; + uint8_t *b = NULL; int i; int j; for ( i = 0; i < hh; i ++ ) @@ -97,15 +111,23 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format p = ( uint16_t * )*image + i * *width; q = end - ( i + 1 ) * *width; j = *width; + a = alpha + i * *width; + b = alpha + ( *height - i - 1 ) * *width; if ( !reverse ) { while ( j -- ) + { *p ++ = *q ++; + *a ++ = *b ++; + } } else { while ( j -- ) + { *q ++ = *p ++; + *b ++ = *a ++; + } } } } @@ -114,22 +136,29 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format uint8_t *end = ( uint8_t *)*image + *width * *height * 2; uint8_t *p = NULL; uint8_t *q = NULL; + uint8_t *a = NULL; + uint8_t *b = NULL; int i; int j; + int uneven_w = ( *width % 2 ) * 2; for ( i = 0; i < *height; i ++ ) { p = ( uint8_t * )*image + i * *width * 2; q = end - i * *width * 2; j = ( ( *width * ( *height - i ) ) / *height ) / 2; + a = alpha + i * *width; + b = alpha + ( *height - i - 1 ) * *width; if ( !reverse ) { while ( j -- ) { *p ++ = *( q - 2 ); - *p ++ = *( q - 3 ); + *p ++ = *( q - 3 - uneven_w ); *p ++ = *( q - 4 ); - *p ++ = *( q - 1 ); + *p ++ = *( q - 1 - uneven_w ); q -= 4; + *a ++ = *b --; + *a ++ = *b --; } } else @@ -137,10 +166,12 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format while ( j -- ) { *( q - 2 ) = *p ++; - *( q - 3 ) = *p ++; + *( q - 3 - uneven_w ) = *p ++; *( q - 4 ) = *p ++; - *( q - 1 ) = *p ++; + *( q - 1 - uneven_w ) = *p ++; q -= 4; + *b -- = *a ++; + *b -- = *a ++; } } } @@ -152,20 +183,27 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format uint8_t *q = NULL; int i; int j; + uint8_t *a = NULL; + uint8_t *b = NULL; + int uneven_w = ( *width % 2 ) * 2; for ( i = 0; i < *height; i ++ ) { p = ( uint8_t * )*image + ( i + 1 ) * *width * 2; q = end - ( i + 1 ) * *width * 2; j = ( ( *width * ( *height - i ) ) / *height ) / 2; + a = alpha + ( i + 1 ) * *width - 1; + b = alpha + ( *height - i - 1 ) * *width; if ( !reverse ) { while ( j -- ) { *q ++ = *( p - 2 ); - *q ++ = *( p - 3 ); + *q ++ = *( p - 3 - uneven_w ); *q ++ = *( p - 4 ); - *q ++ = *( p - 1 ); + *q ++ = *( p - 1 - uneven_w ); p -= 4; + *b ++ = *a --; + *b ++ = *a --; } } else @@ -173,10 +211,12 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format while ( j -- ) { *( p - 2 ) = *q ++; - *( p - 3 ) = *q ++; + *( p - 3 - uneven_w ) = *q ++; *( p - 4 ) = *q ++; - *( p - 1 ) = *q ++; + *( p - 1 - uneven_w ) = *q ++; p -= 4; + *a -- = *b ++; + *a -- = *b ++; } } } @@ -187,24 +227,36 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format uint8_t *p = NULL; uint8_t *q = NULL; int i; + uint8_t *a = NULL; + uint8_t *b = NULL; + uint8_t c; + int uneven_w = ( *width % 2 ) * 2; for ( i = 0; i < *height; i ++ ) { p = ( uint8_t * )*image + i * *width * 2; q = p + *width * 2; + a = alpha + i * *width; + b = a + *width - 1; while ( p < q ) { t[ 0 ] = p[ 0 ]; - t[ 1 ] = p[ 1 ]; + t[ 1 ] = p[ 1 + uneven_w ]; t[ 2 ] = p[ 2 ]; - t[ 3 ] = p[ 3 ]; + t[ 3 ] = p[ 3 + uneven_w ]; *p ++ = *( q - 2 ); - *p ++ = *( q - 3 ); + *p ++ = *( q - 3 - uneven_w ); *p ++ = *( q - 4 ); - *p ++ = *( q - 1 ); + *p ++ = *( q - 1 - uneven_w ); *( -- q ) = t[ 3 ]; *( -- q ) = t[ 0 ]; *( -- q ) = t[ 1 ]; *( -- q ) = t[ 2 ]; + c = *a; + *a ++ = *b; + *b -- = c; + c = *a; + *a ++ = *b; + *b -- = c; } } } @@ -214,18 +266,26 @@ static int filter_get_image( mlt_frame frame, uint8_t **image, mlt_image_format uint16_t *p = NULL; uint16_t *q = NULL; uint16_t t; + uint8_t *a = NULL; + uint8_t *b = NULL; + uint8_t c; int i; int j; for ( i = 0; i < hh; i ++ ) { p = ( uint16_t * )*image + i * *width; q = end - ( i + 1 ) * *width; + a = alpha + i * *width; + b = alpha + ( *height - i - 1 ) * *width; j = *width; while ( j -- ) { t = *p; *p ++ = *q; *q ++ = t; + c = *a; + *a ++ = *b; + *b ++ = c; } } } @@ -252,7 +312,7 @@ static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) /** Constructor for the filter. */ -mlt_filter filter_mirror_init( void *arg ) +mlt_filter filter_mirror_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg ) { // Construct a new filter mlt_filter this = mlt_filter_new( ); @@ -261,7 +321,7 @@ mlt_filter filter_mirror_init( void *arg ) if ( this != NULL ) { // Get the properties - mlt_properties properties = mlt_filter_properties( this ); + mlt_properties properties = MLT_FILTER_PROPERTIES( this ); // Set the default mirror type mlt_properties_set_or_default( properties, "mirror", arg, "horizontal" );