You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
avcodec/mjpegenc: Use custom close function directly
Currently, ff_mpv_encode_end() is the close function of the two MJPEG-based encoders; it calls ff_mjpeg_encode_close() for them which adds a check to the generic code. This commit reverses the order of this relationship: The MJPEG encoders directly use a custom close function which in turn calls ff_mpv_encode_end(). This avoids the branch in ff_mpv_encode_end() and makes the generic code more generic. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
@@ -320,12 +320,15 @@ av_cold int ff_mjpeg_encode_init(MpegEncContext *s)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_cold void ff_mjpeg_encode_close(MpegEncContext *s)
|
static av_cold int mjpeg_encode_close(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
|
MpegEncContext *const s = avctx->priv_data;
|
||||||
if (s->mjpeg_ctx) {
|
if (s->mjpeg_ctx) {
|
||||||
av_freep(&s->mjpeg_ctx->huff_buffer);
|
av_freep(&s->mjpeg_ctx->huff_buffer);
|
||||||
av_freep(&s->mjpeg_ctx);
|
av_freep(&s->mjpeg_ctx);
|
||||||
}
|
}
|
||||||
|
ff_mpv_encode_end(avctx);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -618,7 +621,7 @@ const AVCodec ff_mjpeg_encoder = {
|
|||||||
.priv_data_size = sizeof(MpegEncContext),
|
.priv_data_size = sizeof(MpegEncContext),
|
||||||
.init = ff_mpv_encode_init,
|
.init = ff_mpv_encode_init,
|
||||||
.encode2 = ff_mpv_encode_picture,
|
.encode2 = ff_mpv_encode_picture,
|
||||||
.close = ff_mpv_encode_end,
|
.close = mjpeg_encode_close,
|
||||||
.capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS,
|
.capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS,
|
||||||
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
|
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
|
||||||
.pix_fmts = (const enum AVPixelFormat[]) {
|
.pix_fmts = (const enum AVPixelFormat[]) {
|
||||||
@@ -647,7 +650,7 @@ const AVCodec ff_amv_encoder = {
|
|||||||
.priv_data_size = sizeof(MpegEncContext),
|
.priv_data_size = sizeof(MpegEncContext),
|
||||||
.init = ff_mpv_encode_init,
|
.init = ff_mpv_encode_init,
|
||||||
.encode2 = amv_encode_picture,
|
.encode2 = amv_encode_picture,
|
||||||
.close = ff_mpv_encode_end,
|
.close = mjpeg_encode_close,
|
||||||
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
|
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
|
||||||
.pix_fmts = (const enum AVPixelFormat[]) {
|
.pix_fmts = (const enum AVPixelFormat[]) {
|
||||||
AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_NONE
|
AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_NONE
|
||||||
|
@@ -105,7 +105,6 @@ static inline void put_marker(PutBitContext *p, enum JpegMarker code)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int ff_mjpeg_encode_init(MpegEncContext *s);
|
int ff_mjpeg_encode_init(MpegEncContext *s);
|
||||||
void ff_mjpeg_encode_close(MpegEncContext *s);
|
|
||||||
void ff_mjpeg_encode_mb(MpegEncContext *s, int16_t block[12][64]);
|
void ff_mjpeg_encode_mb(MpegEncContext *s, int16_t block[12][64]);
|
||||||
int ff_mjpeg_encode_stuffing(MpegEncContext *s);
|
int ff_mjpeg_encode_stuffing(MpegEncContext *s);
|
||||||
|
|
||||||
|
@@ -970,9 +970,6 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx)
|
|||||||
ff_rate_control_uninit(s);
|
ff_rate_control_uninit(s);
|
||||||
|
|
||||||
ff_mpv_common_end(s);
|
ff_mpv_common_end(s);
|
||||||
if ((CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER) &&
|
|
||||||
s->out_format == FMT_MJPEG)
|
|
||||||
ff_mjpeg_encode_close(s);
|
|
||||||
|
|
||||||
for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
|
for (i = 0; i < FF_ARRAY_ELEMS(s->tmp_frames); i++)
|
||||||
av_frame_free(&s->tmp_frames[i]);
|
av_frame_free(&s->tmp_frames[i]);
|
||||||
|
Reference in New Issue
Block a user