X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fkino%2Ffilehandler.cc;h=dc57a300bbba4ede385af57746eb3f1a7a317f08;hb=7261f622acf6477b5b39ddd677111ca433cd7cd9;hp=5c4de5249202a335e44265fa90dd11d82c3683e6;hpb=10be0eed6b4e815fa4f6c3942598eecaef3ce058;p=melted diff --git a/src/modules/kino/filehandler.cc b/src/modules/kino/filehandler.cc index 5c4de52..dc57a30 100644 --- a/src/modules/kino/filehandler.cc +++ b/src/modules/kino/filehandler.cc @@ -19,6 +19,10 @@ #include "config.h" +extern "C" { +#include +} + #include #include #include @@ -38,6 +42,11 @@ using std::setfill; #include #include +// libdv header files +#ifdef HAVE_LIBDV +#include +#endif + #include "filehandler.h" #include "error.h" #include "riff.h" @@ -884,30 +893,31 @@ int QtHandler::GetFrame( uint8_t *data, int frameNum ) quicktime_set_video_position( fd, frameNum, 0 ); quicktime_read_frame( fd, data, 0 ); -#if 0 +#ifdef HAVE_LIBDV if ( quicktime_has_audio( fd ) ) { - AudioInfo info; - double samples; - if ( ! isFullyInitialized ) - { - cerr << ">>> using audio from separarate Quicktime audio track" << endl; AllocateAudioBuffers(); - } - info.channels = channels; - info.frequency = quicktime_sample_rate( fd, 0 ); - samples = info.frequency / quicktime_frame_rate( fd, 0 ); - info.samples = (int) samples; - 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 ); - } - frame.EncodeAudio( info, audioChannelBuffer ); + // Fetch the frequency of the audio track and calc number of samples needed + int frequency = quicktime_sample_rate( fd, 0 ); + 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 ); } - frame.ExtractHeader(); #endif return 0;