1
0
Fork 0

matroskadec_haali: make cue-aware seeking more lenient

This commit is contained in:
Hendrik Leppkes 2013-03-29 15:53:07 +01:00
parent 981d492032
commit 84a8cdf791
Signed by: hendrik
GPG Key ID: 846079A4B0A7C1B5
3 changed files with 29 additions and 16 deletions

View File

@ -2967,6 +2967,33 @@ ulonglong mkv_GetSegmentTop(MatroskaFile *mf) {
#define IS_DELTA(f) (!((f)->flags & FRAME_KF) || ((f)->flags & FRAME_UNKNOWN_START))
static inline ulonglong mkv_time_diff(ulonglong one, ulonglong two)
{
if (one > two)
return one-two;
else
return two-one;
}
void mkv_Seek_CueAware(MatroskaFile *mf, ulonglong timecode, unsigned flags)
{
if (timecode > 0 && (flags & (MKVF_SEEK_TO_PREV_KEYFRAME|MKVF_SEEK_TO_PREV_KEYFRAME_STRICT))) {
unsigned int count, i;
Cue *cue;
mkv_GetCues(mf, &cue, &count);
if (count > 0) {
for (i = 0; i < count; i++) {
ulonglong tcDiff = mkv_time_diff(cue[i].Time, timecode);
if (tcDiff == 0 || (cue[i].Track && cue[i].Track <= mf->nTracks && tcDiff <= mf->Tracks[cue[i].Track-1]->DefaultDuration)) {
flags &= ~(MKVF_SEEK_TO_PREV_KEYFRAME|MKVF_SEEK_TO_PREV_KEYFRAME_STRICT);
timecode = cue[i].Time;
}
}
}
}
mkv_Seek(mf, timecode, flags);
}
void mkv_Seek(MatroskaFile *mf,ulonglong timecode,unsigned flags) {
int i,j,m,ret;
unsigned n,z;

View File

@ -336,6 +336,8 @@ X void mkv_Seek(/* in */ MatroskaFile *mf,
/* in */ ulonglong timecode /* in ns */,
/* in */ unsigned flags);
X void mkv_Seek_CueAware(MatroskaFile *mf, ulonglong timecode, unsigned flags);
X void mkv_SkipToKeyframe(MatroskaFile *mf);
X ulonglong mkv_GetLowestQTimecode(MatroskaFile *mf);

View File

@ -742,22 +742,6 @@ static void mkv_process_tags(AVFormatContext *s, Tag *tags, unsigned int tagCoun
}
}
static void mkv_Seek_CueAware(MatroskaFile *mf, ulonglong time, int flags)
{
if (time > 0) {
unsigned int count, i;
Cue *cue;
mkv_GetCues(mf, &cue, &count);
if (count > 0) {
for (i = 0; i < count; i++) {
if (cue[i].Time == time)
flags &= ~MKVF_SEEK_TO_PREV_KEYFRAME;
}
}
}
mkv_Seek(mf, time, flags);
}
static int mkv_read_header(AVFormatContext *s)
{
MatroskaDemuxContext *ctx = (MatroskaDemuxContext *)s->priv_data;