diff mbox series

[FFmpeg-devel,12/35] lavc/avcodec: switch to new FIFO API

Message ID 20220111204610.14262-12-anton@khirnov.net
State New
Headers show
Series [FFmpeg-devel,01/35] lavu/fifo: disallow overly large fifo sizes | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished
andriy/make_ppc success Make finished
andriy/make_fate_ppc success Make fate finished
andriy/make_aarch64_jetson success Make finished
andriy/make_fate_aarch64_jetson success Make fate finished

Commit Message

Anton Khirnov Jan. 11, 2022, 8:45 p.m. UTC
---
 libavcodec/avcodec.c | 15 ++++++---------
 libavcodec/decode.c  | 22 ++++++++--------------
 2 files changed, 14 insertions(+), 23 deletions(-)

Comments

Andreas Rheinhardt Jan. 13, 2022, 6:21 p.m. UTC | #1
Anton Khirnov:
> ---
>  libavcodec/avcodec.c | 15 ++++++---------
>  libavcodec/decode.c  | 22 ++++++++--------------
>  2 files changed, 14 insertions(+), 23 deletions(-)
> 
> diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
> index c00a9b2af8..a75bbe721f 100644
> --- a/libavcodec/avcodec.c
> +++ b/libavcodec/avcodec.c
> @@ -183,7 +183,8 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
>      avci->es.in_frame = av_frame_alloc();
>      avci->in_pkt = av_packet_alloc();
>      avci->last_pkt_props = av_packet_alloc();
> -    avci->pkt_props = av_fifo_alloc(sizeof(*avci->last_pkt_props));
> +    avci->pkt_props = av_fifo_alloc2(1, sizeof(*avci->last_pkt_props),
> +                                     AV_FIFO_FLAG_AUTO_GROW);
>      if (!avci->buffer_frame || !avci->buffer_pkt          ||
>          !avci->es.in_frame  || !avci->in_pkt     ||
>          !avci->last_pkt_props || !avci->pkt_props) {
> @@ -399,13 +400,10 @@ void avcodec_flush_buffers(AVCodecContext *avctx)
>      av_packet_unref(avci->buffer_pkt);
>  
>      av_packet_unref(avci->last_pkt_props);
> -    while (av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) {
> -        av_fifo_generic_read(avci->pkt_props,
> -                             avci->last_pkt_props, sizeof(*avci->last_pkt_props),
> -                             NULL);
> +    while (av_fifo_can_read(avci->pkt_props)) {
> +        av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
>          av_packet_unref(avci->last_pkt_props);

Could be simplified to
do {
    av_packet_unref(avci->last_pkt_props);
} while (av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1) >= 0);

The same goes for other loop below and probably more loops in the next
patches.
(This of course presumes that one is allowed to call av_fifo_read() to
tentatively read more elements than are currently available. I think
this should be allowed.)

>      }
> -    av_fifo_reset(avci->pkt_props);
>  
>      av_frame_unref(avci->es.in_frame);
>      av_packet_unref(avci->in_pkt);
> @@ -464,10 +462,9 @@ av_cold int avcodec_close(AVCodecContext *avctx)
>          av_frame_free(&avci->buffer_frame);
>          av_packet_free(&avci->buffer_pkt);
>          if (avci->pkt_props) {
> -            while (av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) {
> +            while (av_fifo_can_read(avci->pkt_props)) {
>                  av_packet_unref(avci->last_pkt_props);
> -                av_fifo_generic_read(avci->pkt_props, avci->last_pkt_props,
> -                                     sizeof(*avci->last_pkt_props), NULL);
> +                av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
>              }
>              av_fifo_freep(&avci->pkt_props);
>          }
> diff --git a/libavcodec/decode.c b/libavcodec/decode.c
> index 0912f86a14..9f6f2e7fa6 100644
> --- a/libavcodec/decode.c
> +++ b/libavcodec/decode.c
> @@ -165,26 +165,21 @@ static int extract_packet_props(AVCodecInternal *avci, const AVPacket *pkt)
>      int ret = 0;
>  
>      if (IS_EMPTY(avci->last_pkt_props)) {
> -        if (av_fifo_size(avci->pkt_props) >= sizeof(*pkt)) {
> -            av_fifo_generic_read(avci->pkt_props, avci->last_pkt_props,
> -                                 sizeof(*avci->last_pkt_props), NULL);
> +        if (av_fifo_can_read(avci->pkt_props)) {
> +            av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
>          } else

if (av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1) < 0)

>              return copy_packet_props(avci->last_pkt_props, pkt);
>      }
>  
> -    if (av_fifo_space(avci->pkt_props) < sizeof(*pkt)) {
> -        ret = av_fifo_grow(avci->pkt_props, sizeof(*pkt));
> -        if (ret < 0)
> -            return ret;
> -    }
> -
>      ret = copy_packet_props(&tmp, pkt);
>      if (ret < 0)
>          return ret;
>  
> -    av_fifo_generic_write(avci->pkt_props, &tmp, sizeof(tmp), NULL);
> +    ret = av_fifo_write(avci->pkt_props, &tmp, 1);
> +    if (ret < 0)
> +        av_packet_unref(&tmp);
>  
> -    return 0;
> +    return ret;
>  }
>  
>  static int decode_bsfs_init(AVCodecContext *avctx)
> @@ -543,9 +538,8 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
>          avci->draining_done = 1;
>  
>      if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) &&
> -        IS_EMPTY(avci->last_pkt_props) && av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props))
> -        av_fifo_generic_read(avci->pkt_props,
> -                             avci->last_pkt_props, sizeof(*avci->last_pkt_props), NULL);
> +        IS_EMPTY(avci->last_pkt_props) && av_fifo_can_read(avci->pkt_props))

