[FFmpeg-devel] [PATCH v3 2/2] avformat: deprecated av_get_frame_filename() and av_get_frame_filename2()

Zhao Zhili quinkblack at foxmail.com
Mon Sep 23 18:17:45 EEST 2024


> On Sep 23, 2024, at 22:25, Filip Mašić <shoutplenty at gmail.com> wrote:
> 
> I don't mind; whatever gets this merged the fastest is best for me. I
> wasn't aware there was an internal header, and I don't know why any of the
> av_get_frame_filename functions are exposed. I'll add some comments
> regardless:
> 
> 1. Even though the function was previously externally documented as taking
> frame numbers, it has been used for timestamps internally for the past 7
> years, so I think updating the external documentation to "any number" makes
> more sense. My patch deprecated all of the old APIs in favour of what we
> now think the new API should be.

It’s a bug of img2enc no one noticed. We try to reduce API changes if possible.

> 
> 2. Was there a reason you didn't update img2enc frame_pts to use the new
> internal function?

Well, git send-email broken suddenly to send patch 2/2. I’m trying to figure out why.

> 
> 3. You might consider the documentation clarifications I made for the
> parameters:
>> + * @param path path with substitution template
>> + * @param number the number to substitute

I have added it to patch v2 1/2 and add co-authored-by you.

By the way, please don’t top-post.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-avformat-internal-Add-ff_get_frame_filename.patch
Type: application/octet-stream
Size: 3071 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20240923/0fdcf9b2/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0002-avformat-img2enc-Fix-integer-truncation-when-frame_p.patch
Type: application/octet-stream
Size: 1701 bytes
Desc: not available
URL: <https://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20240923/0fdcf9b2/attachment-0001.obj>
-------------- next part --------------

