static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *buf, const uint8_t *end_buf)

{

    int tag, type, count, off, value = 0;

    int i, j;

    uint32_t *pal;

    const uint8_t *rp, *gp, *bp;



    tag = tget_short(&buf, s->le);

    type = tget_short(&buf, s->le);

    count = tget_long(&buf, s->le);

    off = tget_long(&buf, s->le);



    if(count == 1){

        switch(type){

        case TIFF_BYTE:

        case TIFF_SHORT:

            buf -= 4;

            value = tget(&buf, type, s->le);

            buf = NULL;

            break;

        case TIFF_LONG:

            value = off;

            buf = NULL;

            break;

        case TIFF_STRING:

            if(count <= 4){

                buf -= 4;

                break;

            }

        default:

            value = -1;

            buf = start + off;

        }

    }else if(type_sizes[type] * count <= 4){

        buf -= 4;

    }else{

        buf = start + off;

    }



    if(buf && (buf < start || buf > end_buf)){

        av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

        return -1;

    }



    switch(tag){

    case TIFF_WIDTH:

        s->width = value;

        break;

    case TIFF_HEIGHT:

        s->height = value;

        break;

    case TIFF_BPP:

        if(count == 1) s->bpp = value;

        else{

            switch(type){

            case TIFF_BYTE:

                s->bpp = (off & 0xFF) + ((off >> 8) & 0xFF) + ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);

                break;

            case TIFF_SHORT:

            case TIFF_LONG:

                s->bpp = 0;

                for(i = 0; i < count; i++) s->bpp += tget(&buf, type, s->le);

                break;

            default:

                s->bpp = -1;

            }

        }

        if(count > 4){

            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);

            return -1;

        }

        switch(s->bpp*10 + count){

        case 11:

            s->avctx->pix_fmt = PIX_FMT_MONOBLACK;

            break;

        case 81:

            s->avctx->pix_fmt = PIX_FMT_PAL8;

            break;

        case 243:

            s->avctx->pix_fmt = PIX_FMT_RGB24;

            break;

        case 161:

            s->avctx->pix_fmt = PIX_FMT_GRAY16BE;

            break;

        case 324:

            s->avctx->pix_fmt = PIX_FMT_RGBA;

            break;

        case 483:

            s->avctx->pix_fmt = s->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE;

            break;

        default:

            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);

            return -1;

        }

        if(s->width != s->avctx->width || s->height != s->avctx->height){

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

                return -1;

            avcodec_set_dimensions(s->avctx, s->width, s->height);

        }

        if(s->picture.data[0])

            s->avctx->release_buffer(s->avctx, &s->picture);

        if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){

            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");

            return -1;

        }

        if(s->bpp == 8){

            /* make default grayscale pal */

            pal = (uint32_t *) s->picture.data[1];

            for(i = 0; i < 256; i++)

                pal[i] = i * 0x010101;

        }

        break;

    case TIFF_COMPR:

        s->compr = value;

        s->predictor = 0;

        switch(s->compr){

        case TIFF_RAW:

        case TIFF_PACKBITS:

        case TIFF_LZW:

        case TIFF_CCITT_RLE:

            break;

        case TIFF_G3:

        case TIFF_G4:

            s->fax_opts = 0;

            break;

        case TIFF_DEFLATE:

        case TIFF_ADOBE_DEFLATE:

#if CONFIG_ZLIB

            break;

#else

            av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");

            return -1;

#endif

        case TIFF_JPEG:

        case TIFF_NEWJPEG:

            av_log(s->avctx, AV_LOG_ERROR, "JPEG compression is not supported\n");

            return -1;

        default:

            av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n", s->compr);

            return -1;

        }

        break;

    case TIFF_ROWSPERSTRIP:

        if(type == TIFF_LONG && value == -1)

            value = s->avctx->height;

        if(value < 1){

            av_log(s->avctx, AV_LOG_ERROR, "Incorrect value of rows per strip\n");

            return -1;

        }

        s->rps = value;

        break;

    case TIFF_STRIP_OFFS:

        if(count == 1){

            s->stripdata = NULL;

            s->stripoff = value;

        }else

            s->stripdata = start + off;

        s->strips = count;

        if(s->strips == 1) s->rps = s->height;

        s->sot = type;

        if(s->stripdata > end_buf){

            av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

            return -1;

        }

        break;

    case TIFF_STRIP_SIZE:

        if(count == 1){

            s->stripsizes = NULL;

            s->stripsize = value;

            s->strips = 1;

        }else{

            s->stripsizes = start + off;

        }

        s->strips = count;

        s->sstype = type;

        if(s->stripsizes > end_buf){

            av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

            return -1;

        }

        break;

    case TIFF_PREDICTOR:

        s->predictor = value;

        break;

    case TIFF_INVERT:

        switch(value){

        case 0:

            s->invert = 1;

            break;

        case 1:

            s->invert = 0;

            break;

        case 2:

        case 3:

            break;

        default:

            av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n", value);

            return -1;

        }

        break;

    case TIFF_FILL_ORDER:

        if(value < 1 || value > 2){

            av_log(s->avctx, AV_LOG_ERROR, "Unknown FillOrder value %d, trying default one\n", value);

            value = 1;

        }

        s->fill_order = value - 1;

        break;

    case TIFF_PAL:

        if(s->avctx->pix_fmt != PIX_FMT_PAL8){

            av_log(s->avctx, AV_LOG_ERROR, "Palette met but this is not palettized format\n");

            return -1;

        }

        pal = (uint32_t *) s->picture.data[1];

        off = type_sizes[type];

        rp = buf;

        gp = buf + count / 3 * off;

        bp = buf + count / 3 * off * 2;

        off = (type_sizes[type] - 1) << 3;

        for(i = 0; i < count / 3; i++){

            j = (tget(&rp, type, s->le) >> off) << 16;

            j |= (tget(&gp, type, s->le) >> off) << 8;

            j |= tget(&bp, type, s->le) >> off;

            pal[i] = j;

        }

        break;

    case TIFF_PLANAR:

        if(value == 2){

            av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");

            return -1;

        }

        break;

    case TIFF_T4OPTIONS:

        if(s->compr == TIFF_G3)

            s->fax_opts = value;

        break;

    case TIFF_T6OPTIONS:

        if(s->compr == TIFF_G4)

            s->fax_opts = value;

        break;

    }

    return 0;

}

