int64_t TheoraState::Time(th_info* aInfo, int64_t aGranulepos) { if (aGranulepos < 0 || aInfo->fps_numerator == 0) { return -1; } // Implementation of th_granule_frame inlined here to operate // on the th_info structure instead of the theora_state. int shift = aInfo->keyframe_granule_shift; ogg_int64_t iframe = aGranulepos >> shift; ogg_int64_t pframe = aGranulepos - (iframe << shift); int64_t frameno = iframe + pframe - TH_VERSION_CHECK(aInfo, 3, 2, 1); CheckedInt64 t = ((CheckedInt64(frameno) + 1) * USECS_PER_S) * aInfo->fps_denominator; if (!t.isValid()) return -1; t /= aInfo->fps_numerator; return t.isValid() ? t.value() : -1; }
PRInt64 nsTheoraState::Time(th_info* aInfo, PRInt64 aGranulepos) { if (aGranulepos < 0 || aInfo->fps_numerator == 0) { return -1; } PRInt64 t = 0; // Implementation of th_granule_frame inlined here to operate // on the th_info structure instead of the theora_state. int shift = aInfo->keyframe_granule_shift; ogg_int64_t iframe = aGranulepos >> shift; ogg_int64_t pframe = aGranulepos - (iframe << shift); PRInt64 frameno = iframe + pframe - TH_VERSION_CHECK(aInfo, 3, 2, 1); if (!AddOverflow(frameno, 1, t)) return -1; if (!MulOverflow(t, 1000, t)) return -1; if (!MulOverflow(t, aInfo->fps_denominator, t)) return -1; return t / aInfo->fps_numerator; }