diff --git a/jpwl/decoder/jpwldec/j2k_to_image.dsp b/jpwl/decoder/jpwldec/j2k_to_image.dsp index 6a633191..1f0c5368 100644 --- a/jpwl/decoder/jpwldec/j2k_to_image.dsp +++ b/jpwl/decoder/jpwldec/j2k_to_image.dsp @@ -125,6 +125,10 @@ SOURCE=..\libopenjpeg\jpt.c # End Source File # Begin Source File +SOURCE=..\libopenjpeg\jpw.c +# End Source File +# Begin Source File + SOURCE=..\libopenjpeg\mct.c # End Source File # Begin Source File diff --git a/jpwl/decoder_02/libopenjpeg/j2k.c b/jpwl/decoder_02/libopenjpeg/j2k.c index 821a43d0..99e39d7f 100644 --- a/jpwl/decoder_02/libopenjpeg/j2k.c +++ b/jpwl/decoder_02/libopenjpeg/j2k.c @@ -1650,18 +1650,6 @@ void jpwl_read_esd() break; } - //esdata = esdata/2; - //for (i=0; i> 11) & 0x001F; - // value = pow(2,ex-15)*(1+(mant/pow(2,11))); - //fprintf(f,"%x\n",cio_read(1)); - // fprintf(f,"level %d: %f\n",i,value); - //} - //printf("temp: %x\n",cio_read(2)); - //cio_skip(-2); fclose(f); } /* diff --git a/jpwl/decoder_02/libopenjpeg/jpw.c b/jpwl/decoder_02/libopenjpeg/jpw.c index a25fb308..f13f7495 100644 --- a/jpwl/decoder_02/libopenjpeg/jpw.c +++ b/jpwl/decoder_02/libopenjpeg/jpw.c @@ -1,10 +1,4 @@ -// In questa versione si aggiunge la funzione che inserisce il marker RED -// Per ora si suppone che venga aggiunto un solo RED, nel main header, e che sia -// utilizzata la modalità byte-range mode. Osserviamo che ci sono problemi realizzativi -// per l'utilizzo delle modalità a pacchetto (non ci sono pacchetti negli header!). -// Decidiamo di aggiungere il marker RED subito prima di SOT (alla fine di MH!!!). -// Per stare sicuri, come address length utilizziamo 4 bytes (b1=1). #include #include @@ -149,7 +143,7 @@ typedef struct { unsigned int pcrc; unsigned long cl; unsigned char pepc; - id_tecn *tecn; // array di strutture di tipo id_tecn!!! + id_tecn *tecn; } EPC_par; typedef struct { @@ -180,39 +174,35 @@ RED red; int lmex, nbckpar, epbpm, next, startsot; unsigned long psot; -unsigned char *cssrc;// Queste variabili servono per la gestione della codestream. -unsigned int cslen; // Se voglio utilizzare le funzioni "cio" per gestire un buffer, -int cspos; // queste variabili consentono di reinizializzare cio per la CS!! -unsigned int csread; // Lunghezza della codestream letta...serve per uscire in caso di errori +unsigned char *cssrc; +unsigned int cslen; +int cspos; +unsigned int csread; -int redpos; // Per la gestione del passaggio delle funzioni "cio" al e dal buffer RED -int decodeflag; // Vale 1 se RS è stato decodificato, 0 altrimenti -unsigned long redlen; // Lunghezza del buffer che contiene REDdata +int redpos; +int decodeflag; // 1 if there are not errors decoding RS codeword +unsigned long redlen; int redmode; // Se vale 0 allora RED in MH, se vale 1 allora RED in MH e nei vari TPH -int redlenok; // Lunghezza del campo dati della RED che non necessita aggiornamento offset -int nepbrd; // Tiene conto del numero di EPB letti -int lastepb; // Se vale 1 l'EPB corrente è l'ultimo dell'header in questione! +int redlenok; +int nepbrd; // umber of EPBs already read +int lastepb; // Is 1 if the current EPB is the last of an header -// La funzione seguente cerca la presenza nella codestream del marker EPC -// in modo da determinare se si tratta di una codestream JPWL -// Ritorna il numero di EPC presenti nella codestream +// This is the main function which parses the CS searching JPWL marker segments int decode_JPWL(unsigned char *src, int len) { unsigned int temp, nepb, j2k_state, pos, nepc, posi, mem, rest; - //int flag; // se 0 vuol dire che ha trovato EPC dopo SIZ, se 1 dopo EPB - int err; // se 1 vuol dire che EPC è corretto, se 0 vuol dire che contiene - // ancora errori! + int err; unsigned long psot, i; FILE *f,*g; - cssrc = src; //*********Aggiunta in questa versione 1.7 - cslen = len; //*********Aggiunta in questa versione 1.7 - redpos = 0; //*********Aggiunta in questa versione 1.7 - redlen = 0; //*********Aggiunta in questa versione 1.7 + cssrc = src; + cslen = len; + redpos = 0; + redlen = 0; redlenok = 0; - redmode = 0; //*********Aggiunta in questa versione 1.7 - // Per default si assume che la RED è scritta solo in MH!!! + redmode = 0; + csread = 0; @@ -222,146 +212,95 @@ int decode_JPWL(unsigned char *src, int len) printf("Expected marker SOT\n"); return 0; } - //csread+=2; - - //temp = cio_read(2); // qui dovrebbe leggere SIZ - //if (temp >> 8 != 0xff) { - // fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - // return 0; - //} - //temp = cio_read(2); // qui dovrebbe leggere la lunghezza di SIZ: Lsiz - //cio_skip(temp-2); - - j2k_state = 0; // inizializza j2k_state ad un valore indefinito - nepc = 0; // inizializza a zero il numero di EPC finora trovati + j2k_state = 0; + nepc = 0; nepbrd = 0; lastepb = 0; - - //while ((j2k_state != J2K_STATE_MT)&&(csread < cslen)) while (j2k_state != J2K_STATE_MT) { - - //nepc = find_EPC(nepc,&j2k_state); - temp = cio_read(2); // qui dovrebbe leggere SIZ o SOT + temp = cio_read(2); // Read SIZ or SOT if (temp >> 8 != 0xff) { fprintf(stderr, "%.8x: expected a marker instead of %x\n", cio_tell() - 2, temp); return nepc; } - //csread+=2; - posi = cio_tell(); // memorizza la posizione a monte della lunghezza di SIZ o SOT + posi = cio_tell(); // Start of Lsiz or Lsot - //ncomp = 3; // di default si assume che l'immagine abbia 3 componenti!!! - if (temp == J2K_MS_SIZ) // Ha letto SIZ!!! + if (temp == J2K_MS_SIZ) { - temp = cio_read(2); // legge Lsiz - //csread+=2; - //ncomp = (temp - 38)/3; // calcola il numero di componenti dell'immagine - // nbckpar serve per modificare il numero di blocchi di decodifica per la prima - // parte del primo EPB in base al numero di componenti utilizzate!!! - lmex = temp + 17; // lunghezza dei dati da proteggere; - nbckpar = (int)ceil((double)lmex / 96); // 96 è nn-kk per il primo EPB - // temp=Lsiz, 17 tiene conto di EPB,SIZ,SOC + temp = cio_read(2); // Read Lsiz + + lmex = temp + 17; // Length of data to be protected + nbckpar = (int)ceil((double)lmex / 96); + } - else // sta leggendo SOT oppure sta leggendo SIZ ma ci sono errori nel marker SIZ!!! - { // ...in tal caso il decoder assume che l'immagine sia composta da 3 componenti + else + { nbckpar = 1; - temp = cio_read(2); // qui dovrebbe leggere la lunghezza di SIZ o SOT + temp = cio_read(2); } cio_skip(temp-2); - //csread += (temp - 2); - - - temp = cio_read(2); // qui dovrebbe leggere EPC o EPB, se ci sono - //if (temp >> 8 != 0xff) { - // fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - // return nepc; - //} - //csread += 2; + temp = cio_read(2); // Read EPB or EPC if there are if (temp != JPWL_MS_EPC) { - temp = cio_read(2); // qui dovrebbe leggere la lunghezza di EPB, se c'è: Lepb + temp = cio_read(2); // Lepb cio_skip(temp-2); - temp = cio_read(2); // qui dovrebbe leggere EPC, se c'è!! - //if (temp >> 8 != 0xff) { - //fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - //return nepc; - //} - //csread += temp + 2; - + temp = cio_read(2); // EPC pos = cio_tell(); if ((temp != JPWL_MS_EPC)&&(nepc == 0)) { cio_seek(0); - return nepc; // non ha trovato EPC => vede la codestream come NON JPWL + return nepc; // NOT JPWL CS } - if ((temp != JPWL_MS_EPC)&&(nepc != 0)) //vuol dire che il TPH in questione non ha EPC + if ((temp != JPWL_MS_EPC)&&(nepc != 0)) // Current TPH doesn't have EPC { - cio_seek(posi); // siamo a monte della lunghezza di SOT + cio_seek(posi); // Lsot cio_skip(4); psot = cio_read(4); - if (psot == 0) // vuol dire che siamo nell'ultimo TPH - j2k_state = J2K_STATE_MT; // cosi' al passo seguente si esce dal ciclo + if (psot == 0) // Last TPH + j2k_state = J2K_STATE_MT; // Next step skip out of the cicle cio_seek(posi-2); - cio_skip(psot); // si pone a valle dei dati del tile corrente + cio_skip(psot); // End of data of the current TP if (cio_read(2) == J2K_MS_EOC) j2k_state = J2K_STATE_MT; - cio_skip(-2); // si pone a valle dei dati del tile corrente - //csread += (psot - pos); - //return nepc; - + cio_skip(-2); } - if (temp == JPWL_MS_EPC) // ha trovato l'EPC non subito dopo SIZ, quindi c'è EPB! + if (temp == JPWL_MS_EPC) // There is EPB { if (nepc == 0) { j2k_state = J2K_STATE_MHSOC; - cio_seek(posi-4); // si posiziona a monte di SOC - next = cio_tell(); // assegna a next = 0!!!! + cio_seek(posi-4); // SOC + next = cio_tell(); } if (nepc != 0) { j2k_state = J2K_STATE_TPHSOT; - cio_seek(posi-2); // si posiziona a monte di SOT + cio_seek(posi-2); // SOT next = cio_tell(); } - //printf("next: %x\n",next); - red.reddata = (char *) malloc(len * sizeof(char));// Allochiamo lo spazio necessario per RED - // Scegliamo len per "stare larghi" + red.reddata = (char *) malloc(len * sizeof(char)); + + - // ********Cio' che segue è un'aggiunta in jpwldec1.9!!!!********** mem = next; i = 0; - if (!(rest = read_EPB_2(&j2k_state)))// legge il primo EPB(della CS o del tile,caso + EPC!) + if (!(rest = read_EPB_2(&j2k_state)))// First EPB return nepc; i += rest; - temp = cio_tell(); // Memorizza posizione a valle di EPB - cio_seek(pos); // si posiziona a valle del marker EPC - err = read_EPC(); // Legge il primo EPC, o comunque il primo EPC di un tile - //if (err == 1) - // printf("CRC EPC corretto!\n"); - //else - // printf("CRC EPC errato!\n"); - nepc++; // nel caso di più EPC usati nella codestream - nepb = epc.tecn[0].lid / 4; // calcola il numero di EPB presenti - //printf("nepb: %d\n",nepb); - /*********************************************************************** - Qui dovrà essere aggiunta la porzione di codice per la gestione - della scrittura della RED anche nei tile! - *************************************************************************/ - - //while ((i> 8 != 0xff) { - // fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - // return nepc; - //} - - //while ((temp != J2K_MS_SOT)&&(csread < cslen)) + while (temp != J2K_MS_SOT) { cio_skip(cio_read(2)-2); temp = cio_read(2); - //if (temp >> 8 != 0xff) { - //fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - //return nepc; - //} - //csread += 2; + } cio_skip(-2); } temp = cio_read(2); - //printf("mrk: %x\n",temp); - //system("pause"); - //if (temp >> 8 != 0xff) { - //fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - //return nepc; - //} - //csread += 2; + if (temp != J2K_MS_EOC) { if ((j2k_state == J2K_STATE_TPH)||(temp != J2K_MS_SOT)) @@ -446,10 +361,8 @@ int decode_JPWL(unsigned char *src, int len) } } } - // Ora sono stati letti tutti gli EPB associati all'ultimo EPC letto - //printf("temp: %x\n",temp); - - //while ((temp != J2K_MS_EOC)&&(csread < cslen)) + // All EPBs read + while (temp != J2K_MS_EOC) { cio_seek(pos); @@ -458,107 +371,71 @@ int decode_JPWL(unsigned char *src, int len) cio_seek(pos); cio_skip(psot); temp = cio_read(2); - //if (temp >> 8 != 0xff) { - //fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - //return nepc; - //} - //csread += 2; + } - cio_skip(-2); // A questo punto siamo all'inizio di EOC + cio_skip(-2); // EOC j2k_state = J2K_STATE_MT; } } - else // ho trovato EPC dopo SIZ o SOT + else // There is EPC after SIZ { err = read_EPC(); - //if (err == 1) - // printf("CRC EPC corretto!\n"); - //else - // printf("CRC EPC errato!\n"); + if (nepc == 0) { - cio_seek(posi); // siamo a monte della lunghezza di SIZ - cio_skip(cio_read(2)-2); // si pone a valle di SIZ - temp = cio_read(2); // legge il marker successivo - //if (temp >> 8 != 0xff) { - // fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - // return nepc; - //} - - //while ((temp != J2K_MS_SOT)&&(csread < cslen)) + cio_seek(posi); + cio_skip(cio_read(2)-2); + temp = cio_read(2); + while (temp != J2K_MS_SOT) { - cio_skip(cio_read(2)-2); // si pone a valle del MS corrente - temp = cio_read(2); // legge il marker successivo - //if (temp >> 8 != 0xff) { - //fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - //return nepc; - //} - //csread += 2; - //printf("MS: %x\n",temp); + cio_skip(cio_read(2)-2); + temp = cio_read(2); + } - cio_skip(-2); // si posiziona a valle del main header + cio_skip(-2); // End of Main-Header } if (nepc != 0) { - cio_seek(posi); // siamo a monte della lunghezza di SOT + cio_seek(posi); cio_skip(4); psot = cio_read(4); - if (psot == 0) // vuol dire che siamo nell'ultimo TPH - j2k_state = J2K_STATE_MT; // cosi' al passo seguente si esce dal cilclo + if (psot == 0) // Last TPH + j2k_state = J2K_STATE_MT; cio_seek(posi-2); - cio_skip(psot); // si pone a valle dei dati del tile corrente + cio_skip(psot); if (cio_read(2) == J2K_MS_EOC) { j2k_state = J2K_STATE_MT; - cio_skip(-2); // si pone a valle dei dati del tile corrente + cio_skip(-2); } } - //j2k_state = J2K_STATE_MT; + nepc++; } - } // fine while (j2k_state != J2K_STATE_MT)!! - - //printf("Eccomi!\n"); - //f = fopen("output","wb"); - //if (f==NULL) - // printf("Unable to open file!\n"); - //cio_seek(0); - //printf("CL: %d\n",epc.cl); - //for (i=0; i> 8 != 0xff) { - // fprintf(stderr, "%.8x: expected a marker instead of %x\n", - // cio_tell() - 2, temp); - // return nepc; - //} + cio_skip(-2); } - //cio_skip(-2); - //printf("sdfpo: %x\n",cio_read(2)); - // A questo punto ci troviamo a valle dell'ultimo marker del MH - // Dobbiamo inserire il marker RED!!! + insert_RED(cio_tell(),red.lred+2,redlenok); g = fopen("output","wb"); if (g==NULL) @@ -568,7 +445,7 @@ int decode_JPWL(unsigned char *src, int len) fputc(cio_read(1),g); fclose(g); cslen = epc.cl + redlen + 5; - //free(red.reddata); + } else { @@ -576,57 +453,53 @@ int decode_JPWL(unsigned char *src, int len) if (f==NULL) printf("Unable to open file!\n"); cio_seek(0); - //printf("CL: %d\n",epc.cl); - for (i=0; i< cslen; i++) + + for (i=0; i>4)&1) // E' presente una o più ESD !!! + if ((epc.pepc>>4)&1) // One or more ESDs { - esd = (ESD_MS *) malloc(10 * sizeof(ESD_MS)); // ******Si puo' togliere!!!!! - //printf("La codestream contiene il marker ESD!\n"); + esd = (ESD_MS *) malloc(10 * sizeof(ESD_MS)); } - ltec = epc.lepc - 9; // lunghezza dell'EPC a partire dalla fine di pepc + ltec = epc.lepc - 9; count = 0; - nid = 0; // numero di tecniche id usate + nid = 0; // umber of techniques used while (count> 6)&1)) // quello corrente non è l'ultimo EPB del tile corrente + if (!((depb >> 6)&1)) // Not the last EPB lastepb = 0; - if ((depb >> 6)&1) // quello corrente è l'ultimo EPB del tile corrente + if ((depb >> 6)&1) // Last EPB of the TPH lastepb = 1; - if (!((depb >> 7)&1)) // EPB in modalità unpacked + if (!((depb >> 7)&1)) // Unpacked mode { - //printf("Unpacked\n"); - //system("pause"); + if ((!((depb >> 6)&1))&&((*j2k_state == J2K_STATE_MHSOC)||(*j2k_state == J2K_STATE_MH))) - *j2k_state = J2K_STATE_MH; // vuol dire che il prossimo EPB è in MH ma non è il primo - //if (((depb >> 6)&1)&&((*j2k_state == J2K_STATE_MH)||(*j2k_state == J2K_STATE_MHSOC))) - // *j2k_state = J2K_STATE_TPHSOT; // vuol dire che il prossimo EPB è il primo di un TPH - //if (((depb >> 6)&1)&&((*j2k_state == J2K_STATE_TPH)||(*j2k_state == J2K_STATE_TPHSOT))) - // *j2k_state = J2K_STATE_TPHSOT; // vuol dire che il prossimo EPB è il primo di un TPH + *j2k_state = J2K_STATE_MH; + if ((!((depb >> 6)&1))&&((*j2k_state == J2K_STATE_TPHSOT)||(*j2k_state == J2K_STATE_TPH))) - *j2k_state = J2K_STATE_TPH; // vuol dire che il prossimo EPB è relativo ad un TPH + *j2k_state = J2K_STATE_TPH; nepbrd++; - // Ora leggendo pepb il decoder deve capire quale codice applicare per la porzione di dati - // cui fa riferimento la seconda parte del campo EPBdata + - if (pepb) // se pepb=0 allora si usano i codici di default precedenti + if (pepb) // If Pepb=0 => default RS codes { if ((pepb>>28)==2) { - // in questo caso deve effettuare la decodifica RS - /***********/ - // liberiamo gli spazi allocati + free(alpha_to); free(index_of); free(gg); @@ -1056,8 +796,8 @@ int read_EPB_2(int *j2k_state) // ritorna il numero di EPB letti alpha_to = (int *) malloc((nn1+1)*sizeof(int)); index_of = (int *) malloc((nn1+1)*sizeof(int)); gg = (int *) malloc((nn1-kk1+1)*sizeof(int)); - recd = (int *) malloc((nn1)*sizeof(int)); ///forse alcune di queste malloc possono - data = (int *) malloc((kk1)*sizeof(int)); // essere eliminate, inutili per decodifica!!! + recd = (int *) malloc((nn1)*sizeof(int)); + data = (int *) malloc((kk1)*sizeof(int)); bb = (int *) malloc((nn1-kk1)*sizeof(int)); generate_gf(nn1,kk1) ; gen_poly(nn1,kk1) ; @@ -1065,45 +805,35 @@ int read_EPB_2(int *j2k_state) // ritorna il numero di EPB letti if ((pepb>>28)==1) { - // in questo caso deve effettuare le decodifica CRC + // CRC decode free(buff); buff = (char *) malloc(ldpepb * sizeof(char)); write_buff(buff,posdata2+ldata,ldpepb); - if (pepb & 0x00000001) // vuol dire che bisogna decodificare secondo CRC 32 + if (pepb & 0x00000001) // CRC 32 { - /*per fare il crc32 occorre invertire i byte in ingresso, invertire il crc calcolato - e farne il complemento a 1*/ + ResetCRC(); for (i=0; i < ldpepb; i++) UpdateCRC32(reflectByte(buff[i])); reflectCRC32(); - crcSum ^= 0xffffffff; // effettua il complemento a 1 + crcSum ^= 0xffffffff; // 1's complement cio_seek(posdata2); datacrc = cio_read(4); - //printf("CRCSUM: %x\n",crcSum); - //if (datacrc == crcSum) - // printf("CRC corretto!\n"); - //else - // printf("CRC errato!\n"); + } - else // vuol dire che bisogna decodificare secondo CRC 16 + else // CRC 16 { ResetCRC(); for (i=0; i < ldpepb; i++) UpdateCRC16(buff[i]); cio_seek(posdata2); datacrc = cio_read(2); - //printf("CRCSUM: %x\n",crcSum); - //if (datacrc == crcSum) - // printf("CRC corretto!\n"); - //else - // printf("CRC errato!\n"); + } free(buff); cio_seek(posdata2 + ldata + ldpepb); next = cio_tell(); - //printf("read: %x\n",cio_read(2)); - //cio_skip(-2); + temp = cio_read(2); if (temp == J2K_MS_SOT) @@ -1111,197 +841,137 @@ int read_EPB_2(int *j2k_state) // ritorna il numero di EPB letti if (temp == J2K_MS_EOC) *j2k_state = J2K_STATE_MT; cio_skip(-2); - //printf("state: %x\n",*j2k_state); - + return 1; - //return (posdata2 + ldata + ldpepb); // ritorna la posizione a valle dei dati successivi a EPB - //return; + } if (pepb>=0x30000000) { - // tecniche registrate in RA + // RA techniques cio_seek(posdata2); return 1; - //return (posdata2 + ldata + ldpepb); - // Per adesso prevede la semplice uscita dalla funzione + + } if (pepb==0xffffffff) { - // non sono usati metodi per i dati seguenti + cio_seek(posdata2); return 1; - //return (posdata2 + ldata + ldpepb); - //return; + } - }// Fine if (pepb) + } - /*******************/ - // qui bisogna aggiungere la parte per la gestione della modalità packed/unpacked - /*******************/ - - //cio_seek(posdata + (nn-kk)); - //posdata2 = cio_tell(); // posizione inizio seconda parte dati EPB - /********************/ - // Per adesso si suppone che il primo EPB di un header utilizza lo stesso codice - // di default anche per la seconda parte dei dati...in seguito bisognerà aggiungere - // la funzionalità che gestisce l'uso dei vari codici in base al campo pepb - /********************/ - - // Ora bisogna copiare in buff la seconda parte dei dati di EPB e i dati successivi all'epb - // per una lunghezza pari a ldpepb - nblock = ldata / (nn-kk); // numero di "blocchi di decodifica" - //printf("nblock = %d\n",nblock); - //*system("pause"); - //cio_seek(posdata2); // si posiziona all'inizio della seconda parte dei dati EPB + nblock = ldata / (nn-kk); // Number of CW + free(buff); buff = (char *) malloc(nn1 * sizeof(char)); for (i=0; i> 6)&1) // quello corrente è l'ultimo EPB del tile corrente - //{ - // lastepb = 1; // l'epb corrente è l'ultimo del tile - //nepbpm = ((depb << 2) >> 2); // numero di EPB accorpati in modalità packed - // nepbpm = (depb & 0x3f); // numero di EPB accorpati in modalità packed - //printf("nepbpm: %d\n",nepbpm); - //} - if (!((depb >> 6)&1)) // quello corrente non è l'ultimo EPB del tile corrente + cio_skip(2); + depb = cio_read(1); + + if (!((depb >> 6)&1)) // Not the last EPB of the TPH nepbpm += 1; - if ((depb >> 6)&1) // quello corrente è l'ultimo EPB del tile corrente + if ((depb >> 6)&1) // Last EPB of the TPH { nepbpm += 1; lastepb = 1; } - //printf("nepbpm: %d\n",nepbpm); - //printf("lastepb: %d\n",lastepb); - //system("pause"); - - cio_skip(-3); // si posiziona all'inizio del campo lepb - cio_skip(cio_read(2)-2); // si posiziona a valle dell'epb corrente - pos = cio_tell(); // memorizza la posizione all'inizio dell'EPB successivo - //printf("mrk: %x\n",cio_read(2)); - //cio_skip(-2); - //system("pause"); + cio_skip(-3); + cio_skip(cio_read(2)-2); + pos = cio_tell(); // Next EPB + cio_skip(2); - //conta++; + - //csread += lepb; - - } // Fine while (lastepb == 0)!!!! - // A questo punto il decoder ha decodificato le porzioni iniziali di tutti gli EPB - // del tile corrente + } - // Ora dobbiamo decodificare le porzioni finali di tutti gli EPB!!! + // Decode EPB parity bytes protecting J2K data - // pos contiene la posizione a valle dell'ultimo degli EPB packed!!! + cio_skip(-2); posend = cio_tell(); - //printf("posend: %x\n",posend); - //system("pause"); - lpack = posend-posfirst; // lunghezza totale della catena di EPB + + lpack = posend-posfirst; // Total EPBs length epb = (EPB_par *) malloc(nepbpm * sizeof(EPB_par)); cio_seek(posfirst); - //printf("posfirst: %x\n",posfirst); - - //printf("nepbpm: %d\n",nepbpm); + for (count=0; count> 6)&1))&&((*j2k_state == J2K_STATE_MHSOC)||(*j2k_state == J2K_STATE_MH))) - // *j2k_state = J2K_STATE_MH; // vuol dire che il prossimo EPB è in MH ma non è il primo - //if (((epb[count].depb >> 6)&1)&&((*j2k_state == J2K_STATE_MH)||(*j2k_state == J2K_STATE_MHSOC))) - // *j2k_state = J2K_STATE_TPHSOT; // vuol dire che il prossimo EPB è il primo di un TPH - //if (((epb[count].depb >> 6)&1)&&((*j2k_state == J2K_STATE_TPH)||(*j2k_state == J2K_STATE_TPHSOT))) - // *j2k_state = J2K_STATE_TPHSOT; // vuol dire che il prossimo EPB è il primo di un TPH - //if ((!((epb[count].depb >> 6)&1))&&((*j2k_state == J2K_STATE_TPHSOT)||(*j2k_state == J2K_STATE_TPH))) - // *j2k_state = J2K_STATE_TPH; // vuol dire che il prossimo EPB è relativo ad un TPH + cio_seek(posdata + lparity); + posdata2 = cio_tell(); - // Ora leggendo pepb il decoder deve capire quale codice applicare per la porzione di dati - // cui fa riferimento la seconda parte del campo EPBdata - if (epb[count].pepb) // se pepb=0 allora si usano i codici di default precedenti + + + if (epb[count].pepb) // If Pepb=0 => default RS codes { if ((epb[count].pepb>>28)==2) { - // in questo caso deve effettuare la decodifica RS - /***********/ - // liberiamo gli spazi allocati + free(alpha_to); free(index_of); free(gg); @@ -1606,8 +1199,8 @@ int read_EPB_2(int *j2k_state) // ritorna il numero di EPB letti alpha_to = (int *) malloc((nn1+1)*sizeof(int)); index_of = (int *) malloc((nn1+1)*sizeof(int)); gg = (int *) malloc((nn1-kk1+1)*sizeof(int)); - recd = (int *) malloc((nn1)*sizeof(int)); ///forse alcune di queste malloc possono - data = (int *) malloc((kk1)*sizeof(int)); // essere eliminate, inutili per decodifica!!! + recd = (int *) malloc((nn1)*sizeof(int)); + data = (int *) malloc((kk1)*sizeof(int)); bb = (int *) malloc((nn1-kk1)*sizeof(int)); generate_gf(nn1,kk1) ; gen_poly(nn1,kk1) ; @@ -1615,46 +1208,37 @@ int read_EPB_2(int *j2k_state) // ritorna il numero di EPB letti if ((epb[count].pepb>>28)==1) { - // in questo caso deve effettuare le decodifica CRC + // CRC decode free(buff); buff = (char *) malloc(epb[count].ldpepb * sizeof(char)); write_buff(buff,posdata2+epb[count].ldata,epb[count].ldpepb);//***Correggi!!!!!!!!!!! - if (epb[count].pepb & 0x00000001) // vuol dire che bisogna decodificare secondo CRC 32 + if (epb[count].pepb & 0x00000001) // CRC 32 { - /*per fare il crc32 occorre invertire i byte in ingresso, invertire il crc calcolato - e farne il complemento a 1*/ + ResetCRC(); - cio_seek(posend+ldpread); // si posiziona nel blocco dati corrispondente + cio_seek(posend+ldpread); for (i=0; i < epb[count].ldpepb; i++) UpdateCRC32(reflectByte(buff[i])); reflectCRC32(); if (lastepb==1) { - next = startsot + psot; // **************Da correggere!!!! + next = startsot + psot; cio_seek(next); - //printf("%x\n",cio_read(2)); - //cio_skip(-2); } if ((cio_read(2) == 0xffd9)||(psot == 0)) *j2k_state = J2K_STATE_MT; cio_skip(-2); - //else - //{ - // next = cio_tell(); // posizione alla fine dei dati protetti (ldpepb) - //} - crcSum ^= 0xffffffff; // effettua il complemento a 1 + + crcSum ^= 0xffffffff; cio_seek(posdata2); datacrc = cio_read(4); - //if (datacrc == crcSum) - // printf("CRC corretto!\n"); - //else - // printf("CRC errato!\n"); + } - else // vuol dire che bisogna decodificare secondo CRC 16 + else // CRC 16 { ResetCRC(); - cio_seek(posend+ldpread); // si posiziona nel blocco dati corrispondente + cio_seek(posend+ldpread); for (i=0; i < epb[count].ldpepb; i++) UpdateCRC16(buff[i]); if (lastepb==1) @@ -1667,167 +1251,131 @@ int read_EPB_2(int *j2k_state) // ritorna il numero di EPB letti cio_skip(-2); cio_seek(posdata2); datacrc = cio_read(2); - //if (datacrc == crcSum) - // printf("CRC corretto!\n"); - //else - // printf("CRC errato!\n"); } - //free(buff); } if (epb[count].pepb>=0x30000000) { next = cio_tell(); - // tecniche registrate in RA + // RA } if (epb[count].pepb==0xffffffff) { next = cio_tell(); - // non sono usati metodi per i dati seguenti + } } - if (((epb[count].pepb>>28)==2)||(epb[count].pepb==0)) // Vuol dire che si usano codici RS + if (((epb[count].pepb>>28)==2)||(epb[count].pepb==0)) // RS codes { - // Ora bisogna copiare in buff la seconda parte dei dati di EPB e i dati successivi all'epb - // per una lunghezza pari a ldpepb - - //printf("count: %d\n",count); - //printf("ldpread: %d\n",ldpread); - //system("pause"); - //printf("nn: %d\n",nn); - //printf("kk: %d\n",kk); - //system("pause"); - //printf("posiz: %x\n",posdata2 + epb[count].ldata); - nblock = epb[count].ldata / (nn-kk); // numero di "blocchi di decodifica" + + nblock = epb[count].ldata / (nn-kk); // Number of CW free(buff); buff = (char *) malloc(nn1 * sizeof(char)); - //printf("ldata: %d\n",epb[count].ldata); - //printf("nblock: %d\n",nblock); + for (i=0; ipepb)) + } + - // A questo punto abbiamo corretto anche la parte di dati cui fa riferimento la seconda - // parte del campo EPBdata ldpread += epb[count].ldpepb; cio_seek(pos+2); cio_skip(epb[count].lepb); - pos = cio_tell(); // posizione a valle dell'EPB corrente + pos = cio_tell(); - } // fine for (count=0; count> 6)&1))&&((*j2k_state == J2K_STATE_MHSOC)||(*j2k_state == J2K_STATE_MH))) - *j2k_state = J2K_STATE_MH; // vuol dire che il prossimo EPB è in MH ma non è il primo + *j2k_state = J2K_STATE_MH; if (((depb >> 6)&1)&&((*j2k_state == J2K_STATE_MH)||(*j2k_state == J2K_STATE_MHSOC))) - *j2k_state = J2K_STATE_TPHSOT; // vuol dire che il prossimo EPB è il primo di un TPH + *j2k_state = J2K_STATE_TPHSOT; if (((depb >> 6)&1)&&((*j2k_state == J2K_STATE_TPH)||(*j2k_state == J2K_STATE_TPHSOT))) - *j2k_state = J2K_STATE_TPHSOT; // vuol dire che il prossimo EPB è il primo di un TPH + *j2k_state = J2K_STATE_TPHSOT; if ((!((depb >> 6)&1))&&((*j2k_state == J2K_STATE_TPHSOT)||(*j2k_state == J2K_STATE_TPH))) - *j2k_state = J2K_STATE_TPH; // vuol dire che il prossimo EPB è relativo ad un TPH + *j2k_state = J2K_STATE_TPH; if (!((depb >> 7)&1)) - epbpm = 1; // Gli EPB sono scritti in modalità unpacked (epbpm=0) + epbpm = 1; // Unpacked mode else - epbpm = 0; // Gli EPB sono scritti in modalità packed (epbpm=1) + epbpm = 0; // Packed mode nepbrd++; - // Ora leggendo pepb il decoder deve capire quale codice applicare per la porzione di dati - // cui fa riferimento la seconda parte del campo EPBdata - - if (pepb) // se pepb=0 allora si usano i codici di default precedenti + + if (pepb) { if ((pepb>>28)==2) { - // in questo caso deve effettuare la decodifica RS - /***********/ - // liberiamo gli spazi allocati + free(alpha_to); free(index_of); free(gg); free(recd); free(data); free(bb); - /***********/ + kk = (int) pepb & 0x000000ff; nn = (int) (pepb>>8) & 0x000000ff; tt = (int) ceil((double)(nn-kk)/2); @@ -2193,8 +1664,8 @@ int read_EPB(int next, int *j2k_state) // funzione che ritorna la posizione sub alpha_to = (int *) malloc((nn1+1)*sizeof(int)); index_of = (int *) malloc((nn1+1)*sizeof(int)); gg = (int *) malloc((nn1-kk1+1)*sizeof(int)); - recd = (int *) malloc((nn1)*sizeof(int)); ///forse alcune di queste malloc possono - data = (int *) malloc((kk1)*sizeof(int)); // essere eliminate, inutili per decodifica!!! + recd = (int *) malloc((nn1)*sizeof(int)); + data = (int *) malloc((kk1)*sizeof(int)); bb = (int *) malloc((nn1-kk1)*sizeof(int)); generate_gf(nn1,kk1) ; gen_poly(nn1,kk1) ; @@ -2202,19 +1673,18 @@ int read_EPB(int next, int *j2k_state) // funzione che ritorna la posizione sub if ((pepb>>28)==1) { - // in questo caso deve effettuare le decodifica CRC + // CRC free(buff); buff = (char *) malloc(ldpepb * sizeof(char)); write_buff(buff,posdata2+ldata,ldpepb); - if (pepb & 0x00000001) // vuol dire che bisogna decodificare secondo CRC 32 + if (pepb & 0x00000001) // CRC 32 { - /*per fare il crc32 occorre invertire i byte in ingresso, invertire il crc calcolato - e farne il complemento a 1*/ + ResetCRC(); for (i=0; i < ldpepb; i++) UpdateCRC32(reflectByte(buff[i])); reflectCRC32(); - crcSum ^= 0xffffffff; // effettua il complemento a 1 + crcSum ^= 0xffffffff; cio_seek(posdata2); datacrc = cio_read(4); if (datacrc == crcSum) @@ -2222,7 +1692,7 @@ int read_EPB(int next, int *j2k_state) // funzione che ritorna la posizione sub else printf("CRC errato!\n"); } - else // vuol dire che bisogna decodificare secondo CRC 16 + else // CRC 16 { ResetCRC(); for (i=0; i < ldpepb; i++) @@ -2235,189 +1705,134 @@ int read_EPB(int next, int *j2k_state) // funzione che ritorna la posizione sub printf("CRC errato!\n"); } free(buff); - return (posdata2 + ldata + ldpepb); // ritorna la posizione a valle dei dati successivi a EPB - //return; + return (posdata2 + ldata + ldpepb); + } if (pepb>=0x30000000) { - // tecniche registrate in RA + //RA return (posdata2 + ldata + ldpepb); - // Per adesso prevede la semplice uscita dalla funzione + } if (pepb==0xffffffff) { - // non sono usati metodi per i dati seguenti + return (posdata2 + ldata + ldpepb); - //return; + } } - /*******************/ - // qui bisogna aggiungere la parte per la gestione della modalità packed/unpacked - /*******************/ + - //cio_seek(posdata + (nn-kk)); - //posdata2 = cio_tell(); // posizione inizio seconda parte dati EPB - - /********************/ - // Per adesso si suppone che il primo EPB di un header utilizza lo stesso codice - // di default anche per la seconda parte dei dati...in seguito bisognerà aggiungere - // la funzionalità che gestisce l'uso dei vari codici in base al campo pepb - /********************/ - - // Ora bisogna copiare in buff la seconda parte dei dati di EPB e i dati successivi all'epb - // per una lunghezza pari a ldpepb - nblock = ldata / (nn-kk); // numero di "blocchi di decodifica" - //printf("nblock = %d\n",nblock); - //*system("pause"); - //cio_seek(posdata2); // si posiziona all'inizio della seconda parte dei dati EPB + nblock = ldata / (nn-kk); // Number of CW + free(buff); buff = (char *) malloc(nn1 * sizeof(char)); for (i=0; i> 6)&1) // quello corrente è l'ultimo EPB del tile corrente - //{ - // lastepb = 1; // l'epb corrente è l'ultimo del tile - //nepbpm = ((depb << 2) >> 2); // numero di EPB accorpati in modalità packed - // nepbpm = (depb & 0x3f); // numero di EPB accorpati in modalità packed - //printf("nepbpm: %d\n",nepbpm); - //} - if (!((depb >> 6)&1)) // quello corrente non è l'ultimo EPB del tile corrente + cio_skip(2); + depb = cio_read(1); + + if (!((depb >> 6)&1)) nepbpm += 1; - if ((depb >> 6)&1) // quello corrente è l'ultimo EPB del tile corrente + if ((depb >> 6)&1) { nepbpm += 1; lastepb = 1; } - cio_skip(-3); // si posiziona all'inizio del campo lepb - cio_skip(cio_read(2)-2); // si posiziona a valle dell'epb corrente - pos = cio_tell(); // memorizza la posizione all'inizio dell'EPB successivo + cio_skip(-3); + cio_skip(cio_read(2)-2); + pos = cio_tell(); cio_skip(2); - //conta++; - - } // Fine while (lastepb == 0)!!!! - // A questo punto il decoder ha decodificato le porzioni iniziali di tutti gli EPB - // del tile corrente - // Ora dobbiamo decodificare le porzioni finali di tutti gli EPB!!! + } + - // pos contiene la posizione a valle dell'ultimo degli EPB packed!!! + cio_skip(-2); posend = cio_tell(); - lpack = posend-posfirst; // lunghezza totale della catena di EPB + lpack = posend-posfirst; // Total EPBs length epb = (EPB_par *) malloc(nepbpm * sizeof(EPB_par)); cio_seek(posfirst); - //printf("nepbpm: %d\n",nepbpm); + for (count=0; count> 6)&1))&&((*j2k_state == J2K_STATE_MHSOC)||(*j2k_state == J2K_STATE_MH))) - *j2k_state = J2K_STATE_MH; // vuol dire che il prossimo EPB è in MH ma non è il primo + *j2k_state = J2K_STATE_MH; if (((epb[count].depb >> 6)&1)&&((*j2k_state == J2K_STATE_MH)||(*j2k_state == J2K_STATE_MHSOC))) - *j2k_state = J2K_STATE_TPHSOT; // vuol dire che il prossimo EPB è il primo di un TPH + *j2k_state = J2K_STATE_TPHSOT; if (((epb[count].depb >> 6)&1)&&((*j2k_state == J2K_STATE_TPH)||(*j2k_state == J2K_STATE_TPHSOT))) - *j2k_state = J2K_STATE_TPHSOT; // vuol dire che il prossimo EPB è il primo di un TPH + *j2k_state = J2K_STATE_TPHSOT; if ((!((epb[count].depb >> 6)&1))&&((*j2k_state == J2K_STATE_TPHSOT)||(*j2k_state == J2K_STATE_TPH))) - *j2k_state = J2K_STATE_TPH; // vuol dire che il prossimo EPB è relativo ad un TPH + *j2k_state = J2K_STATE_TPH; - // Ora leggendo pepb il decoder deve capire quale codice applicare per la porzione di dati - // cui fa riferimento la seconda parte del campo EPBdata - if (epb[count].pepb) // se pepb=0 allora si usano i codici di default precedenti + + if (epb[count].pepb) { if ((epb[count].pepb>>28)==2) { - // in questo caso deve effettuare la decodifica RS - /***********/ - // liberiamo gli spazi allocati + free(alpha_to); free(index_of); free(gg); free(recd); free(data); free(bb); - /***********/ + kk = (int) epb[count].pepb & 0x000000ff; nn = (int) (epb[count].pepb>>8) & 0x000000ff; tt = (int) ceil((double)(nn-kk)/2); @@ -2766,8 +2099,8 @@ int read_EPB_PM(int *j2k_state) // Gestisce la lettura degli EPB packed mode alpha_to = (int *) malloc((nn1+1)*sizeof(int)); index_of = (int *) malloc((nn1+1)*sizeof(int)); gg = (int *) malloc((nn1-kk1+1)*sizeof(int)); - recd = (int *) malloc((nn1)*sizeof(int)); ///forse alcune di queste malloc possono - data = (int *) malloc((kk1)*sizeof(int)); // essere eliminate, inutili per decodifica!!! + recd = (int *) malloc((nn1)*sizeof(int)); + data = (int *) malloc((kk1)*sizeof(int)); bb = (int *) malloc((nn1-kk1)*sizeof(int)); generate_gf(nn1,kk1) ; gen_poly(nn1,kk1) ; @@ -2775,16 +2108,15 @@ int read_EPB_PM(int *j2k_state) // Gestisce la lettura degli EPB packed mode if ((epb[count].pepb>>28)==1) { - // in questo caso deve effettuare le decodifica CRC + // CRC free(buff); buff = (char *) malloc(epb[count].ldpepb * sizeof(char)); write_buff(buff,posdata2+epb[count].ldata,epb[count].ldpepb); - if (epb[count].pepb & 0x00000001) // vuol dire che bisogna decodificare secondo CRC 32 + if (epb[count].pepb & 0x00000001) // CRC 32 { - /*per fare il crc32 occorre invertire i byte in ingresso, invertire il crc calcolato - e farne il complemento a 1*/ + ResetCRC(); - cio_seek(posend+ldpread); // si posiziona nel blocco dati corrispondente + cio_seek(posend+ldpread); for (i=0; i < epb[count].ldpepb; i++) UpdateCRC32(reflectByte(buff[i])); reflectCRC32(); @@ -2792,17 +2124,13 @@ int read_EPB_PM(int *j2k_state) // Gestisce la lettura degli EPB packed mode { next = startsot + psot; cio_seek(next); - //printf("%x\n",cio_read(2)); - //cio_skip(-2); + } if ((cio_read(2) == 0xffd9)||(psot == 0)) *j2k_state = J2K_STATE_MT; cio_skip(-2); - //else - //{ - // next = cio_tell(); // posizione alla fine dei dati protetti (ldpepb) - //} - crcSum ^= 0xffffffff; // effettua il complemento a 1 + + crcSum ^= 0xffffffff; cio_seek(posdata2); datacrc = cio_read(4); if (datacrc == crcSum) @@ -2811,10 +2139,10 @@ int read_EPB_PM(int *j2k_state) // Gestisce la lettura degli EPB packed mode printf("CRC errato!\n"); } - else // vuol dire che bisogna decodificare secondo CRC 16 + else // CRC 16 { ResetCRC(); - cio_seek(posend+ldpread); // si posiziona nel blocco dati corrispondente + cio_seek(posend+ldpread); for (i=0; i < epb[count].ldpepb; i++) UpdateCRC16(buff[i]); if (lastepb==1) @@ -2832,153 +2160,126 @@ int read_EPB_PM(int *j2k_state) // Gestisce la lettura degli EPB packed mode else printf("CRC errato!\n"); } - //free(buff); + } if (epb[count].pepb>=0x30000000) { - //if (lastepb==1) - // next = startsot + psot; - // tecniche registrate in RA + } if (epb[count].pepb==0xffffffff) { - //if (lastepb==1) - // next = startsot + psot; - // non sono usati metodi per i dati seguenti + } } - if (((epb[count].pepb>>28)==2)||(epb[count].pepb==0)) // Vuol dire che si usano codici RS + if (((epb[count].pepb>>28)==2)||(epb[count].pepb==0)) // RS codes { - // Ora bisogna copiare in buff la seconda parte dei dati di EPB e i dati successivi all'epb - // per una lunghezza pari a ldpepb + - //printf("posiz: %x\n",posdata2 + epb[count].ldata); - nblock = epb[count].ldata / (nn-kk); // numero di "blocchi di decodifica" + + nblock = epb[count].ldata / (nn-kk); // Number of CW free(buff); buff = (char *) malloc(nn1 * sizeof(char)); - //printf("ldata: %d\n",epb[count].ldata); - //printf("nblock: %d\n",nblock); + for (i=0; ipepb)) + } + - // A questo punto abbiamo corretto anche la parte di dati cui fa riferimento la seconda - // parte del campo EPBdata ldpread += epb[count].ldpepb; cio_seek(pos+2); cio_skip(epb[count].lepb); - pos = cio_tell(); // posizione a valle dell'EPB corrente + pos = cio_tell(); - } // fine for (count=0; count> 24)) & 0xff); crcSum = ((crcSum << 8) ^ CrcT32[tmp]); } -/* funzioni per l'inversione dei byte e del crc32 */ char reflectByte(char inbyte) { @@ -3135,15 +2422,6 @@ void reflectCRC32() crcSum = outcrc; } -// Codice relativo alla CODIFICA/DECODIFICA RS - - - -//#define nn 255 /* nn=2**mm -1 length of codeword */ -//#define tt 48 /* number of errors that can be corrected */ -//#define kk 159 /* kk = nn-2*tt */ - -//int pp [mm+1] = { 1, 1, 0, 0, 1} ; /* specify irreducible polynomial coeffts */ diff --git a/jpwl/encoder/jpwlenc/image_to_j2k.dsp b/jpwl/encoder/jpwlenc/image_to_j2k.dsp index 07e5a0a2..185a6fac 100644 --- a/jpwl/encoder/jpwlenc/image_to_j2k.dsp +++ b/jpwl/encoder/jpwlenc/image_to_j2k.dsp @@ -130,6 +130,10 @@ SOURCE=..\libopenjpeg\jpt.c # End Source File # Begin Source File +SOURCE=..\libopenjpeg\jpw.c +# End Source File +# Begin Source File + SOURCE=..\libopenjpeg\mct.c # End Source File # Begin Source File @@ -146,6 +150,10 @@ SOURCE=..\libopenjpeg\raw.c # End Source File # Begin Source File +SOURCE=..\libopenjpeg\rs.c +# End Source File +# Begin Source File + SOURCE=..\libopenjpeg\t1.c # End Source File # Begin Source File