diff mbox series

[FFmpeg-devel,1/4] fftools/ffplay: get rid of flush_pkt

Message ID 20210207210634.16494-1-cus@passwd.hu
State Accepted
Commit a29928e6460e033ad374777b0e660683a49292f5
Headers show
Series [FFmpeg-devel,1/4] fftools/ffplay: get rid of flush_pkt | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished
andriy/PPC64_make success Make finished
andriy/PPC64_make_fate success Make fate finished

Commit Message

Marton Balint Feb. 7, 2021, 9:06 p.m. UTC
The packet serial can be used instead to detect when a flush is needed.

Signed-off-by: Marton Balint <cus@passwd.hu>
---
 fftools/ffplay.c | 29 +++++++++++------------------
 1 file changed, 11 insertions(+), 18 deletions(-)

Comments

Marton Balint Feb. 19, 2021, 8:29 p.m. UTC | #1
On Sun, 7 Feb 2021, Marton Balint wrote:

> The packet serial can be used instead to detect when a flush is needed.
>
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
> fftools/ffplay.c | 29 +++++++++++------------------
> 1 file changed, 11 insertions(+), 18 deletions(-)

Will apply the series.

Regards,
Marton

>
> diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> index 9ff0425163..70d8548a64 100644
> --- a/fftools/ffplay.c
> +++ b/fftools/ffplay.c
> @@ -361,8 +361,6 @@ static int filter_nbthreads = 0;
> static int is_full_screen;
> static int64_t audio_callback_time;
> 
> -static AVPacket flush_pkt;
> -
> #define FF_QUIT_EVENT    (SDL_USEREVENT + 2)
> 
> static SDL_Window *window;
> @@ -437,8 +435,6 @@ static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
>         return -1;
>     pkt1->pkt = *pkt;
>     pkt1->next = NULL;
> -    if (pkt == &flush_pkt)
> -        q->serial++;
>     pkt1->serial = q->serial;
>
>     if (!q->last_pkt)
> @@ -462,7 +458,7 @@ static int packet_queue_put(PacketQueue *q, AVPacket *pkt)
>     ret = packet_queue_put_private(q, pkt);
>     SDL_UnlockMutex(q->mutex);
> 
> -    if (pkt != &flush_pkt && ret < 0)
> +    if (ret < 0)
>         av_packet_unref(pkt);
>
>     return ret;
> @@ -511,6 +507,7 @@ static void packet_queue_flush(PacketQueue *q)
>     q->nb_packets = 0;
>     q->size = 0;
>     q->duration = 0;
> +    q->serial++;
>     SDL_UnlockMutex(q->mutex);
> }
> 
> @@ -536,7 +533,7 @@ static void packet_queue_start(PacketQueue *q)
> {
>     SDL_LockMutex(q->mutex);
>     q->abort_request = 0;
> -    packet_queue_put_private(q, &flush_pkt);
> +    q->serial++;
>     SDL_UnlockMutex(q->mutex);
> }
> 
> @@ -642,20 +639,22 @@ static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) {
>                 av_packet_move_ref(&pkt, &d->pkt);
>                 d->packet_pending = 0;
>             } else {
> +                int old_serial = d->pkt_serial;
>                 if (packet_queue_get(d->queue, &pkt, 1, &d->pkt_serial) < 0)
>                     return -1;
> +                if (old_serial != d->pkt_serial) {
> +                    avcodec_flush_buffers(d->avctx);
> +                    d->finished = 0;
> +                    d->next_pts = d->start_pts;
> +                    d->next_pts_tb = d->start_pts_tb;
> +                }
>             }
>             if (d->queue->serial == d->pkt_serial)
>                 break;
>             av_packet_unref(&pkt);
>         } while (1);
> 
> -        if (pkt.data == flush_pkt.data) {
> -            avcodec_flush_buffers(d->avctx);
> -            d->finished = 0;
> -            d->next_pts = d->start_pts;
> -            d->next_pts_tb = d->start_pts_tb;
> -        } else {
> +        {
>             if (d->avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
>                 int got_frame = 0;
>                 ret = avcodec_decode_subtitle2(d->avctx, sub, &got_frame, &pkt);
> @@ -2962,15 +2961,12 @@ static int read_thread(void *arg)
>             } else {
>                 if (is->audio_stream >= 0) {
>                     packet_queue_flush(&is->audioq);
> -                    packet_queue_put(&is->audioq, &flush_pkt);
>                 }
>                 if (is->subtitle_stream >= 0) {
>                     packet_queue_flush(&is->subtitleq);
> -                    packet_queue_put(&is->subtitleq, &flush_pkt);
>                 }
>                 if (is->video_stream >= 0) {
>                     packet_queue_flush(&is->videoq);
> -                    packet_queue_put(&is->videoq, &flush_pkt);
>                 }
>                 if (is->seek_flags & AVSEEK_FLAG_BYTE) {
>                    set_clock(&is->extclk, NAN, 0);
> @@ -3738,9 +3734,6 @@ int main(int argc, char **argv)
>     SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
>     SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
> 
> -    av_init_packet(&flush_pkt);
> -    flush_pkt.data = (uint8_t *)&flush_pkt;
> -
>     if (!display_disable) {
>         int flags = SDL_WINDOW_HIDDEN;
>         if (alwaysontop)
> -- 
> 2.26.2
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff mbox series

Patch

diff --git a/fftools/ffplay.c b/fftools/ffplay.c
index 9ff0425163..70d8548a64 100644
--- a/fftools/ffplay.c
+++ b/fftools/ffplay.c
@@ -361,8 +361,6 @@  static int filter_nbthreads = 0;
 static int is_full_screen;
 static int64_t audio_callback_time;
 
-static AVPacket flush_pkt;
-
 #define FF_QUIT_EVENT    (SDL_USEREVENT + 2)
 
 static SDL_Window *window;
@@ -437,8 +435,6 @@  static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
         return -1;
     pkt1->pkt = *pkt;
     pkt1->next = NULL;
-    if (pkt == &flush_pkt)
-        q->serial++;
     pkt1->serial = q->serial;
 
     if (!q->last_pkt)
@@ -462,7 +458,7 @@  static int packet_queue_put(PacketQueue *q, AVPacket *pkt)
     ret = packet_queue_put_private(q, pkt);
     SDL_UnlockMutex(q->mutex);
 
-    if (pkt != &flush_pkt && ret < 0)
+    if (ret < 0)
         av_packet_unref(pkt);
 
     return ret;
@@ -511,6 +507,7 @@  static void packet_queue_flush(PacketQueue *q)
     q->nb_packets = 0;
     q->size = 0;
     q->duration = 0;
+    q->serial++;
     SDL_UnlockMutex(q->mutex);
 }
 
@@ -536,7 +533,7 @@  static void packet_queue_start(PacketQueue *q)
 {
     SDL_LockMutex(q->mutex);
     q->abort_request = 0;
-    packet_queue_put_private(q, &flush_pkt);
+    q->serial++;
     SDL_UnlockMutex(q->mutex);
 }
 
@@ -642,20 +639,22 @@  static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) {
                 av_packet_move_ref(&pkt, &d->pkt);
                 d->packet_pending = 0;
             } else {
+                int old_serial = d->pkt_serial;
                 if (packet_queue_get(d->queue, &pkt, 1, &d->pkt_serial) < 0)
                     return -1;
+                if (old_serial != d->pkt_serial) {
+                    avcodec_flush_buffers(d->avctx);
+                    d->finished = 0;
+                    d->next_pts = d->start_pts;
+                    d->next_pts_tb = d->start_pts_tb;
+                }
             }
             if (d->queue->serial == d->pkt_serial)
                 break;
             av_packet_unref(&pkt);
         } while (1);
 
-        if (pkt.data == flush_pkt.data) {
-            avcodec_flush_buffers(d->avctx);
-            d->finished = 0;
-            d->next_pts = d->start_pts;
-            d->next_pts_tb = d->start_pts_tb;
-        } else {
+        {
             if (d->avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
                 int got_frame = 0;
                 ret = avcodec_decode_subtitle2(d->avctx, sub, &got_frame, &pkt);
@@ -2962,15 +2961,12 @@  static int read_thread(void *arg)
             } else {
                 if (is->audio_stream >= 0) {
                     packet_queue_flush(&is->audioq);
-                    packet_queue_put(&is->audioq, &flush_pkt);
                 }
                 if (is->subtitle_stream >= 0) {
                     packet_queue_flush(&is->subtitleq);
-                    packet_queue_put(&is->subtitleq, &flush_pkt);
                 }
                 if (is->video_stream >= 0) {
                     packet_queue_flush(&is->videoq);
-                    packet_queue_put(&is->videoq, &flush_pkt);
                 }
                 if (is->seek_flags & AVSEEK_FLAG_BYTE) {
                    set_clock(&is->extclk, NAN, 0);
@@ -3738,9 +3734,6 @@  int main(int argc, char **argv)
     SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
     SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
 
-    av_init_packet(&flush_pkt);
-    flush_pkt.data = (uint8_t *)&flush_pkt;
-
     if (!display_disable) {
         int flags = SDL_WINDOW_HIDDEN;
         if (alwaysontop)