static int targa_encode_frame(AVCodecContext *avctx,

                              unsigned char *outbuf,

                              int buf_size, void *data){

    AVFrame *p = data;

    int bpp, picsize, datasize;

    uint8_t *out;



    if(avctx->width > 0xffff || avctx->height > 0xffff) {

        av_log(avctx, AV_LOG_ERROR, "image dimensions too large\n");

        return -1;

    }

    picsize = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height);

    if(buf_size < picsize + 45) {

        av_log(avctx, AV_LOG_ERROR, "encoded frame too large\n");

        return -1;

    }



    p->pict_type= FF_I_TYPE;

    p->key_frame= 1;



    /* zero out the header and only set applicable fields */

    memset(outbuf, 0, 11);

    AV_WL16(outbuf+12, avctx->width);

    AV_WL16(outbuf+14, avctx->height);

    outbuf[17] = 0x20;           /* origin is top-left. no alpha */



    /* TODO: support alpha channel */

    switch(avctx->pix_fmt) {

    case PIX_FMT_GRAY8:

        outbuf[2] = 3;           /* uncompressed grayscale image */

        outbuf[16] = 8;          /* bpp */

        break;

    case PIX_FMT_RGB555:

        outbuf[2] = 2;           /* uncompresses true-color image */

        outbuf[16] = 16;         /* bpp */

        break;

    case PIX_FMT_BGR24:

        outbuf[2] = 2;           /* uncompressed true-color image */

        outbuf[16] = 24;         /* bpp */

        break;

    default:

        return -1;

    }

    bpp = outbuf[16] >> 3;



    out = outbuf + 18;  /* skip past the header we just output */



    /* try RLE compression */

    datasize = targa_encode_rle(out, picsize, p, bpp, avctx->width, avctx->height);



    /* if that worked well, mark the picture as RLE compressed */

    if(datasize >= 0)

        outbuf[2] |= 8;



    /* if RLE didn't make it smaller, go back to no compression */

    else datasize = targa_encode_normal(out, p, bpp, avctx->width, avctx->height);



    out += datasize;



    /* The standard recommends including this section, even if we don't use

     * any of the features it affords. TODO: take advantage of the pixel

     * aspect ratio and encoder ID fields available? */

    memcpy(out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.", 26);



    return out + 26 - outbuf;

}

static int targa_encode_frame(AVCodecContext *avctx,

                              unsigned char *outbuf,

                              int buf_size, void *data){

    AVFrame *p = data;

    int bpp, picsize, datasize;

    uint8_t *out;



    if(avctx->width > 0xffff || avctx->height > 0xffff) {

        av_log(avctx, AV_LOG_ERROR, "image dimensions too large\n");

        return -1;

    }

    picsize = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height);

    if(buf_size < picsize + 45) {

        av_log(avctx, AV_LOG_ERROR, "encoded frame too large\n");

        return -1;

    }



    p->pict_type= FF_I_TYPE;

    p->key_frame= 1;



    

    memset(outbuf, 0, 11);

    AV_WL16(outbuf+12, avctx->width);

    AV_WL16(outbuf+14, avctx->height);

    outbuf[17] = 0x20;           



    

    switch(avctx->pix_fmt) {

    case PIX_FMT_GRAY8:

        outbuf[2] = 3;           

        outbuf[16] = 8;          

        break;

    case PIX_FMT_RGB555:

        outbuf[2] = 2;           

        outbuf[16] = 16;         

        break;

    case PIX_FMT_BGR24:

        outbuf[2] = 2;           

        outbuf[16] = 24;         

        break;

    default:

        return -1;

    }

    bpp = outbuf[16] >> 3;



    out = outbuf + 18;  



    

    datasize = targa_encode_rle(out, picsize, p, bpp, avctx->width, avctx->height);



    

    if(datasize >= 0)

        outbuf[2] |= 8;



    

    else datasize = targa_encode_normal(out, p, bpp, avctx->width, avctx->height);



    out += datasize;



    





    memcpy(out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.", 26);



    return out + 26 - outbuf;

}

