Ticket #167: tiff.patch

File tiff.patch, 4.3 KB (added by ami_stuff, 15 years ago)
  • libavcodec/tiff.c

     
    3939    AVFrame picture;
    4040
    4141    int width, height;
    42     unsigned int bpp;
     42    unsigned int bpp, bppcount;
    4343    int le;
    4444    int compr;
    4545    int invert;
     
    209209    return 0;
    210210}
    211211
     212static int init_image(TiffContext *s)
     213{
     214    int i;
     215    uint32_t *pal;
    212216
     217        switch(s->bpp*10 + s->bppcount){
     218        case 11:
     219            s->avctx->pix_fmt = PIX_FMT_MONOBLACK;
     220            break;
     221        case 81:
     222            s->avctx->pix_fmt = PIX_FMT_PAL8;
     223            break;
     224        case 243:
     225            s->avctx->pix_fmt = PIX_FMT_RGB24;
     226            break;
     227        case 161:
     228            s->avctx->pix_fmt = PIX_FMT_GRAY16BE;
     229            break;
     230        case 324:
     231            s->avctx->pix_fmt = PIX_FMT_RGBA;
     232            break;
     233        case 483:
     234            s->avctx->pix_fmt = s->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE;
     235            break;
     236        default:
     237            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, s->bppcount);
     238            return -1;
     239        }
     240        if(s->width != s->avctx->width || s->height != s->avctx->height){
     241            if(avcodec_check_dimensions(s->avctx, s->width, s->height))
     242                return -1;
     243            avcodec_set_dimensions(s->avctx, s->width, s->height);
     244        }
     245        if(s->picture.data[0])
     246            s->avctx->release_buffer(s->avctx, &s->picture);
     247        if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
     248            av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
     249            return -1;
     250        }
     251        if(s->bpp == 8 && s->picture.data[1]){
     252            /* make default grayscale pal */
     253            pal = (uint32_t *) s->picture.data[1];
     254            for(i = 0; i < 256; i++)
     255                pal[i] = i * 0x010101;
     256        }
     257        return 0;
     258}
     259
    213260static int tiff_decode_tag(TiffContext *s, const uint8_t *start, const uint8_t *buf, const uint8_t *end_buf)
    214261{
    215262    int tag, type, count, off, value = 0;
     
    262309        s->height = value;
    263310        break;
    264311    case TIFF_BPP:
     312        s->bppcount = count;
    265313        if(count == 1) s->bpp = value;
    266314        else{
    267315            switch(type){
     
    281329            av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);
    282330            return -1;
    283331        }
    284         switch(s->bpp*10 + count){
    285         case 11:
    286             s->avctx->pix_fmt = PIX_FMT_MONOBLACK;
    287             break;
    288         case 81:
    289             s->avctx->pix_fmt = PIX_FMT_PAL8;
    290             break;
    291         case 243:
    292             s->avctx->pix_fmt = PIX_FMT_RGB24;
    293             break;
    294         case 161:
    295             s->avctx->pix_fmt = PIX_FMT_GRAY16BE;
    296             break;
    297         case 324:
    298             s->avctx->pix_fmt = PIX_FMT_RGBA;
    299             break;
    300         case 483:
    301             s->avctx->pix_fmt = s->le ? PIX_FMT_RGB48LE : PIX_FMT_RGB48BE;
    302             break;
    303         default:
    304             av_log(s->avctx, AV_LOG_ERROR, "This format is not supported (bpp=%d, %d components)\n", s->bpp, count);
     332        if(init_image(s))
    305333            return -1;
     334        break;
     335    case TIFF_SAMPLES_PER_PIXEL:
     336        if(count != 1){
     337            av_log(s->avctx, AV_LOG_ERROR, "Samples per pixel is not a single value\n");
     338            return -1;
    306339        }
    307         if(s->width != s->avctx->width || s->height != s->avctx->height){
    308             if(avcodec_check_dimensions(s->avctx, s->width, s->height))
    309                 return -1;
    310             avcodec_set_dimensions(s->avctx, s->width, s->height);
    311         }
    312         if(s->picture.data[0])
    313             s->avctx->release_buffer(s->avctx, &s->picture);
    314         if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
    315             av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
     340        s->bpp *= value;
     341        s->bppcount = value;
     342        if(init_image(s))
    316343            return -1;
    317         }
    318         if(s->bpp == 8){
    319             /* make default grayscale pal */
    320             pal = (uint32_t *) s->picture.data[1];
    321             for(i = 0; i < 256; i++)
    322                 pal[i] = i * 0x010101;
    323         }
    324344        break;
    325345    case TIFF_COMPR:
    326346        s->compr = value;