为什么fys()在Msys / MinGw下不起作用(跳过字节)?

时间:2012-03-25 22:19:09

标签: c windows mingw fread xuggle

尝试在Windows下构建Xuggler。 Xuggler是包含在Java中的核心本机代码函数,用于声音处理(包括ffmpeg)。

我的Windows是x64 Win 7教授,但所有使用的库都是32位。我在MinGW / MSys下运行构建过程,从Msys shell下面使用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

我已经将readen字节与测试文件的实际内容进行了比较,发现,fread()由于某种原因跳过了一些字节。不知道哪些字节,可能是CR / LF

更新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 ...

readen bytes is

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 ???

更新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;
}

1 个答案:

答案 0 :(得分:1)

应该在截至今天的cross_compile分支上的GIT存储库中修复。我会在本周晚些时候/下周初把它推到树顶。

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