+ double level = 1.0;
+
+ // Use animated "level" property only if it has been set since init
+ char* level_property = mlt_properties_get( MLT_FILTER_PROPERTIES( filter ), "level" );
+ if ( level_property != NULL )
+ {
+ level = mlt_properties_anim_get_double( properties, "level", position, length );
+ }
+ else
+ {
+ // Get level using old "start,"end" mechanics
+ // Get the starting brightness level
+ level = fabs( mlt_properties_get_double( MLT_FILTER_PROPERTIES( filter ), "start" ) );
+
+ // If there is an end adjust gain to the range
+ if ( mlt_properties_get( MLT_FILTER_PROPERTIES( filter ), "end" ) != NULL )
+ {
+ // Determine the time position of this frame in the transition duration
+ double end = fabs( mlt_properties_get_double( MLT_FILTER_PROPERTIES( filter ), "end" ) );
+ level += ( end - level ) * mlt_filter_get_progress( filter, frame );
+ }
+ }
+
+ // Only process if level is something other than 1
+ if ( level != 1.0 )
+ {
+ int i = *width * *height + 1;
+ uint8_t *p = *image;
+ int32_t m = level * ( 1 << 16 );
+ int32_t n = 128 * ( ( 1 << 16 ) - m );
+
+ while ( --i )
+ {
+ p[0] = CLAMP( (p[0] * m) >> 16, 16, 235 );
+ p[1] = CLAMP( (p[1] * m + n) >> 16, 16, 240 );
+ p += 2;
+ }
+ }