Message ID | AM7PR03MB66606013F665BF849CE7CAD68F7D9@AM7PR03MB6660.eurprd03.prod.outlook.com |
---|---|
State | Accepted |
Commit | 0b670a7f915fd4fa86444da7c24f325d651b16bd |
Headers | show |
Series | [FFmpeg-devel,01/14] avcodec/mjpegenc: Use custom close function directly | expand |
Context | Check | Description |
---|---|---|
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
andriy/make_ppc | success | Make finished |
andriy/make_fate_ppc | success | Make fate finished |
Andreas Rheinhardt: > 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> > --- > libavcodec/mjpegenc.c | 9 ++++++--- > libavcodec/mjpegenc.h | 1 - > libavcodec/mpegvideo_enc.c | 3 --- > 3 files changed, 6 insertions(+), 7 deletions(-) > > diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c > index 0ade66bc5f..5bd25b4f3b 100644 > --- a/libavcodec/mjpegenc.c > +++ b/libavcodec/mjpegenc.c > @@ -320,12 +320,15 @@ av_cold int ff_mjpeg_encode_init(MpegEncContext *s) > 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) { > av_freep(&s->mjpeg_ctx->huff_buffer); > 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), > .init = ff_mpv_encode_init, > .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, > .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, > .pix_fmts = (const enum AVPixelFormat[]) { > @@ -647,7 +650,7 @@ const AVCodec ff_amv_encoder = { > .priv_data_size = sizeof(MpegEncContext), > .init = ff_mpv_encode_init, > .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, > .pix_fmts = (const enum AVPixelFormat[]) { > AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_NONE > diff --git a/libavcodec/mjpegenc.h b/libavcodec/mjpegenc.h > index 2e92511276..bc9b017e7a 100644 > --- a/libavcodec/mjpegenc.h > +++ b/libavcodec/mjpegenc.h > @@ -105,7 +105,6 @@ static inline void put_marker(PutBitContext *p, enum JpegMarker code) > } > > 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]); > int ff_mjpeg_encode_stuffing(MpegEncContext *s); > > diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c > index 128d1a327c..d2520368e1 100644 > --- a/libavcodec/mpegvideo_enc.c > +++ b/libavcodec/mpegvideo_enc.c > @@ -970,9 +970,6 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx) > ff_rate_control_uninit(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++) > av_frame_free(&s->tmp_frames[i]); > Will apply this patchset tonight unless there are objections. - Andreas
diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c index 0ade66bc5f..5bd25b4f3b 100644 --- a/libavcodec/mjpegenc.c +++ b/libavcodec/mjpegenc.c @@ -320,12 +320,15 @@ av_cold int ff_mjpeg_encode_init(MpegEncContext *s) 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) { av_freep(&s->mjpeg_ctx->huff_buffer); 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), .init = ff_mpv_encode_init, .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, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, .pix_fmts = (const enum AVPixelFormat[]) { @@ -647,7 +650,7 @@ const AVCodec ff_amv_encoder = { .priv_data_size = sizeof(MpegEncContext), .init = ff_mpv_encode_init, .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, .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_NONE diff --git a/libavcodec/mjpegenc.h b/libavcodec/mjpegenc.h index 2e92511276..bc9b017e7a 100644 --- a/libavcodec/mjpegenc.h +++ b/libavcodec/mjpegenc.h @@ -105,7 +105,6 @@ static inline void put_marker(PutBitContext *p, enum JpegMarker code) } 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]); int ff_mjpeg_encode_stuffing(MpegEncContext *s); diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c index 128d1a327c..d2520368e1 100644 --- a/libavcodec/mpegvideo_enc.c +++ b/libavcodec/mpegvideo_enc.c @@ -970,9 +970,6 @@ av_cold int ff_mpv_encode_end(AVCodecContext *avctx) ff_rate_control_uninit(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++) av_frame_free(&s->tmp_frames[i]);
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> --- libavcodec/mjpegenc.c | 9 ++++++--- libavcodec/mjpegenc.h | 1 - libavcodec/mpegvideo_enc.c | 3 --- 3 files changed, 6 insertions(+), 7 deletions(-)