avcodec/dxvenc, hap(dec|enc): Move TextureDSPContext to stack

Only used during init.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2024-01-24 18:55:26 +01:00
parent e1d1304b4b
commit 8f791304f2
4 changed files with 16 additions and 15 deletions

View File

@ -110,7 +110,6 @@ static void ht_delete(HTEntry *ht, const AVCRC *hash_ctx,
typedef struct DXVEncContext {
AVClass *class;
TextureDSPContext texdsp;
PutByteContext pbc;
uint8_t *tex_data; // Compressed texture
@ -267,6 +266,7 @@ static int dxv_encode(AVCodecContext *avctx, AVPacket *pkt,
static av_cold int dxv_init(AVCodecContext *avctx)
{
DXVEncContext *ctx = avctx->priv_data;
TextureDSPContext texdsp;
int ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
if (ret < 0) {
@ -275,12 +275,12 @@ static av_cold int dxv_init(AVCodecContext *avctx)
return ret;
}
ff_texturedspenc_init(&ctx->texdsp);
ff_texturedspenc_init(&texdsp);
switch (ctx->tex_fmt) {
case DXV_FMT_DXT1:
ctx->compress_tex = dxv_compress_dxt1;
ctx->enc.tex_funct = ctx->texdsp.dxt1_block;
ctx->enc.tex_funct = texdsp.dxt1_block;
ctx->enc.tex_ratio = 8;
break;
default:

View File

@ -61,7 +61,6 @@ typedef struct HapChunk {
typedef struct HapContext {
AVClass *class;
TextureDSPContext dxtc;
GetByteContext gbc;
enum HapTextureFormat opt_tex_fmt; /* Texture type (encoder only) */

View File

@ -337,6 +337,7 @@ static int hap_decode(AVCodecContext *avctx, AVFrame *frame,
static av_cold int hap_init(AVCodecContext *avctx)
{
HapContext *ctx = avctx->priv_data;
TextureDSPContext dxtc;
const char *texture_name;
int ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
@ -350,7 +351,7 @@ static av_cold int hap_init(AVCodecContext *avctx)
avctx->coded_width = FFALIGN(avctx->width, TEXTURE_BLOCK_W);
avctx->coded_height = FFALIGN(avctx->height, TEXTURE_BLOCK_H);
ff_texturedsp_init(&ctx->dxtc);
ff_texturedsp_init(&dxtc);
ctx->texture_count = 1;
ctx->dec[0].raw_ratio = 16;
@ -361,25 +362,25 @@ static av_cold int hap_init(AVCodecContext *avctx)
case MKTAG('H','a','p','1'):
texture_name = "DXT1";
ctx->dec[0].tex_ratio = 8;
ctx->dec[0].tex_funct = ctx->dxtc.dxt1_block;
ctx->dec[0].tex_funct = dxtc.dxt1_block;
avctx->pix_fmt = AV_PIX_FMT_RGB0;
break;
case MKTAG('H','a','p','5'):
texture_name = "DXT5";
ctx->dec[0].tex_ratio = 16;
ctx->dec[0].tex_funct = ctx->dxtc.dxt5_block;
ctx->dec[0].tex_funct = dxtc.dxt5_block;
avctx->pix_fmt = AV_PIX_FMT_RGBA;
break;
case MKTAG('H','a','p','Y'):
texture_name = "DXT5-YCoCg-scaled";
ctx->dec[0].tex_ratio = 16;
ctx->dec[0].tex_funct = ctx->dxtc.dxt5ys_block;
ctx->dec[0].tex_funct = dxtc.dxt5ys_block;
avctx->pix_fmt = AV_PIX_FMT_RGB0;
break;
case MKTAG('H','a','p','A'):
texture_name = "RGTC1";
ctx->dec[0].tex_ratio = 8;
ctx->dec[0].tex_funct = ctx->dxtc.rgtc1u_gray_block;
ctx->dec[0].tex_funct = dxtc.rgtc1u_gray_block;
ctx->dec[0].raw_ratio = 4;
avctx->pix_fmt = AV_PIX_FMT_GRAY8;
break;
@ -387,8 +388,8 @@ static av_cold int hap_init(AVCodecContext *avctx)
texture_name = "DXT5-YCoCg-scaled / RGTC1";
ctx->dec[0].tex_ratio = 16;
ctx->dec[1].tex_ratio = 8;
ctx->dec[0].tex_funct = ctx->dxtc.dxt5ys_block;
ctx->dec[1].tex_funct = ctx->dxtc.rgtc1u_alpha_block;
ctx->dec[0].tex_funct = dxtc.dxt5ys_block;
ctx->dec[1].tex_funct = dxtc.rgtc1u_alpha_block;
ctx->dec[1].raw_ratio = 16;
ctx->dec[1].slice_count = ctx->dec[0].slice_count;
avctx->pix_fmt = AV_PIX_FMT_RGBA;

View File

@ -232,6 +232,7 @@ static int hap_encode(AVCodecContext *avctx, AVPacket *pkt,
static av_cold int hap_init(AVCodecContext *avctx)
{
HapContext *ctx = avctx->priv_data;
TextureDSPContext dxtc;
int corrected_chunk_count;
int ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
@ -247,26 +248,26 @@ static av_cold int hap_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA;
}
ff_texturedspenc_init(&ctx->dxtc);
ff_texturedspenc_init(&dxtc);
switch (ctx->opt_tex_fmt) {
case HAP_FMT_RGBDXT1:
ctx->enc.tex_ratio = 8;
avctx->codec_tag = MKTAG('H', 'a', 'p', '1');
avctx->bits_per_coded_sample = 24;
ctx->enc.tex_funct = ctx->dxtc.dxt1_block;
ctx->enc.tex_funct = dxtc.dxt1_block;
break;
case HAP_FMT_RGBADXT5:
ctx->enc.tex_ratio = 16;
avctx->codec_tag = MKTAG('H', 'a', 'p', '5');
avctx->bits_per_coded_sample = 32;
ctx->enc.tex_funct = ctx->dxtc.dxt5_block;
ctx->enc.tex_funct = dxtc.dxt5_block;
break;
case HAP_FMT_YCOCGDXT5:
ctx->enc.tex_ratio = 16;
avctx->codec_tag = MKTAG('H', 'a', 'p', 'Y');
avctx->bits_per_coded_sample = 24;
ctx->enc.tex_funct = ctx->dxtc.dxt5ys_block;
ctx->enc.tex_funct = dxtc.dxt5ys_block;
break;
default:
av_log(avctx, AV_LOG_ERROR, "Invalid format %02X\n", ctx->opt_tex_fmt);