我正在使用NDK在C中为Android编写JPEG解码器幸运的是,解码器包含对图像文件的重复读取和同色处理我遵循了ITU-81的程序,并使用JPEGSnoop实用程序测试了结果,并获得了一些First MCU的正确结果(请注意,每个MCU的处理方式相同)不幸的是,当我尝试使用ftell()检查文件流位置时,得到了意外的结果。我通过调试进行测试,是否每次都会得到相同的错误位置,但意外的是,每次返回的ftell都不相同
是否有使用fread()的技巧,例如Java中的同步?
下面的代码段是JPEG解码器解码我的代码中扫描内容的方式的一部分
bool decode_ZZ(u_char SSSS, u_int K, u_char scanComponentIndex) {
short *ZZ = &scans[ScanCounts - 1].decodedData[scanComponentIndex][K];
receive(SSSS, ZZ);
extend(ZZ, SSSS);
return true;
}
bool decode(u_char *decodedByte, struct HuffmanTable huffmanTable) {
u_char I = 1;
u_char NextBit;
nextBit(&NextBit);
u_short CODE = NextBit;
Again:
if (CODE > huffmanTable.MAXCODE[I - 1]) {
I++;
nextBit(&NextBit);
CODE = (CODE << 1) + NextBit;
goto Again;
} else {
u_short J = huffmanTable.VALPTR[I - 1];
J = J + CODE - huffmanTable.MINCODE[I - 1];
*decodedByte = huffmanTable.HUFFVAL[J];
}
return true;
}
bool nextBit(u_char *BIT) {
if (CNT == 0) {
fread(&B, 1, 1, imageFile);
CNT = 8;
if (B != 0xFF) {
goto processBit;
} else {
u_char B2;
fread(&B2, 1, 1, imageFile);
if (B2 == 0x00) {
goto processBit;
} else {
if (B2 == DNL) {
processDNLSegment();
terminateScan();
} else {
log("Error: NO DNL marker after '0xFF' without stuff byte");
return false;
}
}
}
} else {
processBit:
*BIT = B >> (u_char) 7;
CNT--;
B = B << 1;
}
return true;
}
bool receive(u_char SSSS, short *Diff) {
u_char I = 0;
u_short V = 0;
u_char NextBit;
Again:
if (I == SSSS) {
*Diff = V;
} else {
nextBit(&NextBit);
I++;
V = (V << 1) + NextBit;
goto Again;
}
return true;
}
bool extend(short *V, u_char T) {
short Vt = (short) pow(2, T - 1);
Recheck:
if (*V < Vt) {
Vt = (short) ((-1 << T) + 1);
*V = *V + Vt;
goto Recheck;
}
return true;
}
您的示例代码不包含fopen()或ftell(),两者可能都很重要。您也可以提供这些代码吗?
谢谢。