#include "bytesource.h"
#include "choice.h"
#include "dehuff.h"
+#include "driver.h"
#include "idct.h"
#include "input.h"
#include "zigzag.h"
-struct jpeg_image {
- unsigned precision;
- unsigned width, height;
- unsigned num_components;
- unsigned hsample[256], vsample[256], qtable[256];
- unsigned max_hsample, max_vsample;
- unsigned stride[256];
- unsigned num_blocks_horizontal, num_blocks_vertical;
- uint32_t qvalues[256][DCTSIZE2];
- void* idct_data[256];
- uint8_t* pixel_data[256];
- uint8_t* pixel_write_pointer[256];
-};
-
ssize_t stdio_read(void* userdata, uint8_t* buf, size_t count)
{
return fread(buf, 1, count, (FILE*)userdata);
}
}
-int main(void)
+void read_jpeg(struct jpeg_image* jpeg, FILE *input)
{
- struct jpeg_image jpeg;
- memset(&jpeg, 0, sizeof(jpeg));
- init_choices();
-
+ memset(jpeg, 0, sizeof(*jpeg));
+
struct byte_source source;
- init_byte_source(&source, stdio_read, stdin);
+ init_byte_source(&source, stdio_read, input);
huffman_tables_t tables;
break;
case 0xdb:
/* DQT */
- read_dqt(&source, &jpeg);
+ read_dqt(&source, jpeg);
break;
case 0xc0:
/* SOF0 (baseline DCT, Huffman encoded) */
- read_sof(&source, &jpeg);
+ read_sof(&source, jpeg);
break;
case 0xd8:
/* SOI */
break;
case 0xda:
/* SOS (start of scan) */
- read_scan(&source, &jpeg, &tables);
+ read_scan(&source, jpeg, &tables);
break;
default:
fprintf(stderr, "Error: Unknown marker 0x%02x\n", m2);
}
}
}
+
+int main(void)
+{
+ init_choices();
+
+ struct jpeg_image jpeg;
+ read_jpeg(&jpeg, stdin);
+}
--- /dev/null
+#ifndef _DRIVER_H
+#define _DRIVER_H 1
+
+#include <stddef.h>
+#include "idct.h"
+
+struct jpeg_image {
+ unsigned precision;
+ unsigned width, height;
+ unsigned num_components;
+ unsigned hsample[256], vsample[256], qtable[256];
+ unsigned max_hsample, max_vsample;
+ unsigned stride[256];
+ unsigned num_blocks_horizontal, num_blocks_vertical;
+ uint32_t qvalues[256][DCTSIZE2];
+ void* idct_data[256];
+ uint8_t* pixel_data[256];
+ uint8_t* pixel_write_pointer[256];
+};
+
+void read_jpeg(struct jpeg_image* jpeg, FILE *input);
+
+#endif /* !defined(_DRIVER_H) */