Merge branch 'develop' of github.com:flokuep/Vocaluxe into develop

This commit is contained in:
Florian Küpper committed 2016-12-26 11:51:44 +01:00
commit e2bfdd6877
2 files changed
+58 -11

No files matched your search

+7 -1
View File
@@ -24,6 +24,12 @@
static constexpr double BaseToneFrequency = 65.4064; // lowest (half-)tone to analyze (C2 = 65.4064 Hz)
static constexpr double HalftoneBase = 1.05946309436; // 2^(1/12) -> HalftoneBase^12 = 2 (one octave)
template<typename T>
T abs_template(T t)
{
return t>0 ? t : -t;
}
int PtAKF::_InitCount = 0;
float* restrict PtAKF::_SamplesPerPeriodPerTone = NULL;
float* restrict PtAKF::_SamplesPerPeriodPerToneFine = NULL;
@@ -360,7 +366,7 @@ float PtAKF::_AMDFBySampleCt(float samples[_SampleCt], float samplesPerPeriodD){
// calc distance to corresponding sample in next period
float xn = samples[sampleIndex];
float xnt = samples[correlatingSampleIndex] * fLow + samples[correlatingSampleIndex + 1] * fHigh;
accumDist += abs(xn - xnt);
accumDist += abs_template(xn - xnt);
}
return accumDist / sampleIndex;
+51 -10
View File
@@ -58,6 +58,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
private readonly AutoResetEvent _EvNoMoreFrames = new AutoResetEvent(false);
private bool _IsSleeping;
private int _WaitCount;
private bool _DropSeekEnabled = true; // Used to fallback to frame skipping if seek is failing once on this file
public float Length { get; private set; }
public bool Loop { get; set; }
@@ -80,6 +81,7 @@ namespace Vocaluxe.Lib.Video.Acinerella
var instance = (SACInstance)Marshal.PtrToStructure(_Instance, typeof(SACInstance));
Length = instance.Info.Duration / 1000f;
bool ok = instance.Opened && Length > 0.001f;
_DropSeekEnabled = true;
if (ok)
return true;
_Free();
@@ -333,6 +335,8 @@ namespace Vocaluxe.Lib.Video.Acinerella
private void _Decode()
{
const int minFrameDropCount = 4;
// With => seekThreshold frames to drop use seek instead of skip
const int seekThreshold = 25; // 25 frames = 0.5 second with _FrameDuration = 0.02f
if (_NoMoreFrames)
return;
@@ -345,17 +349,16 @@ namespace Vocaluxe.Lib.Video.Acinerella
bool hasFrameDecoded = false;
if (dropFrame)
{
try
{
var frameDropCount = (int)Math.Ceiling(timeDifference / _FrameDuration);
// Add 1 dropped frame per 16 frames (Power of 2 -> Div is fast) as skipping takes time too and we don't want to skip again
frameDropCount += frameDropCount / 16;
hasFrameDecoded = CAcinerella.AcSkipFrames(_Instance, _Videodecoder, frameDropCount);
}
catch (Exception)
{
CLog.LogError("Error AcSkipFrame " + _FileName);
}
if (!_DropSeekEnabled || frameDropCount < seekThreshold)
{
hasFrameDecoded = _DropWithSkip(frameDropCount);
}
else
{
hasFrameDecoded = _DropWithSeek(videoTime, frameDropCount);
}
}
if (!hasFrameDecoded)
@@ -383,6 +386,44 @@ namespace Vocaluxe.Lib.Video.Acinerella
}
}
private bool _DropWithSeek(float videoTime, int frameDropCount)
{
bool hasFrameDecoded = false;
try
{
hasFrameDecoded = CAcinerella.AcSeek(_Videodecoder, 0, (long)videoTime * 1000L);
}
catch (Exception)
{
CLog.LogError("Error AcSeek " + _FileName);
}
if (!hasFrameDecoded)
{
// Fallback to frame skipping
_DropSeekEnabled = false;
hasFrameDecoded = _DropWithSkip(frameDropCount);
}
return hasFrameDecoded;
}
private bool _DropWithSkip(int frameDropCount)
{
bool hasFrameDecoded = false;
// Add 1 dropped frame per 16 frames (Power of 2 -> Div is fast) as skipping takes time too and we don't want to skip again
frameDropCount += frameDropCount / 16;
try
{
hasFrameDecoded = CAcinerella.AcSkipFrames(_Instance, _Videodecoder, frameDropCount);
}
catch (Exception)
{
CLog.LogError("Error AcSkipFrame " + _FileName);
}
return hasFrameDecoded;
}
//Copies a frame to the buffer but does not set it as 'written'
//Returns true if frame data is now in buffer
private bool _CopyDecodedFrameToBuffer()