@ -53,7 +53,7 @@ struct dshow_ctx {
int eof ;
int64_t curbufsize ;
int64_t curbufsize [ 2 ] ;
unsigned int video_frame_num ;
IMediaControl * control ;
@ -180,16 +180,16 @@ static char *dup_wchar_to_utf8(wchar_t *w)
return s ;
}
static int shall_we_drop ( AVFormatContext * s )
static int shall_we_drop ( AVFormatContext * s , int index )
{
struct dshow_ctx * ctx = s - > priv_data ;
static const uint8_t dropscore [ ] = { 62 , 75 , 87 , 100 } ;
const int ndropscores = FF_ARRAY_ELEMS ( dropscore ) ;
unsigned int buffer_fullness = ( ctx - > curbufsize * 100 ) / s - > max_picture_buffer ;
unsigned int buffer_fullness = ( ctx - > curbufsize [ index ] * 100 ) / s - > max_picture_buffer ;
if ( dropscore [ + + ctx - > video_frame_num % ndropscores ] < = buffer_fullness ) {
av_log ( s , AV_LOG_ERROR ,
" real-time buffer %d%% full ! frame dropped! \n " , buffer_fullness ) ;
" real-time buffer[%d] too full (%d%% of size: %d) ! frame dropped! \n " , index , buffer_fullness , s - > max_picture_buffer ) ;
return 1 ;
}
@ -207,7 +207,7 @@ callback(void *priv_data, int index, uint8_t *buf, int buf_size, int64_t time)
WaitForSingleObject ( ctx - > mutex , INFINITE ) ;
if ( shall_we_drop ( s ) )
if ( shall_we_drop ( s , index ) )
goto fail ;
pktl_next = av_mallocz ( sizeof ( AVPacketList ) ) ;
@ -225,8 +225,7 @@ callback(void *priv_data, int index, uint8_t *buf, int buf_size, int64_t time)
for ( ppktl = & ctx - > pktl ; * ppktl ; ppktl = & ( * ppktl ) - > next ) ;
* ppktl = pktl_next ;
ctx - > curbufsize + = buf_size ;
ctx - > curbufsize [ index ] + = buf_size ;
SetEvent ( ctx - > event [ 1 ] ) ;
ReleaseMutex ( ctx - > mutex ) ;
@ -944,7 +943,8 @@ static int dshow_read_header(AVFormatContext *avctx)
goto error ;
}
}
ctx - > curbufsize [ 0 ] = 0 ;
ctx - > curbufsize [ 1 ] = 0 ;
ctx - > mutex = CreateMutex ( NULL , 0 , NULL ) ;
if ( ! ctx - > mutex ) {
av_log ( avctx , AV_LOG_ERROR , " Could not create Mutex \n " ) ;
@ -1038,7 +1038,7 @@ static int dshow_read_packet(AVFormatContext *s, AVPacket *pkt)
* pkt = pktl - > pkt ;
ctx - > pktl = ctx - > pktl - > next ;
av_free ( pktl ) ;
ctx - > curbufsize - = pkt - > size ;
ctx - > curbufsize [ pkt - > stream_index ] - = pkt - > size ;
}
ResetEvent ( ctx - > event [ 1 ] ) ;
ReleaseMutex ( ctx - > mutex ) ;