diff mbox series

[FFmpeg-devel,1/2] avformat/img2enc: seperate getting frame filename

Message ID 20240915051656.1321991-1-marcus@marcusspencer.xyz
State New
Headers show
Series [FFmpeg-devel,1/2] avformat/img2enc: seperate getting frame filename | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Marcus B Spencer Sept. 15, 2024, 5:15 a.m. UTC
Seperate the action of getting the frame filename in write_packet into
the function ff_img_get_frame_filename.

This for img2-like muxers that need this functionality.

Signed-off-by: Marcus B Spencer <marcus@marcusspencer.xyz>
---
 libavformat/img2.h    |  5 +++++
 libavformat/img2enc.c | 41 +++++++++++++++++++++++++++--------------
 2 files changed, 32 insertions(+), 14 deletions(-)
diff mbox series

Patch

diff --git a/libavformat/img2.h b/libavformat/img2.h
index e98902c96f..292b90bdbf 100644
--- a/libavformat/img2.h
+++ b/libavformat/img2.h
@@ -76,4 +76,9 @@  extern const AVOption ff_img_options[];
 int ff_img_read_header(AVFormatContext *s1);
 
 int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt);
+
+int ff_img_get_frame_filename(AVFormatContext *s, char *filename,
+                              size_t filename_len, int start_img_number,
+                              int img_number);
+
 #endif
diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c
index 526a11e5ee..ec2941e293 100644
--- a/libavformat/img2enc.c
+++ b/libavformat/img2enc.c
@@ -137,6 +137,28 @@  static int write_and_close(AVFormatContext *s, AVIOContext **pb, const unsigned
     return ff_format_io_close(s, pb);
 }
 
+int ff_img_get_frame_filename(AVFormatContext *s, char *filename,
+                              size_t filename_len, int start_img_number,
+                              int img_number)
+{
+    if (av_get_frame_filename2(filename, filename_len, s->url,
+                               img_number,
+                               AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
+        if (img_number == start_img_number) {
+            av_log(s, AV_LOG_WARNING, "The specified filename '%s' does not contain an image sequence pattern or a pattern is invalid.\n", s->url);
+            av_log(s, AV_LOG_WARNING,
+                   "Use a pattern such as %%03d for an image sequence or "
+                   "use the -update option (with -frames:v 1 if needed) to write a single image.\n");
+            av_strlcpy(filename, s->url, filename_len);
+        } else {
+            av_log(s, AV_LOG_ERROR, "Cannot write more than one file with the same name. Are you missing the -update option or a sequence pattern?\n");
+            return AVERROR(EINVAL);
+        }
+    }
+
+    return 0;
+}
+
 static int write_packet(AVFormatContext *s, AVPacket *pkt)
 {
     VideoMuxData *img = s->priv_data;
@@ -164,20 +186,11 @@  static int write_packet(AVFormatContext *s, AVPacket *pkt)
             av_log(s, AV_LOG_ERROR, "Cannot write filename by pts of the frames.");
             return AVERROR(EINVAL);
         }
-    } else if (av_get_frame_filename2(filename, sizeof(filename), s->url,
-                                      img->img_number,
-                                      AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) {
-        if (img->img_number == img->start_img_number) {
-            av_log(s, AV_LOG_WARNING, "The specified filename '%s' does not contain an image sequence pattern or a pattern is invalid.\n", s->url);
-            av_log(s, AV_LOG_WARNING,
-                   "Use a pattern such as %%03d for an image sequence or "
-                   "use the -update option (with -frames:v 1 if needed) to write a single image.\n");
-            av_strlcpy(filename, s->url, sizeof(filename));
-        } else {
-            av_log(s, AV_LOG_ERROR, "Cannot write more than one file with the same name. Are you missing the -update option or a sequence pattern?\n");
-            return AVERROR(EINVAL);
-        }
-    }
+    } else if ((ret = ff_img_get_frame_filename(s, filename, sizeof(filename),
+                                                img->start_img_number,
+                                                img->img_number)) < 0)
+        return ret;
+
     for (i = 0; i < 4; i++) {
         av_dict_copy(&options, img->protocol_opts, 0);
         snprintf(img->tmp[i], sizeof(img->tmp[i]), "%s.tmp", filename);