Message ID | 20240919162517.48-1-shoutplenty@gmail.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,v2] avformat/utils: added av_get_frame_filename3() (changed parameter int -> int64_t) | 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 |
Any mergers in the chat? If I'm understanding correctly, all you need to do for this one is compile it and run the sample command in issue #11194 (or better yet, the one in https://superuser.com/a/1854641 that cross-references it against vf=drawtext), and maybe also omit the frame_pts option to check that's fine as well. Please lmk what's next. If you need me to test it, I think all I'm stuck on is the configure flags for including image2 in the build but who knows, there could be more impediments. Previous review: https://ffmpeg.org//pipermail/ffmpeg-devel/2024-September/333651.html I seem to have been lucky to avoid needing to rebase my changelogs 3 times so that's also ready to go :D. Thanks for your service. On Thu, 19 Sept 2024 at 17:25, Filip Mašić <shoutplenty@gmail.com> wrote: > Resolves an integer overflow with the frame_pts option (issue 11194). > > Signed-off-by: Filip Mašić <shoutplenty@gmail.com> > --- > doc/APIchanges | 3 +++ > libavformat/avformat.h | 5 ++++- > libavformat/img2enc.c | 6 ++---- > libavformat/utils.c | 12 +++++++++--- > 4 files changed, 18 insertions(+), 8 deletions(-) > > diff --git a/doc/APIchanges b/doc/APIchanges > index 81537fea09..d821f5d496 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -2,6 +2,9 @@ The last version increases of all libraries were on > 2024-03-07 > > API changes, most recent first: > > +2024-09-xx - xxxxxxxxxx - lavf 61.6.100 - avformat.h > + Add av_get_frame_filename3() > + > 2024-09-18 - xxxxxxxxxx - lavc 61.17.100 - packet.h > Add AV_PKT_DATA_LCEVC. > > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 56c1c80289..a2ef209e35 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -2933,10 +2933,13 @@ void av_dump_format(AVFormatContext *ic, > * @param buf destination buffer > * @param buf_size destination buffer size > * @param path numbered sequence string > - * @param number frame number > + * @param number frame number (or pts if frame_pts option passed) > * @param flags AV_FRAME_FILENAME_FLAGS_* > * @return 0 if OK, -1 on format error > */ > +int av_get_frame_filename3(char *buf, int buf_size, > + const char *path, int64_t number, int flags); > + > int av_get_frame_filename2(char *buf, int buf_size, > const char *path, int number, int flags); > > diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c > index 526a11e5ee..460e6a38bd 100644 > --- a/libavformat/img2enc.c > +++ b/libavformat/img2enc.c > @@ -160,13 +160,11 @@ static int write_packet(AVFormatContext *s, AVPacket > *pkt) > return AVERROR(EINVAL); > } > } else if (img->frame_pts) { > - if (av_get_frame_filename2(filename, sizeof(filename), s->url, > pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) { > + if (av_get_frame_filename3(filename, sizeof(filename), s->url, > pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) { > 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) { > + } else if (av_get_frame_filename3(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, > diff --git a/libavformat/utils.c b/libavformat/utils.c > index e9ded627ad..0a7ed1a013 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -19,6 +19,7 @@ > * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > 02110-1301 USA > */ > > +#include <inttypes.h> > #include <stdint.h> > > #include "config.h" > @@ -280,7 +281,7 @@ uint64_t ff_parse_ntp_time(uint64_t ntp_ts) > return (sec * 1000000) + usec; > } > > -int av_get_frame_filename2(char *buf, int buf_size, const char *path, int > number, int flags) > +int av_get_frame_filename3(char *buf, int buf_size, const char *path, > int64_t number, int flags) > { > const char *p; > char *q, buf1[20], c; > @@ -313,7 +314,7 @@ int av_get_frame_filename2(char *buf, int buf_size, > const char *path, int number > percentd_found = 1; > if (number < 0) > nd += 1; > - snprintf(buf1, sizeof(buf1), "%0*d", nd, number); > + snprintf(buf1, sizeof(buf1), "%0*"PRId64, nd, number); > len = strlen(buf1); > if ((q - buf + len) > buf_size - 1) > goto fail; > @@ -338,9 +339,14 @@ fail: > return -1; > } > > +int av_get_frame_filename2(char *buf, int buf_size, const char *path, int > number, int flags) > +{ > + return av_get_frame_filename3(buf, buf_size, path, number, flags); > +} > + > int av_get_frame_filename(char *buf, int buf_size, const char *path, int > number) > { > - return av_get_frame_filename2(buf, buf_size, path, number, 0); > + return av_get_frame_filename3(buf, buf_size, path, number, 0); > } > > void av_url_split(char *proto, int proto_size, > -- > 2.46.0.windows.1 > >
Quoting Filip Mašić (2024-09-19 18:23:27) > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 56c1c80289..a2ef209e35 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -2933,10 +2933,13 @@ void av_dump_format(AVFormatContext *ic, > * @param buf destination buffer > * @param buf_size destination buffer size > * @param path numbered sequence string > - * @param number frame number > + * @param number frame number (or pts if frame_pts option passed) The frame_pts option is specific to img2enc, which is not the only caller of this function. > * @param flags AV_FRAME_FILENAME_FLAGS_* > * @return 0 if OK, -1 on format error > */ > +int av_get_frame_filename3(char *buf, int buf_size, > + const char *path, int64_t number, int flags); > + > int av_get_frame_filename2(char *buf, int buf_size, > const char *path, int number, int flags); av_get_frame_filename2() is now undocumented. It should probably be deprecated.
diff --git a/doc/APIchanges b/doc/APIchanges index 81537fea09..d821f5d496 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,9 @@ The last version increases of all libraries were on 2024-03-07 API changes, most recent first: +2024-09-xx - xxxxxxxxxx - lavf 61.6.100 - avformat.h + Add av_get_frame_filename3() + 2024-09-18 - xxxxxxxxxx - lavc 61.17.100 - packet.h Add AV_PKT_DATA_LCEVC. diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 56c1c80289..a2ef209e35 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -2933,10 +2933,13 @@ void av_dump_format(AVFormatContext *ic, * @param buf destination buffer * @param buf_size destination buffer size * @param path numbered sequence string - * @param number frame number + * @param number frame number (or pts if frame_pts option passed) * @param flags AV_FRAME_FILENAME_FLAGS_* * @return 0 if OK, -1 on format error */ +int av_get_frame_filename3(char *buf, int buf_size, + const char *path, int64_t number, int flags); + int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags); diff --git a/libavformat/img2enc.c b/libavformat/img2enc.c index 526a11e5ee..460e6a38bd 100644 --- a/libavformat/img2enc.c +++ b/libavformat/img2enc.c @@ -160,13 +160,11 @@ static int write_packet(AVFormatContext *s, AVPacket *pkt) return AVERROR(EINVAL); } } else if (img->frame_pts) { - if (av_get_frame_filename2(filename, sizeof(filename), s->url, pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) { + if (av_get_frame_filename3(filename, sizeof(filename), s->url, pkt->pts, AV_FRAME_FILENAME_FLAGS_MULTIPLE) < 0) { 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) { + } else if (av_get_frame_filename3(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, diff --git a/libavformat/utils.c b/libavformat/utils.c index e9ded627ad..0a7ed1a013 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include <inttypes.h> #include <stdint.h> #include "config.h" @@ -280,7 +281,7 @@ uint64_t ff_parse_ntp_time(uint64_t ntp_ts) return (sec * 1000000) + usec; } -int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags) +int av_get_frame_filename3(char *buf, int buf_size, const char *path, int64_t number, int flags) { const char *p; char *q, buf1[20], c; @@ -313,7 +314,7 @@ int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number percentd_found = 1; if (number < 0) nd += 1; - snprintf(buf1, sizeof(buf1), "%0*d", nd, number); + snprintf(buf1, sizeof(buf1), "%0*"PRId64, nd, number); len = strlen(buf1); if ((q - buf + len) > buf_size - 1) goto fail; @@ -338,9 +339,14 @@ fail: return -1; } +int av_get_frame_filename2(char *buf, int buf_size, const char *path, int number, int flags) +{ + return av_get_frame_filename3(buf, buf_size, path, number, flags); +} + int av_get_frame_filename(char *buf, int buf_size, const char *path, int number) { - return av_get_frame_filename2(buf, buf_size, path, number, 0); + return av_get_frame_filename3(buf, buf_size, path, number, 0); } void av_url_split(char *proto, int proto_size,
Resolves an integer overflow with the frame_pts option (issue 11194). Signed-off-by: Filip Mašić <shoutplenty@gmail.com> --- doc/APIchanges | 3 +++ libavformat/avformat.h | 5 ++++- libavformat/img2enc.c | 6 ++---- libavformat/utils.c | 12 +++++++++--- 4 files changed, 18 insertions(+), 8 deletions(-)