Skip to content

Commit

Permalink
experiments
Browse files Browse the repository at this point in the history
  • Loading branch information
gaiomed committed Jun 1, 2012
1 parent e6e820f commit 4f83400
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 86 deletions.
Binary file modified lib/_2RealFFmepgWrapper_static32_d.lib
Binary file not shown.
5 changes: 3 additions & 2 deletions samples/cinderFFmpeg/src/cinderFFmpegApp.cpp
Expand Up @@ -116,7 +116,7 @@ void cinderFFmpegApp::setup()
std::shared_ptr<_2RealFFmpegWrapper::FFmpegWrapper> testFile = std::shared_ptr<_2RealFFmpegWrapper::FFmpegWrapper>(new _2RealFFmpegWrapper::FFmpegWrapper());
testFile->dumpFFmpegInfo();
//if(testFile->open(".\\data\\morph.avi"))
if(testFile->open("d:\\vjing\\final4hallein.avi"))
if(testFile->open("d:\\vjing\\Wildlife.wmv"))
{
m_Players.push_back(testFile);
m_VideoTextures.push_back(gl::Texture());
Expand Down Expand Up @@ -378,7 +378,8 @@ FMOD_RESULT F_CALLBACK cinderFFmpegApp::pcmreadcallback(FMOD_SOUND *sound, void


int len = 2048*sizeof(short);
memcpy(data, audioData.m_pData, datalen);
if(audioData.m_pData!=nullptr)
memcpy(data, audioData.m_pData, len);

oldDts = audioData.m_lDts;
return FMOD_OK;
Expand Down
199 changes: 115 additions & 84 deletions src/_2RealFFmpegWrapper.cpp
Expand Up @@ -320,6 +320,60 @@ void FFmpegWrapper::close()
}
}

void FFmpegWrapper::play()
{
if(!isImage())
{
m_iState = ePlaying;
/* if(!m_bIsThreadRunning)
{
m_bIsThreadRunning = true;
m_PlayerThread = boost::thread(&FFmpegWrapper::threadedPlayer, this);
}*/
}
}

void FFmpegWrapper::pause()
{
m_iState = ePaused;
}

void FFmpegWrapper::stop()
{
//if(m_bIsThreadRunning)
//{
// m_bIsThreadRunning = false;
// m_PlayerThread.join();
//}
m_lCurrentFrameNumber = -1; // set to invalid, as it is not decoded yet
m_dTargetTimeInMs = 0;
m_iState = eStopped;
if(m_bIsFileOpen)
seekFrame(0); // so unseekable files get reset too
}

AVData& FFmpegWrapper::getAVData()
{
update();
return m_AVData;
}

VideoData& FFmpegWrapper::getVideoData()
{
boost::mutex::scoped_lock scopedLock(m_Mutex);

//update();
return m_AVData.m_VideoData;
}

AudioData& FFmpegWrapper::getAudioData()
{
boost::mutex::scoped_lock scopedLock(m_Mutex);

update();
return m_AVData.m_AudioData;
}

void FFmpegWrapper::updateTimer()
{
// todo check for very big over and underflow
Expand Down Expand Up @@ -373,20 +427,20 @@ void FFmpegWrapper::update()
return;

// update timer for correct video sync to fps
updateTimer();
//updateTimer();

// make sure always to decode 0 frame first, even if the first delta time would suggest differently
if(m_dCurrentTimeInMs<0)
m_dTargetTimeInMs = 0;

long lTargetFrame = calculateFrameNumberFromTime(m_dTargetTimeInMs);
if(lTargetFrame != m_lCurrentFrameNumber)
long lTargetFrame = m_lCurrentFrameNumber;//calculateFrameNumberFromTime(m_dTargetTimeInMs);
//if(lTargetFrame != m_lCurrentFrameNumber)
{
// probe to jump to target frame directly

if(bIsSeekable)
{
//bIsSeekable = seekFrame(lTargetFrame);
bIsSeekable = seekFrame(lTargetFrame);
isFrameDecoded = decodeFrame();
if(!isFrameDecoded)
{
Expand All @@ -411,87 +465,11 @@ void FFmpegWrapper::update()
}
}

m_lCurrentFrameNumber = lTargetFrame;
m_lCurrentFrameNumber++;// = lTargetFrame;
m_dCurrentTimeInMs = m_dTargetTimeInMs;
}
}

void FFmpegWrapper::play()
{
if(!isImage())
{
m_iState = ePlaying;
/* if(!m_bIsThreadRunning)
{
m_bIsThreadRunning = true;
m_PlayerThread = boost::thread(&FFmpegWrapper::threadedPlayer, this);
}*/
}
}

void FFmpegWrapper::pause()
{
m_iState = ePaused;
}

