android NDK中的不稳定fread()

问题描述 投票:0回答:1

我正在使用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;
}
android c android-ndk jpeg
1个回答
0
投票

您的示例代码不包含fopen()或ftell(),两者可能都很重要。您也可以提供这些代码吗?

谢谢。

© www.soinside.com 2019 - 2024. All rights reserved.