@ -885,10 +885,14 @@ skip:
if ( s - > pb - > seekable & & ( ! s - > duration | | s - > duration = = AV_NOPTS_VALUE ) & & ! flv - > searched_for_end ) {
if ( s - > pb - > seekable & & ( ! s - > duration | | s - > duration = = AV_NOPTS_VALUE ) & & ! flv - > searched_for_end ) {
int size ;
int size ;
const int64_t pos = avio_tell ( s - > pb ) ;
const int64_t pos = avio_tell ( s - > pb ) ;
// Read the last 4 bytes of the file, this should be the size of the
// previous FLV tag. Use the timestamp of its payload as duration.
int64_t fsize = avio_size ( s - > pb ) ;
int64_t fsize = avio_size ( s - > pb ) ;
retry_duration :
retry_duration :
avio_seek ( s - > pb , fsize - 4 , SEEK_SET ) ;
avio_seek ( s - > pb , fsize - 4 , SEEK_SET ) ;
size = avio_rb32 ( s - > pb ) ;
size = avio_rb32 ( s - > pb ) ;
// Seek to the start of the last FLV tag at position (fsize - 4 - size)
// but skip the byte indicating the type.
avio_seek ( s - > pb , fsize - 3 - size , SEEK_SET ) ;
avio_seek ( s - > pb , fsize - 3 - size , SEEK_SET ) ;
if ( size = = avio_rb24 ( s - > pb ) + 11 ) {
if ( size = = avio_rb24 ( s - > pb ) + 11 ) {
uint32_t ts = avio_rb24 ( s - > pb ) ;
uint32_t ts = avio_rb24 ( s - > pb ) ;