static int FUNC_0(AVCodecContext *VAR_0,

                              unsigned char *VAR_1,

                              int VAR_2, void *VAR_3){

    AVFrame *p = VAR_3;

    int VAR_4, VAR_5, VAR_6;

    uint8_t *out;



    if(VAR_0->width > 0xffff || VAR_0->height > 0xffff) {

        av_log(VAR_0, AV_LOG_ERROR, "image dimensions too large\n");

        return -1;

    }

    VAR_5 = avpicture_get_size(VAR_0->pix_fmt, VAR_0->width, VAR_0->height);

    if(VAR_2 < VAR_5 + 45) {

        av_log(VAR_0, AV_LOG_ERROR, "encoded frame too large\n");

        return -1;

    }



    p->pict_type= FF_I_TYPE;

    p->key_frame= 1;



    

    memset(VAR_1, 0, 11);

    AV_WL16(VAR_1+12, VAR_0->width);

    AV_WL16(VAR_1+14, VAR_0->height);

    VAR_1[17] = 0x20;           



    

    switch(VAR_0->pix_fmt) {

    case PIX_FMT_GRAY8:

        VAR_1[2] = 3;           

        VAR_1[16] = 8;          

        break;

    case PIX_FMT_RGB555:

        VAR_1[2] = 2;           

        VAR_1[16] = 16;         

        break;

    case PIX_FMT_BGR24:

        VAR_1[2] = 2;           

        VAR_1[16] = 24;         

        break;

    default:

        return -1;

    }

    VAR_4 = VAR_1[16] >> 3;



    out = VAR_1 + 18;  



    

    VAR_6 = targa_encode_rle(out, VAR_5, p, VAR_4, VAR_0->width, VAR_0->height);



    

    if(VAR_6 >= 0)

        VAR_1[2] |= 8;



    

    else VAR_6 = targa_encode_normal(out, p, VAR_4, VAR_0->width, VAR_0->height);



    out += VAR_6;



    





    memcpy(out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.", 26);



    return out + 26 - VAR_1;

}

static int FUNC_0(AVCodecContext *VAR_0,
unsigned char *VAR_1,
int VAR_2, void *VAR_3){ AVFrame *p = VAR_3; int VAR_4, VAR_5, VAR_6; uint8_t *out; if(VAR_0->width > 0xffff || VAR_0->height > 0xffff) { av_log(VAR_0, AV_LOG_ERROR, "image dimensions too large\n"); return -1; } VAR_5 = avpicture_get_size(VAR_0->pix_fmt, VAR_0->width, VAR_0->height); if(VAR_2 < VAR_5 + 45) { av_log(VAR_0, AV_LOG_ERROR, "encoded frame too large\n"); return -1; } p->pict_type= FF_I_TYPE; p->key_frame= 1; memset(VAR_1, 0, 11); AV_WL16(VAR_1+12, VAR_0->width); AV_WL16(VAR_1+14, VAR_0->height); VAR_1[17] = 0x20; switch(VAR_0->pix_fmt) { case PIX_FMT_GRAY8:
VAR_1[2] = 3; VAR_1[16] = 8; break; case PIX_FMT_RGB555:
VAR_1[2] = 2; VAR_1[16] = 16; break; case PIX_FMT_BGR24:
VAR_1[2] = 2; VAR_1[16] = 24; break; default:
return -1; } VAR_4 = VAR_1[16] >> 3; out = VAR_1 + 18; VAR_6 = targa_encode_rle(out, VAR_5, p, VAR_4, VAR_0->width, VAR_0->height); if(VAR_6 >= 0)
VAR_1[2] |= 8; else VAR_6 = targa_encode_normal(out, p, VAR_4, VAR_0->width, VAR_0->height); out += VAR_6; memcpy(out, "\0\0\0\0\0\0\0\0TRUEVISION-XFILE.", 26); return out + 26 - VAR_1; }