[FFmpeg-devel] [PATCH v3 1/2] avformat/utils: added av_get_frame_filename3() (changed parameter int -> int64_t)
Marton Balint
cus at passwd.hu
Wed Sep 25 11:42:19 EEST 2024
On Mon, 23 Sep 2024, Filip Mašić wrote:
> Resolves an integer overflow with the frame_pts option (issue 11194).
>
> Signed-off-by: Filip Mašić <shoutplenty at gmail.com>
> ---
> doc/APIchanges | 3 +++
> libavformat/avformat.h | 7 +++++--
> libavformat/img2enc.c | 6 ++----
> libavformat/utils.c | 12 +++++++++---
> libavformat/version.h | 2 +-
> 5 files changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 81537fea09..9f091f5ec5 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.7.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..1bc0e716dc 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -2932,11 +2932,14 @@ 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 path path with substitution template
> + * @param number the number to substitute
> * @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);
> +
In general AVBPrint based API for functions like this is preferred to
discuourage users from limiting the filenames to a fixed size (which
usually becomes a limitation sooner or later).
E.g: av_get_frame_filename_bprint()
Regards,
Marton
> 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,
> diff --git a/libavformat/version.h b/libavformat/version.h
> index 4bde82abb4..70c554c19c 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -31,7 +31,7 @@
>
> #include "version_major.h"
>
> -#define LIBAVFORMAT_VERSION_MINOR 6
> +#define LIBAVFORMAT_VERSION_MINOR 7
> #define LIBAVFORMAT_VERSION_MICRO 100
>
> #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
> --
> 2.46.0.windows.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list