X-Git-Url: http://research.m1stereo.tv/gitweb?a=blobdiff_plain;f=src%2Fmodules%2Fkino%2Ffilehandler.cc;h=92d793b2f426af1be2e2a37b6d4d73fa68bba4e9;hb=293fdbb73409975db82393d85f1aa1414e0c1d9e;hp=67412fda8cbdab34deecc949293d6a1200801934;hpb=efd5f25f6fe70f75f9787e9c7f2b53730ecf6048;p=melted diff --git a/src/modules/kino/filehandler.cc b/src/modules/kino/filehandler.cc index 67412fd..92d793b 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 @@ -693,6 +697,19 @@ bool AVIHandler::GetOpenDML() const #define DV_AUDIO_MAX_SAMPLES 1944 #endif +// Missing fourcc's in libquicktime (allows compilation) +#ifndef QUICKTIME_DV_AVID +#define QUICKTIME_DV_AVID "AVdv" +#endif + +#ifndef QUICKTIME_DV_AVID_A +#define QUICKTIME_DV_AVID_A "dvcp" +#endif + +#ifndef QUICKTIME_DVCPRO +#define QUICKTIME_DVCPRO "dvpp" +#endif + QtHandler::QtHandler() : fd( NULL ) { extension = ".mov"; @@ -839,7 +856,7 @@ int QtHandler::Close() off_t QtHandler::GetFileSize() { struct stat file_status; - fstat( fileno( fd->stream ), &file_status ); + stat( filename.c_str(), &file_status ); return file_status.st_size; } @@ -871,7 +888,8 @@ bool QtHandler::Open( const char *s ) char * fcc = quicktime_video_compressor( fd, 0 ); if ( strncmp( fcc, QUICKTIME_DV, 4 ) != 0 && strncmp( fcc, QUICKTIME_DV_AVID, 4 ) != 0 && - strncmp( fcc, QUICKTIME_DV_AVID_A, 4 ) != 0 ) + strncmp( fcc, QUICKTIME_DV_AVID_A, 4 ) != 0 && + strncmp( fcc, QUICKTIME_DVCPRO, 4 ) != 0 ) { Close(); return false; @@ -895,15 +913,22 @@ int QtHandler::GetFrame( uint8_t *data, int frameNum ) 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 ); }