diff mbox series

[FFmpeg-devel,33/57] avcodec/mpegvideo_enc: Factor setting length of B frame chain out

Message ID AS8P250MB0744F7658585231D26CB9A5A8F1B2@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM
State Superseded
Headers show
Series [FFmpeg-devel,01/14] avcodec/get_buffer: Remove redundant check | expand

Commit Message

Andreas Rheinhardt April 29, 2024, 9:14 p.m. UTC
It already avoids a goto and will be useful in the future
to be able to specify each functions tasks and obligations.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
---
 libavcodec/mpegvideo_enc.c | 33 +++++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)
diff mbox series

Patch

diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 066dca9ac5..c0b7769ccd 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -1472,13 +1472,15 @@  fail:
     return best_b_count;
 }
 
-static int select_input_picture(MpegEncContext *s)
+/**
+ * Determines whether an input picture is discarded or not
+ * and if not determines the length of the next chain of B frames
+ * and puts these pictures (including the P frame) into
+ * reordered_input_picture.
+ */
+static int set_bframe_chain_length(MpegEncContext *s)
 {
-    int i, ret;
-
-    for (int i = 1; i <= MAX_B_FRAMES; i++)
-        s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
-    s->reordered_input_picture[MAX_B_FRAMES] = NULL;
+    int i;
 
     /* set next picture type & ordering */
     if (!s->reordered_input_picture[0] && s->input_picture[0]) {
@@ -1491,7 +1493,7 @@  static int select_input_picture(MpegEncContext *s)
 
                 ff_vbv_update(s, 0);
 
-                goto no_output_pic;
+                return 0;
             }
         }
 
@@ -1598,7 +1600,22 @@  static int select_input_picture(MpegEncContext *s)
             }
         }
     }
-no_output_pic:
+
+    return 0;
+}
+
+static int select_input_picture(MpegEncContext *s)
+{
+    int ret;
+
+    for (int i = 1; i <= MAX_B_FRAMES; i++)
+        s->reordered_input_picture[i - 1] = s->reordered_input_picture[i];
+    s->reordered_input_picture[MAX_B_FRAMES] = NULL;
+
+    ret = set_bframe_chain_length(s);
+    if (ret < 0)
+        return ret;
+
     av_frame_unref(s->new_pic);
 
     if (s->reordered_input_picture[0]) {