> 
> Thanks for the help with this.
> 
> On Mon, 23 Sept 2024 at 13:18, Zhao Zhili <quinkblack at foxmail.com> wrote:
> 
>> 
>> 
>> On Sep 23, 2024, at 18:18, Filip Mašić <shoutplenty at gmail.com> wrote:
>> 
>> ---
>> doc/APIchanges              |  3 ++-
>> libavfilter/vf_signature.c  |  4 ++--
>> libavformat/avformat.h      | 22 ++++++++++++++++++----
>> libavformat/img2dec.c       | 10 +++++-----
>> libavformat/segment.c       |  4 ++--
>> libavformat/utils.c         |  2 +-
>> libavformat/version_major.h |  2 +-
>> libavformat/webm_chunk.c    |  4 ++--
>> 8 files changed, 33 insertions(+), 18 deletions(-)
>> 
>> 
>> The doc of av_get_frame_filename2 says explicitly `number` is `frame
>> number`,
>> I prefer fix img2enc.c over add another API:
>> 
>> https://ffmpeg.org//pipermail/ffmpeg-devel/2024-September/333820.html
>> 
>> 
>> diff --git a/doc/APIchanges b/doc/APIchanges
>> index 9f091f5ec5..cbab71a408 100644
>> --- a/doc/APIchanges
>> +++ b/doc/APIchanges
>> @@ -3,7 +3,8 @@ 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()
>> +  Deprecate av_get_frame_filename(), av_get_frame_filename2(),
>> +  and replace them with av_get_frame_filename3().
>> 
>> 2024-09-18 - xxxxxxxxxx - lavc 61.17.100 - packet.h
>>  Add AV_PKT_DATA_LCEVC.
>> diff --git a/libavfilter/vf_signature.c b/libavfilter/vf_signature.c
>> index f419522ac6..37f3ff227e 100644
>> --- a/libavfilter/vf_signature.c
>> +++ b/libavfilter/vf_signature.c
>> @@ -562,7 +562,7 @@ static int export(AVFilterContext *ctx, StreamContext
>> *sc, int input)
>> 
>>    if (sic->nb_inputs > 1) {
>>        /* error already handled */
>> -        av_assert0(av_get_frame_filename(filename, sizeof(filename),
>> sic->filename, input) == 0);
>> +        av_assert0(av_get_frame_filename3(filename, sizeof(filename),
>> sic->filename, input, 0) == 0);
>>    } else {
>>        if (av_strlcpy(filename, sic->filename, sizeof(filename)) >=
>> sizeof(filename))
>>            return AVERROR(EINVAL);
>> @@ -673,7 +673,7 @@ static av_cold int init(AVFilterContext *ctx)
>>    }
>> 
>>    /* check filename */
>> -    if (sic->nb_inputs > 1 && strlen(sic->filename) > 0 &&
>> av_get_frame_filename(tmp, sizeof(tmp), sic->filename, 0) == -1) {
>> +    if (sic->nb_inputs > 1 && strlen(sic->filename) > 0 &&
>> av_get_frame_filename3(tmp, sizeof(tmp), sic->filename, 0, 0) == -1) {
>>        av_log(ctx, AV_LOG_ERROR, "The filename must contain %%d or %%0nd,
>> if you have more than one input.\n");
>>        return AVERROR(EINVAL);
>>    }
>> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
>> index 1bc0e716dc..a407faecec 100644
>> --- a/libavformat/avformat.h
>> +++ b/libavformat/avformat.h
>> @@ -2940,11 +2940,25 @@ void av_dump_format(AVFormatContext *ic,
>> 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);
>> +#if FF_API_AV_GET_FRAME_FILENAME2
>> +    /**
>> +     * Like av_get_frame_filename3() but requires int-type number
>> +     *
>> +     * @deprecated use av_get_frame_filename3() with same arguments
>> +     */
>> +    attribute_deprecated
>> +    int av_get_frame_filename2(char *buf, int buf_size,
>> +                            const char *path, int number, int flags);
>> 
>> -int av_get_frame_filename(char *buf, int buf_size,
>> -                          const char *path, int number);
>> +    /**
>> +     * Like av_get_frame_filename3() but requires int-type number and
>> doesn't accept flags
>> +     *
>> +     * @deprecated use av_get_frame_filename3() with flags=0
>> +     */
>> +    attribute_deprecated
>> +    int av_get_frame_filename(char *buf, int buf_size,
>> +                            const char *path, int number);
>> +#endif
>> 
>> /**
>> * Check whether filename actually is a numbered sequence generator.
>> diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
>> index 3389fa818e..df376ac612 100644
>> --- a/libavformat/img2dec.c
>> +++ b/libavformat/img2dec.c
>> @@ -122,7 +122,7 @@ static int find_image_range(AVIOContext *pb, int
>> *pfirst_index, int *plast_index
>> 
>>    /* find the first image */
>>    for (first_index = start_index; first_index < start_index +
>> start_index_range; first_index++) {
>> -        if (av_get_frame_filename(buf, sizeof(buf), path, first_index) <
>> 0) {
>> +        if (av_get_frame_filename3(buf, sizeof(buf), path, first_index,
>> 0) < 0) {
>>            *pfirst_index =
>>            *plast_index  = 1;
>>            if (pb || avio_check(buf, AVIO_FLAG_READ) > 0)
>> @@ -144,8 +144,8 @@ static int find_image_range(AVIOContext *pb, int
>> *pfirst_index, int *plast_index
>>                range1 = 1;
>>            else
>>                range1 = 2 * range;
>> -            if (av_get_frame_filename(buf, sizeof(buf), path,
>> -                                      last_index + range1) < 0)
>> +            if (av_get_frame_filename3(buf, sizeof(buf), path,
>> +                                      last_index + range1, 0) < 0)
>>                goto fail;
>>            if (avio_check(buf, AVIO_FLAG_READ) <= 0)
>>                break;
>> @@ -434,9 +434,9 @@ int ff_img_read_packet(AVFormatContext *s1, AVPacket
>> *pkt)
>>            filename = s->globstate.gl_pathv[s->img_number];
>> #endif
>>        } else {
>> -        if (av_get_frame_filename(filename_bytes, sizeof(filename_bytes),
>> +        if (av_get_frame_filename3(filename_bytes, sizeof(filename_bytes),
>>                                  s->path,
>> -                                  s->img_number) < 0 && s->img_number > 1)
>> +                                  s->img_number, 0) < 0 && s->img_number
>>> 1)
>>            return AVERROR(EIO);
>>        }
>>        for (i = 0; i < 3; i++) {
>> diff --git a/libavformat/segment.c b/libavformat/segment.c
>> index 65323ec678..b366f94c43 100644
>> --- a/libavformat/segment.c
>> +++ b/libavformat/segment.c
>> @@ -205,8 +205,8 @@ static int set_segment_filename(AVFormatContext *s)
>>            av_log(oc, AV_LOG_ERROR, "Could not get segment filename with
>> strftime\n");
>>            return AVERROR(EINVAL);
>>        }
>> -    } else if (av_get_frame_filename(buf, sizeof(buf),
>> -                                     s->url, seg->segment_idx) < 0) {
>> +    } else if (av_get_frame_filename3(buf, sizeof(buf),
>> +                                     s->url, seg->segment_idx, 0) < 0) {
>>        av_log(oc, AV_LOG_ERROR, "Invalid segment filename template
>> '%s'\n", s->url);
>>        return AVERROR(EINVAL);
>>    }
>> diff --git a/libavformat/utils.c b/libavformat/utils.c
>> index 0a7ed1a013..39e8d53e8a 100644
>> --- a/libavformat/utils.c
>> +++ b/libavformat/utils.c
>> @@ -116,7 +116,7 @@ int av_filename_number_test(const char *filename)
>> {
>>    char buf[1024];
>>    return filename &&
>> -           (av_get_frame_filename(buf, sizeof(buf), filename, 1) >= 0);
>> +           (av_get_frame_filename3(buf, sizeof(buf), filename, 1, 0) >=
>> 0);
>> }
>> 
>> /**********************************************************/
>> diff --git a/libavformat/version_major.h b/libavformat/version_major.h
>> index 7a9b06703d..d2bd8b5162 100644
>> --- a/libavformat/version_major.h
>> +++ b/libavformat/version_major.h
>> @@ -45,7 +45,7 @@
>> #define FF_API_LAVF_SHORTEST            (LIBAVFORMAT_VERSION_MAJOR < 62)
>> #define FF_API_ALLOW_FLUSH              (LIBAVFORMAT_VERSION_MAJOR < 62)
>> #define FF_API_AVSTREAM_SIDE_DATA       (LIBAVFORMAT_VERSION_MAJOR < 62)
>> -
>> +#define FF_API_AV_GET_FRAME_FILENAME2   (LIBAVFORMAT_VERSION_MAJOR < 62)
>> #define FF_API_GET_DUR_ESTIMATE_METHOD  (LIBAVFORMAT_VERSION_MAJOR < 62)
>> #define FF_API_INTERNAL_TIMING          (LIBAVFORMAT_VERSION_MAJOR < 62)
>> 
>> diff --git a/libavformat/webm_chunk.c b/libavformat/webm_chunk.c
>> index 255b8697c5..aa6572e69f 100644
>> --- a/libavformat/webm_chunk.c
>> +++ b/libavformat/webm_chunk.c
>> @@ -139,8 +139,8 @@ static int get_chunk_filename(AVFormatContext *s, char
>> filename[MAX_FILENAME_SIZ
>>    if (!filename) {
>>        return AVERROR(EINVAL);
>>    }
>> -    if (av_get_frame_filename(filename, MAX_FILENAME_SIZE,
>> -                              s->url, wc->chunk_index - 1) < 0) {
>> +    if (av_get_frame_filename3(filename, MAX_FILENAME_SIZE,
>> +                              s->url, wc->chunk_index - 1, 0) < 0) {
>>        av_log(s, AV_LOG_ERROR, "Invalid chunk filename template '%s'\n",
>> s->url);
>>        return AVERROR(EINVAL);
>>    }
>> --
>> 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".
>> 
>> 
>> 
> _______________________________________________
> 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