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); } }
Demux::~Demux() { clearPacketCache(); }
FFMpegDemuxer::~FFMpegDemuxer() { clearPacketCache(); ObjectCounter::get()->decRef(&typeid(*this)); }
void FFMpegDemuxer::seek(float destTime) { av_seek_frame(m_pFormatContext, -1, (long long)(destTime*AV_TIME_BASE), AVSEEK_FLAG_BACKWARD); clearPacketCache(); }