- int64_t iframe = granulepos >> theora_keyframe_granule_shift;
- //int64_t pframe = granulepos - (iframe << theora_keyframe_granule_shift);
- // check if maybe iframe is known from this page already
- if (granulepos != -1 && iframe <= frame)
- {
- // optimisation, iframe is already known from this page
- } else
- {
- // get previous page so we will get the iframe number
- do {
- ogg_get_prev_page(sw, serialno, &og);
- } while (ogg_page_packets(&og) == 0);
-
- granulepos = ogg_page_granulepos(&og);
- iframe = granulepos >> theora_keyframe_granule_shift;
- //pframe = granulepos - (iframe << theora_keyframe_granule_shift);
+ granulepos &= ~((1<<theora_keyframe_granule_shift)-1);
+ int64_t iframe = theora_granule_frame(&tf->td, granulepos);
+ // iframe based on granulepos
+ if( frame < iframe || !ogg_get_page_of_frame(sw, serialno, &og, iframe) ) {
+ eprintf(_("FileOGG: seek to iframe failed\n"));
+ return 0;