if(s->bytestream + avctx->width*avctx->height*4 > s->bytestream_end) return -1;
static int pnm_decode_frame(AVCodecContext *avctx,                         void *data, int *data_size,                        uint8_t *buf, int buf_size){    PNMContext * const s = avctx->priv_data;    AVFrame *picture = data;    AVFrame * const p= (AVFrame*)&s->picture;    int i, n, linesize, h;    unsigned char *ptr;    s->bytestream_start=    s->bytestream= buf;    s->bytestream_end= buf + buf_size;        if(pnm_decode_header(avctx, s) < 0)        return -1;        if(p->data[0])        avctx->release_buffer(avctx, p);    p->reference= 0;    if(avctx->get_buffer(avctx, p) < 0){        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");        return -1;    }    p->pict_type= FF_I_TYPE;    p->key_frame= 1;        switch(avctx->pix_fmt) {    default:        return -1;    case PIX_FMT_RGB24:        n = avctx->width * 3;        goto do_read;    case PIX_FMT_GRAY8:        n = avctx->width;        goto do_read;    case PIX_FMT_MONOWHITE:    case PIX_FMT_MONOBLACK:        n = (avctx->width + 7) >> 3;    do_read:        ptr = p->data[0];        linesize = p->linesize[0];        for(i = 0; i < avctx->height; i++) {            memcpy(ptr, s->bytestream, n);            s->bytestream += n;            ptr += linesize;        }        break;    case PIX_FMT_YUV420P:        {            unsigned char *ptr1, *ptr2;            n = avctx->width;            ptr = p->data[0];            linesize = p->linesize[0];            for(i = 0; i < avctx->height; i++) {                memcpy(ptr, s->bytestream, n);                s->bytestream += n;                ptr += linesize;            }            ptr1 = p->data[1];            ptr2 = p->data[2];            n >>= 1;            h = avctx->height >> 1;            for(i = 0; i < h; i++) {                memcpy(ptr1, s->bytestream, n);                s->bytestream += n;                memcpy(ptr2, s->bytestream, n);                s->bytestream += n;                ptr1 += p->linesize[1];                ptr2 += p->linesize[2];            }        }        break;    case PIX_FMT_RGBA32:        ptr = p->data[0];        linesize = p->linesize[0];        for(i = 0; i < avctx->height; i++) {            int j, r, g, b, a;            for(j = 0;j < avctx->width; j++) {                r = *s->bytestream++;                g = *s->bytestream++;                b = *s->bytestream++;                a = *s->bytestream++;                ((uint32_t *)ptr)[j] = (a << 24) | (r << 16) | (g << 8) | b;            }            ptr += linesize;        }        break;    }    *picture= *(AVFrame*)&s->picture;    *data_size = sizeof(AVPicture);    return s->bytestream - s->bytestream_start;}