Closes videolan/x264#16.
Bug report by Zu-Ming Jiang.
x264_pthread_mutex_unlock( &frame->mutex );
}
-void x264_frame_cond_wait( x264_frame_t *frame, int i_lines_completed )
+int x264_frame_cond_wait( x264_frame_t *frame, int i_lines_completed )
{
+ int completed;
x264_pthread_mutex_lock( &frame->mutex );
- while( frame->i_lines_completed < i_lines_completed )
+ while( (completed = frame->i_lines_completed) < i_lines_completed && i_lines_completed >= 0 )
x264_pthread_cond_wait( &frame->cv, &frame->mutex );
x264_pthread_mutex_unlock( &frame->mutex );
+ return completed;
}
void x264_threadslice_cond_broadcast( x264_t *h, int pass )
#define x264_frame_cond_broadcast x264_template(frame_cond_broadcast)
void x264_frame_cond_broadcast( x264_frame_t *frame, int i_lines_completed );
#define x264_frame_cond_wait x264_template(frame_cond_wait)
-void x264_frame_cond_wait( x264_frame_t *frame, int i_lines_completed );
+int x264_frame_cond_wait( x264_frame_t *frame, int i_lines_completed );
#define x264_frame_new_slice x264_template(frame_new_slice)
int x264_frame_new_slice( x264_t *h, x264_frame_t *frame );
for( int i = (h->sh.i_type == SLICE_TYPE_B); i >= 0; i-- )
for( int j = 0; j < h->i_ref[i]; j++ )
{
- x264_frame_cond_wait( h->fref[i][j]->orig, thresh );
- thread_mvy_range = X264_MIN( thread_mvy_range, h->fref[i][j]->orig->i_lines_completed - pix_y );
+ int completed = x264_frame_cond_wait( h->fref[i][j]->orig, thresh );
+ thread_mvy_range = X264_MIN( thread_mvy_range, completed - pix_y );
}
if( h->param.b_deterministic )
int ref = h->mb.cache.ref[l][x264_scan8[0]];
if( ref < 0 )
continue;
- completed = h->fref[l][ ref >> MB_INTERLACED ]->orig->i_lines_completed;
+ completed = x264_frame_cond_wait( h->fref[l][ ref >> MB_INTERLACED ]->orig, -1 );
if( (h->mb.cache.mv[l][x264_scan8[15]][1] >> (2 - MB_INTERLACED)) + h->mb.i_mb_y*16 > completed )
{
x264_log( h, X264_LOG_WARNING, "internal error (MV out of thread range)\n");