forked from espressif/esp-idf
		
	
		
			
	
	
		
			92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include "rom/tjpgd.h"
							 | 
						||
| 
								 | 
							
								#include <string.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include "unity.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "test_tjpgd_logo.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct {
							 | 
						||
| 
								 | 
							
								    const unsigned char *inData;
							 | 
						||
| 
								 | 
							
								    int inPos;
							 | 
						||
| 
								 | 
							
								    unsigned char *outData;
							 | 
						||
| 
								 | 
							
								    int outW;
							 | 
						||
| 
								 | 
							
								    int outH;
							 | 
						||
| 
								 | 
							
								} JpegDev;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static UINT infunc(JDEC *decoder, BYTE *buf, UINT len)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    JpegDev *jd = (JpegDev *)decoder->device;
							 | 
						||
| 
								 | 
							
								    printf("Reading %d bytes from pos %d\n", len, jd->inPos);
							 | 
						||
| 
								 | 
							
								    if (buf != NULL) {
							 | 
						||
| 
								 | 
							
								        memcpy(buf, jd->inData + jd->inPos, len);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    jd->inPos += len;
							 | 
						||
| 
								 | 
							
								    return len;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static UINT outfunc(JDEC *decoder, void *bitmap, JRECT *rect)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    unsigned char *in = (unsigned char *)bitmap;
							 | 
						||
| 
								 | 
							
								    unsigned char *out;
							 | 
						||
| 
								 | 
							
								    int y;
							 | 
						||
| 
								 | 
							
								    printf("Rect %d,%d - %d,%d\n", rect->top, rect->left, rect->bottom, rect->right);
							 | 
						||
| 
								 | 
							
								    JpegDev *jd = (JpegDev *)decoder->device;
							 | 
						||
| 
								 | 
							
								    for (y = rect->top; y <= rect->bottom; y++) {
							 | 
						||
| 
								 | 
							
								        out = jd->outData + ((jd->outW * y) + rect->left) * 3;
							 | 
						||
| 
								 | 
							
								        memcpy(out, in, ((rect->right - rect->left) + 1) * 3);
							 | 
						||
| 
								 | 
							
								        in += ((rect->right - rect->left) + 1) * 3;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return 1;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define TESTW 48
							 | 
						||
| 
								 | 
							
								#define TESTH 48
							 | 
						||
| 
								 | 
							
								#define WORKSZ 3100
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TEST_CASE("Test JPEG decompression library", "[tjpgd]")
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    char aapix[] = " .:;+=xX$$";
							 | 
						||
| 
								 | 
							
								    unsigned char *decoded, *p;
							 | 
						||
| 
								 | 
							
								    char *work;
							 | 
						||
| 
								 | 
							
								    int r;
							 | 
						||
| 
								 | 
							
								    int x, y, v;
							 | 
						||
| 
								 | 
							
								    JDEC decoder;
							 | 
						||
| 
								 | 
							
								    JpegDev jd;
							 | 
						||
| 
								 | 
							
								    decoded = malloc(48 * 48 * 3);
							 | 
						||
| 
								 | 
							
								    for (x = 0; x < 48 * 48 * 3; x += 2) {
							 | 
						||
| 
								 | 
							
								        decoded[x] = 0; decoded[x + 1] = 0xff;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    work = malloc(WORKSZ);
							 | 
						||
| 
								 | 
							
								    memset(work, 0, WORKSZ);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    jd.inData = logo_jpg;
							 | 
						||
| 
								 | 
							
								    jd.inPos = 0;
							 | 
						||
| 
								 | 
							
								    jd.outData = decoded;
							 | 
						||
| 
								 | 
							
								    jd.outW = TESTW;
							 | 
						||
| 
								 | 
							
								    jd.outH = TESTH;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    r = jd_prepare(&decoder, infunc, work, WORKSZ, (void *)&jd);
							 | 
						||
| 
								 | 
							
								    TEST_ASSERT_EQUAL(r, JDR_OK);
							 | 
						||
| 
								 | 
							
								    r = jd_decomp(&decoder, outfunc, 0);
							 | 
						||
| 
								 | 
							
								    TEST_ASSERT_EQUAL(r, JDR_OK);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    p = decoded + 2;
							 | 
						||
| 
								 | 
							
								    for (y = 0; y < TESTH; y++) {
							 | 
						||
| 
								 | 
							
								        for (x = 0; x < TESTH; x++) {
							 | 
						||
| 
								 | 
							
								            v = ((*p) * (sizeof(aapix) - 2) * 2) / 256;
							 | 
						||
| 
								 | 
							
								            printf("%c%c", aapix[v / 2], aapix[(v + 1) / 2]);
							 | 
						||
| 
								 | 
							
								            p += 3;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        printf("%c%c", ' ', '\n');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    free(work);
							 | 
						||
| 
								 | 
							
								    free(decoded);
							 | 
						||
| 
								 | 
							
								}
							 |