ref: e7ea7adedf43ec7e815cc105cf8028af81b5cf1e
dir: /decode.c/
#include <u.h> #include <libc.h> #include <bio.h> #include <thread.h> #define J40_CONFIRM_THAT_THIS_IS_EXPERIMENTAL_AND_POTENTIALLY_UNSAFE #define J40_IMPLEMENTATION #define J40_INLINE int __builtin_clz(unsigned int x); int __builtin_clzll(unsigned long long x); #include "j40.h" static void usage(void) { fprint(2, "usage: %s\n", argv0); } static u8int * readall(int f, int *outsz) { int bufsz, sz, n; u8int *s; bufsz = 65535; s = nil; for(sz = 0;; sz += n){ if(bufsz-sz < 65536){ bufsz *= 2; s = realloc(s, bufsz); } if((n = readn(f, s+sz, bufsz-sz)) < 1) break; } if(n < 0 || sz < 1){ if(n == 0) werrstr("empty"); free(s); return nil; } *outsz = sz; return s; } void threadmain(int argc, char **argv) { j40_pixels_u8x4 pixels; u8int *p, *in, x; j40_image image; j40_frame frame; int sz, y, n; Biobuf *b; ARGBEGIN{ default: usage(); }ARGEND if((in = readall(0, &sz)) == nil || (b = Bfdopen(1, OWRITE)) == nil) sysfatal("%r"); j40_from_memory(&image, in, sz, free); // or: j40_from_memory(&image, buf, bufsize, freefunc); j40_output_format(&image, J40_RGBA, J40_U8X4); if(j40_next_frame(&image)){ frame = j40_current_frame(&image); pixels = j40_frame_pixels_u8x4(&frame, J40_RGBA); Bprint(b, "%11s %11d %11d %11d %11d ", "a8r8g8b8", 0, 0, pixels.width, pixels.height); for(y = 0; y < pixels.height; ++y){ p = (u8int*)j40_row_u8x4(pixels, y); for(n = 0; n < 4*pixels.width; n += 4){ x = p[n+0]; p[n+0] = p[n+2]; p[n+2] = x; } Bwrite(b, p, 4*pixels.width); } } if(j40_error(&image)) sysfatal("%s", j40_error_string(&image)); j40_free(&image); // also frees all memory associated to j40_frame etc. Bterm(b); threadexitsall(nil); }