Thread: [Jahshaka-cvs] openlibraries/src/openmedialib/plugins/avformat avformat_plugin.cpp, 1.103, 1.104
Status: Beta
Brought to you by:
jahshaka
From: Charles Y. <lil...@us...> - 2007-08-29 07:07:00
|
Update of /cvsroot/openlibraries/openlibraries/src/openmedialib/plugins/avformat In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv27151 Modified Files: avformat_plugin.cpp Log Message: + Dynamic allocation of memory in the audio resampler (replaces previous work around) Index: avformat_plugin.cpp =================================================================== RCS file: /cvsroot/openlibraries/openlibraries/src/openmedialib/plugins/avformat/avformat_plugin.cpp,v retrieving revision 1.103 retrieving revision 1.104 diff -u -d -r1.103 -r1.104 --- avformat_plugin.cpp 2 Aug 2007 14:14:02 -0000 1.103 +++ avformat_plugin.cpp 29 Aug 2007 07:06:53 -0000 1.104 @@ -1998,8 +1998,8 @@ , context_(NULL) , dirty_(true) , cache_() - , in_buffer_(0) - , out_buffer_(0) + , in_buffer_( ) + , out_buffer_( ) { property_observer_ = boost::shared_ptr<pcos::observer>(new avformat_resampler_filter::property_observer(const_cast<avformat_resampler_filter*>(this))); @@ -2008,9 +2008,6 @@ prop_output_channels_.attach(property_observer_); prop_output_sample_freq_.attach(property_observer_); - - in_buffer_ = (short *)malloc(2097152); - out_buffer_ = (short *)malloc(2097152); } virtual ~avformat_resampler_filter() @@ -2020,9 +2017,6 @@ prop_output_channels_.detach(property_observer_); prop_output_sample_freq_.detach(property_observer_); - - free(in_buffer_); - free(out_buffer_); } virtual const opl::wstring get_uri( ) const { return L"resampler"; } @@ -2193,6 +2187,8 @@ // Allocate buffer memory int in_buffer_size = input_channels_ * input_samples_per_chan * sizeof(short); + if ( in_buffer_.size( ) < in_buffer_size ) + in_buffer_.resize( in_buffer_size ); // Appropriately copy data from cached audio for previous, current & next frames to buffer int offset = 0; @@ -2200,18 +2196,18 @@ if(current_pos > 0) { tmp = input_channels_ * previous_audio->samples(); - memcpy((void*)in_buffer_, (void*)previous_audio->data(), tmp * sizeof(short)); + memcpy((void*)&in_buffer_[ 0 ], (void*)previous_audio->data(), tmp * sizeof(short)); offset = tmp; } tmp = input_channels_ * current_audio->samples(); - memcpy((void*)(in_buffer_ + offset), (void*)current_audio->data(), tmp * sizeof(short)); + memcpy((void*)(&in_buffer_[ offset ]), (void*)current_audio->data(), tmp * sizeof(short)); offset += tmp; if(current_pos < get_frames() - 1) { tmp = input_channels_ * next_audio->samples(); - memcpy((void*)(in_buffer_ + offset), (void*)next_audio->data(), tmp * sizeof(short)); + memcpy((void*)(&in_buffer_[ offset ]), (void*)next_audio->data(), tmp * sizeof(short)); offset += tmp; } @@ -2224,9 +2220,11 @@ // Allocate the memory int out_buffer_size = prop_output_channels_.value<int>() * estimated_output_samples_per_chan * sizeof(short); + if ( out_buffer_.size( ) < out_buffer_size * 2 ) + out_buffer_.resize( out_buffer_size * 2 ); // use ffmpeg to resample data - int num_resampler_output_samples = audio_resample(context_, out_buffer_, in_buffer_, input_samples_per_chan); + int num_resampler_output_samples = audio_resample(context_, &out_buffer_[ 0 ], &in_buffer_[ 0 ], input_samples_per_chan); // Calculate the number of samples needed to pack into current frame at new sample frequency int output_samples = audio_samples_for_frame( current_pos, @@ -2256,7 +2254,7 @@ // Copy data from output buffer to audio object memcpy( (void*)output_audio->data(), - (void*)(out_buffer_ + (som * prop_output_channels_.value<int>())), + (void*)(&out_buffer_[ som * prop_output_channels_.value<int>() ]), output_samples * prop_output_channels_.value<int>() * sizeof(short)); // Set current frame to have this new audio object, which now holds the resampled audio data @@ -2297,8 +2295,8 @@ bool dirty_; std::map< int, frame_type_ptr > cache_; - short* in_buffer_; - short* out_buffer_; + std::vector< short > in_buffer_; + std::vector< short > out_buffer_; }; // |