From 1c0532d20ce6f56902c94913dc6d8b5d7a714de9 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> Date: Sat, 15 Mar 2025 22:10:44 +0100 Subject: [PATCH 1/2] avutil/dict: Unavpriv avpriv_dict_set_timestamp() And move it to lavf, its only user. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavformat/flvdec.c | 3 +-- libavformat/ifv.c | 3 +-- libavformat/internal.h | 11 +++++++++++ libavformat/matroskadec.c | 3 +-- libavformat/mov.c | 3 +-- libavformat/mux_utils.c | 3 +-- libavformat/mxfdec.c | 3 +-- libavformat/utils.c | 19 +++++++++++++++++++ libavutil/dict.c | 18 ------------------ libavutil/dict_internal.h | 37 ------------------------------------- 10 files changed, 36 insertions(+), 67 deletions(-) delete mode 100644 libavutil/dict_internal.h diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index c51f64a588..b90ed34b1c 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -28,7 +28,6 @@ #include "libavutil/avstring.h" #include "libavutil/channel_layout.h" #include "libavutil/dict.h" -#include "libavutil/dict_internal.h" #include "libavutil/mem.h" #include "libavutil/opt.h" #include "libavutil/internal.h" @@ -826,7 +825,7 @@ static int amf_parse_object(AVFormatContext *s, AVStream *astream, ) { // timezone is ignored, since there is no easy way to offset the UTC // timestamp into the specified timezone - avpriv_dict_set_timestamp(&s->metadata, key, 1000 * (int64_t)date.milliseconds); + ff_dict_set_timestamp(&s->metadata, key, 1000 * (int64_t)date.milliseconds); } } diff --git a/libavformat/ifv.c b/libavformat/ifv.c index 0cfd2763a9..f0263ed3b4 100644 --- a/libavformat/ifv.c +++ b/libavformat/ifv.c @@ -21,7 +21,6 @@ */ #include "libavutil/channel_layout.h" -#include "libavutil/dict_internal.h" #include "avformat.h" #include "demux.h" #include "internal.h" @@ -96,7 +95,7 @@ static int parse_header(AVFormatContext *s) uint32_t vid_magic; avio_skip(s->pb, 0x34); - avpriv_dict_set_timestamp(&s->metadata, "creation_time", avio_rl32(s->pb) * 1000000LL); + ff_dict_set_timestamp(&s->metadata, "creation_time", avio_rl32(s->pb) * 1000000LL); avio_skip(s->pb, 0x24); ifv->width = avio_rl16(s->pb); diff --git a/libavformat/internal.h b/libavformat/internal.h index b909adf209..1cf162c2bd 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -651,4 +651,15 @@ int ff_match_url_ext(const char *url, const char *extensions); int ff_get_frame_filename(char *buf, int buf_size, const char *path, int64_t number, int flags); +/** + * Set a dictionary value to an ISO-8601 compliant timestamp string. + * + * @param dict pointer to a pointer to a dictionary struct. If *dict is NULL + * a dictionary struct is allocated and put in *dict. + * @param key metadata key + * @param timestamp unix timestamp in microseconds + * @return <0 on error + */ +int ff_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp); + #endif /* AVFORMAT_INTERNAL_H */ diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index efa3e44c85..d4b7ae112c 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -38,7 +38,6 @@ #include "libavutil/base64.h" #include "libavutil/bprint.h" #include "libavutil/dict.h" -#include "libavutil/dict_internal.h" #include "libavutil/display.h" #include "libavutil/hdr_dynamic_metadata.h" #include "libavutil/intfloat.h" @@ -2137,7 +2136,7 @@ static int matroska_aac_sri(int samplerate) static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc) { /* Convert to seconds and adjust by number of seconds between 2001-01-01 and Epoch */ - avpriv_dict_set_timestamp(metadata, "creation_time", date_utc / 1000 + 978307200000000LL); + ff_dict_set_timestamp(metadata, "creation_time", date_utc / 1000 + 978307200000000LL); } static int matroska_parse_flac(AVFormatContext *s, diff --git a/libavformat/mov.c b/libavformat/mov.c index 57d9364ea2..cb96521e81 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -32,7 +32,6 @@ #include "libavutil/attributes.h" #include "libavutil/bprint.h" #include "libavutil/channel_layout.h" -#include "libavutil/dict_internal.h" #include "libavutil/internal.h" #include "libavutil/intreadwrite.h" #include "libavutil/intfloat.h" @@ -1858,7 +1857,7 @@ static void mov_metadata_creation_time(MOVContext *c, AVIOContext *pb, AVDiction return; } - avpriv_dict_set_timestamp(metadata, "creation_time", time * 1000000); + ff_dict_set_timestamp(metadata, "creation_time", time * 1000000); } } diff --git a/libavformat/mux_utils.c b/libavformat/mux_utils.c index ed1242a6a2..86d333dbe7 100644 --- a/libavformat/mux_utils.c +++ b/libavformat/mux_utils.c @@ -20,7 +20,6 @@ */ #include "libavutil/dict.h" -#include "libavutil/dict_internal.h" #include "libavutil/internal.h" #include "libavutil/log.h" #include "libavutil/mem.h" @@ -157,6 +156,6 @@ int ff_standardize_creation_time(AVFormatContext *s) int64_t timestamp; int ret = ff_parse_creation_time_metadata(s, ×tamp, 0); if (ret == 1) - return avpriv_dict_set_timestamp(&s->metadata, "creation_time", timestamp); + return ff_dict_set_timestamp(&s->metadata, "creation_time", timestamp); return ret; } diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 3b87063c3f..1978b2cec5 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -56,7 +56,6 @@ #include "libavcodec/defs.h" #include "libavcodec/internal.h" #include "libavutil/channel_layout.h" -#include "libavutil/dict_internal.h" #include "libavutil/intreadwrite.h" #include "libavutil/parseutils.h" #include "libavutil/timecode.h" @@ -3207,7 +3206,7 @@ static int64_t mxf_timestamp_to_int64(uint64_t timestamp) #define SET_TS_METADATA(pb, name, var, str) do { \ var = avio_rb64(pb); \ - if (var && (ret = avpriv_dict_set_timestamp(&s->metadata, name, mxf_timestamp_to_int64(var))) < 0) \ + if (var && (ret = ff_dict_set_timestamp(&s->metadata, name, mxf_timestamp_to_int64(var))) < 0) \ return ret; \ } while (0) diff --git a/libavformat/utils.c b/libavformat/utils.c index e892e8bde7..eee7b9e0e3 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -20,14 +20,17 @@ */ #include <stdint.h> +#include <time.h> #include "config.h" #include "libavutil/avstring.h" #include "libavutil/bprint.h" +#include "libavutil/dict.h" #include "libavutil/internal.h" #include "libavutil/mem.h" #include "libavutil/time.h" +#include "libavutil/time_internal.h" #include "libavcodec/internal.h" @@ -596,3 +599,19 @@ int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf par->extradata_size = buf->len; return 0; } + +int ff_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp) +{ + time_t seconds = timestamp / 1000000; + struct tm *ptm, tmbuf; + ptm = gmtime_r(&seconds, &tmbuf); + if (ptm) { + char buf[32]; + if (!strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", ptm)) + return AVERROR_EXTERNAL; + av_strlcatf(buf, sizeof(buf), ".%06dZ", (int)(timestamp % 1000000)); + return av_dict_set(dict, key, buf, 0); + } else { + return AVERROR_EXTERNAL; + } +} diff --git a/libavutil/dict.c b/libavutil/dict.c index 6fb09399ba..a5fa2d3bfa 100644 --- a/libavutil/dict.c +++ b/libavutil/dict.c @@ -25,10 +25,8 @@ #include "avassert.h" #include "avstring.h" #include "dict.h" -#include "dict_internal.h" #include "error.h" #include "mem.h" -#include "time_internal.h" #include "bprint.h" struct AVDictionary { @@ -274,19 +272,3 @@ int av_dict_get_string(const AVDictionary *m, char **buffer, } return av_bprint_finalize(&bprint, buffer); } - -int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp) -{ - time_t seconds = timestamp / 1000000; - struct tm *ptm, tmbuf; - ptm = gmtime_r(&seconds, &tmbuf); - if (ptm) { - char buf[32]; - if (!strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", ptm)) - return AVERROR_EXTERNAL; - av_strlcatf(buf, sizeof(buf), ".%06dZ", (int)(timestamp % 1000000)); - return av_dict_set(dict, key, buf, 0); - } else { - return AVERROR_EXTERNAL; - } -} diff --git a/libavutil/dict_internal.h b/libavutil/dict_internal.h deleted file mode 100644 index 6d5b0dc2b0..0000000000 --- a/libavutil/dict_internal.h +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#ifndef AVUTIL_DICT_INTERNAL_H -#define AVUTIL_DICT_INTERNAL_H - -#include <stdint.h> - -#include "dict.h" - -/** - * Set a dictionary value to an ISO-8601 compliant timestamp string. - * - * @param dict pointer to a pointer to a dictionary struct. If *dict is NULL - * a dictionary struct is allocated and put in *dict. - * @param key metadata key - * @param timestamp unix timestamp in microseconds - * @return <0 on error - */ -int avpriv_dict_set_timestamp(AVDictionary **dict, const char *key, int64_t timestamp); - -#endif /* AVUTIL_DICT_INTERNAL_H */ -- 2.45.2