我试图渲染运行在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;
}
编辑
问题已修复。看到我自己对这篇文章的回答。
这可能是由于许多原因造成的 - 返回递归,堆栈损坏,竞态条件 - 尝试缩小问题的范围,或者至少向我们展示一些代码。 – 2010-01-08 21:57:02