void FFmpegWrapper::stop()
{
//if(m_bIsThreadRunning)
//{
// m_bIsThreadRunning = false;
// m_PlayerThread.join();
//}
m_lCurrentFrameNumber = -1; // set to invalid, as it is not decoded yet
m_dTargetTimeInMs = 0;
m_iState = eStopped;
if(m_bIsFileOpen)
seekFrame(0); // so unseekable files get reset too
}

AVData& FFmpegWrapper::getAVData()
{
update();
return m_AVData;
}

VideoData& FFmpegWrapper::getVideoData()
{
boost::mutex::scoped_lock scopedLock(m_Mutex);

update();
return m_AVData.m_VideoData;
}

AudioData& FFmpegWrapper::getAudioData()
{
boost::mutex::scoped_lock scopedLock(m_Mutex);

update();
return m_AVData.m_AudioData;
}

void FFmpegWrapper::setFramePosition(long lTargetFrameNumber)
{
m_dTargetTimeInMs = ((float)(lTargetFrameNumber) * 1.0 / m_dFps * 1000.0);
}

void FFmpegWrapper::setTimePositionInMs(double dTargetTimeInMs)
{
m_dTargetTimeInMs = dTargetTimeInMs;
}

void FFmpegWrapper::setPosition(float fPos)
{
if(fPos<0.0)
{
fPos=0.0;
}
else if(fPos>1.0)
{
fPos=1.0;
}
m_dTargetTimeInMs = (fPos * m_dDurationInMs);
}

AVPacket* FFmpegWrapper::fetchAVPacket()
{
Expand All @@ -517,20 +495,27 @@ bool FFmpegWrapper::decodeFrame()
// Is this a packet from the video stream?
if(pAVPacket->stream_index == m_iVideoStream)
{
bRet = false;
bRet = decodeVideoFrame(pAVPacket);
}
else if(pAVPacket->stream_index == m_iAudioStream)
{
bRet = false;
bRet = decodeAudioFrame(pAVPacket);
}

av_free_packet(pAVPacket);

if(!bRet)
return false;


}
}
return true;

if(!bRet)
printf("ficke");
return bRet;
}

bool FFmpegWrapper::decodeVideoFrame(AVPacket* pAVPacket)
Expand Down Expand Up @@ -605,7 +590,7 @@ bool FFmpegWrapper::decodeImage()
if(isFrameDecoded) // Did we get a video frame?
{
//Convert YUV->RGB
sws_scale(m_pSwScalingContext, m_pVideoFrame->data, m_pVideoFrame->linesize, 0,getHeight(), m_pVideoFrameRGB->data, m_pVideoFrameRGB->linesize);
sws_scale(m_pSwScalingContext, m_pVideoFrame->data, m_pVideoFrame->linesize, 0, getHeight(), m_pVideoFrameRGB->data, m_pVideoFrameRGB->linesize);
av_free_packet(&packet);
free(imgBuffer); // we have to free this buffer separately don't ask me why, otherwise leak
return true;
Expand Down Expand Up @@ -646,7 +631,53 @@ bool FFmpegWrapper::seekFrame(long lTargetFrameNumber)

bool FFmpegWrapper::seekTime(double dTimeInMs)
{
return seekFrame( calculateFrameNumberFromTime(dTimeInMs) );
int iDirectionFlag = 0;
if(m_iDirection == eBackward)
iDirectionFlag = AVSEEK_FLAG_BACKWARD;

int iStream = m_iVideoStream;
if(iStream<0) // we just have an audio stream so seek in this stream
iStream = m_iAudioStream;

if(iStream>=0)
{
if(avformat_seek_file(m_pFormatContext, -1, dTimeInMs*1000-2, dTimeInMs*1000, dTimeInMs*1000+2, AVSEEK_FLAG_ANY | iDirectionFlag) < 0)
{
return false;
}
if( m_pVideoCodecContext != nullptr)
avcodec_flush_buffers(m_pVideoCodecContext);
if( m_pAudioCodecContext != nullptr)
avcodec_flush_buffers(m_pAudioCodecContext);

return true;
}
return false;
//return seekFrame( calculateFrameNumberFromTime(dTimeInMs) );
}


void FFmpegWrapper::setFramePosition(long lTargetFrameNumber)
{
m_dTargetTimeInMs = ((float)(lTargetFrameNumber) * 1.0 / m_dFps * 1000.0);
}

void FFmpegWrapper::setTimePositionInMs(double dTargetTimeInMs)
{
m_dTargetTimeInMs = dTargetTimeInMs;
}

void FFmpegWrapper::setPosition(float fPos)
{
if(fPos<0.0)
{
fPos=0.0;
}
else if(fPos>1.0)
{
fPos=1.0;
}
m_dTargetTimeInMs = (fPos * m_dDurationInMs);
}

void FFmpegWrapper::setLoopMode(int iLoopMode)
Expand Down

0 comments on commit 4f83400

Please sign in to comment.