Re: pre 1.0 API issues.

Romain Beauxis <[email protected]>
Newsgroups gmane.comp.multimedia.ogg.theora.devel
Message-ID <[email protected]>
	Hi !

Le jeudi 19 novembre 2009 13:26:26, Timothy B. Terriberry a écrit :
> Romain Beauxis wrote:
> > Since the transcoding example in the binding works well, I am suspecting
> > some  sort of issue in the encoding parameters...
> 
> Well, one thing I notice is that create_encoder initializes an encoder
> of size video_x × video_y (rounded up to a multiple of 16, as required),
> but RGB.create_yuv is passed width and height (not rounded up to a
> multiple of 16), which is also what theora_yuv is initialized with. The
> old pre-1.0 API required a complete buffer, padded out to a multiple of
> 16 by the caller. The 1.0.2 encoder validated the luma plane's size, and
> 1.1.1 validates all of the planes' sizes, so I don't think this is the
> problem (assuming the input video in your example really was 320×240),
> but it is a problem.

Ok.

> As an aside, the new API guarantees it will never read outside of the
> picture region, so you don't really need to pad the buffer, but you do
> need to play pointer games as if you had a padded buffer (unfortunate,
> but it made it easier for existing code to be ported to the new API).
> See examples/encoder_example.c in the libtheora source for details.

Ok.

> I should also point out that the method used to end the stream in
> ocaml_theora_encode_eos() actually inserts an extra frame into the
> stream (which gets rendered as a duplicate of the previous frame). In
> addition the granule position assigned to it will be wrong if you
> happened to hit the maximum keyframe interval, producing an invalid
> stream (it may play straight through, but will certainly have its length
> mis-reported by anything that tries to calculate it, and seeking near
> the end of the stream may behave oddly). The correct way end a stream
> after you've already encoded all of the packets is to add a page with no
> packets, but with the e_o_s bit set on the page. It should use the same
> granule position as the last packet in the stream. This uses a few more
> bytes than just simply setting the e_o_s bit on the last packet itself,
> when it is generated.

Ok, thanks for this, it is really usefull.

However, I do not know how to forge a page with no packet, the ogg_page 
structure needs a header and a a body, so I would need to be able to forge 
them.. Do you know how to do so ?

> Now, I don't know ocaml, but the one line that does strike me as very
> suspicious is:
> http://savonet.rastageeks.org/browser/trunk/liquidsoap/src/ogg_formats/theo
> ra_encoder.ml?rev=7022#L48 quality = quality
> 
> The transcoder example has, instead
> http://savonet.rastageeks.org/browser/trunk/ocaml-theora/examples/thtransco
> de.ml#L114 quality = !quality
> 
> which I assume means it takes the second quality from an outer scope. If
> the former is really assigning the variable to itself, then it will be
> the default (zero), and if you're not specifying a rate, you could very
> well get the behavior you described from the 1.1.1 encoder. I don't
> recall what the 1.0.2 encoder would do if you set both quality and
> bitrate to zero, but I suspect that it would have continued to produce a
> recognizable picture (albeit of fairly poor quality). The new encoder,
> on the other hand, will drop frames and generally produce something
> horrible, in an attempt to give you what you asked for.

Ok, thanks. I don't think these parameters where wrong. However, I have 
sucessfully updated our binding to the new API which solved these issues, so 
for me at least this is ok now...



Romain
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.