diff mbox series

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

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

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Marcus B Spencer Sept. 23, 2024, 3:38 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>
---
Identical to v1.

 libavformat/img2.h    |  5 +++++
 libavformat/img2enc.c | 41 +++++++++++++++++++++++++++--------------
 2 files changed, 32 insertions(+), 14 deletions(-)

Comments

Marton Balint Sept. 25, 2024, 7:55 a.m. UTC | #1
On Sun, 22 Sep 2024, Marcus B Spencer wrote:

> 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.

But why don't you simply extend img2 muxer/demuxer with this image format? 
That seems the right place, not a separate demuxer / demuxer.

Thanks,
Marton

>
> Signed-off-by: Marcus B Spencer <marcus@marcusspencer.xyz>
> ---
> Identical to v1.
>
> libavformat/img2.h    |  5 +++++
> libavformat/img2enc.c | 41 +++++++++++++++++++++++++++--------------
> 2 files changed, 32 insertions(+), 14 deletions(-)
>
> 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);
> -- 
> 2.46.1
>
> _______________________________________________
> 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/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);