mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 12:36:41 +08:00 
			
		
		
		
	| @@ -166,6 +166,34 @@ static int cmp_pkt_sub_pos_ts(const void *a, const void *b) | |||||||
|     return s1->pos > s2->pos ? 1 : -1; |     return s1->pos > s2->pos ? 1 : -1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void drop_dups(FFDemuxSubtitlesQueue *q) | ||||||
|  | { | ||||||
|  |     int i, drop = 0; | ||||||
|  |  | ||||||
|  |     for (i = 1; i < q->nb_subs; i++) { | ||||||
|  |         const int last_id = i - 1 - drop; | ||||||
|  |         const AVPacket *last = &q->subs[last_id]; | ||||||
|  |  | ||||||
|  |         if (q->subs[i].pts        == last->pts && | ||||||
|  |             q->subs[i].duration   == last->duration && | ||||||
|  |             !strcmp(q->subs[i].data, last->data)) { | ||||||
|  |  | ||||||
|  |             av_free_packet(&q->subs[i]); | ||||||
|  |             drop++; | ||||||
|  |         } else if (drop) { | ||||||
|  |             q->subs[last_id + 1] = q->subs[i]; | ||||||
|  |             memset(&q->subs[i], 0, sizeof(q->subs[i])); // for safety | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (drop) { | ||||||
|  |         q->nb_subs -= drop; | ||||||
|  |  | ||||||
|  |         // TODO: forward log context down here | ||||||
|  |         av_log(NULL, AV_LOG_WARNING, "Dropping %d duplicated subtitle events\n", drop); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| void ff_subtitles_queue_finalize(FFDemuxSubtitlesQueue *q) | void ff_subtitles_queue_finalize(FFDemuxSubtitlesQueue *q) | ||||||
| { | { | ||||||
|     int i; |     int i; | ||||||
| @@ -176,6 +204,7 @@ void ff_subtitles_queue_finalize(FFDemuxSubtitlesQueue *q) | |||||||
|     for (i = 0; i < q->nb_subs; i++) |     for (i = 0; i < q->nb_subs; i++) | ||||||
|         if (q->subs[i].duration == -1 && i < q->nb_subs - 1) |         if (q->subs[i].duration == -1 && i < q->nb_subs - 1) | ||||||
|             q->subs[i].duration = q->subs[i + 1].pts - q->subs[i].pts; |             q->subs[i].duration = q->subs[i + 1].pts - q->subs[i].pts; | ||||||
|  |     drop_dups(q); | ||||||
| } | } | ||||||
|  |  | ||||||
| int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt) | int ff_subtitles_queue_read_packet(FFDemuxSubtitlesQueue *q, AVPacket *pkt) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Clément Bœsch
					Clément Bœsch