diff mbox series

[FFmpeg-devel,01/14] avcodec/mjpegenc: Use custom close function directly

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

Checks

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

Commit Message

Andreas Rheinhardt Dec. 22, 2021, 3:19 a.m. UTC
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(-)

Comments

Andreas Rheinhardt Dec. 31, 2021, 10:03 a.m. UTC | #1
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 mbox series

Patch

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]);