예제 #1
0
void FFMpegDemuxer::seek(int DestFrame, int StartTimestamp, int StreamIndex)
{
    AVStream * pVStream = m_pFormatContext->streams[StreamIndex];
#if LIBAVFORMAT_BUILD <= 4616
    av_seek_frame(m_pFormatContext, StreamIndex, 
            int((double(DestFrame)*1000000*1000)/pVStream->r_frame_rate+StartTimestamp));
#else
#if LIBAVFORMAT_BUILD < ((49<<16)+(0<<8)+0)
    av_seek_frame(m_pFormatContext, StreamIndex, 
            int((double(DestFrame)*1000000*1000)/pVStream->r_frame_rate+StartTimestamp), 0);
#else
    double framerate = (pVStream->r_frame_rate.num)/pVStream->r_frame_rate.den;
    double FrameStartOffset = framerate*StartTimestamp/1000.0;
    av_seek_frame(m_pFormatContext, -1, 
            int((double(DestFrame+FrameStartOffset)*AV_TIME_BASE)/framerate),
            AVSEEK_FLAG_BACKWARD);
#endif
#endif
    clearPacketCache();
    map<int, PacketList>::iterator it;
    for (it=m_PacketLists.begin(); it != m_PacketLists.end(); ++it) {
        int CurStreamIndex = it->first;
        AVStream * pStream = m_pFormatContext->streams[CurStreamIndex];
        avcodec_flush_buffers(pStream->codec);
    }
}
예제 #2
0
파일: Demux.cpp 프로젝트: artcom/y60
Demux::~Demux()
{
    clearPacketCache();
}
예제 #3
0
FFMpegDemuxer::~FFMpegDemuxer()
{
    clearPacketCache();
    ObjectCounter::get()->decRef(&typeid(*this));
}
예제 #4
0
void FFMpegDemuxer::seek(float destTime)
{
    av_seek_frame(m_pFormatContext, -1, (long long)(destTime*AV_TIME_BASE),
            AVSEEK_FLAG_BACKWARD);
    clearPacketCache();
}