[FFmpeg-cvslog] avcodec/mpegvideo_enc: Factor setting length of B frame chain out

Andreas Rheinhardt git at videolan.org
Wed Jun 12 14:15:58 EEST 2024


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Mon Oct  9 00:44:58 2023 +0200| [17b5fc2e51a3bb5a7fc10cbd177d88ef1c025527] | committer: Andreas Rheinhardt

avcodec/mpegvideo_enc: Factor setting length of B frame chain out

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 at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=17b5fc2e51a3bb5a7fc10cbd177d88ef1c025527
---

 libavcodec/mpegvideo_enc.c | 33 +++++++++++++++++++++++++--------
 1 file changed, 25 insertions(+), 8 deletions(-)

diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index b87f03d303..60710eee98 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]) {



More information about the ffmpeg-cvslog mailing list