return samples;
}
+
+int64_t mlt_sample_calculator_to_now( float fps, int frequency, int64_t frame )
+{
+ int64_t samples = 0;
+
+ // TODO: Correct rules for NTSC and drop the * 100 hack
+ if ( ( int )( fps * 100 ) == 2997 )
+ {
+ samples = ( ( double )( frame * frequency ) / 30 );
+ switch( frequency )
+ {
+ case 48000:
+ samples += 2 * ( frame / 5 );
+ break;
+ case 44100:
+ samples += frame + ( frame / 2 ) - ( frame / 30 ) + ( frame / 300 );
+ break;
+ case 32000:
+ samples += ( 2 * frame ) - ( frame / 4 ) - ( frame / 29 );
+ break;
+ }
+ }
+ else if ( fps != 0 )
+ {
+ samples = ( ( frame * frequency ) / ( int )fps );
+ }
+
+ return samples;
+}
extern void mlt_resize_yuv422( uint8_t *output, int owidth, int oheight, uint8_t *input, int iwidth, int iheight );
extern int mlt_frame_mix_audio( mlt_frame self, mlt_frame that, float weight_start, float weight_end, int16_t **buffer, mlt_audio_format *format, int *frequency, int *channels, int *samples );
extern int mlt_sample_calculator( float fps, int frequency, int64_t position );
+extern int64_t mlt_sample_calculator_to_now( float fps, int frequency, int64_t position );
/* this macro scales rgb into the yuv gamut, y is scaled by 219/255 and uv by 224/255 */
#define RGB2YUV(r, g, b, y, u, v)\
construct_full_file( full_file, prefix, file );
// Open the shared object
- object = dlopen( full_file, RTLD_NOW );
+ object = dlopen( full_file, RTLD_NOW | RTLD_GLOBAL );
if ( object != NULL )
{
// Set it on the properties
#include "config.h"
+extern "C" {
+#include <framework/mlt_frame.h>
+}
+
#include <string>
#include <iostream>
#include <sstream>
if ( ! isFullyInitialized )
AllocateAudioBuffers();
+ // Fetch the frequency of the audio track and calc number of samples needed
int frequency = quicktime_sample_rate( fd, 0 );
- int samples = ( int )( frequency / quicktime_frame_rate( fd, 0 ) );
- for ( int i = 0; i < channels; i++ )
- {
- quicktime_set_audio_position( fd, ( int64_t )( frameNum * samples ), 0 );
- quicktime_decode_audio( fd, audioChannelBuffer[ i ], NULL, (long) samples, i );
- }
+ float fps = ( data[ 3 ] & 0x80 ) ? 25.0f : 29.97f;
+ int samples = mlt_sample_calculator( fps, frequency, frameNum );
+ int64_t seek = mlt_sample_calculator_to_now( fps, frequency, frameNum );
+
+ // Obtain a dv encoder and initialise it with minimal info
dv_encoder_t *encoder = dv_encoder_new( 0, 0, 0 );
+ encoder->isPAL = ( data[ 3 ] & 0x80 );
encoder->samples_this_frame = samples;
+
+ // Seek to the calculated position and decode
+ quicktime_set_audio_position( fd, seek, 0 );
+ lqt_decode_audio( fd, audioChannelBuffer, NULL, (long) samples );
+
+ // Encode the audio on the frame and done
dv_encode_full_audio( encoder, audioChannelBuffer, channels, frequency, data );
dv_encoder_free( encoder );
}