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

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Wed Aug 24 15:33:56 EEST 2022


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


More information about the ffmpeg-devel mailing list