X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=inline;f=src%2Fmodules%2Fcore%2Ffilter_audioconvert.c;h=a38219286f7c10968b2589296f240b3e0d91d398;hb=31e70f01d93d5465d96b2842780fccd1d9bc6ade;hp=eeff0792b91075256f245f150fe4b8e3de5c8dce;hpb=835fd43a4200772b82f52e9714cd2f02c0f23db0;p=mlt diff --git a/src/modules/core/filter_audioconvert.c b/src/modules/core/filter_audioconvert.c index eeff0792..a3821928 100644 --- a/src/modules/core/filter_audioconvert.c +++ b/src/modules/core/filter_audioconvert.c @@ -1,6 +1,6 @@ /* * filter_audioconvert.c -- convert from one audio format to another - * Copyright (C) 2009 Ushodaya Enterprises Limited + * Copyright (C) 2009-2012 Ushodaya Enterprises Limited * Author: Dan Dennedy * * This library is free software; you can redistribute it and/or @@ -27,7 +27,7 @@ static int convert_audio( mlt_frame frame, void **audio, mlt_audio_format *format, mlt_audio_format requested_format ) { - int error = 0; + int error = 1; mlt_properties properties = MLT_FRAME_PROPERTIES( frame ); int channels = mlt_properties_get_int( properties, "audio_channels" ); int samples = mlt_properties_get_int( properties, "audio_samples" ); @@ -59,6 +59,7 @@ static int convert_audio( mlt_frame frame, void **audio, mlt_audio_format *forma } } *audio = buffer; + error = 0; break; } case mlt_audio_float: @@ -77,10 +78,51 @@ static int convert_audio( mlt_frame frame, void **audio, mlt_audio_format *forma } } *audio = buffer; + error = 0; + break; + } + case mlt_audio_s32le: + { + int32_t *buffer = mlt_pool_alloc( size ); + int32_t *p = buffer; + int16_t *q = (int16_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + *p++ = (int32_t) *q++ << 16; + *audio = buffer; + error = 0; + break; + } + case mlt_audio_f32le: + { + float *buffer = mlt_pool_alloc( size ); + float *p = buffer; + int16_t *q = (int16_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + { + float f = (float)( *q++ ) / 32768.0; + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = f; + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_u8: + { + uint8_t *buffer = mlt_pool_alloc( size ); + uint8_t *p = buffer; + int16_t *q = (int16_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + *p++ = ( *q++ >> 8 ) + 128; + *audio = buffer; + error = 0; break; } default: - error = 1; + break; } break; case mlt_audio_s32: @@ -96,6 +138,7 @@ static int convert_audio( mlt_frame frame, void **audio, mlt_audio_format *forma for ( c = 0; c < channels; c++ ) *p++ = *( q + c * samples + s ) >> 16; *audio = buffer; + error = 0; break; } case mlt_audio_float: @@ -107,10 +150,54 @@ static int convert_audio( mlt_frame frame, void **audio, mlt_audio_format *forma while ( --i ) *p++ = (float)( *q++ ) / 2147483648.0; *audio = buffer; + error = 0; + break; + } + case mlt_audio_s32le: + { + int32_t *buffer = mlt_pool_alloc( size ); + int32_t *p = buffer; + int32_t *q = (int32_t*) *audio; + int s, c; + for ( s = 0; s < samples; s++ ) + for ( c = 0; c < channels; c++ ) + *p++ = *( q + c * samples + s ); + *audio = buffer; + error = 0; + break; + } + case mlt_audio_f32le: + { + float *buffer = mlt_pool_alloc( size ); + float *p = buffer; + int32_t *q = (int32_t*) *audio; + int s, c; + for ( s = 0; s < samples; s++ ) + for ( c = 0; c < channels; c++ ) + { + float f = (float)( *( q + c * samples + s ) ) / 2147483648.0; + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = f; + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_u8: + { + uint8_t *buffer = mlt_pool_alloc( size ); + uint8_t *p = buffer; + int32_t *q = (int32_t*) *audio; + int s, c; + for ( s = 0; s < samples; s++ ) + for ( c = 0; c < channels; c++ ) + *p++ = ( q[c * samples + s] >> 24 ) + 128; + *audio = buffer; + error = 0; break; } default: - error = 1; + break; } break; case mlt_audio_float: @@ -130,6 +217,7 @@ static int convert_audio( mlt_frame frame, void **audio, mlt_audio_format *forma *p++ = 32767 * f; } *audio = buffer; + error = 0; break; } case mlt_audio_s32: @@ -145,14 +233,323 @@ static int convert_audio( mlt_frame frame, void **audio, mlt_audio_format *forma *p++ = ( f > 0 ? 2147483647LL : 2147483648LL ) * f; } *audio = buffer; + error = 0; + break; + } + case mlt_audio_s32le: + { + int32_t *buffer = mlt_pool_alloc( size ); + int32_t *p = buffer; + float *q = (float*) *audio; + int s, c; + for ( s = 0; s < samples; s++ ) + for ( c = 0; c < channels; c++ ) + { + float f = *( q + c * samples + s ); + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = ( f > 0 ? 2147483647LL : 2147483648LL ) * f; + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_f32le: + { + float *buffer = mlt_pool_alloc( size ); + float *p = buffer; + float *q = (float*) *audio; + int s, c; + for ( s = 0; s < samples; s++ ) + for ( c = 0; c < channels; c++ ) + *p++ = *( q + c * samples + s ); + *audio = buffer; + error = 0; + break; + } + case mlt_audio_u8: + { + uint8_t *buffer = mlt_pool_alloc( size ); + uint8_t *p = buffer; + float *q = (float*) *audio; + int s, c; + for ( s = 0; s < samples; s++ ) + for ( c = 0; c < channels; c++ ) + { + float f = *( q + c * samples + s ); + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = ( 127 * f ) + 128; + } + *audio = buffer; + error = 0; break; } default: - error = 1; + break; + } + break; + case mlt_audio_s32le: + switch ( requested_format ) + { + case mlt_audio_s16: + { + int16_t *buffer = mlt_pool_alloc( size ); + int16_t *p = buffer; + int32_t *q = (int32_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + *p++ = *q++ >> 16; + *audio = buffer; + error = 0; + break; + } + case mlt_audio_s32: + { + int32_t *buffer = mlt_pool_alloc( size ); + int32_t *p = buffer; + int c; + for ( c = 0; c < channels; c++ ) + { + int32_t *q = (int32_t*) *audio + c; + int i = samples + 1; + while ( --i ) + { + *p++ = *q; + q += channels; + } + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_float: + { + float *buffer = mlt_pool_alloc( size ); + float *p = buffer; + int c; + for ( c = 0; c < channels; c++ ) + { + int32_t *q = (int32_t*) *audio + c; + int i = samples + 1; + while ( --i ) + { + *p++ = (float)( *q ) / 2147483648.0; + q += channels; + } + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_f32le: + { + float *buffer = mlt_pool_alloc( size ); + float *p = buffer; + int32_t *q = (int32_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + *p++ = (float)( *q++ ) / 2147483648.0; + *audio = buffer; + error = 0; + break; + } + case mlt_audio_u8: + { + uint8_t *buffer = mlt_pool_alloc( size ); + uint8_t *p = buffer; + int32_t *q = (int32_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + *p++ = ( *q++ >> 24 ) + 128; + *audio = buffer; + error = 0; + break; + } + default: + break; + } + break; + case mlt_audio_f32le: + switch ( requested_format ) + { + case mlt_audio_s16: + { + int16_t *buffer = mlt_pool_alloc( size ); + int16_t *p = buffer; + float *q = (float*) *audio; + int i = samples * channels + 1; + while ( --i ) + { + float f = *q++; + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = 32767 * f; + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_float: + { + float *buffer = mlt_pool_alloc( size ); + float *p = buffer; + int c; + for ( c = 0; c < channels; c++ ) + { + float *q = (float*) *audio + c; + int i = samples + 1; + while ( --i ) + { + *p++ = *q; + q += channels; + } + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_s32: + { + int32_t *buffer = mlt_pool_alloc( size ); + int32_t *p = buffer; + int c; + for ( c = 0; c < channels; c++ ) + { + float *q = (float*) *audio + c; + int i = samples + 1; + while ( --i ) + { + float f = *q; + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = ( f > 0 ? 2147483647LL : 2147483648LL ) * f; + q += channels; + } + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_s32le: + { + int32_t *buffer = mlt_pool_alloc( size ); + int32_t *p = buffer; + float *q = (float*) *audio; + int i = samples * channels + 1; + while ( --i ) + { + float f = *q++; + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = ( f > 0 ? 2147483647LL : 2147483648LL ) * f; + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_u8: + { + uint8_t *buffer = mlt_pool_alloc( size ); + uint8_t *p = buffer; + float *q = (float*) *audio; + int i = samples * channels + 1; + while ( --i ) + { + float f = *q++; + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = ( 127 * f ) + 128; + } + *audio = buffer; + error = 0; + break; + } + default: + break; + } + break; + case mlt_audio_u8: + switch ( requested_format ) + { + case mlt_audio_s32: + { + int32_t *buffer = mlt_pool_alloc( size ); + int32_t *p = buffer; + int c; + for ( c = 0; c < channels; c++ ) + { + uint8_t *q = (uint8_t*) *audio + c; + int i = samples + 1; + while ( --i ) + { + *p++ = ( (int32_t) *q - 128 ) << 24; + q += channels; + } + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_float: + { + float *buffer = mlt_pool_alloc( size ); + float *p = buffer; + int c; + for ( c = 0; c < channels; c++ ) + { + uint8_t *q = (uint8_t*) *audio + c; + int i = samples + 1; + while ( --i ) + { + *p++ = ( (float) *q - 128 ) / 256.0f; + q += channels; + } + } + *audio = buffer; + error = 0; + break; + } + case mlt_audio_s16: + { + int16_t *buffer = mlt_pool_alloc( size ); + int16_t *p = buffer; + uint8_t *q = (uint8_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + *p++ = ( (int16_t) *q++ - 128 ) << 8; + *audio = buffer; + error = 0; + break; + } + case mlt_audio_s32le: + { + int32_t *buffer = mlt_pool_alloc( size ); + int32_t *p = buffer; + uint8_t *q = (uint8_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + *p++ = ( (int32_t) *q++ - 128 ) << 24; + *audio = buffer; + error = 0; + break; + } + case mlt_audio_f32le: + { + float *buffer = mlt_pool_alloc( size ); + float *p = buffer; + uint8_t *q = (uint8_t*) *audio; + int i = samples * channels + 1; + while ( --i ) + { + float f = ( (float) *q++ - 128 ) / 256.0f; + f = f > 1.0 ? 1.0 : f < -1.0 ? -1.0 : f; + *p++ = f; + } + *audio = buffer; + error = 0; + break; + } + default: + break; } break; default: - error = 1; + break; } } if ( !error ) @@ -177,7 +574,7 @@ static mlt_frame filter_process( mlt_filter this, mlt_frame frame ) mlt_filter filter_audioconvert_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg ) { - mlt_filter this = calloc( sizeof( struct mlt_filter_s ), 1 ); + mlt_filter this = calloc( 1, sizeof( struct mlt_filter_s ) ); if ( mlt_filter_init( this, this ) == 0 ) this->process = filter_process; return this;