diff --git a/libavformat/av1.c b/libavformat/av1.c index 4ff4bffddf..876fd92733 100644 --- a/libavformat/av1.c +++ b/libavformat/av1.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/avassert.h" #include "libavutil/mem.h" #include "libavcodec/av1.h" #include "libavcodec/av1_parse.h" @@ -48,7 +49,8 @@ int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size) case AV1_OBU_PADDING: break; default: - avio_write(pb, buf, len); + if (pb) + avio_write(pb, buf, len); size += len; break; } @@ -58,23 +60,31 @@ int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size) return size; } -int ff_av1_filter_obus_buf(const uint8_t *buf, uint8_t **out, int *size) +int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out, int *size) { - AVIOContext *pb; - int ret; + AVIOContext pb; + uint8_t *buf; + int len, ret; - ret = avio_open_dyn_buf(&pb); - if (ret < 0) - return ret; - - ret = ff_av1_filter_obus(pb, buf, *size); + len = ret = ff_av1_filter_obus(NULL, in, *size); if (ret < 0) { - ffio_free_dyn_buf(&pb); return ret; } + buf = av_malloc(len + AV_INPUT_BUFFER_PADDING_SIZE); + if (!buf) + return AVERROR(ENOMEM); + + ffio_init_context(&pb, buf, len, 1, NULL, NULL, NULL, NULL); + + ret = ff_av1_filter_obus(&pb, in, *size); + av_assert1(ret == len); + + memset(buf + len, 0, AV_INPUT_BUFFER_PADDING_SIZE); + av_freep(out); - *size = avio_close_dyn_buf(pb, out); + *out = buf; + *size = len; return 0; } diff --git a/libavformat/av1.h b/libavformat/av1.h index 0578435376..acba12612c 100644 --- a/libavformat/av1.h +++ b/libavformat/av1.h @@ -61,7 +61,7 @@ int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size); * * @param pb pointer to the AVIOContext where the filtered bitstream shall be * written - * @param buf input data buffer + * @param in input data buffer * @param out pointer to pointer that will hold the allocated data buffer * @param size size of the input data buffer. The size of the resulting output data buffer will be written here @@ -69,7 +69,7 @@ int ff_av1_filter_obus(AVIOContext *pb, const uint8_t *buf, int size); * @return 0 in case of success, a negative AVERROR code in case of failure. * On failure, out and size are unchanged */ -int ff_av1_filter_obus_buf(const uint8_t *buf, uint8_t **out, int *size); +int ff_av1_filter_obus_buf(const uint8_t *in, uint8_t **out, int *size); /** * Parses a Sequence Header from the the provided buffer.