mlt_properties_set_int( properties, "height", 576 );
mlt_properties_set_int( properties, "normalised_width", 720 );
mlt_properties_set_int( properties, "normalised_height", 576 );
- mlt_properties_set_double( properties, "aspect_ratio", 72.0/79.0 );
+ mlt_properties_set_double( properties, "aspect_ratio", 59.0/54.0 );
}
else
{
mlt_properties_set_int( properties, "height", 480 );
mlt_properties_set_int( properties, "normalised_width", 720 );
mlt_properties_set_int( properties, "normalised_height", 480 );
- mlt_properties_set_double( properties, "aspect_ratio", 128.0/117.0 );
+ mlt_properties_set_double( properties, "aspect_ratio", 10.0/11.0 );
}
mlt_properties_set_data( properties, "audio", NULL, 0, NULL, NULL );
mlt_properties_set_int( properties, "width", *width );
mlt_properties_set_int( properties, "height", *height );
mlt_properties_set_double( properties, "aspect_ratio", mlt_frame_get_aspect_ratio( test_frame ) );
- mlt_properties_set( properties, "rescale.interp", "none" );
- mlt_properties_set( properties, "scale", "off" );
}
else
{
uint8_t *mlt_frame_get_alpha_mask( mlt_frame this )
{
- if ( this->get_alpha_mask != NULL )
+ if ( this != NULL && this->get_alpha_mask != NULL )
return this->get_alpha_mask( this );
- return NULL;
+ return this == NULL ? NULL : mlt_properties_get_data( &this->parent, "alpha", NULL );
}
int mlt_frame_get_audio( mlt_frame this, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples )
{
mlt_properties properties = mlt_frame_properties( this );
+ int hide = mlt_properties_get_int( properties, "test_audio" );
- if ( this->get_audio != NULL )
+ if ( hide == 0 && this->get_audio != NULL )
{
+ mlt_position position = mlt_frame_get_position( this );
this->get_audio( this, buffer, format, frequency, channels, samples );
+ mlt_frame_set_position( this, position );
}
else if ( mlt_properties_get_data( properties, "audio", NULL ) )
{
return ret;
}
+uint8_t *mlt_resize_alpha( uint8_t *input, int owidth, int oheight, int iwidth, int iheight )
+{
+ uint8_t *output = NULL;
+
+ if ( input != NULL && ( iwidth != owidth || iheight != oheight ) )
+ {
+ iwidth = iwidth - ( iwidth % 2 );
+ owidth = owidth - ( owidth % 2 );
+
+ output = mlt_pool_alloc( owidth * oheight );
+
+ // Coordinates (0,0 is middle of output)
+ int y;
+
+ // Calculate ranges
+ int out_x_range = owidth / 2;
+ int out_y_range = oheight / 2;
+ int in_x_range = iwidth / 2 < out_x_range ? iwidth / 2 : out_x_range;
+ int in_y_range = iheight / 2 < out_y_range ? iheight / 2 : out_y_range;
+
+ // Output pointers
+ uint8_t *out_line = output;
+ uint8_t *out_ptr = out_line;
+
+ // Calculate a middle and possibly invalid pointer in the input
+ uint8_t *in_middle = input + iwidth * ( iheight / 2 ) + ( iwidth / 2 );
+ int in_line = - in_y_range * iwidth - in_x_range;
+
+ int elements;
+
+ // Fill whole section with black
+ y = out_y_range - ( iheight / 2 );
+ int blank_elements = owidth * y;
+ elements = blank_elements;
+ while ( elements -- )
+ *out_line ++ = 0;
+
+ int active_width = iwidth;
+ int inactive_width = out_x_range - in_x_range;
+ uint8_t *p = NULL;
+ uint8_t *end = NULL;
+
+ // Loop for the entirety of our output height.
+ while ( iheight -- )
+ {
+ // Start at the beginning of the line
+ out_ptr = out_line;
+
+ // Fill the outer part with black
+ elements = inactive_width;
+ while ( elements -- )
+ *out_ptr ++ = 0;
+
+ // We're in the input range for this row.
+ p = in_middle + in_line;
+ end = out_ptr + active_width;
+ while ( out_ptr != end )
+ *out_ptr ++ = *p ++;
+
+ // Fill the outer part with black
+ elements = inactive_width;
+ while ( elements -- )
+ *out_ptr ++ = 0;
+
+ // Move to next input line
+ in_line += iwidth;
+
+ // Move to next output line
+ out_line += owidth;
+ }
+
+ // Fill whole section with black
+ elements = blank_elements;
+ while ( elements -- )
+ *out_line ++ = 0;
+ }
+
+ return output;
+}
+
void mlt_resize_yuv422( uint8_t *output, int owidth, int oheight, uint8_t *input, int iwidth, int iheight )
{
// Calculate strides
iwidth = iwidth - ( iwidth % 4 );
owidth = owidth - ( owidth % 4 );
- iheight = iheight - ( iheight % 2 );
- oheight = oheight - ( oheight % 2 );
+ //iheight = iheight - ( iheight % 2 );
+ //oheight = oheight - ( oheight % 2 );
// Optimisation point
if ( iwidth == owidth && iheight == oheight )
// Get the input image, width and height
uint8_t *input = mlt_properties_get_data( properties, "image", NULL );
+ uint8_t *alpha = mlt_frame_get_alpha_mask( this );
+
int iwidth = mlt_properties_get_int( properties, "width" );
int iheight = mlt_properties_get_int( properties, "height" );
mlt_properties_set_int( properties, "width", owidth );
mlt_properties_set_int( properties, "height", oheight );
+ // We should resize the alpha too
+ alpha = mlt_resize_alpha( alpha, owidth, oheight, iwidth, iheight );
+ if ( alpha != NULL )
+ {
+ mlt_properties_set_data( properties, "alpha", alpha, owidth * ( oheight + 1 ), ( mlt_destructor )mlt_pool_release, NULL );
+ this->get_alpha_mask = NULL;
+ }
+
// Return the output
return output;
}
//fprintf( stderr, "mix: frame dest samples %d channels %d position %lld\n", samples_dest, channels_dest, mlt_properties_get_position( mlt_frame_properties( this ), "_position" ) );
mlt_frame_get_audio( that, &src, format, &frequency_src, &channels_src, &samples_src );
//fprintf( stderr, "mix: frame src samples %d channels %d\n", samples_src, channels_src );
-
+
+ int silent = mlt_properties_get_int( mlt_frame_properties( this ), "silent_audio" );
+ mlt_properties_set_int( mlt_frame_properties( this ), "silent_audio", 0 );
+ if ( silent )
+ memset( dest, 0, samples_dest * channels_dest * sizeof( int16_t ) );
+
+ silent = mlt_properties_get_int( mlt_frame_properties( that ), "silent_audio" );
+ mlt_properties_set_int( mlt_frame_properties( that ), "silent_audio", 0 );
+ if ( silent )
+ memset( src, 0, samples_src * channels_src * sizeof( int16_t ) );
+
if ( channels_src > 6 )
channels_src = 0;
if ( channels_dest > 6 )