X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fqimage%2Fqimage_wrapper.cpp;h=af6838eb2e1d71ed065fee5192b9f1a1660cfe12;hb=399e3ce12bafdf1e2668d69ad839f0ef4c686739;hp=cc88272380bbdf68e64c7aa640c80adffd210f47;hpb=a5ab71761c0334c52565e034f2343d7cdc39c23d;p=melted diff --git a/src/modules/qimage/qimage_wrapper.cpp b/src/modules/qimage/qimage_wrapper.cpp index cc88272..af6838e 100644 --- a/src/modules/qimage/qimage_wrapper.cpp +++ b/src/modules/qimage/qimage_wrapper.cpp @@ -1,6 +1,6 @@ /* * qimage_wrapper.cpp -- a QT/QImage based producer for MLT - * Copyright (C) 2003-2004 Ushodaya Enterprises Limited + * Copyright (C) 2006 Visual Media * Author: Charles Yates * * NB: This module is designed to be functionally equivalent to the @@ -23,16 +23,33 @@ #include "qimage_wrapper.h" #include + + +#include "config.h" + +#ifdef USE_KDE +#include +#include +#endif + #include extern "C" { #include +#ifdef USE_KDE +static KInstance *instance = 0L; +#endif + static void qimage_delete( void *data ) { QImage *image = ( QImage * )data; delete image; +#ifdef USE_KDE + if (instance) delete instance; + instance = 0L; +#endif } static void clear_buffered_image( mlt_properties producer_props, uint8_t **current_image, uint8_t **current_alpha ) @@ -47,14 +64,26 @@ static void clear_buffered_image( mlt_properties producer_props, uint8_t **curre static void assign_buffered_image( mlt_properties producer_props, uint8_t *current_image, uint8_t *current_alpha, int width, int height ) { + int use_cache = mlt_properties_get_int( producer_props, "cache" ); + mlt_destructor destructor = use_cache ? NULL : mlt_pool_release; mlt_events_block( producer_props, NULL ); - mlt_properties_set_data( producer_props, "_qimage_image", current_image, 0, mlt_pool_release, NULL ); - mlt_properties_set_data( producer_props, "_qimage_alpha", current_alpha, 0, mlt_pool_release, NULL ); + mlt_properties_set_data( producer_props, "_qimage_image", current_image, 0, destructor, NULL ); + mlt_properties_set_data( producer_props, "_qimage_alpha", current_alpha, 0, destructor, NULL ); mlt_properties_set_int( producer_props, "_qimage_width", width ); mlt_properties_set_int( producer_props, "_qimage_height", height ); mlt_events_unblock( producer_props, NULL ); } +void init_qimage() +{ +#ifdef USE_KDE + if (!instance) { + instance = new KInstance("qimage_prod"); + KImageIO::registerFormats(); + } +#endif +} + void refresh_qimage( mlt_frame frame, int width, int height ) { // Obtain a previous assigned qimage (if it exists) @@ -72,6 +101,11 @@ void refresh_qimage( mlt_frame frame, int width, int height ) // Obtain properties of producer mlt_properties producer_props = MLT_PRODUCER_PROPERTIES( producer ); + // Obtain the cache flag and structure + int use_cache = mlt_properties_get_int( producer_props, "cache" ); + mlt_properties cache = ( mlt_properties )mlt_properties_get_data( producer_props, "_cache", NULL ); + int update_cache = 0; + // Retrieve current info if available uint8_t *current_image = ( uint8_t * )mlt_properties_get_data( producer_props, "_qimage_image", NULL ); uint8_t *current_alpha = ( uint8_t * )mlt_properties_get_data( producer_props, "_qimage_alpha", NULL ); @@ -87,6 +121,39 @@ void refresh_qimage( mlt_frame frame, int width, int height ) // Image index int image_idx = ( int )floor( ( double )position / ttl ) % self->count; + // Key for the cache + char image_key[ 10 ]; + sprintf( image_key, "%d", image_idx ); + + // Check if the frame is already loaded + if ( use_cache ) + { + if ( cache == NULL ) + { + cache = mlt_properties_new( ); + mlt_properties_set_data( producer_props, "_cache", cache, 0, ( mlt_destructor )mlt_properties_close, NULL ); + } + + mlt_frame cached = ( mlt_frame )mlt_properties_get_data( cache, image_key, NULL ); + + if ( cached ) + { + self->image_idx = image_idx; + mlt_properties cached_props = MLT_FRAME_PROPERTIES( cached ); + current_width = mlt_properties_get_int( cached_props, "width" ); + current_height = mlt_properties_get_int( cached_props, "height" ); + mlt_properties_set_int( producer_props, "_real_width", mlt_properties_get_int( cached_props, "real_width" ) ); + mlt_properties_set_int( producer_props, "_real_height", mlt_properties_get_int( cached_props, "real_height" ) ); + current_image = ( uint8_t * )mlt_properties_get_data( cached_props, "image", NULL ); + current_alpha = ( uint8_t * )mlt_properties_get_data( cached_props, "alpha", NULL ); + + if ( width != 0 && ( width != current_width || height != current_height ) ) + current_image = NULL; + + assign_buffered_image( producer_props, current_image, current_alpha, current_width, current_height ); + } + } + // optimization for subsequent iterations on single picture if ( width != 0 && current_image != NULL && image_idx == self->image_idx ) { @@ -153,12 +220,15 @@ void refresh_qimage( mlt_frame frame, int width, int height ) current_alpha = ( uint8_t * )mlt_pool_alloc( current_width * current_height ); // Convert the image - if ( QImage::systemBitOrder( ) == QImage::BigEndian ) + if ( QImage::systemByteOrder( ) == QImage::BigEndian ) mlt_convert_argb_to_yuv422( temp.bits( ), current_width, current_height, temp.bytesPerLine( ), current_image, current_alpha ); else mlt_convert_bgr24a_to_yuv422( temp.bits( ), current_width, current_height, temp.bytesPerLine( ), current_image, current_alpha ); assign_buffered_image( producer_props, current_image, current_alpha, current_width, current_height ); + + // Ensure we update the cache when we need to + update_cache = use_cache; } // Set width/height of frame @@ -170,6 +240,19 @@ void refresh_qimage( mlt_frame frame, int width, int height ) // pass the image data without destructor mlt_properties_set_data( properties, "image", current_image, current_width * ( current_height + 1 ) * 2, NULL, NULL ); mlt_properties_set_data( properties, "alpha", current_alpha, current_width * current_height, NULL, NULL ); + + if ( update_cache ) + { + mlt_frame cached = mlt_frame_init( ); + mlt_properties cached_props = MLT_FRAME_PROPERTIES( cached ); + mlt_properties_set_int( cached_props, "width", current_width ); + mlt_properties_set_int( cached_props, "height", current_height ); + mlt_properties_set_int( cached_props, "real_width", mlt_properties_get_int( producer_props, "_real_width" ) ); + mlt_properties_set_int( cached_props, "real_height", mlt_properties_get_int( producer_props, "_real_height" ) ); + mlt_properties_set_data( cached_props, "image", current_image, current_width * ( current_height + 1 ) * 2, mlt_pool_release, NULL ); + mlt_properties_set_data( cached_props, "alpha", current_alpha, current_width * current_height, mlt_pool_release, NULL ); + mlt_properties_set_data( cache, image_key, cached, 0, ( mlt_destructor )mlt_frame_close, NULL ); + } } }