Essentially it comes down to this line of code.
if( ogg_stream_packetout( &m_theoraStreamState, &opTheora) > 0 )
in TheoraMovieClip.cpp
the m_theoraStreamState struct is used to determine which ogg packet to get from the stream. On the reset of the loop, this struct has to be somehow filled with the correct values.
At the end of the TheoraMovieClip::execute() function, I capture the end of the stream event and set the following
m_oggFile->seek(0);
bytesRead = 1;
m_Timer->reset();
// need to do some stuff to m_theoraState, m_theoraStreamState
m_theoraState.granulepos = -1;
m_theoraStreamState.packetno = -1;
m_theoraStreamState.pageno = -1;
m_lastFrameTime = 0;
m_FrameNum = 0;
m_FramesDropped = 0;
which allows for looping but has the hitch. I'm dumping the values of the struct all over the code, but still can't discern the pattern. Onwards and upwards.