@ -40,6 +40,8 @@
* seems someone came to the same conclusions as me , and updated it :
* ( 2 ) http : //www.stud.ktu.lt/~vitslav/nsv/nsv-format.txt
* http : //www.stud.ktu.lt/~vitslav/nsv/
* official docs
* ( 3 ) http : //ultravox.aol.com/NSVFormat.rtf
* Sample files :
* ( S1 ) http : //www.nullsoft.com/nsv/samples/
* http : //www.nullsoft.com/nsv/samples/faster.nsv
@ -208,15 +210,6 @@ static const CodecTag nsv_codec_audio_tags[] = {
{ 0 , 0 } ,
} ;
static const AVRational nsv_framerate_table [ ] = {
{ 30 , 1 } ,
{ 30000 , 1001 } ,
{ 25 , 1 } ,
{ 24000 , 1001 } ,
{ 30 , 1 } ,
{ 15000 , 1001 } ,
} ;
//static int nsv_load_index(AVFormatContext *s);
static int nsv_read_chunk ( AVFormatContext * s , int fill_header ) ;
@ -415,11 +408,25 @@ static int nsv_parse_NSVs_header(AVFormatContext *s, AVFormatParameters *ap)
vwidth = get_le16 ( pb ) ;
vheight = get_le16 ( pb ) ;
i = get_byte ( pb ) ;
/* XXX how big must the table be ? */
/* seems there is more to that... */
PRINT ( ( " NSV NSVs framerate code %2x \n " , i ) ) ;
if ( i & 0x80 ) framerate = nsv_framerate_table [ i & 0x7F ] ;
else framerate = ( AVRational ) { i , 1 } ;
if ( i & 0x80 ) { /* odd way of giving native framerates from docs */
int t = ( i & 0x7F ) > > 2 ;
if ( t < 16 ) framerate = ( AVRational ) { 1 , t + 1 } ;
else framerate = ( AVRational ) { t - 15 , 1 } ;
if ( i & 1 ) {
framerate . num * = 1000 ;
framerate . den * = 1001 ;
}
if ( ( i & 3 ) = = 3 ) framerate . num * = 24 ;
else if ( ( i & 3 ) = = 2 ) framerate . num * = 25 ;
else framerate . num * = 30 ;
}
else
framerate = ( AVRational ) { i , 1 } ;
nsv - > avsync = get_le16 ( pb ) ;
# ifdef DEBUG
print_tag ( " NSV NSVs vtag " , vtag , 0 ) ;