2010-01-08 59 views
0

我试图渲染运行在XUL窗口顶部的GStreamer管道。当从另一个DLL调用功能时,插件应用程序挂起

为此我写了一个XPCOM插件。 XPCOM插件基本上是一个由Gecko引擎加载的dll文件。我的插件与GStreamer链接,因此它依赖于许多其他GStreamer插件(也是dll文件)。

调用GStreamer代码(例如一个简单的函数,如gst_pipeline_new)会导致应用程序崩溃。更具体地说,它冻结和油腔滑调挂起消耗整个CPU核心(CPU总数的50%):

alt text http://img36.imageshack.us/img36/4354/tracep.png

会有人愿意帮助我弄清楚发生了什么问题呢?

编辑

一个几句话:在Windows

  • 单机的GStreamer项目做工精细。
  • XUL插件也可以正常工作(只要我不进行任何GStreamer调用)。
  • 从XUL插件中,我可以调用一个简单的glib函数,像g_strndup没有任何问题。
  • 从插件中调用GStreamer函数会崩溃应用程序。

此代码可以重现该问题。 (我不知道,如果它是有帮助的,但..)

插件.idl文件中定义的属性videoWindow

#include "nsISupports.idl" 
interface nsIDOMXULElement; 

[scriptable, uuid(BFE3F1BF-1C7B-4da2-8EAB-12F7683FAF71)] 
interface IVideo : nsISupports 
{ 
    attribute nsIDOMXULElement videoWindow; 
}; 

它的实施可以重现该问题:

NS_IMETHODIMP Video::SetVideoWindow(nsIDOMXULElement * inXULVideoWindow) 
{ 
    GstElement * pipeline = gst_pipeline_new("test"); // freezes here 
    return NS_OK; 
} 

编辑
问题已修复。看到我自己对这篇文章的回答。

+0

这可能是由于许多原因造成的 - 返回递归,堆栈损坏,竞态条件 - 尝试缩小问题的范围,或者至少向我们展示一些代码。 – 2010-01-08 21:57:02

回答

0

好吧,我不会让人......我忘了执行GStreamer的初始化函数:现在

gst_init(NULL, NULL); 

问题是固定的。

0

修复您的符号,以便您可以读取gstreamer和glib函数 - 这可能需要从源代码编译这两个库。一旦你看到真正的堆栈,解决问题将更容易

相关问题