[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