diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-01-05 17:16:11 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-01-05 17:16:11 +0400 |
commit | 05a2fc42d10600352151af02139034def56e9edf (patch) | |
tree | 0961097313555d40d05d8c3997d2ffe08cd04259 | |
parent | fd744ff521a74c583555841ecb69134616267b29 (diff) |
Only use index entries marked as keyframes for IKeyFrameInfo
-rw-r--r-- | demuxer/Demuxers/LAVFDemuxer.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/demuxer/Demuxers/LAVFDemuxer.cpp b/demuxer/Demuxers/LAVFDemuxer.cpp index 66010d87..f7c8fb80 100644 --- a/demuxer/Demuxers/LAVFDemuxer.cpp +++ b/demuxer/Demuxers/LAVFDemuxer.cpp @@ -927,9 +927,14 @@ STDMETHODIMP CLAVFDemuxer::GetKeyFrameCount(UINT& nKFs) return E_FAIL; } + nKFs = 0; + AVStream *stream = m_avFormat->streams[m_dActiveStreams[video]]; - nKFs = stream->nb_index_entries; - return (stream->nb_index_entries == stream->nb_frames) ? S_FALSE : S_OK; + for (int i = 0; i < stream->nb_index_entries; i++) { + if (stream->index_entries[i].flags & AVINDEX_KEYFRAME) + nKFs++; + } + return (nKFs == stream->nb_frames) ? S_FALSE : S_OK; } STDMETHODIMP CLAVFDemuxer::GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKFs, UINT& nKFs) @@ -945,10 +950,15 @@ STDMETHODIMP CLAVFDemuxer::GetKeyFrames(const GUID* pFormat, REFERENCE_TIME* pKF if(*pFormat != TIME_FORMAT_MEDIA_TIME) return E_INVALIDARG; + UINT nKFsMax = nKFs; + nKFs = 0; + AVStream *stream = m_avFormat->streams[m_dActiveStreams[video]]; - nKFs = stream->nb_index_entries; - for(unsigned int i = 0; i < nKFs; ++i) { - pKFs[i] = ConvertTimestampToRT(stream->index_entries[i].timestamp, stream->time_base.num, stream->time_base.den); + for(unsigned int i = 0; i < stream->nb_index_entries && nKFs < nKFsMax; i++) { + if (stream->index_entries[i].flags & AVINDEX_KEYFRAME) { + pKFs[nKFs] = ConvertTimestampToRT(stream->index_entries[i].timestamp, stream->time_base.num, stream->time_base.den); + nKFs++; + } } return S_OK; } |