[theora] trying to encode/decode videos using libtheora

Ralph Giles giles at xiph.org
Fri Aug 25 14:39:25 PDT 2006


On Thu, Aug 24, 2006 at 10:26:32PM -0300, Ribamar Santarosa de Sousa wrote:

> The source code is here:
> http://opensvn.csie.org/ribamar/projects/streaming/cvaenc.c

I've only taken a quick look, but it looks like you're not writing out 
all the ogg pages. A packet can map to multiple pages, or many packets 
can map to the same page. You want something like this:

	while((ret = ogg_stream_pageout(&stream, &page) > 0){
		fwrite(page.header,1,page.header_len,fout);
		fwrite(page.body,1,page.body_len,fout);
	}
	if (ret < 0) {
		fprintf(finfo, "problem pageout-ing.\n"); 
	}

...and something similar to with ogg_stream_flush() when you know you've 
submitted you last packet. You're only making the fwrite() calls once 
after all the ogg_stream_* calls, which of course drops most of the 
stream data.

Two other things I noticed: by spec you must page flush after the first 
and last header packets. libogg does the first flush automatically, but 
you must do the second yourself.

You should use a random number for the serial number field in ogg_stream_init().
The rule is that the serial number must be unique in concatenated ogg 
streams, but best practice is to use a random number when creating a 
stream so native concatenation works most of the time.

Hope that helps,
 -r


More information about the theora mailing list