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 properties = mlt_frame_properties( this );
mlt_get_image get_image = mlt_frame_pop_get_image( this );
mlt_producer producer = mlt_properties_get_data( properties, "test_card_producer", NULL );
+
+ *width = *width >> 1 << 1;
if ( get_image != NULL )
{
- return get_image( this, buffer, format, width, height, writable );
+ int error = 0;
+ mlt_position position = mlt_frame_get_position( this );
+ error = get_image( this, buffer, format, width, height, writable );
+ mlt_frame_set_position( this, position );
+ return error;
}
else if ( mlt_properties_get_data( properties, "image", NULL ) != NULL )
{
mlt_properties_set_data( properties, "image", *buffer, *width * *height * 2, NULL, NULL );
mlt_properties_set_int( properties, "width", *width );
mlt_properties_set_int( properties, "height", *height );
- mlt_properties_set( properties, "rescale.interp", "none" );
- mlt_properties_set( properties, "scale", "off" );
+ mlt_properties_set_double( properties, "aspect_ratio", mlt_frame_get_aspect_ratio( test_frame ) );
}
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 0;
}
+unsigned char *mlt_frame_get_waveform( mlt_frame this, int w, int h )
+{
+ int16_t *pcm = NULL;
+ mlt_properties properties = mlt_frame_properties( this );
+ mlt_audio_format format = mlt_audio_pcm;
+ int frequency = 32000; // lower frequency available?
+ int channels = 2;
+ double fps = mlt_properties_get_double( properties, "fps" );
+ int samples = mlt_sample_calculator( fps, frequency, mlt_frame_get_position( this ) );
+
+ // Get the pcm data
+ mlt_frame_get_audio( this, &pcm, &format, &frequency, &channels, &samples );
+
+ // Make an 8-bit buffer large enough to hold rendering
+ int size = w * h;
+ unsigned char *bitmap = ( unsigned char* )mlt_pool_alloc( size );
+ if ( bitmap != NULL )
+ memset( bitmap, 0, size );
+ mlt_properties_set_data( properties, "waveform", bitmap, size, ( mlt_destructor )mlt_pool_release, NULL );
+
+ // Render vertical lines
+ int16_t *ubound = pcm + samples * channels;
+ int skip = samples / w - 1;
+ int i, j, k;
+
+ // Iterate sample stream and along x coordinate
+ for ( i = 0; i < w && pcm < ubound; i++ )
+ {
+ // pcm data has channels interleaved
+ for ( j = 0; j < channels; j++ )
+ {
+ // Determine sample's magnitude from 2s complement;
+ int pcm_magnitude = *pcm < 0 ? ~(*pcm) + 1 : *pcm;
+ // The height of a line is the ratio of the magnitude multiplied by
+ // half the vertical resolution
+ int height = ( int )( ( double )( pcm_magnitude ) / 32768 * h / 2 );
+ // Determine the starting y coordinate - left channel above center,
+ // right channel below - currently assumes 2 channels
+ int displacement = ( h / 2 ) - ( 1 - j ) * height;
+ // Position buffer pointer using y coordinate, stride, and x coordinate
+ unsigned char *p = &bitmap[ i + displacement * w ];
+
+ // Draw vertical line
+ for ( k = 0; k < height; k++ )
+ p[ w * k ] = 0xFF;
+
+ pcm++;
+ }
+ pcm += skip * channels;
+ }
+
+ return bitmap;
+}
+
+mlt_producer mlt_frame_get_original_producer( mlt_frame this )
+{
+ if ( this != NULL )
+ return mlt_properties_get_data( mlt_frame_properties( this ), "_producer", NULL );
+ return NULL;
+}
+
void mlt_frame_close( mlt_frame this )
{
if ( this != NULL && mlt_properties_dec_ref( mlt_frame_properties( this ) ) <= 0 )
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 )