static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *buf, const uint8_t *end_buf)

{

    int tag, type, count, off, value = 0;

    int i, j;

    uint32_t *pal;

    const uint8_t *rp, *gp, *bp;



    tag = tget_short(&buf, s->le);

    type = tget_short(&buf, s->le);

    count = tget_long(&buf, s->le);

    off = tget_long(&buf, s->le);



    if(count == 1){

        switch(type){

        case TIFF_BYTE:

        case TIFF_SHORT:

            buf -= 4;

            value = tget(&buf, type, s->le);

            buf = NULL;

            break;

        case TIFF_LONG:

            value = off;

            buf = NULL;

            break;

        case TIFF_STRING:

            if(count <= 4){

                buf -= 4;

                break;

            }

        default:

            value = -1;

            buf = start + off;

        }

    }else if(type_sizes[type] * count <= 4){

        buf -= 4;

    }else{

        buf = start + off;

    }



    if(buf && (buf < start || buf > end_buf)){

        av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

        return -1;

    }



    switch(tag){

    case TIFF_WIDTH:

        s->width = value;

        break;

    case TIFF_HEIGHT:

        s->height = value;

        break;

    case TIFF_BPP:

        if(count == 1) s->bpp = value;

        else{

            switch(type){

            case TIFF_BYTE:

                s->bpp = (off & 0xFF) + ((off >> 8) & 0xFF) + ((off >> 16) & 0xFF) + ((off >> 24) & 0xFF);

                break;

            case TIFF_SHORT:

            case TIFF_LONG:

                s->bpp = 0;

                for(i = 0; i < count; i++) s->bpp += tget(&buf, type, s->le);

                break;

            default:

                s->bpp = -1;

            }

        }

        if(count > 4){

            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);

            return -1;

        }

        switch(s->bpp*10 + count){

        case 11:

            s->avctx->pix_fmt = PIX_FMT_MONOBLACK;

            break;

        case 81:

            s->avctx->pix_fmt = PIX_FMT_PAL8;

            break;

        case 243:

            s->avctx->pix_fmt = PIX_FMT_RGB24;

            break;

        case 161:

            s->avctx->pix_fmt = PIX_FMT_GRAY16BE;

            break;

        case 324:

            s->avctx->pix_fmt = PIX_FMT_RGBA;

            break;

        case 483:

            s->avctx->pix_fmt = s->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE;

            break;

        default:

            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);

            return -1;

        }

        if(s->width != s->avctx->width || s->height != s->avctx->height){

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

                return -1;

            avcodec_set_dimensions(s->avctx, s->width, s->height);

        }

        if(s->picture.data[0])

            s->avctx->release_buffer(s->avctx, &s->picture);

        if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){

            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");

            return -1;

        }

        if(s->bpp == 8){

            

            pal = (uint32_t *) s->picture.data[1];

            for(i = 0; i < 256; i++)

                pal[i] = i * 0x010101;

        }

        break;

    case TIFF_COMPR:

        s->compr = value;

        s->predictor = 0;

        switch(s->compr){

        case TIFF_RAW:

        case TIFF_PACKBITS:

        case TIFF_LZW:

        case TIFF_CCITT_RLE:

            break;

        case TIFF_G3:

        case TIFF_G4:

            s->fax_opts = 0;

            break;

        case TIFF_DEFLATE:

        case TIFF_ADOBE_DEFLATE:

#if CONFIG_ZLIB

            break;

#else

            av_log(s->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");

            return -1;

#endif

        case TIFF_JPEG:

        case TIFF_NEWJPEG:

            av_log(s->avctx, AV_LOG_ERROR, "JPEG compression is not supported\n");

            return -1;

        default:

            av_log(s->avctx, AV_LOG_ERROR, "Unknown compression method %i\n", s->compr);

            return -1;

        }

        break;

    case TIFF_ROWSPERSTRIP:

        if(type == TIFF_LONG && value == -1)

            value = s->avctx->height;

        if(value < 1){

            av_log(s->avctx, AV_LOG_ERROR, "Incorrect value of rows per strip\n");

            return -1;

        }

        s->rps = value;

        break;

    case TIFF_STRIP_OFFS:

        if(count == 1){

            s->stripdata = NULL;

            s->stripoff = value;

        }else

            s->stripdata = start + off;

        s->strips = count;

        if(s->strips == 1) s->rps = s->height;

        s->sot = type;

        if(s->stripdata > end_buf){

            av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

            return -1;

        }

        break;

    case TIFF_STRIP_SIZE:

        if(count == 1){

            s->stripsizes = NULL;

            s->stripsize = value;

            s->strips = 1;

        }else{

            s->stripsizes = start + off;

        }

        s->strips = count;

        s->sstype = type;

        if(s->stripsizes > end_buf){

            av_log(s->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

            return -1;

        }

        break;

    case TIFF_PREDICTOR:

        s->predictor = value;

        break;

    case TIFF_INVERT:

        switch(value){

        case 0:

            s->invert = 1;

            break;

        case 1:

            s->invert = 0;

            break;

        case 2:

        case 3:

            break;

        default:

            av_log(s->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n", value);

            return -1;

        }

        break;

    case TIFF_FILL_ORDER:

        if(value < 1 || value > 2){

            av_log(s->avctx, AV_LOG_ERROR, "Unknown FillOrder value %d, trying default one\n", value);

            value = 1;

        }

        s->fill_order = value - 1;

        break;

    case TIFF_PAL:

        if(s->avctx->pix_fmt != PIX_FMT_PAL8){

            av_log(s->avctx, AV_LOG_ERROR, "Palette met but this is not palettized format\n");

            return -1;

        }

        pal = (uint32_t *) s->picture.data[1];

        off = type_sizes[type];

        rp = buf;

        gp = buf + count / 3 * off;

        bp = buf + count / 3 * off * 2;

        off = (type_sizes[type] - 1) << 3;

        for(i = 0; i < count / 3; i++){

            j = (tget(&rp, type, s->le) >> off) << 16;

            j |= (tget(&gp, type, s->le) >> off) << 8;

            j |= tget(&bp, type, s->le) >> off;

            pal[i] = j;

        }

        break;

    case TIFF_PLANAR:

        if(value == 2){

            av_log(s->avctx, AV_LOG_ERROR, "Planar format is not supported\n");

            return -1;

        }

        break;

    case TIFF_T4OPTIONS:

        if(s->compr == TIFF_G3)

            s->fax_opts = value;

        break;

    case TIFF_T6OPTIONS:

        if(s->compr == TIFF_G4)

            s->fax_opts = value;

        break;

    }

    return 0;

}

        if(count > 4){             av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);             return -1;
static int FUNC_0(TiffContext *VAR_0, const uint8_t *VAR_1, const uint8_t *VAR_2, const uint8_t *VAR_3)

{

    int VAR_4, VAR_5, VAR_6, VAR_7, VAR_8 = 0;

    int VAR_9, VAR_10;

    uint32_t *pal;

    const uint8_t *VAR_11, *gp, *bp;



    VAR_4 = tget_short(&VAR_2, VAR_0->le);

    VAR_5 = tget_short(&VAR_2, VAR_0->le);

    VAR_6 = tget_long(&VAR_2, VAR_0->le);

    VAR_7 = tget_long(&VAR_2, VAR_0->le);



    if(VAR_6 == 1){

        switch(VAR_5){

        case TIFF_BYTE:

        case TIFF_SHORT:

            VAR_2 -= 4;

            VAR_8 = tget(&VAR_2, VAR_5, VAR_0->le);

            VAR_2 = NULL;

            break;

        case TIFF_LONG:

            VAR_8 = VAR_7;

            VAR_2 = NULL;

            break;

        case TIFF_STRING:

            if(VAR_6 <= 4){

                VAR_2 -= 4;

                break;

            }

        default:

            VAR_8 = -1;

            VAR_2 = VAR_1 + VAR_7;

        }

    }else if(type_sizes[VAR_5] * VAR_6 <= 4){

        VAR_2 -= 4;

    }else{

        VAR_2 = VAR_1 + VAR_7;

    }



    if(VAR_2 && (VAR_2 < VAR_1 || VAR_2 > VAR_3)){

        av_log(VAR_0->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

        return -1;

    }



    switch(VAR_4){

    case TIFF_WIDTH:

        VAR_0->width = VAR_8;

        break;

    case TIFF_HEIGHT:

        VAR_0->height = VAR_8;

        break;

    case TIFF_BPP:

        if(VAR_6 == 1) VAR_0->bpp = VAR_8;

        else{

            switch(VAR_5){

            case TIFF_BYTE:

                VAR_0->bpp = (VAR_7 & 0xFF) + ((VAR_7 >> 8) & 0xFF) + ((VAR_7 >> 16) & 0xFF) + ((VAR_7 >> 24) & 0xFF);

                break;

            case TIFF_SHORT:

            case TIFF_LONG:

                VAR_0->bpp = 0;

                for(VAR_9 = 0; VAR_9 < VAR_6; VAR_9++) VAR_0->bpp += tget(&VAR_2, VAR_5, VAR_0->le);

                break;

            default:

                VAR_0->bpp = -1;

            }

        }

        if(VAR_6 > 4){

            av_log(VAR_0->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", VAR_0->bpp, VAR_6);

            return -1;

        }

        switch(VAR_0->bpp*10 + VAR_6){

        case 11:

            VAR_0->avctx->pix_fmt = PIX_FMT_MONOBLACK;

            break;

        case 81:

            VAR_0->avctx->pix_fmt = PIX_FMT_PAL8;

            break;

        case 243:

            VAR_0->avctx->pix_fmt = PIX_FMT_RGB24;

            break;

        case 161:

            VAR_0->avctx->pix_fmt = PIX_FMT_GRAY16BE;

            break;

        case 324:

            VAR_0->avctx->pix_fmt = PIX_FMT_RGBA;

            break;

        case 483:

            VAR_0->avctx->pix_fmt = VAR_0->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE;

            break;

        default:

            av_log(VAR_0->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", VAR_0->bpp, VAR_6);

            return -1;

        }

        if(VAR_0->width != VAR_0->avctx->width || VAR_0->height != VAR_0->avctx->height){

            if(av_image_check_size(VAR_0->width, VAR_0->height, 0, VAR_0->avctx))

                return -1;

            avcodec_set_dimensions(VAR_0->avctx, VAR_0->width, VAR_0->height);

        }

        if(VAR_0->picture.data[0])

            VAR_0->avctx->release_buffer(VAR_0->avctx, &VAR_0->picture);

        if(VAR_0->avctx->get_buffer(VAR_0->avctx, &VAR_0->picture) < 0){

            av_log(VAR_0->avctx, AV_LOG_ERROR, "get_buffer() failed\n");

            return -1;

        }

        if(VAR_0->bpp == 8){

            

            pal = (uint32_t *) VAR_0->picture.data[1];

            for(VAR_9 = 0; VAR_9 < 256; VAR_9++)

                pal[VAR_9] = VAR_9 * 0x010101;

        }

        break;

    case TIFF_COMPR:

        VAR_0->compr = VAR_8;

        VAR_0->predictor = 0;

        switch(VAR_0->compr){

        case TIFF_RAW:

        case TIFF_PACKBITS:

        case TIFF_LZW:

        case TIFF_CCITT_RLE:

            break;

        case TIFF_G3:

        case TIFF_G4:

            VAR_0->fax_opts = 0;

            break;

        case TIFF_DEFLATE:

        case TIFF_ADOBE_DEFLATE:

#if CONFIG_ZLIB

            break;

#else

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n");

            return -1;

#endif

        case TIFF_JPEG:

        case TIFF_NEWJPEG:

            av_log(VAR_0->avctx, AV_LOG_ERROR, "JPEG compression is not supported\n");

            return -1;

        default:

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Unknown compression method %VAR_9\n", VAR_0->compr);

            return -1;

        }

        break;

    case TIFF_ROWSPERSTRIP:

        if(VAR_5 == TIFF_LONG && VAR_8 == -1)

            VAR_8 = VAR_0->avctx->height;

        if(VAR_8 < 1){

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Incorrect VAR_8 of rows per strip\n");

            return -1;

        }

        VAR_0->rps = VAR_8;

        break;

    case TIFF_STRIP_OFFS:

        if(VAR_6 == 1){

            VAR_0->stripdata = NULL;

            VAR_0->stripoff = VAR_8;

        }else

            VAR_0->stripdata = VAR_1 + VAR_7;

        VAR_0->strips = VAR_6;

        if(VAR_0->strips == 1) VAR_0->rps = VAR_0->height;

        VAR_0->sot = VAR_5;

        if(VAR_0->stripdata > VAR_3){

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

            return -1;

        }

        break;

    case TIFF_STRIP_SIZE:

        if(VAR_6 == 1){

            VAR_0->stripsizes = NULL;

            VAR_0->stripsize = VAR_8;

            VAR_0->strips = 1;

        }else{

            VAR_0->stripsizes = VAR_1 + VAR_7;

        }

        VAR_0->strips = VAR_6;

        VAR_0->sstype = VAR_5;

        if(VAR_0->stripsizes > VAR_3){

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n");

            return -1;

        }

        break;

    case TIFF_PREDICTOR:

        VAR_0->predictor = VAR_8;

        break;

    case TIFF_INVERT:

        switch(VAR_8){

        case 0:

            VAR_0->invert = 1;

            break;

        case 1:

            VAR_0->invert = 0;

            break;

        case 2:

        case 3:

            break;

        default:

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n", VAR_8);

            return -1;

        }

        break;

    case TIFF_FILL_ORDER:

        if(VAR_8 < 1 || VAR_8 > 2){

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Unknown FillOrder VAR_8 %d, trying default one\n", VAR_8);

            VAR_8 = 1;

        }

        VAR_0->fill_order = VAR_8 - 1;

        break;

    case TIFF_PAL:

        if(VAR_0->avctx->pix_fmt != PIX_FMT_PAL8){

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Palette met but this is not palettized format\n");

            return -1;

        }

        pal = (uint32_t *) VAR_0->picture.data[1];

        VAR_7 = type_sizes[VAR_5];

        VAR_11 = VAR_2;

        gp = VAR_2 + VAR_6 / 3 * VAR_7;

        bp = VAR_2 + VAR_6 / 3 * VAR_7 * 2;

        VAR_7 = (type_sizes[VAR_5] - 1) << 3;

        for(VAR_9 = 0; VAR_9 < VAR_6 / 3; VAR_9++){

            VAR_10 = (tget(&VAR_11, VAR_5, VAR_0->le) >> VAR_7) << 16;

            VAR_10 |= (tget(&gp, VAR_5, VAR_0->le) >> VAR_7) << 8;

            VAR_10 |= tget(&bp, VAR_5, VAR_0->le) >> VAR_7;

            pal[VAR_9] = VAR_10;

        }

        break;

    case TIFF_PLANAR:

        if(VAR_8 == 2){

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Planar format is not supported\n");

            return -1;

        }

        break;

    case TIFF_T4OPTIONS:

        if(VAR_0->compr == TIFF_G3)

            VAR_0->fax_opts = VAR_8;

        break;

    case TIFF_T6OPTIONS:

        if(VAR_0->compr == TIFF_G4)

            VAR_0->fax_opts = VAR_8;

        break;

    }

    return 0;

}

static int FUNC_0(TiffContext *VAR_0, const uint8_t *VAR_1, const uint8_t *VAR_2, const uint8_t *VAR_3)
{ int VAR_4, VAR_5, VAR_6, VAR_7, VAR_8 = 0; int VAR_9, VAR_10; uint32_t *pal; const uint8_t *VAR_11, *gp, *bp; VAR_4 = tget_short(&VAR_2, VAR_0->le); VAR_5 = tget_short(&VAR_2, VAR_0->le); VAR_6 = tget_long(&VAR_2, VAR_0->le); VAR_7 = tget_long(&VAR_2, VAR_0->le); if(VAR_6 == 1){ switch(VAR_5){ case TIFF_BYTE:
case TIFF_SHORT:
VAR_2 -= 4; VAR_8 = tget(&VAR_2, VAR_5, VAR_0->le); VAR_2 = NULL; break; case TIFF_LONG:
VAR_8 = VAR_7; VAR_2 = NULL; break; case TIFF_STRING:
if(VAR_6 <= 4){ VAR_2 -= 4; break; } default:
VAR_8 = -1; VAR_2 = VAR_1 + VAR_7; } }else if(type_sizes[VAR_5] * VAR_6 <= 4){ VAR_2 -= 4; }else{ VAR_2 = VAR_1 + VAR_7; } if(VAR_2 && (VAR_2 < VAR_1 || VAR_2 > VAR_3)){ av_log(VAR_0->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n"); return -1; } switch(VAR_4){ case TIFF_WIDTH:
VAR_0->width = VAR_8; break; case TIFF_HEIGHT:
VAR_0->height = VAR_8; break; case TIFF_BPP:
if(VAR_6 == 1) VAR_0->bpp = VAR_8; else{ switch(VAR_5){ case TIFF_BYTE:
VAR_0->bpp = (VAR_7 & 0xFF) + ((VAR_7 >> 8) & 0xFF) + ((VAR_7 >> 16) & 0xFF) + ((VAR_7 >> 24) & 0xFF); break; case TIFF_SHORT:
case TIFF_LONG:
VAR_0->bpp = 0; for(VAR_9 = 0; VAR_9 < VAR_6; VAR_9++) VAR_0->bpp += tget(&VAR_2, VAR_5, VAR_0->le); break; default:
VAR_0->bpp = -1; } } if(VAR_6 > 4){ av_log(VAR_0->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", VAR_0->bpp, VAR_6); return -1; } switch(VAR_0->bpp*10 + VAR_6){ case 11:
VAR_0->avctx->pix_fmt = PIX_FMT_MONOBLACK; break; case 81:
VAR_0->avctx->pix_fmt = PIX_FMT_PAL8; break; case 243:
VAR_0->avctx->pix_fmt = PIX_FMT_RGB24; break; case 161:
VAR_0->avctx->pix_fmt = PIX_FMT_GRAY16BE; break; case 324:
VAR_0->avctx->pix_fmt = PIX_FMT_RGBA; break; case 483:
VAR_0->avctx->pix_fmt = VAR_0->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE; break; default:
av_log(VAR_0->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", VAR_0->bpp, VAR_6); return -1; } if(VAR_0->width != VAR_0->avctx->width || VAR_0->height != VAR_0->avctx->height){ if(av_image_check_size(VAR_0->width, VAR_0->height, 0, VAR_0->avctx))
return -1; avcodec_set_dimensions(VAR_0->avctx, VAR_0->width, VAR_0->height); } if(VAR_0->picture.data[0])
VAR_0->avctx->release_buffer(VAR_0->avctx, &VAR_0->picture); if(VAR_0->avctx->get_buffer(VAR_0->avctx, &VAR_0->picture) < 0){ av_log(VAR_0->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } if(VAR_0->bpp == 8){ pal = (uint32_t *) VAR_0->picture.data[1]; for(VAR_9 = 0; VAR_9 < 256; VAR_9++) pal[VAR_9] = VAR_9 * 0x010101; } break; case TIFF_COMPR:
VAR_0->compr = VAR_8; VAR_0->predictor = 0; switch(VAR_0->compr){ case TIFF_RAW:
case TIFF_PACKBITS:
case TIFF_LZW:
case TIFF_CCITT_RLE:
break; case TIFF_G3:
case TIFF_G4:
VAR_0->fax_opts = 0; break; case TIFF_DEFLATE:
case TIFF_ADOBE_DEFLATE:
#if CONFIG_ZLIB
break; #else
av_log(VAR_0->avctx, AV_LOG_ERROR, "Deflate: ZLib not compiled in\n"); return -1; #endif
case TIFF_JPEG:
case TIFF_NEWJPEG:
av_log(VAR_0->avctx, AV_LOG_ERROR, "JPEG compression is not supported\n"); return -1; default:
av_log(VAR_0->avctx, AV_LOG_ERROR, "Unknown compression method %VAR_9\n", VAR_0->compr); return -1; } break; case TIFF_ROWSPERSTRIP:
if(VAR_5 == TIFF_LONG && VAR_8 == -1)
VAR_8 = VAR_0->avctx->height; if(VAR_8 < 1){ av_log(VAR_0->avctx, AV_LOG_ERROR, "Incorrect VAR_8 of rows per strip\n"); return -1; } VAR_0->rps = VAR_8; break; case TIFF_STRIP_OFFS:
if(VAR_6 == 1){ VAR_0->stripdata = NULL; VAR_0->stripoff = VAR_8; }else VAR_0->stripdata = VAR_1 + VAR_7; VAR_0->strips = VAR_6; if(VAR_0->strips == 1) VAR_0->rps = VAR_0->height; VAR_0->sot = VAR_5; if(VAR_0->stripdata > VAR_3){ av_log(VAR_0->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n"); return -1; } break; case TIFF_STRIP_SIZE:
if(VAR_6 == 1){ VAR_0->stripsizes = NULL; VAR_0->stripsize = VAR_8; VAR_0->strips = 1; }else{ VAR_0->stripsizes = VAR_1 + VAR_7; } VAR_0->strips = VAR_6; VAR_0->sstype = VAR_5; if(VAR_0->stripsizes > VAR_3){ av_log(VAR_0->avctx, AV_LOG_ERROR, "Tag referencing position outside the image\n"); return -1; } break; case TIFF_PREDICTOR:
VAR_0->predictor = VAR_8; break; case TIFF_INVERT:
switch(VAR_8){ case 0:
VAR_0->invert = 1; break; case 1:
VAR_0->invert = 0; break; case 2:
case 3:
break; default:
av_log(VAR_0->avctx, AV_LOG_ERROR, "Color mode %d is not supported\n", VAR_8); return -1; } break; case TIFF_FILL_ORDER:
if(VAR_8 < 1 || VAR_8 > 2){ av_log(VAR_0->avctx, AV_LOG_ERROR, "Unknown FillOrder VAR_8 %d, trying default one\n", VAR_8); VAR_8 = 1; } VAR_0->fill_order = VAR_8 - 1; break; case TIFF_PAL:
if(VAR_0->avctx->pix_fmt != PIX_FMT_PAL8){ av_log(VAR_0->avctx, AV_LOG_ERROR, "Palette met but this is not palettized format\n"); return -1; } pal = (uint32_t *) VAR_0->picture.data[1]; VAR_7 = type_sizes[VAR_5]; VAR_11 = VAR_2; gp = VAR_2 + VAR_6 / 3 * VAR_7; bp = VAR_2 + VAR_6 / 3 * VAR_7 * 2; VAR_7 = (type_sizes[VAR_5] - 1) << 3; for(VAR_9 = 0; VAR_9 < VAR_6 / 3; VAR_9++){ VAR_10 = (tget(&VAR_11, VAR_5, VAR_0->le) >> VAR_7) << 16; VAR_10 |= (tget(&gp, VAR_5, VAR_0->le) >> VAR_7) << 8; VAR_10 |= tget(&bp, VAR_5, VAR_0->le) >> VAR_7; pal[VAR_9] = VAR_10; } break; case TIFF_PLANAR:
if(VAR_8 == 2){ av_log(VAR_0->avctx, AV_LOG_ERROR, "Planar format is not supported\n"); return -1; } break; case TIFF_T4OPTIONS:
if(VAR_0->compr == TIFF_G3)
VAR_0->fax_opts = VAR_8; break; case TIFF_T6OPTIONS:
if(VAR_0->compr == TIFF_G4)
VAR_0->fax_opts = VAR_8; break; } return 0; }