[FFmpeg-devel] [PATCH v2 15/22] avformat/avio: Constify data pointees of write callbacks
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Thu Sep 7 04:05:31 EEST 2023
They are currently non-const for reasons unknown, although
avio_write() accepts a const buffer.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
---
rtmpcrypt.c sometimes modifies the buffer whose content
it is supposed to write.
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_major.h | 1 +
9 files changed, 70 insertions(+)
diff --git a/doc/APIchanges b/doc/APIchanges
index 762c2d6628..963ad477bf 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.xx.100 - avio.h
+ Constify the buffer pointees in the write_packet and write_data_type
+ callbacks of AVIOContext.
+
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 5e1acba31b..053cb2e05a 100644
--- a/libavformat/avio.c
+++ b/libavformat/avio.c
@@ -421,7 +421,11 @@ int ffurl_read_complete(URLContext *h, unsigned char *buf, int size)
h->prot->url_read, NULL, 1);
}
+#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 bba1a9a1df..f0327218d4 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_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
--
2.34.1
More information about the ffmpeg-devel
mailing list