unsigned char FGETC(unsigned char *fi) { #ifdef INPUT_DMA unsigned char c = fi[vld_count]; vld_count = (vld_count + 1) & TOTAL_BLOCK_SIZE; ddr_vld_cnt++; #else unsigned int c = ((fi[vld_count / 4] << (8 * (vld_count % 4))) >> 24) & 0x00ff; vld_count++; #endif bit_counter += 8; refill_bit_counter += 8; #ifdef INPUT_DMA if( refill_bit_counter >= INPUT_READ_SIZE_BITS) { refill_bit_counter = 0; while(hw_dma_status_addr( (void *) mb1_dma0_BASEADDR)); hw_dma_receive_addr((unsigned int*)(cmem_input_circ_buff + buff_sel * INPUT_READ_SIZE_INT), (void*)(&ddr_input[ddr_input_chunck_offset*INPUT_READ_SIZE_INT]), INPUT_READ_SIZE_INT, (void*)mb1_dma0_BASEADDR); ddr_input_chunck_offset++; //ddr_input = (int) (ddr_input + INPUT_READ_SIZE_INT); buff_sel = CHANGE_BUFFER(buff_sel); } #endif return c; }
unsigned int FGETC(volatile unsigned int *fi) { #ifdef INPUT_DMA unsigned int c = ((fi[(vld_count / 4)] << (8 * (vld_count % 4))) >> 24) & 0x00ff; vld_count = (vld_count + 1) & TOTAL_BLOCK_SIZE; #else unsigned int c = ((fi[vld_count / 4] << (8 * (vld_count % 4))) >> 24) & 0x00ff; vld_count++; #endif bit_counter += 8; refill_bit_counter += 8; //mk_mon_debug_info(c); //mk_mon_debug_info(bit_counter); //if(bit_counter == 1024) suicide(); #ifdef INPUT_DMA if( refill_bit_counter == INPUT_READ_SIZE_BITS) { refill_bit_counter = 0; hw_dma_receive_addr((unsigned int*)(cmem_input_circ_buff + buff_sel * INPUT_READ_SIZE), (unsigned int*)(ddr_input), INPUT_READ_SIZE, (void*)mb1_dma0_BASEADDR); ddr_input += INPUT_READ_SIZE; buff_sel = CHANGE_BUFFER(buff_sel); } #endif return c; }
int FSEEK(int offset, int start) { #ifdef INPUT_DMA vld_count += offset; ddr_vld_cnt += offset; refill_bit_counter += (offset << 3); if( refill_bit_counter >= INPUT_READ_SIZE_BITS) { int addr; refill_bit_counter = ((offset & 3) << 3); ddr_input_chunck_offset = 0; buff_sel = 0; addr = ddr_vld_cnt >> 2 ; while(hw_dma_status_addr( (void *) mb1_dma0_BASEADDR)); hw_dma_receive_addr((unsigned int*)(cmem_input_circ_buff + buff_sel * INPUT_READ_SIZE_INT), (void*)(&ddr_input[addr]), INPUT_READ_SIZE_INT, (void*)mb1_dma0_BASEADDR); ddr_input = (unsigned int *) (ddr_input + addr + ddr_input_chunck_offset * INPUT_READ_SIZE_INT); ddr_input_chunck_offset++; vld_count = (buff_sel * INPUT_READ_SIZE) + (offset & 3); buff_sel = CHANGE_BUFFER(buff_sel); }
int JpegToBmp() { unsigned int aux, mark; int n_restarts, restart_interval, leftover; /* RST check */ int i, j; /*No Need to do the file operation operation*/ #ifdef FILE_IO fi = fopen(file1, "rb"); if (fi == NULL) { return 0; } #else #ifdef INPUT_DMA // wait for input data to arrive //mk_mon_debug_info(0xFF); // read input file DRAM (via my cmem-out) ddr_input = (unsigned int*)(shared_pt_REMOTEADDR + 1024*1024*4); cmem_input_circ_buff = (unsigned int*) (mb1_cmemout0_BASEADDR); hw_dma_receive_addr((int*)(cmem_input_circ_buff + buff_sel * INPUT_READ_SIZE_INT), (void*)(&ddr_input[ddr_input_chunck_offset*INPUT_READ_SIZE_INT]), INPUT_READ_SIZE_INT, (void*)mb1_dma0_BASEADDR); ddr_input_chunck_offset++; buff_sel = CHANGE_BUFFER(buff_sel); for (i = 0 ; i < NUM_OF_INIT_BUFF_LOAD-1; i++) { while(hw_dma_status_addr( (void *) mb1_dma0_BASEADDR)); hw_dma_receive_addr((unsigned int*)(cmem_input_circ_buff + buff_sel * INPUT_READ_SIZE_INT), (void*)(&ddr_input[ddr_input_chunck_offset*INPUT_READ_SIZE_INT]), INPUT_READ_SIZE_INT, (void*)mb1_dma0_BASEADDR); ddr_input_chunck_offset++; buff_sel = CHANGE_BUFFER(buff_sel); } fi = (unsigned char *)(cmem_input_circ_buff); #else fi = (volatile unsigned int *)(shared_pt_REMOTEADDR+1024*1024*4); #endif #endif /* First find the SOI marker: */ aux = get_next_MK(fi); if (aux != SOI_MK) aborted_stream(fi); if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tFound the SOI marker!\n", ftell(fi)); #else //printf("%d:\tINFO:\tFound the SOI marker!\n", FTELL()); #endif } in_frame = 0; restart_interval = 0; for (i = 0; i < 4; i++) QTvalid[i] = 0; /* Now process segments as they appear: */ do { mark = get_next_MK(fi); //mk_mon_debug_info(0XFFF); //mk_mon_debug_info(mark); //mk_mon_debug_info(bit_counter); //mk_mon_debug_info(0XFFF); switch (mark) { case SOF_MK: if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tFound the SOF marker!\n", ftell(fi)); #else //printf("%d:\tINFO:\tFound the SOF marker!\n", FTELL()); #endif } in_frame = 1; get_size(fi); /* header size, don't care */ /* load basic image parameters */ #ifdef FILE_IO fgetc(fi); /* precision, 8bit, don't care */ #else FGETC(fi); /* precision, 8bit, don't care */ #endif y_size = get_size(fi); x_size = get_size(fi); if (verbose) { #ifdef FILE_IO fprintf(stderr, "\tINFO:\tImage size is %d by %d\n", x_size, y_size); #else //printf("\tINFO:\tImage size is %d by %d\n", x_size, y_size); #endif } #ifdef FILE_IO n_comp = fgetc(fi); /* # of components */ #else n_comp = FGETC(fi); /* # of components */ #endif if (verbose) { #ifdef FILE_IO fprintf(stderr, "\tINFO:\t"); #else //printf("\tINFO:\t"); #endif switch (n_comp) { #ifdef FILE_IO case 1: fprintf(stderr, "Monochrome"); break; case 3: fprintf(stderr, "Color"); break; default: fprintf(stderr, "Not a"); break; #else case 1: //printf("Monochrome"); break; case 3: //printf("Color"); break; default: //printf("Not a"); break; #endif } #ifdef FILE_IO fprintf(stderr, " JPEG image!\n"); #else //printf(" JPEG image!\n"); #endif } for (i = 0; i < n_comp; i++) { #ifdef FILE_IO /* component specifiers */ comp[i].CID = fgetc(fi); aux = fgetc(fi); comp[i].HS = first_quad(aux); comp[i].VS = second_quad(aux); comp[i].QT = fgetc(fi); #else /* component specifiers */ comp[i].CID = FGETC(fi); aux = FGETC(fi); comp[i].HS = first_quad(aux); comp[i].VS = second_quad(aux); comp[i].QT = FGETC(fi); #endif } if ((n_comp > 1) && verbose) { #ifdef FILE_IO fprintf(stderr, "\tINFO:\tColor format is %d:%d:%d, H=%d\n", comp[0].HS * comp[0].VS, comp[1].HS * comp[1].VS, comp[2].HS * comp[2].VS, comp[1].HS); #else #if 0 //printf("\tINFO:\tColor format is %d:%d:%d, H=%d\n", comp[0].HS * comp[0].VS, comp[1].HS * comp[1].VS, comp[2].HS * comp[2].VS, comp[1].HS); #endif #endif } if (init_MCU() == -1) aborted_stream(fi); /* dimension scan buffer for YUV->RGB conversion */ /* TODO */ #if 0 FrameBuffer = (volatile unsigned char *)mk_malloc((size_t) x_size * y_size * n_comp); #else FrameBuffer = (unsigned int *) mb1_cmemout1_BASEADDR; #endif //ColorBuffer = (volatile unsigned char *)mk_malloc((size_t) MCU_sx * MCU_sy * n_comp); #if 0 FBuff = (FBlock *) mk_malloc(sizeof(FBlock)); #else MY_MK_MALLOC(FBuff,FBlock,1); #endif #if 0 PBuff = (PBlock *) mk_malloc(sizeof(PBlock)); #else MY_MK_MALLOC(PBuff,PBlock,1); #endif if ((FrameBuffer == NULL) /*|| (ColorBuffer == NULL)*/ || (FBuff == NULL) || (PBuff == NULL)) { #ifdef FILE_IO fprintf(stderr, "\tERROR:\tCould not allocate pixel storage!\n"); #else //printf("\tERROR:\tCould not allocate pixel storage!\n"); #endif } break; case DHT_MK: if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tDefining Huffman Tables\n", ftell(fi)); #else //printf("%d:\tINFO:\tDefining Huffman Tables\n", FTELL()); #endif } if (load_huff_tables(fi) == -1) aborted_stream(fi); break; case DQT_MK: if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tDefining Quantization Tables\n", ftell(fi)); #else //printf("%d:\tINFO:\tDefining Quantization Tables\n", FTELL()); #endif } if (load_quant_tables(fi) == -1) aborted_stream(fi); break; case DRI_MK: get_size(fi); /* skip size */ restart_interval = get_size(fi); if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tDefining Restart Interval %d\n", ftell(fi),restart_interval); #else //printf("%d:\tINFO:\tDefining Restart Interval %d\n", FTELL(), restart_interval); #endif } break; case SOS_MK: /* lots of things to do here */ //mk_mon_debug_info(01); //mk_mon_debug_info(bit_counter); //mk_mon_debug_info(02); if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tFound the SOS marker!\n", ftell(fi)); #else //printf("%d:\tINFO:\tFound the SOS marker!\n", FTELL(fi)); #endif } get_size(fi); /* don't care */ #ifdef FILE_IO aux = fgetc(fi); #else aux = FGETC(fi); #endif if (aux != (unsigned int)n_comp) { #ifdef FILE_IO fprintf(stderr, "\tERROR:\tBad component interleaving!\n"); #else //printf("\tERROR:\tBad component interleaving!\n"); #endif aborted_stream(fi); } for (i = 0; i < n_comp; i++) { #ifdef FILE_IO aux = fgetc(fi); #else aux = FGETC(fi); #endif if (aux != comp[i].CID) { #ifdef FILE_IO fprintf(stderr, "\tERROR:\tBad Component Order!\n"); #else //printf("\tERROR:\tBad Component Order!\n"); #endif aborted_stream(fi); } #ifdef FILE_IO aux = fgetc(fi); #else aux = FGETC(fi); #endif comp[i].DC_HT = first_quad(aux); comp[i].AC_HT = second_quad(aux); } get_size(fi); #ifdef FILE_IO fgetc(fi); /* skip things */ #else FGETC(fi); /* skip things */ #endif MCU_column = 0; MCU_row = 0; clear_bits(); reset_prediction(); /* main MCU processing loop here */ if (restart_interval) { n_restarts = ceil_div(mx_size * my_size, restart_interval) - 1; leftover = mx_size * my_size - n_restarts * restart_interval; /* final interval may be incomplete */ for (i = 0; i < n_restarts; i++) { for (j = 0; j < restart_interval; j++) { process_MCU(fi); } /* proc till all EOB met */ aux = get_next_MK(fi); if (!RST_MK(aux)) { #ifdef FILE_IO fprintf(stderr, "%ld:\tERROR:\tLost Sync after interval!\n", ftell(fi)); #else //printf("%d:\tERROR:\tLost Sync after interval!\n", FTELL()); #endif aborted_stream(fi); } else if (verbose) { //printf("%d:\tINFO:\tFound Restart Marker\n", FTELL()); } reset_prediction(); clear_bits(); } /* intra-interval loop */ } else { leftover = mx_size * my_size; } /* process till end of row without restarts */ for (i = 0; i < leftover; i++) { process_MCU(fi); } in_frame = 0; //mk_mon_debug_info(0XFEFE); //mk_mon_debug_info(0XFEFE); break; case EOI_MK: //mk_mon_debug_info(0XDEADBEE2); if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tFound the EOI marker!\n", ftell(fi)); #else //printf("%d:\tINFO:\tFound the EOI marker!\n", FTELL()); #endif } if (in_frame) { aborted_stream(fi); } if (verbose) { #ifdef FILE_IO fprintf(stderr, "\tINFO:\tTotal skipped bytes %d, total stuffers %d\n", passed, stuffers); #else //printf("\tINFO:\tTotal skipped bytes %d, total stuffers %d\n", passed, stuffers); #endif } #ifdef FILE_IO fclose(fi); #else /*Check if something has to be done!!*/ #endif #ifdef FILE_IO // write_bmp(file2); #else /*Need to implement the function to write in DDR*/ // write_bmp_to_ddr_1(); //printf_frame_buffer(); #endif #ifdef FILE_IO free_structures(); #else /*No Need to do anything as structures are static*/ //mk_mon_debug_info(0XDEADBEE1); //free_structures(); //mk_mon_debug_info(0XDEADBEE2); #endif /* signal to core 2 that the FIFO is initialized and can be read from. */ while(cheap_is_empty(producer) != 1) { #if 0 mk_mon_debug_info(producer->readc); mk_mon_debug_info(producer->writec); #endif } *fifo_sync_data = 0; DMA_SEND_BLOCKING((void *)fifo_sync, (int*)fifo_sync_data, sizeof(int),(void *)mb1_dma0_BASEADDR,DMA_flag); return 0; break; case COM_MK: if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tSkipping comments\n", ftell(fi)); #else //printf("%d:\tINFO:\tSkipping comments\n", FTELL()); #endif } skip_segment(fi); break; case 0XD9: //case 0XD9: if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tERROR:\tRan out of input data!\n", ftell(fi)); #else //printf("%d:\tERROR:\tRan out of input data!\n", FTELL()); #endif } aborted_stream(fi); default: if ((mark & MK_MSK) == APP_MK) { if (verbose) { #ifdef FILE_IO fprintf(stderr, "%ld:\tINFO:\tSkipping application data\n", ftell(fi)); #else //printf("%d:\tINFO:\tSkipping application data\n", FTELL()); #endif } skip_segment(fi); break; } if (RST_MK(mark)) { reset_prediction(); break; } /* if all else has failed ... */ #ifdef FILE_IO fprintf(stderr, "%ld:\tWARNING:\tLost Sync outside scan, %d!\n", ftell(fi), mark); #else //printf("%d:\tWARNING:\tLost Sync outside scan, %d!\n", FTELL(), mark); #endif aborted_stream(fi); break; } /* end switch */ } while (1); return 0; }
/* TODO: add more error checks, cut corner cases */ int css_parse(css_parser *state, const char *data, int len) { #define CHANGE_BUFFER(BUFF) \ state->tobuf = (BUFF); \ *(state->tobuf) = 0; \ state->tobuf_space = sizeof((BUFF)) #define OUTER_SPACE 0 /* whitespace outside the ___sel{}___ */ #define INNER_SPACE 9 /* whitespace inside the {___prop:val;___} */ #define MIDDLE_SPACE 8 /* whitespace between prop:____val */ #define COMMENT 1 #define SUBSTRING 5 #define SELECTORS 3 #define PROPERTY 6 #define VALUE 7 int i, j; #if 0 printf("\n");//debug printf("BUF2>> %s[end]\n", state->selector_buffer); printf("BUF3>> %s[end]\n", state->property_buffer); printf("BUF4>> %s[end]\n", state->value_buffer); #endif for (i = 0; i < len; i++) { char c = data[i]; //printf("[%d] -- %c\n", sector, c); //if ( c == '\n' || c == '\r' || c == '\t') continue; if (isspace(c)) { if (state->sector == OUTER_SPACE) continue; /* ignore outer whitespace */ if (state->sector == PROPERTY) continue; /* ignore whitespace in property names -- note, not clean, might lead to errors */ if (state->sector == INNER_SPACE) continue; /* ignore whitespace after property values */ if (state->sector == MIDDLE_SPACE) continue; /* ignore whitespace inside rule blocks? */ } if (c == '/' && state->sector == COMMENT) { /* end of comment */ /* pop sector */ state->sector = state->prev_sector; state->prev_sector = 0; continue; } if (state->sector == COMMENT) { /* inside a comment, ignore */ continue; } if (c == '/') { /* start of comment */ /* push sector */ state->prev_sector = state->sector; state->sector = COMMENT; continue; } if (c == 0) break; /* not readable */ if (c == ',') { /* end of selector? */ if (state->sector == SELECTORS) { //printf("Got selector %d: `%s`\n", num_selectors, buf2); state->selectors[state->num_selectors++] = css_target_parse(state->selector_buffer); CHANGE_BUFFER(state->selector_buffer); state->sector = OUTER_SPACE; continue; } } if (c == '{') { /* start of rule block? */ if (state->sector == SELECTORS) { //printf("Got last selector: `%s`\n", buf2); state->selectors[state->num_selectors++] = css_target_parse(state->selector_buffer); CHANGE_BUFFER(state->selector_buffer); } /* now, create empty rules for each selector */ for (j = 0; j < state->num_selectors; j++) { state->rules[j] = css_rule_create(state->selectors[j], NULL, NULL); state->num_rules++; if (!state->style) state->style = state->rules[j]; else css_rule_add_next(state->style, state->rules[j]); } /* and reset "pending" selectors */ state->num_selectors = 0; state->sector = INNER_SPACE; continue; } /* if (sector == SELECTORS) { // inside selectors, condense all spaces if (isspace(c)) { extra_space = 1; continue; } else if (extra_space) { *tobuf++ = ' '; extra_space = 0; } } */ if (c == ':' && state->sector == PROPERTY) { /* end of property name */ state->sector = MIDDLE_SPACE; continue; } if (c == ';' && state->sector == VALUE) { /* end of property value */ /* add prop/value to all pending rules */ for (j = 0; j < state->num_rules; j++) css_rule_add_one(state->rules[j], state->property_buffer, strtrim(state->value_buffer)); //printf("Added `%s=%s` to %d rule(s)\n", buf3, buf4, num_rules); state->sector = INNER_SPACE; continue; } if (c == '}') { if (state->sector == VALUE) { /* add prop/value to all pending rules */ for (j = 0; j < state->num_rules; j++) css_rule_add_one(state->rules[j], state->property_buffer, strtrim(state->value_buffer)); //printf("Added `%s=%s` to %d rule(s)\n", buf3, buf4, num_rules); } else if (state->sector != INNER_SPACE) { fprintf(stderr, "Unexpected '}', expected value or ';'\n"); return 1; } /* reset rules */ state->num_rules = 0; state->sector = OUTER_SPACE; continue; } if (!isspace(c)) { if (state->sector == INNER_SPACE) { /* start of property name */ state->sector = PROPERTY; CHANGE_BUFFER(state->property_buffer); /* select "property" buffer for output */ } if (state->sector == MIDDLE_SPACE) { /* start of value */ state->sector = VALUE; CHANGE_BUFFER(state->value_buffer); /* select "value" buffer for output */ } } if (c == '"') { /* push/pop in-string */ if (state->sector == SUBSTRING) { state->sector = state->prev_sector; state->prev_sector = 0; } else { state->prev_sector = state->sector; state->sector = SUBSTRING; } continue; } if (isalpha(c) || c == '*' || c == '.' || c == '#') { if (state->sector == OUTER_SPACE) { /* start of selector(s) */ state->sector = SELECTORS; CHANGE_BUFFER(state->selector_buffer); /* select "selectors" buffer for output */ } } /* Buffer overflow */ if (state->tobuf_space < 2) { fprintf(stderr, "No buffer space to store selector/property/value, ABORTING parsing.\n"); return 1; } //printf("Saving `%c`, space left: %d\n", c, tobuf_space); /* Save character to either buffer */ *state->tobuf++ = c; *state->tobuf = 0; state->tobuf_space--; } return 0; }