From 2a68d945cd74265bb71c3d38b7a2e7f7d7e87be5 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Wed, 6 Sep 2023 20:30:08 +0200 Subject: [PATCH] avformat/avio: Constify data pointees of write callbacks They are currently non-const for reasons unknown, although avio_write() accepts a const buffer. Reviewed-by: Anton Khirnov Signed-off-by: Andreas Rheinhardt --- doc/APIchanges | 4 ++++ libavformat/avio.c | 4 ++++ libavformat/avio.h | 13 +++++++++++++ libavformat/avio_internal.h | 4 ++++ libavformat/aviobuf.c | 28 ++++++++++++++++++++++++++++ libavformat/hdsenc.c | 4 ++++ libavformat/smoothstreamingenc.c | 4 ++++ libavformat/url.h | 8 ++++++++ libavformat/version.h | 2 +- libavformat/version_major.h | 1 + 10 files changed, 71 insertions(+), 1 deletion(-) diff --git a/doc/APIchanges b/doc/APIchanges index 762c2d6628..51586d628f 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -2,6 +2,10 @@ The last version increases of all libraries were on 2023-02-09 API changes, most recent first: +2023-09-07 - xxxxxxxxxx - lavf 60.12.100 - avio.h + Constify the buffer pointees in the write_packet and write_data_type + callbacks of AVIOContext on the next major bump. + 2023-09-07 - xxxxxxxxxx - lavc 60.26.100 - defs.h Add AV_PROFILE_* and AV_LEVEL_* replacements in defs.h for the defines from avcodec.h. The latter are deprecated. diff --git a/libavformat/avio.c b/libavformat/avio.c index 36bee0fa55..b6a192892a 100644 --- a/libavformat/avio.c +++ b/libavformat/avio.c @@ -408,7 +408,11 @@ int ffurl_read_complete(URLContext *h, unsigned char *buf, int size) return retry_transfer_wrapper(h, buf, size, size, h->prot->url_read); } +#if FF_API_AVIO_WRITE_NONCONST int ffurl_write2(void *urlcontext, uint8_t *buf, int size) +#else +int ffurl_write2(void *urlcontext, const uint8_t *buf, int size) +#endif { URLContext *h = urlcontext; diff --git a/libavformat/avio.h b/libavformat/avio.h index 5f13e0622d..887a397c37 100644 --- a/libavformat/avio.h +++ b/libavformat/avio.h @@ -238,7 +238,11 @@ typedef struct AVIOContext { void *opaque; /**< A private pointer, passed to the read/write/seek/... functions. */ int (*read_packet)(void *opaque, uint8_t *buf, int buf_size); +#if FF_API_AVIO_WRITE_NONCONST int (*write_packet)(void *opaque, uint8_t *buf, int buf_size); +#else + int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size); +#endif int64_t (*seek)(void *opaque, int64_t offset, int whence); int64_t pos; /**< position in the file of the current buffer */ int eof_reached; /**< true if was unable to read due to error or eof */ @@ -286,8 +290,13 @@ typedef struct AVIOContext { /** * A callback that is used instead of write_packet. */ +#if FF_API_AVIO_WRITE_NONCONST int (*write_data_type)(void *opaque, uint8_t *buf, int buf_size, enum AVIODataMarkerType type, int64_t time); +#else + int (*write_data_type)(void *opaque, const uint8_t *buf, int buf_size, + enum AVIODataMarkerType type, int64_t time); +#endif /** * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT, * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly @@ -407,7 +416,11 @@ AVIOContext *avio_alloc_context( int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), +#if FF_API_AVIO_WRITE_NONCONST int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), +#else + int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size), +#endif int64_t (*seek)(void *opaque, int64_t offset, int whence)); /** diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h index aef6ab660e..bd58499b64 100644 --- a/libavformat/avio_internal.h +++ b/libavformat/avio_internal.h @@ -89,7 +89,11 @@ void ffio_init_context(FFIOContext *s, int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), +#if FF_API_AVIO_WRITE_NONCONST int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), +#else + int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size), +#endif int64_t (*seek)(void *opaque, int64_t offset, int whence)); /** diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index ad5827f216..c55fe8a837 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -84,7 +84,11 @@ void ffio_init_context(FFIOContext *ctx, int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), +#if FF_API_AVIO_WRITE_NONCONST int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), +#else + int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size), +#endif int64_t (*seek)(void *opaque, int64_t offset, int whence)) { AVIOContext *const s = &ctx->pub; @@ -143,7 +147,11 @@ AVIOContext *avio_alloc_context( int write_flag, void *opaque, int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), +#if FF_API_AVIO_WRITE_NONCONST int (*write_packet)(void *opaque, uint8_t *buf, int buf_size), +#else + int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size), +#endif int64_t (*seek)(void *opaque, int64_t offset, int whence)) { FFIOContext *s = av_malloc(sizeof(*s)); @@ -165,12 +173,20 @@ static void writeout(AVIOContext *s, const uint8_t *data, int len) if (!s->error) { int ret = 0; if (s->write_data_type) +#if FF_API_AVIO_WRITE_NONCONST ret = s->write_data_type(s->opaque, (uint8_t *)data, +#else + ret = s->write_data_type(s->opaque, data, +#endif len, ctx->current_type, ctx->last_time); else if (s->write_packet) +#if FF_API_AVIO_WRITE_NONCONST ret = s->write_packet(s->opaque, (uint8_t *)data, len); +#else + ret = s->write_packet(s->opaque, data, len); +#endif if (ret < 0) { s->error = ret; } else { @@ -1396,7 +1412,11 @@ typedef struct DynBuffer { uint8_t io_buffer[1]; } DynBuffer; +#if FF_API_AVIO_WRITE_NONCONST static int dyn_buf_write(void *opaque, uint8_t *buf, int buf_size) +#else +static int dyn_buf_write(void *opaque, const uint8_t *buf, int buf_size) +#endif { DynBuffer *d = opaque; unsigned new_size; @@ -1428,7 +1448,11 @@ static int dyn_buf_write(void *opaque, uint8_t *buf, int buf_size) return buf_size; } +#if FF_API_AVIO_WRITE_NONCONST static int dyn_packet_buf_write(void *opaque, uint8_t *buf, int buf_size) +#else +static int dyn_packet_buf_write(void *opaque, const uint8_t *buf, int buf_size) +#endif { unsigned char buf1[4]; int ret; @@ -1565,7 +1589,11 @@ void ffio_free_dyn_buf(AVIOContext **s) avio_context_free(s); } +#if FF_API_AVIO_WRITE_NONCONST static int null_buf_write(void *opaque, uint8_t *buf, int buf_size) +#else +static int null_buf_write(void *opaque, const uint8_t *buf, int buf_size) +#endif { DynBuffer *d = opaque; diff --git a/libavformat/hdsenc.c b/libavformat/hdsenc.c index 080a873ee8..7062441b70 100644 --- a/libavformat/hdsenc.c +++ b/libavformat/hdsenc.c @@ -112,7 +112,11 @@ static int parse_header(OutputStream *os, const uint8_t *buf, int buf_size) return 0; } +#if FF_API_AVIO_WRITE_NONCONST static int hds_write(void *opaque, uint8_t *buf, int buf_size) +#else +static int hds_write(void *opaque, const uint8_t *buf, int buf_size) +#endif { OutputStream *os = opaque; if (os->out) { diff --git a/libavformat/smoothstreamingenc.c b/libavformat/smoothstreamingenc.c index 3c050ca54e..0379e9a079 100644 --- a/libavformat/smoothstreamingenc.c +++ b/libavformat/smoothstreamingenc.c @@ -75,7 +75,11 @@ typedef struct SmoothStreamingContext { int nb_fragments; } SmoothStreamingContext; +#if FF_API_AVIO_WRITE_NONCONST static int ism_write(void *opaque, uint8_t *buf, int buf_size) +#else +static int ism_write(void *opaque, const uint8_t *buf, int buf_size) +#endif { OutputStream *os = opaque; if (os->out) diff --git a/libavformat/url.h b/libavformat/url.h index ab97160cb7..59d9f1b870 100644 --- a/libavformat/url.h +++ b/libavformat/url.h @@ -194,7 +194,11 @@ static inline int ffurl_read(URLContext *h, uint8_t *buf, int size) */ int ffurl_read_complete(URLContext *h, unsigned char *buf, int size); +#if FF_API_AVIO_WRITE_NONCONST int ffurl_write2(void *urlcontext, uint8_t *buf, int size); +#else +int ffurl_write2(void *urlcontext, const uint8_t *buf, int size); +#endif /** * Write size bytes from buf to the resource accessed by h. * @@ -203,7 +207,11 @@ int ffurl_write2(void *urlcontext, uint8_t *buf, int size); */ static inline int ffurl_write(URLContext *h, const uint8_t *buf, int size) { +#if FF_API_AVIO_WRITE_NONCONST return ffurl_write2(h, (uint8_t*)buf, size); +#else + return ffurl_write2(h, buf, size); +#endif } int64_t ffurl_seek2(void *urlcontext, int64_t pos, int whence); diff --git a/libavformat/version.h b/libavformat/version.h index 1055753772..cb67e0a1f8 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -31,7 +31,7 @@ #include "version_major.h" -#define LIBAVFORMAT_VERSION_MINOR 11 +#define LIBAVFORMAT_VERSION_MINOR 12 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ diff --git a/libavformat/version_major.h b/libavformat/version_major.h index 293fbd3397..1b43fe64cb 100644 --- a/libavformat/version_major.h +++ b/libavformat/version_major.h @@ -45,6 +45,7 @@ #define FF_API_GET_END_PTS (LIBAVFORMAT_VERSION_MAJOR < 61) #define FF_API_AVIODIRCONTEXT (LIBAVFORMAT_VERSION_MAJOR < 61) #define FF_API_AVFORMAT_IO_CLOSE (LIBAVFORMAT_VERSION_MAJOR < 61) +#define FF_API_AVIO_WRITE_NONCONST (LIBAVFORMAT_VERSION_MAJOR < 61) #define FF_API_R_FRAME_RATE 1