Author: stippi Date: 2010-01-07 02:12:47 +0100 (Thu, 07 Jan 2010) New Revision: 34928 Changeset: http://dev.haiku-os.org/changeset/34928/haiku Modified: haiku/trunk/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp Log: Slightly more precise calculations in finding keyframes/seeking. Modified: haiku/trunk/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp =================================================================== --- haiku/trunk/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp 2010-01-07 01:11:12 UTC (rev 34927) +++ haiku/trunk/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp 2010-01-07 01:12:47 UTC (rev 34928) @@ -788,7 +788,7 @@ uint32_t seekFlags = incr < 0 ? AVSEEK_FLAG_BACKWARD : 0; pos = av_rescale_q(pos, AV_TIME_BASE_Q, fStream->time_base); - + ret = av_seek_frame(fContext, Index(), pos, seekFlags); #endif @@ -839,17 +839,18 @@ if ((flags & B_MEDIA_SEEK_TO_FRAME) != 0) *time = (bigtime_t)(*frame * 1000000LL / frameRate); - double timeBase = av_q2d(fStream->time_base); int64_t timeStamp; if ((flags & B_MEDIA_SEEK_TO_FRAME) != 0) { // Can use frame, because stream timeStamp is actually in frame // units. timeStamp = *frame; - } else - timeStamp = (int64_t)(*time / timeBase / 1000000.0); + } else { + timeStamp = *time * fStream->time_base.num + / ((int64_t)fStream->time_base.den * 1000000); + } - TRACE_SEEK(" time: %.2fs -> %lld (time_base: %f)\n", *time / 1000000.0, - timeStamp, timeBase); + TRACE_SEEK(" time: %.2fs -> %lld (time_base: %d/%d)\n", *time / 1000000.0, + timeStamp, fStream->time_base.num, fStream->time_base.den); int searchFlags = AVSEEK_FLAG_BACKWARD; if ((flags & B_MEDIA_SEEK_CLOSEST_FORWARD) != 0) @@ -867,7 +868,8 @@ const AVIndexEntry& entry = fStream->index_entries[index]; timeStamp = entry.timestamp; - *time = (bigtime_t)(timeStamp * 1000000.0 * timeBase); + *time = (bigtime_t)(timeStamp * 1000000 * fStream->time_base.num + / fStream->time_base.den); TRACE_SEEK(" seeked time: %.2fs (%lld)\n", *time / 1000000.0, timeStamp); if ((flags & B_MEDIA_SEEK_TO_FRAME) != 0) {