void display_image(int row, int col, const void *image) { const u16 *p = image; u32 width = *p++; u32 height = *p++; u32 pos; u16 palette[128]; for (pos = 0; pos < width * height; ) { u16 word = *p++; u8 index = word >> 8; if ((index & 0x80)) { palette[index & 0x7f] = rgb24to16((word << 16) | *p++); } else { u8 rl = word; u16 color = palette[index]; do { set_pixel(row + pos / width, col + pos % width, color); pos++; } while (rl-- > 0); } } }
int main(int argc, char **argv) { int i, funcNum; uint8_t *srcBuffer= (uint8_t*)av_malloc(SIZE); uint8_t *dstBuffer= (uint8_t*)av_malloc(SIZE); int failedNum=0; int passedNum=0; av_log(NULL, AV_LOG_INFO, "memory corruption test ...\n"); args_parse(argc, argv); av_log(NULL, AV_LOG_INFO, "CPU capabilities forced to %x\n", cpu_caps); sws_rgb2rgb_init(cpu_caps); for(funcNum=0; funcNum<100; funcNum++){ int width; int failed=0; int srcBpp=0; int dstBpp=0; av_log(NULL, AV_LOG_INFO,"."); memset(srcBuffer, srcByte, SIZE); for(width=32; width<64; width++){ int dstOffset; for(dstOffset=128; dstOffset<196; dstOffset+=4){ int srcOffset; memset(dstBuffer, dstByte, SIZE); for(srcOffset=128; srcOffset<196; srcOffset+=4){ uint8_t *src= srcBuffer+srcOffset; uint8_t *dst= dstBuffer+dstOffset; char *name=NULL; if(failed) break; //don't fill the screen with shit ... switch(funcNum){ case 0: srcBpp=2; dstBpp=2; name="rgb15to16"; rgb15to16(src, dst, width*srcBpp); break; case 1: srcBpp=2; dstBpp=3; name="rgb15to24"; rgb15to24(src, dst, width*srcBpp); break; case 2: srcBpp=2; dstBpp=4; name="rgb15to32"; rgb15to32(src, dst, width*srcBpp); break; case 3: srcBpp=2; dstBpp=3; name="rgb16to24"; rgb16to24(src, dst, width*srcBpp); break; case 4: srcBpp=2; dstBpp=4; name="rgb16to32"; rgb16to32(src, dst, width*srcBpp); break; case 5: srcBpp=3; dstBpp=2; name="rgb24to15"; rgb24to15(src, dst, width*srcBpp); break; case 6: srcBpp=3; dstBpp=2; name="rgb24to16"; rgb24to16(src, dst, width*srcBpp); break; case 7: srcBpp=3; dstBpp=4; name="rgb24to32"; rgb24to32(src, dst, width*srcBpp); break; case 8: srcBpp=4; dstBpp=2; name="rgb32to15"; //((*s++) << TGA_SHIFT32) | TGA_ALPHA32; rgb32to15(src, dst, width*srcBpp); break; case 9: srcBpp=4; dstBpp=2; name="rgb32to16"; rgb32to16(src, dst, width*srcBpp); break; case 10: srcBpp=4; dstBpp=3; name="rgb32to24"; rgb32to24(src, dst, width*srcBpp); break; case 11: srcBpp=2; dstBpp=2; name="rgb16to15"; rgb16to15(src, dst, width*srcBpp); break; case 14: srcBpp=2; dstBpp=2; name="rgb15tobgr15"; rgb15tobgr15(src, dst, width*srcBpp); break; case 15: srcBpp=2; dstBpp=2; name="rgb15tobgr16"; rgb15tobgr16(src, dst, width*srcBpp); break; case 16: srcBpp=2; dstBpp=3; name="rgb15tobgr24"; rgb15tobgr24(src, dst, width*srcBpp); break; case 17: srcBpp=2; dstBpp=4; name="rgb15tobgr32"; rgb15tobgr32(src, dst, width*srcBpp); break; case 18: srcBpp=2; dstBpp=2; name="rgb16tobgr15"; rgb16tobgr15(src, dst, width*srcBpp); break; case 19: srcBpp=2; dstBpp=2; name="rgb16tobgr16"; rgb16tobgr16(src, dst, width*srcBpp); break; case 20: srcBpp=2; dstBpp=3; name="rgb16tobgr24"; rgb16tobgr24(src, dst, width*srcBpp); break; case 21: srcBpp=2; dstBpp=4; name="rgb16tobgr32"; rgb16tobgr32(src, dst, width*srcBpp); break; case 22: srcBpp=3; dstBpp=2; name="rgb24tobgr15"; rgb24tobgr15(src, dst, width*srcBpp); break; case 23: srcBpp=3; dstBpp=2; name="rgb24tobgr16"; rgb24tobgr16(src, dst, width*srcBpp); break; case 24: srcBpp=3; dstBpp=3; name="rgb24tobgr24"; rgb24tobgr24(src, dst, width*srcBpp); break; case 25: srcBpp=3; dstBpp=4; name="rgb24tobgr32"; rgb24tobgr32(src, dst, width*srcBpp); break; case 26: srcBpp=4; dstBpp=2; name="rgb32tobgr15"; rgb32tobgr15(src, dst, width*srcBpp); break; case 27: srcBpp=4; dstBpp=2; name="rgb32tobgr16"; rgb32tobgr16(src, dst, width*srcBpp); break; case 28: srcBpp=4; dstBpp=3; name="rgb32tobgr24"; rgb32tobgr24(src, dst, width*srcBpp); break; case 29: srcBpp=4; dstBpp=4; name="rgb32tobgr32"; rgb32tobgr32(src, dst, width*srcBpp); break; } if(!srcBpp) break; for(i=0; i<SIZE; i++){ if(srcBuffer[i]!=srcByte){ av_log(NULL, AV_LOG_INFO, "src damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } for(i=0; i<dstOffset; i++){ if(dstBuffer[i]!=dstByte){ av_log(NULL, AV_LOG_INFO, "dst damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } for(i=dstOffset + width*dstBpp; i<SIZE; i++){ if(dstBuffer[i]!=dstByte){ av_log(NULL, AV_LOG_INFO, "dst damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } } } } if(failed) failedNum++; else if(srcBpp) passedNum++; } av_log(NULL, AV_LOG_INFO, "%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum); return failedNum; }
JPEG_NODE *jpeg_decode(PFBDEV pfbdev, JPEG_NODE *p, const char *img_file) { struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; FILE *infile; u8_t *buffer; unsigned int y; register JSAMPARRAY lineBuf; // open jpeg file if ((infile = fopen(img_file, "rb")) == NULL) { perror("img open"); return NULL; } // init jpeg decompress object error handler cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); // bind jpeg decompress object to infile jpeg_stdio_src(&cinfo, infile); // read jpeg header jpeg_read_header(&cinfo, TRUE); /* * decompress process. * note: after jpeg_start_decompress() is called. * the dimension infomation will be known * so allocate memory buffer for scanline immediately */ jpeg_start_decompress(&cinfo); printf("%d, %d\n", cinfo.output_width, cinfo.output_height); if ((cinfo.output_width > pfbdev->fb_var.xres) || (cinfo.output_height > pfbdev->fb_var.yres)) { printf("Too large JPEG file, cannot display\n"); return NULL; } lineBuf = cinfo.mem->alloc_sarray ((j_common_ptr) &cinfo, JPOOL_IMAGE, (cinfo.output_width * cinfo.output_components), 1); buffer = (u8_t *)malloc(3 * cinfo.output_width * cinfo.output_height); if (buffer == NULL) { perror("buffer"); return NULL; } if (cinfo.output_components == 3) { for (y = 0; y < cinfo.output_height; y++) { jpeg_read_scanlines(&cinfo, lineBuf, 1); memcpy((buffer + y * cinfo.output_width * 3), lineBuf[0], 3 * cinfo.output_width); } } // finish decompress, destroy decompress object jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); // the flow is only for TEST //u16_t *buf_16 = malloc(pfbdev->fb_var.xres * pfbdev->fb_var.yres * pfbdev->fb_var.bits_per_pixel / 8); u16_t *buf_16 = malloc(cinfo.output_width * cinfo.output_height * pfbdev->fb_var.bits_per_pixel / 8); rgb24to16(buffer, buf_16, cinfo.output_width, cinfo.output_height); free(buffer); p->pjpeg = buf_16; p->jpeg_width = cinfo.output_width; p->jpeg_height = cinfo.output_height; // End of the TEST fclose(infile); return p; }
main(int argc, char **argv) { int i, funcNum; uint8_t *srcBuffer= (uint8_t*)memalign(128, SIZE); uint8_t *dstBuffer= (uint8_t*)memalign(128, SIZE); int failedNum=0; int passedNum=0; printf("memory corruption test ...\n"); if(argc==2){ GetCpuCaps(&gCpuCaps); printf("testing mmx\n"); } sws_rgb2rgb_init(get_sws_cpuflags()); for(funcNum=0; funcNum<100; funcNum++){ int width; int failed=0; int srcBpp=0; int dstBpp=0; printf("."); fflush(stdout); memset(srcBuffer, srcByte, SIZE); for(width=32; width<64; width++){ int dstOffset; for(dstOffset=128; dstOffset<196; dstOffset++){ int srcOffset; memset(dstBuffer, dstByte, SIZE); for(srcOffset=128; srcOffset<196; srcOffset++){ uint8_t *src= srcBuffer+srcOffset; uint8_t *dst= dstBuffer+dstOffset; char *name=NULL; if(failed) break; //don't fill the screen with shit ... switch(funcNum){ case 0: srcBpp=2; dstBpp=2; name="rgb15to16"; rgb15to16(src, dst, width*srcBpp); break; case 1: srcBpp=2; dstBpp=3; name="rgb15to24"; rgb15to24(src, dst, width*srcBpp); break; case 2: srcBpp=2; dstBpp=4; name="rgb15to32"; rgb15to32(src, dst, width*srcBpp); break; case 3: srcBpp=2; dstBpp=3; name="rgb16to24"; rgb16to24(src, dst, width*srcBpp); break; case 4: srcBpp=2; dstBpp=4; name="rgb16to32"; rgb16to32(src, dst, width*srcBpp); break; case 5: srcBpp=3; dstBpp=2; name="rgb24to15"; rgb24to15(src, dst, width*srcBpp); break; case 6: srcBpp=3; dstBpp=2; name="rgb24to16"; rgb24to16(src, dst, width*srcBpp); break; case 7: srcBpp=3; dstBpp=4; name="rgb24to32"; rgb24to32(src, dst, width*srcBpp); break; case 8: srcBpp=4; dstBpp=2; name="rgb32to15"; rgb32to15(src, dst, width*srcBpp); break; case 9: srcBpp=4; dstBpp=2; name="rgb32to16"; rgb32to16(src, dst, width*srcBpp); break; case 10: srcBpp=4; dstBpp=3; name="rgb32to24"; rgb32to24(src, dst, width*srcBpp); break; case 11: srcBpp=2; dstBpp=2; name="rgb16to15"; rgb16to15(src, dst, width*srcBpp); break; case 14: srcBpp=2; dstBpp=2; name="rgb15tobgr15"; rgb15tobgr15(src, dst, width*srcBpp); break; case 15: srcBpp=2; dstBpp=2; name="rgb15tobgr16"; rgb15tobgr16(src, dst, width*srcBpp); break; case 16: srcBpp=2; dstBpp=3; name="rgb15tobgr24"; rgb15tobgr24(src, dst, width*srcBpp); break; case 17: srcBpp=2; dstBpp=4; name="rgb15tobgr32"; rgb15tobgr32(src, dst, width*srcBpp); break; case 18: srcBpp=2; dstBpp=2; name="rgb16tobgr15"; rgb16tobgr15(src, dst, width*srcBpp); break; case 19: srcBpp=2; dstBpp=2; name="rgb16tobgr16"; rgb16tobgr16(src, dst, width*srcBpp); break; case 20: srcBpp=2; dstBpp=3; name="rgb16tobgr24"; rgb16tobgr24(src, dst, width*srcBpp); break; case 21: srcBpp=2; dstBpp=4; name="rgb16tobgr32"; rgb16tobgr32(src, dst, width*srcBpp); break; case 22: srcBpp=3; dstBpp=2; name="rgb24tobgr15"; rgb24tobgr15(src, dst, width*srcBpp); break; case 23: srcBpp=3; dstBpp=2; name="rgb24tobgr16"; rgb24tobgr16(src, dst, width*srcBpp); break; case 24: srcBpp=3; dstBpp=3; name="rgb24tobgr24"; rgb24tobgr24(src, dst, width*srcBpp); break; case 25: srcBpp=3; dstBpp=4; name="rgb24tobgr32"; rgb24tobgr32(src, dst, width*srcBpp); break; case 26: srcBpp=4; dstBpp=2; name="rgb32tobgr15"; rgb32tobgr15(src, dst, width*srcBpp); break; case 27: srcBpp=4; dstBpp=2; name="rgb32tobgr16"; rgb32tobgr16(src, dst, width*srcBpp); break; case 28: srcBpp=4; dstBpp=3; name="rgb32tobgr24"; rgb32tobgr24(src, dst, width*srcBpp); break; case 29: srcBpp=4; dstBpp=4; name="rgb32tobgr32"; rgb32tobgr32(src, dst, width*srcBpp); break; } if(!srcBpp) break; for(i=0; i<SIZE; i++){ if(srcBuffer[i]!=srcByte){ printf("src damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } for(i=0; i<dstOffset; i++){ if(dstBuffer[i]!=dstByte){ printf("dst damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } for(i=dstOffset + width*dstBpp; i<SIZE; i++){ if(dstBuffer[i]!=dstByte){ printf("dst damaged at %d w:%d src:%d dst:%d %s\n", i, width, srcOffset, dstOffset, name); failed=1; break; } } } } } if(failed) failedNum++; else if(srcBpp) passedNum++; } printf("%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum); return failedNum; }