diff --git a/ffplay.c b/ffplay.c index 292ac338f6..f74f0e4e4f 100644 --- a/ffplay.c +++ b/ffplay.c @@ -144,6 +144,9 @@ typedef struct VideoState { SDL_mutex *pictq_mutex; SDL_cond *pictq_cond; + SDL_mutex *video_decoder_mutex; + SDL_mutex *audio_decoder_mutex; + // QETimer *video_timer; char filename[1024]; int width, height, xleft, ytop; @@ -899,9 +902,11 @@ static int video_thread(void *arg) if (pkt->dts != AV_NOPTS_VALUE) pts = (double)pkt->dts / AV_TIME_BASE; + SDL_LockMutex(is->video_decoder_mutex); len1 = avcodec_decode_video(&is->video_st->codec, frame, &got_picture, pkt->data, pkt->size); + SDL_UnlockMutex(is->video_decoder_mutex); // if (len1 < 0) // break; if (got_picture) { @@ -1026,9 +1031,11 @@ static int audio_decode_frame(VideoState *is, uint8_t *audio_buf, double *pts_pt for(;;) { /* NOTE: the audio packet can contain several frames */ while (is->audio_pkt_size > 0) { + SDL_LockMutex(is->audio_decoder_mutex); len1 = avcodec_decode_audio(&is->audio_st->codec, (int16_t *)audio_buf, &data_size, is->audio_pkt_data, is->audio_pkt_size); + SDL_UnlockMutex(is->audio_decoder_mutex); if (len1 < 0) { /* if error, we skip the frame */ is->audio_pkt_size = 0; @@ -1414,7 +1421,9 @@ static int decode_thread(void *arg) } if (is->video_stream >= 0) { packet_queue_flush(&is->videoq); + SDL_LockMutex(is->video_decoder_mutex); avcodec_flush_buffers(&ic->streams[video_index]->codec); + SDL_UnlockMutex(is->video_decoder_mutex); } } is->seek_req = 0; @@ -1494,6 +1503,9 @@ static VideoState *stream_open(const char *filename, AVInputFormat *iformat) /* start video display */ is->pictq_mutex = SDL_CreateMutex(); is->pictq_cond = SDL_CreateCond(); + + is->audio_decoder_mutex = SDL_CreateMutex(); + is->video_decoder_mutex = SDL_CreateMutex(); /* add the refresh timer to draw the picture */ schedule_refresh(is, 40); @@ -1525,6 +1537,8 @@ static void stream_close(VideoState *is) } SDL_DestroyMutex(is->pictq_mutex); SDL_DestroyCond(is->pictq_cond); + SDL_DestroyMutex(is->audio_decoder_mutex); + SDL_DestroyMutex(is->video_decoder_mutex); } void stream_cycle_channel(VideoState *is, int codec_type)