EXR_PXR24,
EXR_B44,
EXR_B44A,
+ EXR_DWA,
+ EXR_DWB,
EXR_UNKN,
};
bytestream_put_le16(&out, pixel);
}
break;
+ case EXR_UINT:
+ ptr[0] = in;
+ ptr[1] = ptr[0] + s->xdelta;
+ ptr[2] = ptr[1] + s->xdelta;
+ ptr[3] = ptr[2] + s->xdelta;
+ in = ptr[3] + s->xdelta;
+
+ for (j = 0; j < s->xdelta; ++j) {
+ uint32_t diff = (*(ptr[0]++) << 24) |
+ (*(ptr[1]++) << 16) |
+ (*(ptr[2]++) << 8 ) |
+ (*(ptr[3]++));
+ pixel += diff;
+ bytestream_put_le32(&out, pixel);
+ }
+ break;
default:
return AVERROR_INVALIDDATA;
}
return var_size;
}
-static int decode_header(EXRContext *s)
+static int decode_header(EXRContext *s, AVFrame *frame)
{
+ AVDictionary *metadata = NULL;
int magic_number, version, i, flags, sar = 0;
int layer_match = 0;
return AVERROR_PATCHWELCOME;
}
+ continue;
+ } else if ((var_size = check_header_variable(s, "writer",
+ "string", 1)) >= 0) {
+ uint8_t key[256] = { 0 };
+
+ bytestream2_get_buffer(&s->gb, key, FFMIN(sizeof(key) - 1, var_size));
+ av_dict_set(&metadata, "writer", key, 0);
+
continue;
}
return AVERROR_INVALIDDATA;
}
+ av_frame_set_metadata(frame, metadata);
+
// aaand we are done
bytestream2_skip(&s->gb, 1);
return 0;
bytestream2_init(&s->gb, avpkt->data, avpkt->size);
- if ((ret = decode_header(s)) < 0)
+ if ((ret = decode_header(s, picture)) < 0)
return ret;
switch (s->pixel_type) {
avctx->execute2(avctx, decode_block, s->thread_data, NULL, nb_blocks);
// Zero out the end if ymax+1 is not h
+ ptr = picture->data[0] + ((s->ymax+1) * picture->linesize[0]);
for (y = s->ymax + 1; y < avctx->height; y++) {
memset(ptr, 0, out_line_size);
ptr += picture->linesize[0];