@ -501,8 +501,14 @@ static int avi_write_header(AVFormatContext *s)
AVRational dar = av_mul_q ( st - > sample_aspect_ratio ,
( AVRational ) { par - > width ,
par - > height } ) ;
int num , den ;
int num , den , fields , i ;
av_reduce ( & num , & den , dar . num , dar . den , 0xFFFF ) ;
if ( par - > field_order = = AV_FIELD_TT | | par - > field_order = = AV_FIELD_BB | |
par - > field_order = = AV_FIELD_TB | | par - > field_order = = AV_FIELD_BT ) {
fields = 2 ; // interlaced
} else {
fields = 1 ; // progressive
}
avio_wl32 ( pb , 0 ) ; // video format = unknown
avio_wl32 ( pb , 0 ) ; // video standard = unknown
@ -514,17 +520,30 @@ static int avi_write_header(AVFormatContext *s)
avio_wl16 ( pb , num ) ;
avio_wl32 ( pb , par - > width ) ;
avio_wl32 ( pb , par - > height ) ;
avio_wl32 ( pb , 1 ) ; // progressive FIXME
avio_wl32 ( pb , par - > height ) ;
avio_wl32 ( pb , par - > width ) ;
avio_wl32 ( pb , par - > height ) ;
avio_wl32 ( pb , par - > width ) ;
avio_wl32 ( pb , 0 ) ;
avio_wl32 ( pb , 0 ) ;
avio_wl32 ( pb , fields ) ; // fields per frame
for ( i = 0 ; i < fields ; i + + ) {
int start_line ;
// OpenDML v1.02 is not very specific on what value to use for
// start_line when frame data is not coming from a capturing device,
// so just use 0/1 depending on the field order for interlaced frames
if ( par - > field_order = = AV_FIELD_TT | | par - > field_order = = AV_FIELD_TB ) {
start_line = ( i = = 0 ) ? 0 : 1 ;
} else if ( par - > field_order = = AV_FIELD_BB | | par - > field_order = = AV_FIELD_BT ) {
start_line = ( i = = 0 ) ? 1 : 0 ;
} else {
start_line = 0 ;
}
avio_wl32 ( pb , 0 ) ;
avio_wl32 ( pb , 0 ) ;
avio_wl32 ( pb , par - > height / fields ) ; // compressed bitmap height
avio_wl32 ( pb , par - > width ) ; // compressed bitmap width
avio_wl32 ( pb , par - > height / fields ) ; // valid bitmap height
avio_wl32 ( pb , par - > width ) ; // valid bitmap width
avio_wl32 ( pb , 0 ) ; // valid bitmap X offset
avio_wl32 ( pb , 0 ) ; // valid bitmap Y offset
avio_wl32 ( pb , 0 ) ; // valid X offset in T
avio_wl32 ( pb , start_line ) ; // valid Y start line
}
ff_end_tag ( pb , vprp ) ;
}