[vlc-devel] Transcoding bug

Anatoly madRat L.Berenblit madrat at hotbox.ru
Mon Mar 16 14:39:57 CET 2009


Hello developers. I've using vlc for transcoding in the chain " 
internet-url --> vlc (for transcode from mms to rcp with mp4v/mp4a) --> 
DarwinStreamingServer (stream to my local network)

Some mms channels can be opened only with new vlc 0.9.8a (i've using 
0.8.6d - because it can do everythink that I need). I've donwload neew 
one and install it. So I face the follows problem:

when I try to stream with b-frames' 
'#transcode{venc=avcodec{bframes=1},vcodec=mp4v,vb=400,fps=20,width=320,height=240,acodec=mp4a,channels=1,ab=48}:rtp{port-audio=20000,port-video=20002,dst=127.0.0.1,sdp=file:///usr/local/movies/1.sdp}
no video sending to DarwinStreaming Server, but If i try to disable 
bframes or transcode to file (std instead rcp) - everything works.

I've research the problem and want to report to you.

The problem is in encoder module(modules/codec/avcodec/encoder.c), it 
generates invalid dts. and that wrong value sending into 
modules/stream_out/rtp.c.

rtp.c sends data to socket in special thread, that mwait(sleep) if frame 
has come to rpc-streamer much earlier, but with wrong dts is waits about 
290000 years

*rtp.c near line 1524*
mtime_t  i_date = out->i_dts + i_caching;
ssize_t  len = out->i_buffer;

mwait( i_date ); // i_date = "i_caching-0x8000000000000000" and systems 
must wait about 290000 years

the problem is in modules/codec/avcodec/encoder.c
in function: static block_t *EncodeVideo( encoder_t *p_enc, picture_t 
*p_pict ) (line ~ 849)

/* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
*if( p_enc->fmt_out.i_codec != VLC_FOURCC( 'm', 'p', '4', 'v' ) )*
{
...
}
else
{
    frame.pts = (int64_t)AV_NOPTS_VALUE;
}

in the follows code system suppose that frame.pts have valid value, not 
AV_NOPTS_VALUE (==0x8000000000000000)

in VLC 0.8.6 was
#if LIBAVCODEC_BUILD < 4702
    /* Set the pts of the frame being encoded (segfaults with mpeg4!)*/
    if( p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', 'g', 'v' ) ||
        p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '1', 'v' ) ||
        p_enc->fmt_out.i_codec == VLC_FOURCC( 'm', 'p', '2', 'v' ) )
#else
    if( 1 )
#endif
    {
...
}
else
{
    frame.pts = (int64_t)AV_NOPTS_VALUE;
}

So, looks that bug appears where code was ported.

Best regards, madRat.

PS. Also not fixed a Bug with wrong mp4 video transcoding: vlc generates 
mpeg4 video with long sequences with 0xFF 0xFF  0xFF ...0xFF values.
Correct video stream should be not have any regular sequence. (if it is 
=> it may be compressed => it should not be in data where bitrate is 
limited and every saved bit is important! I not belive that mpeg4 team 
suppose that is a good idea to have some reqular sequences.)

*The best player should be the best in all, that it does!!!

*



More information about the vlc-devel mailing list