You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	ffplay: simplify and fix flushing out old subtitles on seeking
Fixes the additional issue reported in ticket #2666. Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
		
							
								
								
									
										33
									
								
								ffplay.c
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								ffplay.c
									
									
									
									
									
								
							| @@ -134,6 +134,7 @@ typedef struct VideoPicture { | ||||
| typedef struct SubPicture { | ||||
|     double pts; /* presentation time stamp for this picture */ | ||||
|     AVSubtitle sub; | ||||
|     int serial; | ||||
| } SubPicture; | ||||
|  | ||||
| typedef struct AudioParams { | ||||
| @@ -230,7 +231,6 @@ typedef struct VideoState { | ||||
|  | ||||
|     SDL_Thread *subtitle_tid; | ||||
|     int subtitle_stream; | ||||
|     int subtitle_stream_changed; | ||||
|     AVStream *subtitle_st; | ||||
|     PacketQueue subtitleq; | ||||
|     SubPicture subpq[SUBPICTURE_QUEUE_SIZE]; | ||||
| @@ -1400,24 +1400,7 @@ retry: | ||||
|             } | ||||
|  | ||||
|             if (is->subtitle_st) { | ||||
|                 if (is->subtitle_stream_changed) { | ||||
|                     SDL_LockMutex(is->subpq_mutex); | ||||
|  | ||||
|                     while (is->subpq_size) { | ||||
|                         free_subpicture(&is->subpq[is->subpq_rindex]); | ||||
|  | ||||
|                         /* update queue size and signal for next picture */ | ||||
|                         if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE) | ||||
|                             is->subpq_rindex = 0; | ||||
|  | ||||
|                         is->subpq_size--; | ||||
|                     } | ||||
|                     is->subtitle_stream_changed = 0; | ||||
|  | ||||
|                     SDL_CondSignal(is->subpq_cond); | ||||
|                     SDL_UnlockMutex(is->subpq_mutex); | ||||
|                 } else { | ||||
|                     if (is->subpq_size > 0) { | ||||
|                     while (is->subpq_size > 0) { | ||||
|                         sp = &is->subpq[is->subpq_rindex]; | ||||
|  | ||||
|                         if (is->subpq_size > 1) | ||||
| @@ -1425,7 +1408,8 @@ retry: | ||||
|                         else | ||||
|                             sp2 = NULL; | ||||
|  | ||||
|                         if ((is->vidclk.pts > (sp->pts + ((float) sp->sub.end_display_time / 1000))) | ||||
|                         if (sp->serial != is->subtitleq.serial | ||||
|                                 || (is->vidclk.pts > (sp->pts + ((float) sp->sub.end_display_time / 1000))) | ||||
|                                 || (sp2 && is->vidclk.pts > (sp2->pts + ((float) sp2->sub.start_display_time / 1000)))) | ||||
|                         { | ||||
|                             free_subpicture(sp); | ||||
| @@ -1438,9 +1422,10 @@ retry: | ||||
|                             is->subpq_size--; | ||||
|                             SDL_CondSignal(is->subpq_cond); | ||||
|                             SDL_UnlockMutex(is->subpq_mutex); | ||||
|                         } else { | ||||
|                             break; | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | ||||
| display: | ||||
| @@ -2000,6 +1985,7 @@ static int subtitle_thread(void *arg) | ||||
|     SubPicture *sp; | ||||
|     AVPacket pkt1, *pkt = &pkt1; | ||||
|     int got_subtitle; | ||||
|     int serial; | ||||
|     double pts; | ||||
|     int i, j; | ||||
|     int r, g, b, y, u, v, a; | ||||
| @@ -2008,7 +1994,7 @@ static int subtitle_thread(void *arg) | ||||
|         while (is->paused && !is->subtitleq.abort_request) { | ||||
|             SDL_Delay(10); | ||||
|         } | ||||
|         if (packet_queue_get(&is->subtitleq, pkt, 1, NULL) < 0) | ||||
|         if (packet_queue_get(&is->subtitleq, pkt, 1, &serial) < 0) | ||||
|             break; | ||||
|  | ||||
|         if (pkt->data == flush_pkt.data) { | ||||
| @@ -2039,6 +2025,7 @@ static int subtitle_thread(void *arg) | ||||
|             if (sp->sub.pts != AV_NOPTS_VALUE) | ||||
|                 pts = sp->sub.pts / (double)AV_TIME_BASE; | ||||
|             sp->pts = pts; | ||||
|             sp->serial = serial; | ||||
|  | ||||
|             for (i = 0; i < sp->sub.num_rects; i++) | ||||
|             { | ||||
| @@ -2633,8 +2620,6 @@ static void stream_component_close(VideoState *is, int stream_index) | ||||
|         /* note: we also signal this mutex to make sure we deblock the | ||||
|            video thread in all cases */ | ||||
|         SDL_LockMutex(is->subpq_mutex); | ||||
|         is->subtitle_stream_changed = 1; | ||||
|  | ||||
|         SDL_CondSignal(is->subpq_cond); | ||||
|         SDL_UnlockMutex(is->subpq_mutex); | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user