[theora] Seek problem 3 - Locating a keyframe
    Bo Thorsen 
    bo at thorsen-consulting.dk
       
    Thu Apr 12 02:48:06 PDT 2007
    
    
  
Hi people,
Last problem is a simple API question.
The granulepos in Theora is a combination of keyframe number + frames since 
the last keyframe. This is nice for seeking to the last keyframe. But why 
isn't this available in the public API of libtheora? I had to include 
codec_internal.h (the name does suggest to me that this is bad) and code 
this:
ogg_int64_t framesSinceKeyframe(theora_state *th,ogg_int64_t granulepos) {
	CP_INSTANCE *cpi=(CP_INSTANCE *)(th->internal_encode);
	PB_INSTANCE *pbi=(PB_INSTANCE *)(th->internal_decode);
	if(cpi)
		pbi=&cpi->pb;
	if (granulepos>=0) {
		ogg_int64_t iframe = granulepos >> pbi->keyframe_granule_shift;
		return granulepos - (iframe << pbi->keyframe_granule_shift);
	}
	return(-1);
}
ogg_int64_t keyframeNumber(theora_state *th,ogg_int64_t granulepos) {
	CP_INSTANCE *cpi=(CP_INSTANCE *)(th->internal_encode);
	PB_INSTANCE *pbi=(PB_INSTANCE *)(th->internal_decode);
	if(cpi)
		pbi=&cpi->pb;
	if (granulepos>=0) {
		return granulepos >> pbi->keyframe_granule_shift;
	}
	return(-1);
}
It would have been nice if these were part of the library. Feel free to grab 
the code and include it, if you agree.
Bo Thorsen.
-- 
Thorsen Consulting ApS - Qt consulting services
http://www.thorsen-consulting.dk
    
    
More information about the theora
mailing list