mlt_filter filter_audiospectrum_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg ) { mlt_filter filter = mlt_filter_new(); private_data* pdata = (private_data*)calloc( 1, sizeof(private_data) ); if ( filter && pdata && createQApplicationIfNeeded( MLT_FILTER_SERVICE(filter) ) ) { mlt_properties properties = MLT_FILTER_PROPERTIES( filter ); mlt_properties_set_int( properties, "_filter_private", 1 ); mlt_properties_set_int( properties, "frequency_low", 20 ); mlt_properties_set_int( properties, "frequency_high", 20000 ); mlt_properties_set( properties, "type", "line" ); mlt_properties_set( properties, "bgcolor", "0x00000000" ); mlt_properties_set( properties, "color.1", "0xffffffff" ); mlt_properties_set( properties, "rect", "0% 0% 100% 100%" ); mlt_properties_set( properties, "thickness", "0" ); mlt_properties_set( properties, "fill", "0" ); mlt_properties_set( properties, "mirror", "0" ); mlt_properties_set( properties, "reverse", "0" ); mlt_properties_set( properties, "tension", "0.4" ); mlt_properties_set( properties, "angle", "0" ); mlt_properties_set( properties, "gorient", "v" ); mlt_properties_set_int( properties, "bands", 31 ); mlt_properties_set_double( properties, "threshold", -60.0 ); mlt_properties_set_int( properties, "window_size", 8192 ); // Create a unique ID for storing data on the frame pdata->fft_prop_name = (char*)calloc( 1, 20 ); snprintf( pdata->fft_prop_name, 20, "fft.%p", filter ); pdata->fft_prop_name[20 - 1] = '\0'; pdata->fft = 0; filter->close = filter_close; filter->process = filter_process; filter->child = pdata; } else { mlt_log_error( MLT_FILTER_SERVICE(filter), "Filter audio spectrum failed\n" ); if( filter ) { mlt_filter_close( filter ); } if( pdata ) { free( pdata ); } filter = NULL; } return filter; }
mlt_transition transition_vqm_init( mlt_profile profile, mlt_service_type type, const char *id, void *arg ) { mlt_transition transition = mlt_transition_new(); if ( transition ) { mlt_properties properties = MLT_TRANSITION_PROPERTIES( transition ); if ( !createQApplicationIfNeeded( MLT_TRANSITION_SERVICE(transition) ) ) { mlt_transition_close( transition ); return NULL; } transition->process = process; mlt_properties_set_int( properties, "_transition_type", 1 ); // video only mlt_properties_set_int( properties, "window_size", 8 ); printf( "frame psnr[Y] psnr[Cb] psnr[Cr] ssim[Y] ssim[Cb] ssim[Cr]\n" ); } return transition; }
mlt_filter filter_audiowaveform_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg ) { mlt_filter filter = mlt_filter_new(); if ( !filter ) return NULL; if ( !createQApplicationIfNeeded( MLT_FILTER_SERVICE(filter) ) ) { mlt_filter_close( filter ); return NULL; } filter->process = filter_process; mlt_properties filter_properties = MLT_FILTER_PROPERTIES( filter ); mlt_properties_set( filter_properties, "bgcolor", "0x00000000" ); mlt_properties_set( filter_properties, "color.1", "0xffffffff" ); mlt_properties_set( filter_properties, "thickness", "0" ); mlt_properties_set( filter_properties, "show_channel", "0" ); mlt_properties_set( filter_properties, "angle", "0" ); mlt_properties_set( filter_properties, "rect", "0 0 100% 100%" ); mlt_properties_set( filter_properties, "fill", "0" ); mlt_properties_set( filter_properties, "gorient", "v" ); return filter; }
mlt_producer producer_qtext_init( mlt_profile profile, mlt_service_type type, const char *id, char *filename ) { // Create a new producer object mlt_producer producer = mlt_producer_new( profile ); mlt_properties producer_properties = MLT_PRODUCER_PROPERTIES( producer ); // Initialize the producer if ( producer ) { if ( !createQApplicationIfNeeded( MLT_PRODUCER_SERVICE(producer) ) ) { mlt_producer_close( producer ); return NULL; } mlt_properties_set( producer_properties, "text", "" ); mlt_properties_set( producer_properties, "fgcolour", "0xffffffff" ); mlt_properties_set( producer_properties, "bgcolour", "0x00000000" ); mlt_properties_set( producer_properties, "olcolour", "0x00000000" ); mlt_properties_set( producer_properties, "outline", "0" ); mlt_properties_set( producer_properties, "align", "left" ); mlt_properties_set( producer_properties, "pad", "0" ); mlt_properties_set( producer_properties, "family", "Sans" ); mlt_properties_set( producer_properties, "size", "48" ); mlt_properties_set( producer_properties, "style", "normal" ); mlt_properties_set( producer_properties, "weight", "400" ); mlt_properties_set( producer_properties, "encoding", "UTF-8" ); // Parse the filename argument if ( filename == NULL || !strcmp( filename, "" ) || strstr( filename, "<producer>" ) ) { } else if( filename[ 0 ] == '+' || strstr( filename, "/+" ) ) { char *copy = strdup( filename + 1 ); char *tmp = copy; if ( strstr( tmp, "/+" ) ) tmp = strstr( tmp, "/+" ) + 2; if ( strrchr( tmp, '.' ) ) ( *strrchr( tmp, '.' ) ) = '\0'; while ( strchr( tmp, '~' ) ) ( *strchr( tmp, '~' ) ) = '\n'; mlt_properties_set( producer_properties, "text", tmp ); mlt_properties_set( producer_properties, "resource", filename ); free( copy ); } else { // Convert file name string encoding. mlt_properties_set( producer_properties, "resource", filename ); mlt_properties_from_utf8( producer_properties, "resource", "_resource" ); filename = mlt_properties_get( producer_properties, "_resource" ); FILE *f = fopen( filename, "r" ); if ( f != NULL ) { char line[81]; char *tmp = NULL; size_t size = 0; line[80] = '\0'; while ( fgets( line, 80, f ) ) { size += strlen( line ) + 1; if ( tmp ) { tmp = (char*)realloc( tmp, size ); if ( tmp ) strcat( tmp, line ); } else { tmp = strdup( line ); } } fclose( f ); if ( tmp && tmp[ strlen( tmp ) - 1 ] == '\n' ) tmp[ strlen( tmp ) - 1 ] = '\0'; if ( tmp ) mlt_properties_set( producer_properties, "text", tmp ); free( tmp ); } } // Create QT objects to be reused. mlt_properties_set_data( producer_properties, "_qimg", static_cast<void*>( new QImage() ), 0, close_qimg, NULL ); mlt_properties_set_data( producer_properties, "_qpath", static_cast<void*>( new QPainterPath() ), 0, close_qpath, NULL ); // Callback registration producer->get_frame = producer_get_frame; producer->close = ( mlt_destructor )producer_close; } return producer; }
int refresh_qimage( producer_qimage self, mlt_frame frame ) { // Obtain properties of frame and producer mlt_properties properties = MLT_FRAME_PROPERTIES( frame ); mlt_producer producer = &self->parent; mlt_properties producer_props = MLT_PRODUCER_PROPERTIES( producer ); // Check if user wants us to reload the image if ( mlt_properties_get_int( producer_props, "force_reload" ) ) { self->qimage = NULL; self->current_image = NULL; mlt_properties_set_int( producer_props, "force_reload", 0 ); } // Get the time to live for each frame double ttl = mlt_properties_get_int( producer_props, "ttl" ); // Get the original position of this frame mlt_position position = mlt_frame_original_position( frame ); position += mlt_producer_get_in( producer ); // Image index int image_idx = ( int )floor( ( double )position / ttl ) % self->count; int disable_exif = mlt_properties_get_int( producer_props, "disable_exif" ); if ( !createQApplicationIfNeeded( MLT_PRODUCER_SERVICE(producer) ) ) return -1; if ( image_idx != self->qimage_idx ) self->qimage = NULL; if ( !self->qimage || mlt_properties_get_int( producer_props, "_disable_exif" ) != disable_exif ) { self->current_image = NULL; QImage *qimage = new QImage( QString::fromUtf8( mlt_properties_get_value( self->filenames, image_idx ) ) ); self->qimage = qimage; if ( !qimage->isNull( ) ) { // Read the exif value for this file if ( !disable_exif ) qimage = reorient_with_exif( self, image_idx, qimage ); // Register qimage for destruction and reuse mlt_cache_item_close( self->qimage_cache ); mlt_service_cache_put( MLT_PRODUCER_SERVICE( producer ), "qimage.qimage", qimage, 0, ( mlt_destructor )qimage_delete ); self->qimage_cache = mlt_service_cache_get( MLT_PRODUCER_SERVICE( producer ), "qimage.qimage" ); self->qimage_idx = image_idx; // Store the width/height of the qimage self->current_width = qimage->width( ); self->current_height = qimage->height( ); mlt_events_block( producer_props, NULL ); mlt_properties_set_int( producer_props, "meta.media.width", self->current_width ); mlt_properties_set_int( producer_props, "meta.media.height", self->current_height ); mlt_properties_set_int( producer_props, "_disable_exif", disable_exif ); mlt_events_unblock( producer_props, NULL ); } else { delete qimage; self->qimage = NULL; } } // Set width/height of frame mlt_properties_set_int( properties, "width", self->current_width ); mlt_properties_set_int( properties, "height", self->current_height ); return image_idx; }