[Ffmpeg-devel] [PATCH] flacenc - md5

Justin Ruggles jruggle
Sun Jul 9 19:50:18 CEST 2006


Michael Niedermayer wrote:
> Hi
> 
> On Sat, Jul 08, 2006 at 10:41:05PM -0400, Justin Ruggles wrote:
> 
>>sheesh. I do need my cola tonight. The regression references would need
>>to be updated as well.  Here is a patch with regression updates.
> 
> 
> all things you do in the flac muxer will be missing if flac is stored in
> other containers, is raw flac more common then flac in ogg?
> 
> the problem i have with the changes is that theres lots of new code
> but the md5 will still be missing if flac is stored in any container
> furthermore the md5 isnt really mandatory so unless you can find a
> simple way to set the md5 which then also works with other containers,
> iam against setting it at all in lav*

Raw flac is not just more common, it is vastly more common.  I have only
seen a few ogg-flac files out there, but raw flac is all over the place.
 Like I said before, the reference encoder doesn't even put the MD5 in
ogg-flac files.  I think writing it, even if only in raw flac, is still
important.

Concerning trying to get it into other containers though...maybe your
previous suggestion of a 2-pass solution would work ok.  I would have to
study the current system for reading/writing the 2-pass info file to
know exactly how this could work though.  If it works how I think, it
might be the simplest solution & could avoid passing the md5 through
AVCodecContext or modifying the extradata after it has been written already.

As far as the other metadata, Ogg has to do things a bit differently
anyway.  The standard flac-to-ogg mapping adds its own header to the
streaminfo, then puts each metadata block into a separate ogg packet.

I could shrink & simplify the code quite a bit if the extradata is
explicitly defined to contain only the streaminfo.  In fact, I like this
idea.  It may limit some of the raw flac functionality, but it would be
simpler for other containers since they would know exactly what they are
writing.  I am still in favor of adding the padding and vorbis comment
in raw flac though.  The vorbis comment writing could conceivably be put
in a place where other muxers could access it if they wanted to...

> 
> [...]
> 
>>    // keep current count of audio samples
>>    if(pkt->pts != AV_NOPTS_VALUE) {
>>        flac->sample_count = (float)(pkt->pts+pkt->duration) *
>>                             (float)st->time_base.num /
>>                             (float)st->time_base.den *
>>                             (float)st->codec->sample_rate + 0.5;
> 
> 
> use av_rescale(), floats are unacceptable and inaccurate

ok. I'll try it and see if I can get it to work. Doing the integer math
directly, I kept getting 1 sample too short due to rounding of the pts
and duration. Could there be a way of setting a better time_base to
ensure single-sample accuracy?

> 
> 
>>Index: ffmpeg.c
>>===================================================================
>>--- ffmpeg.c	(revision 5683)
>>+++ ffmpeg.c	(working copy)
>>@@ -1393,13 +1393,11 @@
>>                             ret = 0;
>>                             /* encode any samples remaining in fifo */
>>                             if(fifo_bytes > 0 && enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
>>-                                int fs_tmp = enc->frame_size;
>>                                 enc->frame_size = fifo_bytes / (2 * enc->channels);
>>                                 if(fifo_read(&ost->fifo, (uint8_t *)samples, fifo_bytes,
>>                                         &ost->fifo.rptr) == 0) {
>>                                     ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, samples);
>>                                 }
>>-                                enc->frame_size = fs_tmp;
>>                             }
>>                             if(ret <= 0) {
>>                                 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
> 
> 
> this change seems unrelated ...
> 
> [...]

It is related to the calculation of the sample count.  The last packet
was reporting an incorrect duration due to frame_size being set back to
the larger size.  The result was that the sample count was too high.
Leaving frame_size the actual size of the last frame seemed okay to me,
especially since it is the last frame anyway.


-Justin




More information about the ffmpeg-devel mailing list