#include <stdlib.h>
#include <math.h>
+#define CLAMP( x, min, max ) (x) < (min) ? (min) : (x) > (max) ? (max) : (x)
+
/** Do it :-).
*/
static int filter_get_image( mlt_frame this, uint8_t **image, mlt_image_format *format, int *width, int *height, int writable )
{
// Get the image
+ *format = mlt_image_yuv422;
int error = mlt_frame_get_image( this, image, format, width, height, 1 );
// Only process if we have no error and a valid colour space
- if ( error == 0 && *format == mlt_image_yuv422 )
+ if ( error == 0 )
{
// Get the brightness level
double level = mlt_properties_get_double( MLT_FRAME_PROPERTIES( this ), "brightness" );
// Only process if level is something other than 1
if ( level != 1.0 )
{
+ int i = *width * *height + 1;
uint8_t *p = *image;
- uint8_t *q = *image + *width * *height * 2;
- int32_t x = 0;
int32_t m = level * ( 1 << 16 );
+ int32_t n = 128 * ( ( 1 << 16 ) - m );
- while ( p != q )
+ while ( --i )
{
- x = ( *p * m ) >> 16;
- *p = x < 16 ? 16 : x > 235 ? 235 : x;
+ p[0] = CLAMP( (p[0] * m) >> 16, 16, 235 );
+ p[1] = CLAMP( (p[1] * m + n) >> 16, 16, 240 );
p += 2;
}
}
{
// Get the starting brightness level
double level = fabs( mlt_properties_get_double( MLT_FILTER_PROPERTIES( this ), "start" ) );
-
+
// If there is an end adjust gain to the range
if ( mlt_properties_get( MLT_FILTER_PROPERTIES( this ), "end" ) != NULL )
{
// Determine the time position of this frame in the transition duration
- mlt_position in = mlt_filter_get_in( this );
- mlt_position out = mlt_filter_get_out( this );
- mlt_position time = mlt_frame_get_position( frame );
- double position = ( double )( time - in ) / ( double )( out - in + 1 );
double end = fabs( mlt_properties_get_double( MLT_FILTER_PROPERTIES( this ), "end" ) );
- level += ( end - level ) * position;
+ level += ( end - level ) * mlt_filter_get_progress( this, frame );
}
// Push the frame filter