Initial commit of old code

This commit is contained in:
nedko 2022-11-25 16:12:57 +02:00
commit 7f181eb8b6
2 changed files with 191 additions and 0 deletions

2
Makefile Normal file
View File

@ -0,0 +1,2 @@
all:
gcc -o flac_scan main.c

189
main.c Normal file
View File

@ -0,0 +1,189 @@
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#define THRESHOLD 1200
/* portions derived from IJG code */
#define readbyte(a,b) do if(((a)=getc((b))) == EOF) return 0; while (0)
#define readword(a,b) do { int cc_=0,dd_=0; \
if((cc_=getc((b))) == EOF \
|| (dd_=getc((b))) == EOF) return 0; \
(a) = (cc_<<8) + (dd_); \
} while(0)
int scanhead (FILE * infile, int * image_width, int * image_height) {
int marker=0;
int dummy=0;
if ( getc(infile) != 0xFF || getc(infile) != 0xD8 )
return 0;
for (;
;) {
int discarded_bytes=0;
readbyte(marker,infile);
while (marker != 0xFF) {
discarded_bytes++;
readbyte(marker,infile);
}
do readbyte(marker,infile); while (marker == 0xFF);
if (discarded_bytes != 0) return 0;
switch (marker) {
case 0xC0:
case 0xC1:
case 0xC2:
case 0xC3:
case 0xC5:
case 0xC6:
case 0xC7:
case 0xC9:
case 0xCA:
case 0xCB:
case 0xCD:
case 0xCE:
case 0xCF: {
readword(dummy,infile); /* usual parameter length count */
readbyte(dummy,infile);
readword((*image_height),infile);
readword((*image_width),infile);
readbyte(dummy,infile);
return 1;
break;
}
case 0xDA:
case 0xD9:
return 0;
default: {
int length;
readword(length,infile);
if (length < 2)
return 0;
length -= 2;
while (length > 0) {
readbyte(dummy, infile);
length--;
}
}
break;
}
}
}
int scanPNG(FILE *fp, int *width, int *height)
{
uint8_t img_buf[4];
uint32_t w;
uint32_t h;
// NO SEEKING IN PIPE
// fseek(fp, 16, SEEK_SET);
fread(img_buf, 1, 4, fp);
fread(img_buf, 1, 4, fp);
fread(img_buf, 1, 4, fp);
fread(img_buf, 1, 4, fp);
// Read Width
fread(img_buf, 1, 4, fp);
w = img_buf[0];
w <<= 8;
w += img_buf[1];
w <<= 8;
w += img_buf[2];
w <<= 8;
w += img_buf[3];
// Read Height
fread(img_buf, 1, 4, fp);
h = img_buf[0];
h <<= 8;
h += img_buf[1];
h <<= 8;
h += img_buf[2];
h <<= 8;
h += img_buf[3];
*width = w;
*height = h;
return 0;
}
int fpeek(FILE *stream)
{
int c;
if (feof(stream))
{
return EOF;
}
c = fgetc(stream);
ungetc(c, stream);
return c;
}
int main(int argc, char **argv)
{
int width;
int height;
int peek;
FILE *pp;
char cmd[2048];
if (argc < 2)
{
printf("Need filename\n");
return -1;
}
strcpy(cmd, "metaflac --export-picture-to=- \"");
strcat(cmd, argv[1]);
strcat(cmd, "\" 2>&1");
pp = popen(cmd, "r");
if (NULL == pp)
{
printf("Bad PP: '%s'\n", argv[1]);
return -1;
}
peek = fpeek(pp);
switch (peek)
{
case 0xFF:
//JPG
scanhead(pp, &width, &height);
if ((width > THRESHOLD) || (height > THRESHOLD))
{
printf("'%s' W:%04d H:%04d\n", argv[1], width, height);
}
break;
case 0x89:
//PNG
scanPNG(pp, &width, &height);
if ((width > THRESHOLD) || (height > THRESHOLD))
{
printf("'%s' W:%04d H:%04d\n", argv[1], width, height);
}
break;
case 0x2F:
break;
default:
//NaN
printf("'%s' WeirdChamp: 0x%02X\n", argv[1], peek);
}
pclose(pp);
return 0;
}