[FFmpeg-devel] [PATCH] avcodec: ViewQuest VQC decoder
Tomas Härdin
git at haerdin.se
Fri Oct 7 12:38:29 EEST 2022
tor 2022-10-06 klockan 21:45 +1100 skrev Peter Ross:
>
> +static av_cold int vqc_decode_init(AVCodecContext * avctx)
> +{
> + static AVOnce init_static_once = AV_ONCE_INIT;
> + VqcContext *s = avctx->priv_data;
> +
> + s->vectors = av_malloc((avctx->width * avctx->height * 3) / 2);
> + if (!s->vectors)
> + return AVERROR(ENOMEM);
> +
> + s->coeff = av_malloc(2 * avctx->width * sizeof(int16_t));
> + if (!s->coeff)
> + return AVERROR(ENOMEM);
> +
> + s->tmp1 = av_malloc(avctx->width * sizeof(int16_t) / 2);
> + if (!s->tmp1)
> + return AVERROR(ENOMEM);
> +
> + s->tmp2 = av_malloc(avctx->width * sizeof(int16_t) / 2);
av_malloc_array() perhaps? Not that these are likely to overflow since
max pixels is usually far away from INT_MAX
> +static uint8_t sat1(int x)
> +{
> + return x >= -128 ? x <= 127 ? x + 0x80 : 0xFF : 0x00;
> +}
Use av_clip*()
> +static uint8_t sat2(int x)
> +{
> + return x >= -128 ? x <= 127 ? x + 0x80 : 0x00 : 0xFF;
> +}
Doesn't look like av_clip() will work here. Or?
> +static int vqc_decode_frame(AVCodecContext *avctx, AVFrame * rframe,
> + int * got_frame, AVPacket * avpkt)
> +{
> + VqcContext *s = avctx->priv_data;
> + int ret;
> + uint8_t * buf = avpkt->data;
> + int cache, seed[7], gamma, contrast;
> +
> + if (avpkt->size < 7)
> + return AVERROR_INVALIDDATA;
> +
> + if ((ret = ff_reget_buffer(avctx, s->frame, 0)) < 0)
> + return ret;
> +
> + av_log(avctx, AV_LOG_DEBUG, "VQC%d format\n", (buf[2] & 1) + 1);
> +
> + if (((buf[0] >> 1) & 7) != 5) {
> + avpriv_request_sample(avctx, "subversion != 5\n");
> + return AVERROR_PATCHWELCOME;
> + }
> +
> + cache = buf[4] | (AV_RL16(buf + 5) << 8);
AV_RL24()
No tests? Looks like samp.avi would make a fine addition to FATE
/Tomas
More information about the ffmpeg-devel
mailing list