[Jahshaka-cvs] openlibraries/src/openmedialib/ml utilities.cpp, 1.15, 1.16
Status: Beta
Brought to you by:
jahshaka
From: jpn <non...@us...> - 2006-10-30 14:10:13
|
Update of /cvsroot/openlibraries/openlibraries/src/openmedialib/ml In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv16503/src/openmedialib/ml Modified Files: utilities.cpp Log Message: An alternative audio sample calculator Index: utilities.cpp =================================================================== RCS file: /cvsroot/openlibraries/openlibraries/src/openmedialib/ml/utilities.cpp,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- utilities.cpp 26 Oct 2006 09:36:30 -0000 1.15 +++ utilities.cpp 30 Oct 2006 14:10:06 -0000 1.16 @@ -15,96 +15,101 @@ namespace { - // samples per frame = 3203.2 therefore integer number of samples over 5 frames (3203.2 x 5 = 16016) - // 0.2 x 5 = 1 extra sample to distribute over cycle - static const int NTSC_96000_frames_per_cycle = 5; - static const int NTSC_96000_audio_samples_per_cycle = 16016LL; - static const int NTSC_96000_audio_samples_per_frame[NTSC_96000_frames_per_cycle] = {3204LL, 3203LL, 3203LL, 3203LL, 3203LL}; - static const long long NTSC_96000_cyclic_audio_sample_offset[NTSC_96000_frames_per_cycle] = {0LL, 3204LL, 6407LL, 9610LL, 12813LL}; - - // samples per frame = 1601.6 therefore integer number of samples over 5 frames (1601.6 x 5 = 8008) - // 0.6 x 5 = 3 extra samples to distribute over cycle - static const int NTSC_48000_frames_per_cycle = 5; - static const int NTSC_48000_audio_samples_per_cycle = 8008LL; - static const int NTSC_48000_audio_samples_per_frame[NTSC_48000_frames_per_cycle] = {1602LL, 1601LL, 1602LL, 1601LL, 1602LL}; - static const long long NTSC_48000_cyclic_audio_sample_offset[NTSC_48000_frames_per_cycle] = {0LL, 1602LL, 3203LL, 4805LL, 6406LL}; - - // samples per frame = 1471.47 therefore integer number of samples over 100 frames (1471.47 x 100 = 147147) - // 0.47 x 100 = 47 extra samples to distribute over cycle - static const int NTSC_44100_frames_per_cycle = 100; - static const int NTSC_44100_audio_samples_per_cycle = 147147LL; - static const int NTSC_44100_audio_samples_per_frame[NTSC_44100_frames_per_cycle] = { - 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1471LL, 1472LL, 1471LL, 1472LL, - 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1471LL, 1472LL, 1471LL, - 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1471LL, 1472LL, - 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, - 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1471LL, - 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1471LL, 1472LL, - 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, - 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1471LL, - 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, - 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL, 1472LL, 1471LL }; - static const long long NTSC_44100_cyclic_audio_sample_offset[NTSC_44100_frames_per_cycle] = { - 0LL, 1472LL, 2943LL, 4415LL, 5886LL, 7358LL, 8829LL, 10300LL, 11772LL, 13243LL, - 14715LL, 16186LL, 17658LL, 19129LL, 20601LL, 22072LL, 23544LL, 25015LL, 26486LL, 27958LL, - 29429LL, 30901LL, 32372LL, 33844LL, 35315LL, 36787LL, 38258LL, 39730LL, 41201LL, 42672LL, - 44144LL, 45615LL, 47087LL, 48558LL, 50030LL, 51501LL, 52973LL, 54444LL, 55916LL, 57387LL, - 58859LL, 60330LL, 61802LL, 63273LL, 64745LL, 66216LL, 67688LL, 69159LL, 70631LL, 72102LL, - 73573LL, 75045LL, 76516LL, 77988LL, 79459LL, 80931LL, 82402LL, 83874LL, 85345LL, 86816LL, - 88288LL, 89759LL, 91231LL, 92702LL, 94174LL, 95645LL, 97117LL, 98588LL, 100060LL, 101531LL, - 103003LL, 104474LL, 105946LL, 107417LL, 108889LL, 110360LL, 111832LL, 113303LL, 114775LL, 116246LL, - 117717LL, 119189LL, 120660LL, 122132LL, 123603LL, 125075LL, 126546LL, 128018LL, 129489LL, 130961LL, - 132432LL, 133904LL, 135375LL, 136847LL, 138318LL, 139790LL, 141261LL, 142733LL, 144204LL, 145676LL }; - - // samples per frame = 1067.7333' therefore integer number of samples over 15 frames (1067.7333' x 15 = 16016) - // 0.7333' x 15 = 11 extra samples to distribute over cycle - static const int NTSC_32000_frames_per_cycle = 15; - static const int NTSC_32000_audio_samples_per_cycle = 16016LL; - static const int NTSC_32000_audio_samples_per_frame[NTSC_32000_frames_per_cycle] = {1068LL, 1068LL, 1067LL, 1068LL, 1068LL, 1067LL, 1068LL, 1068LL, 1068LL, 1067LL, 1068LL, 1068LL, 1067LL, 1068LL, 1068LL}; - static const long long NTSC_32000_cyclic_audio_sample_offset[NTSC_32000_frames_per_cycle] = {0LL, 1068LL, 2136LL, 3203LL, 4271LL, 5339LL, 6406LL, 7474LL, 8542LL, 9610LL, 10677LL, 11745LL, 12813LL, 13880LL, 14948LL}; - - // samples per frame = 533.8666' therefore integer number of samples over 15 frames (533.8666' x 15 = 8008) - // 0.8666' x 15 = 13 extra samples to distribute over cycle - static const int NTSC_16000_frames_per_cycle = 15; - static const int NTSC_16000_audio_samples_per_cycle = 8008LL; - static const int NTSC_16000_audio_samples_per_frame[NTSC_16000_frames_per_cycle] = {534LL, 534LL, 534LL, 534LL, 534LL, 534LL, 533LL, 534LL, 534LL, 534LL, 534LL, 534LL, 534LL, 534LL, 533LL}; - static const long long NTSC_16000_cyclic_audio_sample_offset[NTSC_16000_frames_per_cycle] = {0LL, 534LL, 1068LL, 1602LL, 2136LL, 2670LL, 3204LL, 3737LL, 4271LL, 4805LL, 5339LL, 5873LL, 6407LL, 6941LL, 7475LL}; - - // samples per frame = 266.9333' therefore integer number of samples over 15 frames (266.9333' x 15 = 4004) - // 0.9333' x 15 = 14 extra samples to distribute over cycle - static const int NTSC_8000_frames_per_cycle = 15; - static const int NTSC_8000_audio_samples_per_cycle = 4004LL; - static const int NTSC_8000_audio_samples_per_frame[NTSC_8000_frames_per_cycle] = {267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 267LL, 266LL}; - static const long long NTSC_8000_cyclic_audio_sample_offset[NTSC_8000_frames_per_cycle] = {0LL, 267LL, 534LL, 801LL, 1068LL, 1335LL, 1602LL, 1869LL, 2136LL, 2403LL, 2670LL, 2937LL, 3204LL, 3471LL, 3738LL}; - - - // samples per frame = 1837.5 therefore integer number of samples over 2 frames (1837.5 x 2= 3675) - // 0.5 x 2 = 1 extra samples to distribute over cycle - static const int FILM_44100_frames_per_cycle = 2; - static const int FILM_44100_audio_samples_per_cycle = 3675LL; - static const int FILM_44100_audio_samples_per_frame[FILM_44100_frames_per_cycle] = {1838LL, 1837LL}; - static const long long FILM_44100_cyclic_audio_sample_offset[FILM_44100_frames_per_cycle] = {0LL, 1838LL }; - - // samples per frame = 1333.333' therefore integer number of samples over 3 frames (1333.333' x 3 = 4000) - // 0.333' x 3 = 1 extra samples to distribute over cycle - static const int FILM_32000_frames_per_cycle = 3; - static const int FILM_32000_audio_samples_per_cycle = 4000LL; - static const int FILM_32000_audio_samples_per_frame[FILM_32000_frames_per_cycle] = {1334LL, 1333LL, 1333LL}; - static const long long FILM_32000_cyclic_audio_sample_offset[FILM_32000_frames_per_cycle] = {0LL, 1334LL, 2667LL}; - - // samples per frame = 666.666' therefore integer number of samples over 3 frames (666.666' x 3 = 2000) - // 0.666' x 3 = 2 extra samples to distribute over cycle - static const int FILM_16000_frames_per_cycle = 3; - static const int FILM_16000_audio_samples_per_cycle = 2000LL; - static const int FILM_16000_audio_samples_per_frame[FILM_16000_frames_per_cycle] = {667LL, 667LL, 666LL}; - static const long long FILM_16000_cyclic_audio_sample_offset[FILM_16000_frames_per_cycle] = {0LL, 667LL, 1334LL}; + class audio_sample_calculator + { + public: + audio_sample_calculator(int samplefreq, int framerate_numerator, int framerate_denominator) + : samplefreq_(samplefreq), + framerate_numerator_(framerate_numerator), + framerate_denominator_(framerate_denominator) + { + float totalsamples_per_cycle = 0.0; + double samples_per_frame = (double(samplefreq) * framerate_denominator) / framerate_numerator; + + frames_per_cycle_ = 0; + + do + { + ++frames_per_cycle_; + totalsamples_per_cycle = samples_per_frame * frames_per_cycle_; + + } while(totalsamples_per_cycle - int(totalsamples_per_cycle) != 0.0); - // samples per frame = 333.333' therefore integer number of samples over 3 frames (333.333' x 3 = 1000) - // 0.333' x 3 = 1 extra samples to distribute over cycle - static const int FILM_8000_frames_per_cycle = 3; - static const int FILM_8000_audio_samples_per_cycle = 1000LL; - static const int FILM_8000_audio_samples_per_frame[FILM_8000_frames_per_cycle] = {334LL, 333LL, 333LL}; - static const long long FILM_8000_cyclic_audio_sample_offset[FILM_8000_frames_per_cycle] = {0LL, 334LL, 667LL}; + // like this cos of some weird rounding issue + samples_per_cycle_ = static_cast<int>(static_cast<float>(samples_per_frame * double(frames_per_cycle_))); + + int samples_per_frame_base = (samplefreq * framerate_denominator) / framerate_numerator; + // like this cos of some weird rounding issue + int extra_samples = static_cast<int>(static_cast<float>(double(frames_per_cycle_) * (samples_per_frame - double(samples_per_frame_base)))); + + samples_per_frame_ = new int[frames_per_cycle_]; + cyclic_sample_offset_ = new long long[frames_per_cycle_]; + + for(int idx = 0; idx < frames_per_cycle_; idx++) + { + samples_per_frame_[idx] = samples_per_frame_base; + + if((double(2 * extra_samples)/(frames_per_cycle_ - idx)) > 1.0) + { + samples_per_frame_[idx] += 1; + extra_samples--; + } + + cyclic_sample_offset_[idx] = (idx == 0) ? 0 : cyclic_sample_offset_[idx - 1] + samples_per_frame_[idx - 1]; + } + }; + + ~audio_sample_calculator() + { + delete [] samples_per_frame_; + delete [] cyclic_sample_offset_; + }; + + int get_samplefreq() + { + return samplefreq_; + } + + int get_framerate_numerator() + { + return framerate_numerator_; + } + + int get_framerate_denominator() + { + return framerate_denominator_; + } + + int get_frames_per_cycle() + { + return frames_per_cycle_; + } + + int get_samples_per_cycle() + { + return samples_per_cycle_; + } + + long long calc_samples_to_frame(int frameoffset) + { + return ((long long)(frameoffset / frames_per_cycle_) * samples_per_cycle_) + cyclic_sample_offset_[frameoffset % frames_per_cycle_]; + } + + int calc_samples_for_frame(int frameoffset) + { + //fprintf(stdout, "frameoffset=%d, frames_per_cycle_=%d, mod(frameoffset/frames_per_cycle_)=%d\n", frameoffset, frames_per_cycle_, frameoffset % frames_per_cycle_); + return samples_per_frame_[frameoffset % frames_per_cycle_]; + } + + private: + int samplefreq_; + int framerate_numerator_; + int framerate_denominator_; + int frames_per_cycle_; + int samples_per_cycle_; + int* samples_per_frame_; + long long* cyclic_sample_offset_; + }; } // Query structure used @@ -227,125 +232,10 @@ ML_DECLSPEC long long ml::audio_samples_to_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator) { - long long offset = -1; - - if ( (framerate_numerator == 30000) - && (framerate_denominator == 1001) ) - { - switch(samplefreq) - { - case 96000: - // offset to start of current cycle + offset within cycle - offset = ((long long)(frameoffset / NTSC_96000_frames_per_cycle) * NTSC_96000_audio_samples_per_cycle) + NTSC_96000_cyclic_audio_sample_offset[frameoffset % NTSC_96000_frames_per_cycle]; - break; - case 48000: - offset = ((long long)(frameoffset / NTSC_48000_frames_per_cycle) * NTSC_48000_audio_samples_per_cycle) + NTSC_48000_cyclic_audio_sample_offset[frameoffset % NTSC_48000_frames_per_cycle]; - break; - case 44100: - offset = ((long long)(frameoffset / NTSC_44100_frames_per_cycle) * NTSC_44100_audio_samples_per_cycle) + NTSC_44100_cyclic_audio_sample_offset[frameoffset % NTSC_44100_frames_per_cycle]; - break; - case 32000: - offset = ((long long)(frameoffset / NTSC_32000_frames_per_cycle) * NTSC_32000_audio_samples_per_cycle) + NTSC_32000_cyclic_audio_sample_offset[frameoffset % NTSC_32000_frames_per_cycle]; - break; - case 16000: - offset = ((long long)(frameoffset / NTSC_16000_frames_per_cycle) * NTSC_16000_audio_samples_per_cycle) + NTSC_16000_cyclic_audio_sample_offset[frameoffset % NTSC_16000_frames_per_cycle]; - break; - case 8000: - offset = ((long long)(frameoffset / NTSC_8000_frames_per_cycle) * NTSC_8000_audio_samples_per_cycle) + NTSC_8000_cyclic_audio_sample_offset[frameoffset % NTSC_8000_frames_per_cycle]; - break; - } - } - else if ( (framerate_numerator == 24) - && (framerate_denominator == 1) ) - { - switch(samplefreq) - { - case 96000: - case 48000: - offset = ((long long)frameoffset * samplefreq) / framerate_numerator; - break; - case 44100: - offset = ((long long)(frameoffset / FILM_44100_frames_per_cycle) * FILM_44100_audio_samples_per_cycle) + FILM_44100_cyclic_audio_sample_offset[frameoffset % FILM_44100_frames_per_cycle]; - break; - case 32000: - offset = ((long long)(frameoffset / FILM_32000_frames_per_cycle) * FILM_32000_audio_samples_per_cycle) + FILM_32000_cyclic_audio_sample_offset[frameoffset % FILM_32000_frames_per_cycle]; - break; - case 16000: - offset = ((long long)(frameoffset / FILM_16000_frames_per_cycle) * FILM_16000_audio_samples_per_cycle) + FILM_16000_cyclic_audio_sample_offset[frameoffset % FILM_16000_frames_per_cycle]; - break; - case 8000: - offset = ((long long)(frameoffset / FILM_8000_frames_per_cycle) * FILM_8000_audio_samples_per_cycle) + FILM_8000_cyclic_audio_sample_offset[frameoffset % FILM_8000_frames_per_cycle]; - break; - } - } - else if ( (framerate_denominator == 1) - && (framerate_numerator != 0) - && (samplefreq % framerate_numerator == 0) ) - { - offset = ((long long)frameoffset * samplefreq) / framerate_numerator; - } - - return offset; + return audio_sample_calculator(samplefreq, framerate_numerator, framerate_denominator).calc_samples_to_frame(frameoffset); } ML_DECLSPEC int ml::audio_samples_for_frame(int frameoffset, int samplefreq, int framerate_numerator, int framerate_denominator) { - int samples = -1; - - if ( (framerate_numerator == 30000) - && (framerate_denominator == 1001) ) - { - switch(samplefreq) - { - case 96000: - samples = NTSC_96000_audio_samples_per_frame[frameoffset % NTSC_96000_frames_per_cycle]; - break; - case 48000: - samples = NTSC_48000_audio_samples_per_frame[frameoffset % NTSC_48000_frames_per_cycle]; - break; - case 44100: - samples = NTSC_44100_audio_samples_per_frame[frameoffset % NTSC_44100_frames_per_cycle]; - break; - case 32000: - samples = NTSC_32000_audio_samples_per_frame[frameoffset % NTSC_32000_frames_per_cycle]; - break; - case 16000: - samples = NTSC_16000_audio_samples_per_frame[frameoffset % NTSC_16000_frames_per_cycle]; - break; - case 8000: - samples = NTSC_8000_audio_samples_per_frame[frameoffset % NTSC_8000_frames_per_cycle]; - break; - } - } - else if ( (framerate_numerator == 24) - && (framerate_denominator == 1) ) - { - switch(samplefreq) - { - case 96000: - case 48000: - samples = samplefreq / framerate_numerator; - break; - case 44100: - samples = FILM_44100_audio_samples_per_frame[frameoffset % FILM_44100_frames_per_cycle]; - break; - case 32000: - samples = FILM_32000_audio_samples_per_frame[frameoffset % FILM_32000_frames_per_cycle]; - break; - case 16000: - samples = FILM_16000_audio_samples_per_frame[frameoffset % FILM_16000_frames_per_cycle]; - break; - case 8000: - samples = FILM_8000_audio_samples_per_frame[frameoffset % FILM_8000_frames_per_cycle]; - break; - } - } - else if ( (framerate_denominator == 1) - && (framerate_numerator != 0) - && (samplefreq % framerate_numerator == 0) ) - { - samples = samplefreq / framerate_numerator; - } - - return samples; + return audio_sample_calculator(samplefreq, framerate_numerator, framerate_denominator).calc_samples_for_frame(frameoffset); } |