为什么FREAD()不属于MSYS/MinGW的工作(跳过字节)?

问题描述:

极力打造Windows下Xuggler。 Xuggler是裹成Java进行声音处理用途(包括FFMPEG)核心本地代码的功能。为什么FREAD()不属于MSYS/MinGW的工作(跳过字节)?

我的窗户是64位Win 7的教授,但是所有使用的资料库是32位。我下的MinGW /运行MSys的构建过程,从下MSYS壳与followinf脚本:

#!/bin/sh 
export JAVA_HOME=/C/Program\ Files\ \(x86\)/Java/jdk1.6.0_25 
export XUGGLE_HOME=/C/Xuggler 

PATH=$XUGGLE_HOME/bin:/C/Program\ Files\ \(x86\)/Java/jdk1.6.0_25/bin:/d/APPS/msysgit/msysgit/bin/git:/D/APPS/MinGW/bin:/bin:/D/APPS/apa che-ant-1.8.2/bin:/D/Users/Dims/Design/MinGW/Util:$PATH 
ant -Dbuild.m64=no run-tests 

Ant目标在结尾处包含一些测试,给出一个错误。错误如下

[exec] Running 6 tests.. 
[exec] In StdioURLProtocolHandlerTest::testRead: 
[exec] ../../../../../../../../../test/csrc/com/xuggle/xuggler/io/StdioURLProtocolHandlerTest.cpp:108: Error: Expected (4546420 == totalBytes), found (4546420 != 1042) 
[exec] In StdioURLProtocolHandlerTest::testReadWrite: 
[exec] ../../../../../../../../../test/csrc/com/xuggle/xuggler/io/StdioURLProtocolHandlerTest.cpp:185: Error: Expected (4546420 == totalBytes), found (4546420 != 1042) 
[exec] In StdioURLProtocolHandlerTest::testSeek: 
[exec] ../../../../../../../../../test/csrc/com/xuggle/xuggler/io/StdioURLProtocolHandlerTest.cpp:139: Error: Expected (4546420 == totalBytes), found (4546420 != 1042) 
[exec] . 
[exec] Failed 3 of 6 tests 
[exec] Success rate: 50% 
[exec] FAIL: xugglerioTestStdioURLProtocolHandler.exe 

更新1

的测试代码如下:

int32_t totalBytes = 0; 
do { 
    unsigned char buf[2048]; 
    retval = handler->url_read(buf, (int)sizeof(buf)); 
    if (retval > 0) 
     totalBytes+= retval; 
} while (retval > 0); 
VS_TUT_ENSURE_EQUALS("", 4546420, totalBytes); 

虽然url_read代码如下:

int 
StdioURLProtocolHandler :: url_read(unsigned char* buf, int size) 
{ 
    if (!mFile) 
     return -1; 
    return (int) fread(buf, 1, size, mFile); 
} 

我不明白在什么情况下它可以返回1042? ?不知怎的,可能是64位播放?

更新2

我打印出来使用的文件名,这是

d:/......./../../../test/fixtures/testfile.flv 

路径是正确的,但开始d://d/

这能起到MSYS下一个角色?

更新3

我比较与测试文件的真实内容读进来字节和发现,FREAD()跳过某些原因,一些字节。不知道哪个字节还,可能这些都是CR/LF

UPDATE 4

与CR/LF我想没有关系的。

原始字节

46 4C 56 01 05 00 00 00 09 00 00 00 00 12 00 00 F4 00 00 00 00 00 00 00 02 00 0A 6F 6E 4D 65 74 61 44 61 74 61 08 00 00 ... 

读进来字节

46 4C 56 15 00 09 00 00 12 00 F4 00 00 00 02 0A 6F 6E 4D 65 74 61 44 61 74 61 80 00 B0 86 47 57 26 17 46 96 F6 E0 40 62 ... 

这是FLV文件开始。我不明白腐败的原则。

如何01 05 00 00变换只是15 ???

UPDATE 5

文件开口做过类似以下

void 
StdioURLProtocolHandlerTest :: testRead() 
{ 
    StdioURLProtocolManager::registerProtocol("test"); 
    URLProtocolHandler* handler = StdioURLProtocolManager::findHandler("test:foo", 0,0); 
    VS_TUT_ENSURE("", handler); 

    int retval = 0; 
    retval = handler->url_open(mSampleFile, URLProtocolHandler::URL_RDONLY_MODE); 
    VS_TUT_ENSURE("", retval >= 0); 

    int32_t totalBytes = 0; 
    printf("Bytes:\n"); 
    do { 
    //... 

url_open()函数如下:

int StdioURLProtocolHandler :: url_open(const char *url, int flags) 
{ 
    if (!url || !*url) 
    return -1; 
    reset(); 
    const char * mode; 

    switch(flags) { 
    case URLProtocolHandler::URL_RDONLY_MODE: 
     mode="r"; 
     break; 
    case URLProtocolHandler::URL_WRONLY_MODE: 
     mode="w"; 
     break; 
    case URLProtocolHandler::URL_RDWR_MODE: 
      mode="r+"; 
      break; 
     default: 
     return -1; 
    } 

    // The URL MAY contain a protocol string. Find it now. 
    char proto[256]; 
    const char* protocol = URLProtocolManager::parseProtocol(proto, sizeof(proto), url); 
    if (protocol) 
    { 
    size_t protoLen = strlen(protocol); 
    // skip past it 
    url = url + protoLen; 
    if (*url == ':' || *url == ',') 
     ++url; 
    } 
// fprintf(stderr, "protocol: %s; url: %s; mode: %s\n", protocol, url, mode); 
    mFile = fopen(url, mode); 
    if (!mFile) 
    return -1; 
    return 0; 
} 
+0

你是如何打开该文件的? – Mat 2012-03-26 07:16:59

+0

查看更新5.看起来不可疑。 – Dims 2012-03-26 12:45:04

+1

看起来很可疑。在打开模式下没有“b”。 – Mat 2012-03-26 12:52:23

应固定在GIT库上CROSS_COMPILE分支为今天。本周晚些时候/下周早些时候我会把它推到树的尖端。

现在stdio处理程序以二进制打开所有文件。

+0

谢谢。建议用户'cross_compile'为Windows编译?即我可以在Linux上运行编译器,但会得到Windows的二进制文件,对吧? – Dims 2012-04-05 12:26:34

+0

现在主人包含此修复程序和分布在我们常春藤回购的预构建的jar文件包含所有操作系统。如果您在Linux中构建,则不会默认生成Windows。你需要启用交叉编译(搜索博客)。 – 2012-04-05 16:50:54