@ -301,6 +301,7 @@ static int ffm_read_data(AVFormatContext *s,
if ( len = = 0 ) {
if ( len = = 0 ) {
if ( url_ftell ( pb ) = = ffm - > file_size )
if ( url_ftell ( pb ) = = ffm - > file_size )
url_fseek ( pb , ffm - > packet_size , SEEK_SET ) ;
url_fseek ( pb , ffm - > packet_size , SEEK_SET ) ;
retry_read :
get_be16 ( pb ) ; /* PACKET_ID */
get_be16 ( pb ) ; /* PACKET_ID */
fill_size = get_be16 ( pb ) ;
fill_size = get_be16 ( pb ) ;
ffm - > pts = get_be64 ( pb ) ;
ffm - > pts = get_be64 ( pb ) ;
@ -310,7 +311,18 @@ static int ffm_read_data(AVFormatContext *s,
/* if first packet or resynchronization packet, we must
/* if first packet or resynchronization packet, we must
handle it specifically */
handle it specifically */
if ( ffm - > first_packet | | ( frame_offset & 0x8000 ) ) {
if ( ffm - > first_packet | | ( frame_offset & 0x8000 ) ) {
if ( ! frame_offset ) {
/* This packet has no frame headers in it */
if ( url_ftell ( pb ) > = ffm - > packet_size * 3 ) {
url_fseek ( pb , - ffm - > packet_size * 2 , SEEK_CUR ) ;
goto retry_read ;
}
/* This is bad, we cannot find a valid frame header */
return 0 ;
}
ffm - > first_packet = 0 ;
ffm - > first_packet = 0 ;
if ( ( frame_offset & 0x7ffff ) < FFM_HEADER_SIZE )
abort ( ) ;
ffm - > packet_ptr = ffm - > packet + ( frame_offset & 0x7fff ) - FFM_HEADER_SIZE ;
ffm - > packet_ptr = ffm - > packet + ( frame_offset & 0x7fff ) - FFM_HEADER_SIZE ;
if ( ! first )
if ( ! first )
break ;
break ;