* only work on linux since I need memmem function
*/
+/*
+ * Add support for other signatures:
+ *
+ * obj<</Subtype/Image/Length 110494/Filter/JPXDecode/BitsPerComponent 8/ColorSpace/DeviceRGB/Width 712/Height 1052>>stream
+ */
#define _GNU_SOURCE
#include <string.h>
#include <stdio.h>
{
#define NUMJP2 32
int i, c = 0;
- long offets[NUMJP2];
+ long offsets[NUMJP2];
char buffer[512];
#define BUFLEN 4096
int cont = 1;
const ptrdiff_t diff = ret - haystack;
assert( diff >= 0 );
/*fprintf( stdout, "Found it: %lx\n", (ptrdiff_t)cpos - (ptrdiff_t)hlen + diff);*/
- offets[c++] = (ptrdiff_t)cpos - (ptrdiff_t)hlen + diff;
+ offsets[c++] = (ptrdiff_t)cpos - (ptrdiff_t)hlen + diff;
}
cont = (nread == flen);
memcpy( haystack, haystack + nread, nlen );
{
int s, len = 0;
char *r;
- const int ret = fseek(f, offets[i], SEEK_SET);
+ const int ret = fseek(f, offsets[i], SEEK_SET);
assert( ret == 0 );
r = fgets(buffer, sizeof(buffer), f);
assert( r );
/*fprintf( stderr, "DEBUG: %s", r );*/
s = sscanf(r, "JPXDecode]/Length %d/Width %*d/BitsPerComponent %*d/Height %*d", &len);
- assert( s == 1 );
+ if( s == 0 )
+ { // try again harder
+ const int ret = fseek(f, offsets[i] - 40, SEEK_SET); // 40 is magic number
+ assert( ret == 0 );
+ r = fgets(buffer, sizeof(buffer), f);
+ assert( r );
+ const char needle2[] = "/Length";
+ char * s2 = strstr(buffer, needle2);
+ s = sscanf(s2, "/Length %d/", &len);
+ }
+ if( s == 1 )
{
FILE *jp2;
int j;