2 * filter_oldfilm.c -- oldfilm filter
3 * Copyright (c) 2007 Marco Gittler <g.marco@freenet.de>
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #include <framework/mlt_filter.h>
21 #include <framework/mlt_frame.h>
28 static int filter_get_image( mlt_frame
this, uint8_t **image
, mlt_image_format
*format
, int *width
, int *height
, int writable
)
31 mlt_filter filter
= mlt_frame_pop_service( this );
32 int error
= mlt_frame_get_image( this, image
, format
, width
, height
, 1 );
34 if ( error
== 0 && *image
&& *format
== mlt_image_yuv422
)
42 mlt_position in
= mlt_filter_get_in( filter
);
43 mlt_position out
= mlt_filter_get_out( filter
);
44 mlt_position time
= mlt_frame_get_position( this );
45 double position
= ( double )( time
- in
) / ( double )( out
- in
+ 1 );
46 srand(position
*10000);
48 int delta
= mlt_properties_get_int( MLT_FILTER_PROPERTIES( filter
), "delta" );
49 int every
= mlt_properties_get_int( MLT_FILTER_PROPERTIES( filter
), "every" );
51 int bdu
= mlt_properties_get_int( MLT_FILTER_PROPERTIES( filter
), "brightnessdelta_up" );
52 int bdd
= mlt_properties_get_int( MLT_FILTER_PROPERTIES( filter
), "brightnessdelta_down" );
53 int bevery
= mlt_properties_get_int( MLT_FILTER_PROPERTIES( filter
), "brightnessdelta_every" );
57 diffpic
=rand()%delta
*2-delta
;
61 brightdelta
=rand()%(bdu
+bdd
)-bdd
;
64 if (rand()%100>bevery
)
80 uint8_t* pic
=(*image
+y
*w
*2+x
*2);
82 if (newy
>0 && newy
<h
){
83 uint8_t oldval
=*(pic
+diffpic
*w
*2);
85 int randx=(x<=frameborder)?x:(x+frameborder>w)?w-x:-1;
86 int randy=((newy)<=frameborder)?(newy):((newy)+frameborder>h)?h-(y+diffpic):-1;
88 oldval=oldval*pow(((double)randx/(double)frameborder),1.5);
91 oldval=oldval*pow(((double)randy/(double)frameborder),1.5);
93 if (randx>=0 && randy>=0){
94 //oldval=oldval*(randx*randy)/500.0;
97 if ( ((int) oldval
+ brightdelta
) >255)
99 else if ( ( (int) oldval
+brightdelta
) <0){
102 *pic
=oldval
+brightdelta
;
103 *(pic
+1)=*(pic
+diffpic
*w
*2+1);
118 static mlt_frame
filter_process( mlt_filter
this, mlt_frame frame
)
121 mlt_frame_push_service( frame
, this );
122 mlt_frame_push_get_image( frame
, filter_get_image
);
126 mlt_filter
filter_oldfilm_init( mlt_profile profile
, mlt_service_type type
, const char *id
, char *arg
)
128 mlt_filter
this = mlt_filter_new( );
131 this->process
= filter_process
;
132 mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "delta", "14" );
133 mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "every", "20" );
134 mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "brightnessdelta_up" , "20" );
135 mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "brightnessdelta_down" , "30" );
136 mlt_properties_set( MLT_FILTER_PROPERTIES( this ), "brightnessdelta_every" , "70" );