X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fresample%2Ffilter_resample.c;h=2c848a8520b1273244399ca5ee2025c03d4ab038;hb=4d699147e17dc4edbc002ca26ba62c409cecb4b6;hp=b8da7605d04672ffa1e639bb2e8f140a6c503bbd;hpb=6e4f3aabfeae526318998c1078213de269ea2e65;p=melted diff --git a/src/modules/resample/filter_resample.c b/src/modules/resample/filter_resample.c index b8da760..2c848a8 100644 --- a/src/modules/resample/filter_resample.c +++ b/src/modules/resample/filter_resample.c @@ -43,6 +43,7 @@ static int resample_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form SRC_DATA data; float *input_buffer = mlt_properties_get_data( properties, "resample.input_buffer", NULL ); float *output_buffer = mlt_properties_get_data( properties, "resample.output_buffer", NULL ); + int channels_avail = *channels; int i; if ( output_rate == 0 ) @@ -52,9 +53,50 @@ static int resample_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form frame->get_audio = mlt_properties_get_data( properties, "resample.get_audio", NULL ); // Get the producer's audio - mlt_frame_get_audio( frame, buffer, format, frequency, channels, samples ); + mlt_frame_get_audio( frame, buffer, format, frequency, &channels_avail, samples ); - // Return now if now work to do + // Duplicate channels as necessary + if ( channels_avail < *channels ) + { + int size = *channels * *samples * sizeof( int16_t ); + int16_t *new_buffer = mlt_pool_alloc( size ); + + // Duplicate the existing channels + for ( i = 0; i < *samples; i++ ) + { + int j, k = 0; + for ( j = 0; j < *channels; j++ ) + { + new_buffer[ ( i * *channels ) + j ] = (*buffer)[ ( i * channels_avail ) + k ]; + k = ( k + 1 ) % channels_avail; + } + } + + // Update the audio buffer now - destroys the old + mlt_properties_set_data( properties, "audio", new_buffer, size, ( mlt_destructor )mlt_pool_release, NULL ); + + *buffer = new_buffer; + } + else if ( channels_avail > *channels ) + { + // Nasty hack for ac3 5.1 audio - may be a cause of failure? + int size = *channels * *samples * sizeof( int16_t ); + int16_t *new_buffer = mlt_pool_alloc( size ); + + // Drop all but the first *channels + for ( i = 0; i < *samples; i++ ) + { + new_buffer[ ( i * *channels ) + 0 ] = (*buffer)[ ( i * channels_avail ) + 2 ]; + new_buffer[ ( i * *channels ) + 1 ] = (*buffer)[ ( i * channels_avail ) + 3 ]; + } + + // Update the audio buffer now - destroys the old + mlt_properties_set_data( properties, "audio", new_buffer, size, ( mlt_destructor )mlt_pool_release, NULL ); + + *buffer = new_buffer; + } + + // Return now if no work to do if ( output_rate == *frequency ) return 0; @@ -107,24 +149,27 @@ static int resample_get_audio( mlt_frame frame, int16_t **buffer, mlt_audio_form static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) { - mlt_properties properties = mlt_filter_properties( this ); - mlt_properties frame_props = mlt_frame_properties( frame ); - - // Propogate the frequency property if supplied - if ( mlt_properties_get( properties, "frequency" ) != NULL ) - mlt_properties_set_int( frame_props, "resample.frequency", mlt_properties_get_int( properties, "frequency" ) ); - - // Propogate the other properties - mlt_properties_set_int( frame_props, "resample.channels", mlt_properties_get_int( properties, "channels" ) ); - mlt_properties_set_data( frame_props, "resample.state", mlt_properties_get_data( properties, "state", NULL ), 0, NULL, NULL ); - mlt_properties_set_data( frame_props, "resample.input_buffer", mlt_properties_get_data( properties, "input_buffer", NULL ), 0, NULL, NULL ); - mlt_properties_set_data( frame_props, "resample.output_buffer", mlt_properties_get_data( properties, "output_buffer", NULL ), 0, NULL, NULL ); + if ( frame->get_audio != NULL ) + { + mlt_properties properties = mlt_filter_properties( this ); + mlt_properties frame_props = mlt_frame_properties( frame ); + + // Propogate the frequency property if supplied + if ( mlt_properties_get( properties, "frequency" ) != NULL ) + mlt_properties_set_int( frame_props, "resample.frequency", mlt_properties_get_int( properties, "frequency" ) ); + + // Propogate the other properties + mlt_properties_set_int( frame_props, "resample.channels", mlt_properties_get_int( properties, "channels" ) ); + mlt_properties_set_data( frame_props, "resample.state", mlt_properties_get_data( properties, "state", NULL ), 0, NULL, NULL ); + mlt_properties_set_data( frame_props, "resample.input_buffer", mlt_properties_get_data( properties, "input_buffer", NULL ), 0, NULL, NULL ); + mlt_properties_set_data( frame_props, "resample.output_buffer", mlt_properties_get_data( properties, "output_buffer", NULL ), 0, NULL, NULL ); - // Backup the original get_audio (it's still needed) - mlt_properties_set_data( frame_props, "resample.get_audio", frame->get_audio, 0, NULL, NULL ); + // Backup the original get_audio (it's still needed) + mlt_properties_set_data( frame_props, "resample.get_audio", frame->get_audio, 0, NULL, NULL ); - // Override the get_audio method - frame->get_audio = resample_get_audio; + // Override the get_audio method + frame->get_audio = resample_get_audio; + } return frame; } @@ -158,4 +203,3 @@ mlt_filter filter_resample_init( char *arg ) } return this; } -