@@ -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
@@ -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);
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(-)