Странный и непредсказуемый сбой при использовании libx264, кросс-скомпилированного с MinGW - PullRequest
3 голосов
/ 11 февраля 2012

Я работаю над проектом C ++ с использованием Visual Studio 2010 в Windows.Я динамически связываюсь с x264, который я создал как общую библиотеку, используя MinGW, следуя инструкции на

http://www.ayobamiadewole.com/Blog/Others/x264compilation.aspx

Странно то, что мой код x264 работает отлично иногда .Затем, когда я изменяю какую-то строку кода (или даже меняю комментарии в файле!) И перекомпилирую все, происходит сбой на строке

encoder_ = x264_encoder_open(&param);

с сообщением

Access violation reading location 0x00000000

ЯЯ не делаю ничего лишнего, так что, вероятно, это не мой код, но я думаю, что с компоновкой что-то идет не так или, возможно, что-то не так с тем, как я скомпилировал x264.

Полный код инициализации:

x264_param_t param = { 0 };
if (x264_param_default_preset(&param, "ultrafast", "zerolatency") < 0) {
  throw KStreamerException("x264_param_default_preset failed");
}

param.i_threads = 1;
param.i_width = 640;
param.i_height = 480;
param.i_fps_num = 10;
param.i_fps_den = 1;

encoder_ = x264_encoder_open(&param); // <-----
if (encoder_ == 0) {
  throw KStreamerException("x264_encoder_open failed");
}

x264_picture_alloc(&pic_, X264_CSP_I420, 640, 480);

Редактировать: Оказывается, что он всегда работает в режиме выпуска и при использовании сверхбыстрого вместо сверхбыстрого он также работает в режиме отладки 100%.Может быть, сверхбыстрый режим выполняет сумасшедшие оптимизации, которые не нравятся отладчику?

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Я тоже сталкивался с этой проблемой с libx264-120. libx264-120 был построен на MinGW и конфигурации, как показано ниже.

$ ./configure --disable-cli --enable-shared --extra-ldflags = -Wl, - output-def = libx264-120.def --enable-debug --enable-win32thread

platform:      X86
system:        WINDOWS
cli:           no
libx264:       internal
shared:        yes
static:        no
asm:           yes
interlaced:    yes
avs:           yes
lavf:          no
ffms:          no
gpac:          no
gpl:           yes
thread:        win32
filters:       crop select_every
debug:         yes
gprof:         no
strip:         no
PIC:           no
visualize:     no
bit depth:     8
chroma format: all

$ make -j8

lib /def:libx264-120.def / machine: x86

#include "stdafx.h"
#include <iostream>
#include <cassert>

using namespace std;

#include <stdint.h>
extern "C"{
#include <x264.h>
}

int _tmain(int argc, _TCHAR* argv[])
{
int width(640);
int height(480);

int err(-1);

x264_param_t x264_param = {0};
//x264_param_default(&x264_param);

err = 
    x264_param_default_preset(&x264_param, "veryfast", "zerolatency");
assert(0==err);

x264_param.i_threads = 8;
x264_param.i_width = width;
x264_param.i_height = height;
x264_param.i_fps_num = 60;//fps;
x264_param.i_fps_den = 1;
// Intra refres:
x264_param.i_keyint_max = 60;//fps;
x264_param.b_intra_refresh = 1;
//Rate control:
x264_param.rc.i_rc_method = X264_RC_CRF;
x264_param.rc.f_rf_constant = 25;
x264_param.rc.f_rf_constant_max = 35;
//For streaming:
x264_param.b_repeat_headers = 1;
x264_param.b_annexb = 1;

err = x264_param_apply_profile(&x264_param, "baseline");
assert(0==err);

x264_t *x264_encoder = x264_encoder_open(&x264_param);
x264_encoder = x264_encoder;


x264_encoder_close( x264_encoder );

getchar();
return 0;
}

Эта программа завершается успешно иногда . Но часто происходит сбой на x264_encoder_open с нарушением прав доступа. Информация для этого не существует в Google. А как инициализировать x264_param_t и как использовать x264_encoder_open, неясно.

Кажется, что поведение вызвано значениями настроек x264, но я не могу знать их, не читая некоторые программы с открытым исходным кодом, использующие libx264.

И, похоже, это нарушение прав доступа не возникает при ПЕРВОМ ИСПОЛНЕНИИ ВРЕМЕНИ и при компиляции с gcc MinGW (например, gcc -o test test.c -lx264; ./ test)

После такого поведения я думаю, что libx264 выполняет странные процессы с ресурсами в версии DLL ilbx264, которая была построена на gcc MinGW.

0 голосов
/ 02 марта 2012

У меня была такая же проблема. Единственный способ, которым я смог это исправить, это собрать dll x264 без опции asm (т.е. указать --disable-asm)

...