[FFmpeg-devel] [PATCH 08/18] lavc/dvdec: stop using DVVideoContext
Anton Khirnov
anton at khirnov.net
Wed Aug 24 11:43:08 EEST 2022
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,
--
2.35.1
More information about the ffmpeg-devel
mailing list