Почему fread () не может работать (пропуская байты) под Msys / MinGw? - PullRequest
0 голосов
/ 26 марта 2012

Попытка собрать Xuggler под Windows.Xuggler - это основные функции собственного кода, встроенные в Java для обработки звука (включая ffmpeg).

Моя Windows - x64 Win 7 prof, но все используемые библиотеки - 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

ОБНОВЛЕНИЕ 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 ???

ОБНОВЛЕНИЕ 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 Ответ

1 голос
/ 05 апреля 2012

Должно быть исправлено в GIT-репозитории на ветке cross_compile на сегодняшний день. Я сверну это в верхушку дерева позже на этой неделе / ​​в начале следующей недели.

Теперь обработчик stdio открывает все файлы в двоичном виде.

...