libavcodec/exr : add support for compression in tile
This commit is contained in:
		
							parent
							
								
									062ad63064
								
							
						
					
					
						commit
						832861535a
					
				@ -780,9 +780,9 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize,
 | 
			
		||||
        int size = channel->pixel_type;
 | 
			
		||||
 | 
			
		||||
        for (j = 0; j < size; j++)
 | 
			
		||||
            wav_decode(ptr + j, s->xdelta, size, s->ysize,
 | 
			
		||||
                       s->xdelta * size, maxval);
 | 
			
		||||
        ptr += s->xdelta * s->ysize * size;
 | 
			
		||||
            wav_decode(ptr + j, s->xsize, size, s->ysize,
 | 
			
		||||
                       s->xsize * size, maxval);
 | 
			
		||||
        ptr += s->xsize * s->ysize * size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    apply_lut(td->lut, tmp, dsize / sizeof(uint16_t));
 | 
			
		||||
@ -790,9 +790,9 @@ static int piz_uncompress(EXRContext *s, const uint8_t *src, int ssize,
 | 
			
		||||
    out = td->uncompressed_data;
 | 
			
		||||
    for (i = 0; i < s->ysize; i++)
 | 
			
		||||
        for (j = 0; j < s->nb_channels; j++) {
 | 
			
		||||
            uint16_t *in = tmp + j * s->xdelta * s->ysize + i * s->xdelta;
 | 
			
		||||
            memcpy(out, in, s->xdelta * 2);
 | 
			
		||||
            out += s->xdelta * 2;
 | 
			
		||||
            uint16_t *in = tmp + j * s->xsize * s->ysize + i * s->xsize;
 | 
			
		||||
            memcpy(out, in, s->xsize * 2);
 | 
			
		||||
            out += s->xsize * 2;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
@ -830,11 +830,11 @@ static int pxr24_uncompress(EXRContext *s, const uint8_t *src,
 | 
			
		||||
            switch (channel->pixel_type) {
 | 
			
		||||
            case EXR_FLOAT:
 | 
			
		||||
                ptr[0] = in;
 | 
			
		||||
                ptr[1] = ptr[0] + s->xdelta;
 | 
			
		||||
                ptr[2] = ptr[1] + s->xdelta;
 | 
			
		||||
                in     = ptr[2] + s->xdelta;
 | 
			
		||||
                ptr[1] = ptr[0] + s->xsize;
 | 
			
		||||
                ptr[2] = ptr[1] + s->xsize;
 | 
			
		||||
                in     = ptr[2] + s->xsize;
 | 
			
		||||
 | 
			
		||||
                for (j = 0; j < s->xdelta; ++j) {
 | 
			
		||||
                for (j = 0; j < s->xsize; ++j) {
 | 
			
		||||
                    uint32_t diff = (*(ptr[0]++) << 24) |
 | 
			
		||||
                                    (*(ptr[1]++) << 16) |
 | 
			
		||||
                                    (*(ptr[2]++) << 8);
 | 
			
		||||
@ -844,9 +844,9 @@ static int pxr24_uncompress(EXRContext *s, const uint8_t *src,
 | 
			
		||||
                break;
 | 
			
		||||
            case EXR_HALF:
 | 
			
		||||
                ptr[0] = in;
 | 
			
		||||
                ptr[1] = ptr[0] + s->xdelta;
 | 
			
		||||
                in     = ptr[1] + s->xdelta;
 | 
			
		||||
                for (j = 0; j < s->xdelta; j++) {
 | 
			
		||||
                ptr[1] = ptr[0] + s->xsize;
 | 
			
		||||
                in     = ptr[1] + s->xsize;
 | 
			
		||||
                for (j = 0; j < s->xsize; j++) {
 | 
			
		||||
                    uint32_t diff = (*(ptr[0]++) << 8) | *(ptr[1]++);
 | 
			
		||||
 | 
			
		||||
                    pixel += diff;
 | 
			
		||||
@ -922,8 +922,8 @@ static int b44_uncompress(EXRContext *s, const uint8_t *src, int compressed_size
 | 
			
		||||
    int c, iY, iX, y, x;
 | 
			
		||||
 | 
			
		||||
    /* calc B44 block count */
 | 
			
		||||
    nbB44BlockW = s->xdelta / 4;
 | 
			
		||||
    if ((s->xdelta % 4) != 0)
 | 
			
		||||
    nbB44BlockW = s->xsize / 4;
 | 
			
		||||
    if ((s->xsize % 4) != 0)
 | 
			
		||||
        nbB44BlockW++;
 | 
			
		||||
 | 
			
		||||
    nbB44BlockH = s->ysize / 4;
 | 
			
		||||
@ -957,8 +957,8 @@ static int b44_uncompress(EXRContext *s, const uint8_t *src, int compressed_size
 | 
			
		||||
                indexHgY = iY * 4;
 | 
			
		||||
 | 
			
		||||
                for (y = indexHgY; y < FFMIN(indexHgY + 4, s->ysize); y++) {
 | 
			
		||||
                    for (x = indexHgX; x < FFMIN(indexHgX + 4, s->xdelta); x++) {
 | 
			
		||||
                        indexOut = (c * s->xdelta + y * s->xdelta * s->nb_channels + x) * 2;
 | 
			
		||||
                    for (x = indexHgX; x < FFMIN(indexHgX + 4, s->xsize); x++) {
 | 
			
		||||
                        indexOut = (c * s->xsize + y * s->xsize * s->nb_channels + x) * 2;
 | 
			
		||||
                        indexTmp = (y-indexHgY) * 4 + (x-indexHgX);
 | 
			
		||||
                        td->uncompressed_data[indexOut] = tmpBuffer[indexTmp] & 0xff;
 | 
			
		||||
                        td->uncompressed_data[indexOut + 1] = tmpBuffer[indexTmp] >> 8;
 | 
			
		||||
@ -1531,11 +1531,6 @@ static int decode_header(EXRContext *s)
 | 
			
		||||
            av_log(s->avctx, AV_LOG_ERROR, "Invalid tile attribute.\n");
 | 
			
		||||
            return AVERROR_INVALIDDATA;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (s->compression != EXR_RAW) {
 | 
			
		||||
            avpriv_report_missing_feature(s->avctx, "Compression in tile %d", s->compression);
 | 
			
		||||
            return AVERROR_PATCHWELCOME;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    s->scan_line_size = s->xdelta * s->current_channel_offset;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user