[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v3] pickles: Add new pickle for jpeg
From: |
Mohammad-Reza Nabipoor |
Subject: |
Re: [PATCH v3] pickles: Add new pickle for jpeg |
Date: |
Mon, 26 Feb 2024 19:17:25 +0100 |
Hi Andreas,
On Sun, Feb 25, 2024 at 06:02:05PM +0100, Andreas Klinger wrote:
> diff --git a/pickles/jpeg.pk b/pickles/jpeg.pk
> new file mode 100644
> index 00000000..1c5c4856
> --- /dev/null
> +++ b/pickles/jpeg.pk
> +
>[...]
> +type JPEG_Segment =
> + struct
> + {
> + uint<8> ff == 0xFF;
> + uint<8> xx : xx != 0xD8 && xx != 0xDA && xx != 0xD9 && xx >= 0xC0 && xx
> < 0xFF;
> + uint<16> size : size >= 2;
I'd suggest: `offset<uint<16>,B> size : size >= 2#B;'
> +type JPEG_Tag =
> + struct
> + {
> + type Image =
> + union
> + {
> + uint<8>[2] pair: ((pair[1] != 0xFFUB) && (pair != [0xFFUB,0xD9UB]))
> || (pair == [0xFFUB,0x00UB]);
> + uint<8> single: single != 0xFFUB;
> + };
> + JPEG_STS soi: soi.xx == 0xD8UB;
> + JPEG_Segment[] segments;
> + JPEG_STS sos: sos.xx == 0xDAUB;
> + Image[] image;
> + JPEG_STS eoi: eoi.xx == 0xD9UB;
> + method get_nsegs = uint<32>:
> + {
> + return segments'length;
> + }
> + method get_image = uint<8>[]:
> + {
> + var bytes = uint<8>[]();
> + for (i in image)
> + try bytes += i.pair;
> + catch if E_elem { bytes += [i.single]; }
> + return bytes;
> + }
> + };
Maybe having a function like this is also useful:
```poke
method get_image_range = offset<uint<64>,B>[]:
{
var begin = image'offset,
end = begin + image'size;
return [begin, end];
}
```
In case somebody want to Poke that range directly, e.g., like this:
```poke
var range = tag.get_image_range;
var img = uint<8>[range[1] - range[0]] @ range[0];
if (image'size > 0#B);
img[1#B] = ~img[1#B];
```
Regards,
Mohammad-Reza