代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

从另一个dll调用功能时,插件应用程序挂起

  •  0
  • StackedCrooked  · 技术社区  · 15 年前

    我正在尝试呈现在XUL窗口顶部运行的gstreamer管道。

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

    调用gstreamer代码(例如 gst_pipeline_new )导致应用程序崩溃。更具体地说,它冻结并挂在glib中,消耗整个CPU核心(占总CPU的50%):

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

    有人愿意帮我弄清楚出了什么问题吗?

    编辑

    几句话:

    • Windows上的独立gstreamer项目工作正常。
    • XUL插件也可以正常工作(只要我不进行任何gstreamer调用)。
    • 在XUL插件中,我可以调用一个简单的glib函数,比如g_Strndup,没有任何问题。
    • 从插件中调用gstreamer函数会使应用程序崩溃。

    此代码可以重现问题。(但我不确定这是否有帮助…)

    plugin.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;
    }
    

    编辑
    问题已解决。看看我自己对这篇文章的回答。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Ana Betts    15 年前

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

        2
  •  0
  •   StackedCrooked    15 年前

    好吧,我被困了…我忘记执行gstreamer初始化函数:

    gst_init(NULL, NULL);
    

    现在问题已解决。