diff mbox series

[FFmpeg-devel,08/18] lavc/dvdec: stop using DVVideoContext

Message ID 20220824084318.333-8-anton@khirnov.net
State New
Headers show
Series [FFmpeg-devel,01/18] tests/fate/mov: add a test for dv audio demuxed through dv demuxer | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 fail Make fate failed
andriy/make_x86 success Make finished
andriy/make_fate_x86 fail Make fate failed

Commit Message

Anton Khirnov Aug. 24, 2022, 8:43 a.m. UTC
The struct is quite small and the decoder and the encoder use different
fields from it, so benefits from reusing it are small.

This allows making the buf field const.
---
 libavcodec/dvdec.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

Comments

Andreas Rheinhardt Aug. 24, 2022, 12:33 p.m. UTC | #1
Anton Khirnov:
> The struct is quite small and the decoder and the encoder use different
> fields from it, so benefits from reusing it are small.
> 
> This allows making the buf field const.
> ---
>  libavcodec/dvdec.c | 28 +++++++++++++++++++++-------
>  1 file changed, 21 insertions(+), 7 deletions(-)
> 
> diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c
> index 7f9e4eb0c0..444b137488 100644
> --- a/libavcodec/dvdec.c
> +++ b/libavcodec/dvdec.c
> @@ -48,6 +48,7 @@
>  #include "dv_profile_internal.h"
>  #include "dvdata.h"
>  #include "get_bits.h"
> +#include "idctdsp.h"
>  #include "internal.h"
>  #include "put_bits.h"
>  #include "simple_idct.h"
> @@ -63,6 +64,19 @@ typedef struct BlockInfo {
>      int shift_offset;
>  } BlockInfo;
>  
> +typedef struct DVDecContext {
> +    const AVDVProfile *sys;
> +    const AVFrame     *frame;
> +    const uint8_t     *buf;
> +
> +    uint8_t      dv_zigzag[2][64];
> +    DVwork_chunk work_chunks[4 * 12 * 27];
> +    uint32_t     idct_factor[2 * 4 * 16 * 64];
> +    void       (*idct_put[2])(uint8_t *dest, ptrdiff_t stride, int16_t *block);
> +
> +    IDCTDSPContext idsp;
> +} DVDecContext;
> +
>  static const int dv_iweight_bits = 14;
>  
>  static const uint16_t dv_iweight_88[64] = {
> @@ -188,7 +202,7 @@ static void dv_init_static(void)
>      }
>  }
>  
> -static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d)
> +static void dv_init_weight_tables(DVDecContext *ctx, const AVDVProfile *d)
>  {
>      int j, i, c, s;
>      uint32_t *factor1 = &ctx->idct_factor[0],
> @@ -237,7 +251,7 @@ static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d)
>  static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
>  {
>      static AVOnce init_static_once = AV_ONCE_INIT;
> -    DVVideoContext *s = avctx->priv_data;
> +    DVDecContext *s = avctx->priv_data;
>      int i;
>  
>      avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
> @@ -347,7 +361,7 @@ static av_always_inline void put_block_8x4(int16_t *block, uint8_t *av_restrict
>      }
>  }
>  
> -static void dv100_idct_put_last_row_field_chroma(const DVVideoContext *s, uint8_t *data,
> +static void dv100_idct_put_last_row_field_chroma(const DVDecContext *s, uint8_t *data,
>                                                   int stride, int16_t *blocks)
>  {
>      s->idsp.idct(blocks + 0*64);
> @@ -359,7 +373,7 @@ static void dv100_idct_put_last_row_field_chroma(const DVVideoContext *s, uint8_
>      put_block_8x4(blocks+1*64 + 4*8, data + 8 + stride, stride<<1);
>  }
>  
> -static void dv100_idct_put_last_row_field_luma(const DVVideoContext *s, uint8_t *data,
> +static void dv100_idct_put_last_row_field_luma(const DVDecContext *s, uint8_t *data,
>                                                 int stride, int16_t *blocks)
>  {
>      s->idsp.idct(blocks + 0*64);
> @@ -380,7 +394,7 @@ static void dv100_idct_put_last_row_field_luma(const DVVideoContext *s, uint8_t
>  /* mb_x and mb_y are in units of 8 pixels */
>  static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
>  {
> -    const DVVideoContext *s = avctx->priv_data;
> +    const DVDecContext *s = avctx->priv_data;
>      DVwork_chunk *work_chunk = arg;
>      int quant, dc, dct_mode, class1, j;
>      int mb_index, mb_x, mb_y, last_index;
> @@ -614,7 +628,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, AVFrame *frame,
>  {
>      uint8_t *buf = avpkt->data;
>      int buf_size = avpkt->size;
> -    DVVideoContext *s = avctx->priv_data;
> +    DVDecContext *s = avctx->priv_data;
>      const uint8_t *vsc_pack;
>      int apt, is16_9, ret;
>      const AVDVProfile *sys;
> @@ -688,7 +702,7 @@ const FFCodec ff_dvvideo_decoder = {
>      .p.long_name    = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
>      .p.type         = AVMEDIA_TYPE_VIDEO,
>      .p.id           = AV_CODEC_ID_DVVIDEO,
> -    .priv_data_size = sizeof(DVVideoContext),
> +    .priv_data_size = sizeof(DVDecContext),
>      .init           = dvvideo_decode_init,
>      FF_CODEC_DECODE_CB(dvvideo_decode_frame),
>      .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS,

LGTM.

- Andreas
diff mbox series

Patch

diff --git a/libavcodec/dvdec.c b/libavcodec/dvdec.c
index 7f9e4eb0c0..444b137488 100644
--- a/libavcodec/dvdec.c
+++ b/libavcodec/dvdec.c
@@ -48,6 +48,7 @@ 
 #include "dv_profile_internal.h"
 #include "dvdata.h"
 #include "get_bits.h"
+#include "idctdsp.h"
 #include "internal.h"
 #include "put_bits.h"
 #include "simple_idct.h"
@@ -63,6 +64,19 @@  typedef struct BlockInfo {
     int shift_offset;
 } BlockInfo;
 
+typedef struct DVDecContext {
+    const AVDVProfile *sys;
+    const AVFrame     *frame;
+    const uint8_t     *buf;
+
+    uint8_t      dv_zigzag[2][64];
+    DVwork_chunk work_chunks[4 * 12 * 27];
+    uint32_t     idct_factor[2 * 4 * 16 * 64];
+    void       (*idct_put[2])(uint8_t *dest, ptrdiff_t stride, int16_t *block);
+
+    IDCTDSPContext idsp;
+} DVDecContext;
+
 static const int dv_iweight_bits = 14;
 
 static const uint16_t dv_iweight_88[64] = {
@@ -188,7 +202,7 @@  static void dv_init_static(void)
     }
 }
 
-static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d)
+static void dv_init_weight_tables(DVDecContext *ctx, const AVDVProfile *d)
 {
     int j, i, c, s;
     uint32_t *factor1 = &ctx->idct_factor[0],
@@ -237,7 +251,7 @@  static void dv_init_weight_tables(DVVideoContext *ctx, const AVDVProfile *d)
 static av_cold int dvvideo_decode_init(AVCodecContext *avctx)
 {
     static AVOnce init_static_once = AV_ONCE_INIT;
-    DVVideoContext *s = avctx->priv_data;
+    DVDecContext *s = avctx->priv_data;
     int i;
 
     avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
@@ -347,7 +361,7 @@  static av_always_inline void put_block_8x4(int16_t *block, uint8_t *av_restrict
     }
 }
 
-static void dv100_idct_put_last_row_field_chroma(const DVVideoContext *s, uint8_t *data,
+static void dv100_idct_put_last_row_field_chroma(const DVDecContext *s, uint8_t *data,
                                                  int stride, int16_t *blocks)
 {
     s->idsp.idct(blocks + 0*64);
@@ -359,7 +373,7 @@  static void dv100_idct_put_last_row_field_chroma(const DVVideoContext *s, uint8_
     put_block_8x4(blocks+1*64 + 4*8, data + 8 + stride, stride<<1);
 }
 
-static void dv100_idct_put_last_row_field_luma(const DVVideoContext *s, uint8_t *data,
+static void dv100_idct_put_last_row_field_luma(const DVDecContext *s, uint8_t *data,
                                                int stride, int16_t *blocks)
 {
     s->idsp.idct(blocks + 0*64);
@@ -380,7 +394,7 @@  static void dv100_idct_put_last_row_field_luma(const DVVideoContext *s, uint8_t
 /* mb_x and mb_y are in units of 8 pixels */
 static int dv_decode_video_segment(AVCodecContext *avctx, void *arg)
 {
-    const DVVideoContext *s = avctx->priv_data;
+    const DVDecContext *s = avctx->priv_data;
     DVwork_chunk *work_chunk = arg;
     int quant, dc, dct_mode, class1, j;
     int mb_index, mb_x, mb_y, last_index;
@@ -614,7 +628,7 @@  static int dvvideo_decode_frame(AVCodecContext *avctx, AVFrame *frame,
 {
     uint8_t *buf = avpkt->data;
     int buf_size = avpkt->size;
-    DVVideoContext *s = avctx->priv_data;
+    DVDecContext *s = avctx->priv_data;
     const uint8_t *vsc_pack;
     int apt, is16_9, ret;
     const AVDVProfile *sys;
@@ -688,7 +702,7 @@  const FFCodec ff_dvvideo_decoder = {
     .p.long_name    = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
     .p.type         = AVMEDIA_TYPE_VIDEO,
     .p.id           = AV_CODEC_ID_DVVIDEO,
-    .priv_data_size = sizeof(DVVideoContext),
+    .priv_data_size = sizeof(DVDecContext),
     .init           = dvvideo_decode_init,
     FF_CODEC_DECODE_CB(dvvideo_decode_frame),
     .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS,