struct geometry_s
{
+ int frame;
float position;
float mix;
int nw; // normalised width
position = ( position - in->position ) / ( out->position - in->position );
// Calculate this frames geometry
- output->nw = in->nw;
- output->nh = in->nh;
- output->x = in->x + ( out->x - in->x ) * position;
- output->y = in->y + ( out->y - in->y ) * position;
- output->w = in->w + ( out->w - in->w ) * position;
- output->h = in->h + ( out->h - in->h ) * position;
- output->mix = in->mix + ( out->mix - in->mix ) * position;
- output->distort = in->distort;
+ if ( in->frame != out->frame - 1 )
+ {
+ output->nw = in->nw;
+ output->nh = in->nh;
+ output->x = in->x + ( out->x - in->x ) * position;
+ output->y = in->y + ( out->y - in->y ) * position;
+ output->w = in->w + ( out->w - in->w ) * position;
+ output->h = in->h + ( out->h - in->h ) * position;
+ output->mix = in->mix + ( out->mix - in->mix ) * position;
+ output->distort = in->distort;
+ }
+ else
+ {
+ output->nw = out->nw;
+ output->nh = out->nh;
+ output->x = out->x;
+ output->y = out->y;
+ output->w = out->w;
+ output->h = out->h;
+ output->mix = out->mix;
+ output->distort = out->distort;
+ }
// DRD> These break on negative values. I do not think they are needed
// since yuv_composite takes care of YUYV group alignment
// Parse and add to the list
geometry_parse( temp, ptr, value, normalised_width, normalised_height );
- // Assign the position
+ // Assign the position and frame
+ temp->frame = frame;
temp->position = position;
// Allow the next to be appended after this one
}
// crop overlay beyond right edge of frame
- else if ( x + width_src > width_dest )
+ if ( x + width_src > width_dest )
width_src = width_dest - x;
// crop overlay off the top edge of the frame
y_src = -y;
height_src -= y_src;
}
+
// crop overlay below bottom edge of frame
- else if ( y + height_src > height_dest )
+ if ( y + height_src > height_dest )
height_src = height_dest - y;
// offset pointer into overlay buffer based on cropping
stride_dest *= step;
int alpha_stride = stride_src / bpp;
- if ( line_fn == NULL )
- line_fn = composite_line_yuv;
-
// now do the compositing only to cropped extents
- for ( i = 0; i < height_src; i += step )
+ if ( line_fn != NULL )
{
- line_fn( p_dest, p_src, width_src, p_alpha, weight, p_luma, softness );
-
- p_src += stride_src;
- p_dest += stride_dest;
- if ( p_alpha )
- p_alpha += alpha_stride;
- if ( p_luma )
- p_luma += alpha_stride;
+ for ( i = 0; i < height_src; i += step )
+ {
+ line_fn( p_dest, p_src, width_src, p_alpha, weight, p_luma, softness );
+
+ p_src += stride_src;
+ p_dest += stride_dest;
+ if ( p_alpha )
+ p_alpha += alpha_stride;
+ if ( p_luma )
+ p_luma += alpha_stride;
+ }
+ }
+ else
+ {
+ for ( i = 0; i < height_src; i += step )
+ {
+ composite_line_yuv( p_dest, p_src, width_src, p_alpha, weight, p_luma, softness );
+
+ p_src += stride_src;
+ p_dest += stride_dest;
+ if ( p_alpha )
+ p_alpha += alpha_stride;
+ if ( p_luma )
+ p_luma += alpha_stride;
+ }
}
return ret;
*width = geometry->sw * *width / geometry->nw;
*height = geometry->sh * *height / geometry->nh;
- x -= x % 2;
+ x &= 0xfffffffe;
// optimization points - no work to do
if ( *width < 1 || *height < 1 )
uint8_t *dest = *image;
uint8_t *src = image_b;
uint8_t *alpha = mlt_frame_get_alpha_mask( b_frame );
- int progressive = mlt_properties_get_int( a_props, "progressive" ) ||
+ int progressive =
mlt_properties_get_int( a_props, "consumer_progressive" ) ||
mlt_properties_get_int( properties, "progressive" );
int field;
int32_t luma_softness = mlt_properties_get_double( properties, "softness" ) * ( 1 << 16 );
uint16_t *luma_bitmap = get_luma( properties, width_b, height_b );
- composite_line_fn line_fn = mlt_properties_get_int( properties, "_MMX" ) ? composite_line_yuv_mmx : composite_line_yuv;
+ composite_line_fn line_fn = mlt_properties_get_int( properties, "_MMX" ) ? composite_line_yuv_mmx : NULL;
for ( field = 0; field < ( progressive ? 1 : 2 ); field++ )
{