static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)

{

    InputStream *ist = s->opaque;

    FrameBuffer *buf;

    int ret, i;



    if(av_image_check_size(s->width, s->height, 0, s))

        return -1;



    if (!ist->buffer_pool && (ret = alloc_buffer(s, ist, &ist->buffer_pool)) < 0)

        return ret;



    buf              = ist->buffer_pool;

    ist->buffer_pool = buf->next;

    buf->next        = NULL;

    if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {

        av_freep(&buf->base[0]);

        av_free(buf);

        ist->dr1 = 0;

        if ((ret = alloc_buffer(s, ist, &buf)) < 0)

            return ret;

    }

    buf->refcount++;



    frame->opaque        = buf;

    frame->type          = FF_BUFFER_TYPE_USER;

    frame->extended_data = frame->data;

    frame->pkt_pts       = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;



    for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {

        frame->base[i]     = buf->base[i];  

        frame->data[i]     = buf->data[i];

        frame->linesize[i] = buf->linesize[i];

    }



    return 0;

}