The av_fifo_can_read() check could be dropped.

> +        av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
>  
>      if (!ret) {
>          frame->best_effort_timestamp = guess_correct_pts(avctx,
>
diff mbox series

Patch

diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index c00a9b2af8..a75bbe721f 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -183,7 +183,8 @@  int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
     avci->es.in_frame = av_frame_alloc();
     avci->in_pkt = av_packet_alloc();
     avci->last_pkt_props = av_packet_alloc();
-    avci->pkt_props = av_fifo_alloc(sizeof(*avci->last_pkt_props));
+    avci->pkt_props = av_fifo_alloc2(1, sizeof(*avci->last_pkt_props),
+                                     AV_FIFO_FLAG_AUTO_GROW);
     if (!avci->buffer_frame || !avci->buffer_pkt          ||
         !avci->es.in_frame  || !avci->in_pkt     ||
         !avci->last_pkt_props || !avci->pkt_props) {
@@ -399,13 +400,10 @@  void avcodec_flush_buffers(AVCodecContext *avctx)
     av_packet_unref(avci->buffer_pkt);
 
     av_packet_unref(avci->last_pkt_props);
-    while (av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) {
-        av_fifo_generic_read(avci->pkt_props,
-                             avci->last_pkt_props, sizeof(*avci->last_pkt_props),
-                             NULL);
+    while (av_fifo_can_read(avci->pkt_props)) {
+        av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
         av_packet_unref(avci->last_pkt_props);
     }
-    av_fifo_reset(avci->pkt_props);
 
     av_frame_unref(avci->es.in_frame);
     av_packet_unref(avci->in_pkt);
@@ -464,10 +462,9 @@  av_cold int avcodec_close(AVCodecContext *avctx)
         av_frame_free(&avci->buffer_frame);
         av_packet_free(&avci->buffer_pkt);
         if (avci->pkt_props) {
-            while (av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props)) {
+            while (av_fifo_can_read(avci->pkt_props)) {
                 av_packet_unref(avci->last_pkt_props);
-                av_fifo_generic_read(avci->pkt_props, avci->last_pkt_props,
-                                     sizeof(*avci->last_pkt_props), NULL);
+                av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
             }
             av_fifo_freep(&avci->pkt_props);
         }
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index 0912f86a14..9f6f2e7fa6 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -165,26 +165,21 @@  static int extract_packet_props(AVCodecInternal *avci, const AVPacket *pkt)
     int ret = 0;
 
     if (IS_EMPTY(avci->last_pkt_props)) {
-        if (av_fifo_size(avci->pkt_props) >= sizeof(*pkt)) {
-            av_fifo_generic_read(avci->pkt_props, avci->last_pkt_props,
-                                 sizeof(*avci->last_pkt_props), NULL);
+        if (av_fifo_can_read(avci->pkt_props)) {
+            av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
         } else
             return copy_packet_props(avci->last_pkt_props, pkt);
     }
 
-    if (av_fifo_space(avci->pkt_props) < sizeof(*pkt)) {
-        ret = av_fifo_grow(avci->pkt_props, sizeof(*pkt));
-        if (ret < 0)
-            return ret;
-    }
-
     ret = copy_packet_props(&tmp, pkt);
     if (ret < 0)
         return ret;
 
-    av_fifo_generic_write(avci->pkt_props, &tmp, sizeof(tmp), NULL);
+    ret = av_fifo_write(avci->pkt_props, &tmp, 1);
+    if (ret < 0)
+        av_packet_unref(&tmp);
 
-    return 0;
+    return ret;
 }
 
 static int decode_bsfs_init(AVCodecContext *avctx)
@@ -543,9 +538,8 @@  static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
         avci->draining_done = 1;
 
     if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS) &&
-        IS_EMPTY(avci->last_pkt_props) && av_fifo_size(avci->pkt_props) >= sizeof(*avci->last_pkt_props))
-        av_fifo_generic_read(avci->pkt_props,
-                             avci->last_pkt_props, sizeof(*avci->last_pkt_props), NULL);
+        IS_EMPTY(avci->last_pkt_props) && av_fifo_can_read(avci->pkt_props))
+        av_fifo_read(avci->pkt_props, avci->last_pkt_props, 1);
 
     if (!ret) {
         frame->best_effort_timestamp = guess_correct_pts(avctx,