[MPlayer-users] [BUG] incorrect detection of VP3/VP6 keyframes in NSV demux

Corey Hickey bugfood-ml at fatooh.org
Tue Jul 25 20:38:44 CEST 2006


Chris Dolan wrote:
> As of SVN r18890, the NSV demuxer uses an incorrect algorithm to detect 
> keyframes in a VP31, VP61 or VP62 stream.  As documented for VP3 
> (http://www.multimedia.cx/vp3-format.txt) the keyframe/interframe 
> distingisher is bit 7 of the frame header, that is, "buf[7] & 0x80" in 
> the notation of the code below.  The below code looks for a magic number 
> in bits 9-11 for VP6x and bits 8-23 for VP31, both of which are 
> incorrect.  While keyframes should always pass those tests, interframes 
> may accidentally pass them too.
> 
> I've examined several FLVs containing VP62 video and discovered that bit 
> 7 is the only consistent distinguisher between keyframes and 
> interframes.  I don't have any authoritative documentation for VP61 or 
> VP62, so this conclusion is empirical.
> 
> 
> Current code:
> http://svn.mplayerhq.hu/mplayer/trunk/libmpdemux/demux_nsv.c?view=markup&pathrev=18890 
> 
> 
>             // here we search for the correct keyframe
>             // vp6 keyframe is when the 2nd byte of the vp6 header is
>             // 0x36 for VP61 and 0x46 for VP62
>             if((priv->v_format==mmioFOURCC('V','P','6','1')) ||
>                (priv->v_format==mmioFOURCC('V','P','6','2')) ||
>                (priv->v_format==mmioFOURCC('V','P','3','1'))) {
>                 stream_read(demuxer->stream,buf,10);
>                 if (((((priv->v_format>>16) & 0xff) == '6') && 
> ((buf[8]&0x0e)!=0x06)) ||
>                     ((((priv->v_format>>16) & 0xff) == '3') && 
> (buf[8]!=0x00 || buf[9]!=0x08))) {
> 
> Speculative fix (untested):
> 
>             // here we search for the correct keyframe
>             // vp3/6 keyframe is indicated by bit 7 of the frame header
>             if((priv->v_format==mmioFOURCC('V','P','6','1')) ||
>                (priv->v_format==mmioFOURCC('V','P','6','2')) ||
>                (priv->v_format==mmioFOURCC('V','P','3','1'))) {
>                 stream_read(demuxer->stream,buf,10);
>                 if ((buf[7]&0x80)==0) {
> 
> Please note that all of my experiments have been on FLV files, not NSV 
> files, but in the VP62 case, they contain similar payload.

If you can suggest a fix to a problem, please subscribe to the 
mplayer-dev-eng list and post there. Also, provide fixes in the unified 
diff format. 'svn diff' is the easiest way.

-Corey



More information about the MPlayer-users mailing list