ffmpeg/libavcodec/zlib_wrapper.c
Andreas Rheinhardt 9cae7f9450 avcodec/zlib_wrapper: Add wrapper for deflateInit()
The rationale is the same as for the wrappers for inflateInit(),
although the case for it is admittedly not so strong because
there are less users of deflateInit().
Also remove an unnecessary inclusion of config.h in
libavformat/protocols.c in order to trigger a request for reconfigure
(which is needed for CONFIG_DEFLATE_WRAPPER to take effect).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2022-03-19 00:18:36 +01:00

103 lines
2.5 KiB
C

/*
* Wrappers for zlib
* Copyright (C) 2022 Andreas Rheinhardt
*
* 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
*/
#include <zlib.h>
#include "config.h"
#include "libavutil/error.h"
#include "libavutil/log.h"
#include "libavutil/mem.h"
#include "zlib_wrapper.h"
static void *alloc_wrapper(void *opaque, uInt items, uInt size)
{
return av_malloc_array(items, size);
}
static void free_wrapper(void *opaque, void *ptr)
{
av_free(ptr);
}
#if CONFIG_INFLATE_WRAPPER
int ff_inflate_init(FFZStream *z, void *logctx)
{
z_stream *const zstream = &z->zstream;
int zret;
z->inited = 0;
zstream->next_in = Z_NULL;
zstream->avail_in = 0;
zstream->zalloc = alloc_wrapper;
zstream->zfree = free_wrapper;
zstream->opaque = Z_NULL;
zret = inflateInit(zstream);
if (zret == Z_OK) {
z->inited = 1;
} else {
av_log(logctx, AV_LOG_ERROR, "inflateInit error %d, message: %s\n",
zret, zstream->msg ? zstream->msg : "");
return AVERROR_EXTERNAL;
}
return 0;
}
void ff_inflate_end(FFZStream *z)
{
if (z->inited) {
z->inited = 0;
inflateEnd(&z->zstream);
}
}
#endif
#if CONFIG_DEFLATE_WRAPPER
int ff_deflate_init(FFZStream *z, int level, void *logctx)
{
z_stream *const zstream = &z->zstream;
int zret;
z->inited = 0;
zstream->zalloc = alloc_wrapper;
zstream->zfree = free_wrapper;
zstream->opaque = Z_NULL;
zret = deflateInit(zstream, level);
if (zret == Z_OK) {
z->inited = 1;
} else {
av_log(logctx, AV_LOG_ERROR, "deflateInit error %d, message: %s\n",
zret, zstream->msg ? zstream->msg : "");
return AVERROR_EXTERNAL;
}
return 0;
}
void ff_deflate_end(FFZStream *z)
{
if (z->inited) {
z->inited = 0;
deflateEnd(&z->zstream);
}
}
#endif