[MPlayer-dev-eng] [PATCH] mencoder: detect end of audio stream while encoded data still buffered
Kieran Clancy
clancy.kieran+mplayer at gmail.com
Sat May 3 21:49:10 CEST 2014
On Sun, May 4, 2014 at 4:31 AM, Reimar Döffinger
<Reimar.Doeffinger at gmx.de> wrote:
> I still think you are looking at the completely wrong thing.
> Yes, the encoder can't flush data, so some audio data will be lost.
> However the data buffer_len refers to is _already encoded_ data.
You are right, that sounds reasonable.
> Since you talk about "whole frame" you seem to (I believe mistakenly?)
> assume that frames have some fixed size?
> Whenever we get data back from the encoder it should be a frame.
> Which might mean the fact that buffer_len becomes > 0 is a bug in the
> first place.
I'm aware that frames have variable sizes.
Perhaps there are several problems then.
After the last encoded data is produced
len = aencoder->encode(...);
is giving > 0 bytes, but then the while(1) loop continues.
Then, on a subsequent loop,
len = dec_audio(...);
is returning 0, overwriting the previous non-zero value of len, and
preventing muxer_write_chunk(...) on line 1394 from ever seeing the
data.
Could the solution be as simple as something like this?
Index: mencoder.c
===================================================================
--- mencoder.c (revision 37181)
+++ mencoder.c (working copy)
@@ -1362,7 +1362,7 @@
len = dec_audio(sh_audio,aencoder->decode_buffer,
aencoder->decode_buffer_size);
if(len <= 0)
{
- len = 0;
+ len = mux_a->buffer_len;
break;
}
len = aencoder->encode(aencoder, mux_a->buffer +
mux_a->buffer_len, aencoder->decode_buffer, len,
mux_a->buffer_size-mux_a->buffer_len);
This should ensure that a non-zero buffer_len will still cause one
last call to muxer_write_chunk(...) on line 1394, and on the next loop
through it will properly reach the EOF condition.
More information about the MPlayer-dev-eng
mailing list