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