Я работаю над плагином webkit-kernel-browser.Большинство плагинов подчиняются правилам NPAPI.После вызова функции NP_new браузер должен вызвать Npp_setwindows и т. Д. Но браузер Chrome этого не запускает.Это вызывает Np_destory, чтобы закончить экземпляр прямо.Поэтому я не могу получить xid браузера, чтобы установить на нем видеосинк.Как это можно решить?
И когда я использую браузер Firefox, я могу получить xid.К сожалению, когда я использую gst_x_overlay_set_xwindow_id для встраивания в браузер.Сбой браузера.Вот код для теста.
gst_init (NULL, NULL);
player->pipeline = gst_element_factory_make ("playbin2", "playstation");
LOGMSG("create playbin2");
player->audio_sink = gst_element_factory_make ("alsasink", "audio-sink");
if (NULL == player->audio_sink)
{
player->audio_sink = gst_element_factory_make ("autoaudiosink", "audio-sink");
g_warning ("Could not create a GST audio_sink. Audio unavailable.");
}
player->video_sink = gst_element_factory_make ("xvimagesink", "video-sink");
if (NULL == player->video_sink)
{
//pvrvideosink is used for some special solution ,but this case never used
player->video_sink = gst_element_factory_make ("pvrvideosink","video-sink");
g_warning ("Could not create a GST video_sink. Video unavailable.");
}
g_object_set (player->video_sink, "force-aspect-ratio", TRUE, NULL);
sprintf(buff," \n pipleline:%p\n video:%p\n audio:%p\n uri:%s\n xid:%d",
player->pipeline,player->video_sink,player->audio_sink,player->uri,player->xid);
LOGMSG(buff);enter code here
// log shows all the content is ok
g_object_set (player->pipeline, "video-sink", player->video_sink, NULL);
g_object_set (player->pipeline, "audio-sink", player->audio_sink, NULL);
g_object_set (player->pipeline, "uri",player->uri, NULL);
player->bus = gst_element_get_bus (GST_ELEMENT (player->pipeline));
gst_bus_add_watch(player->bus,(void *)process_events,player);
LOGMSG("start set winid");
/*
chrome can not get the browser xid ,so it display the image in fullscreen way with the player 's own window. The firefox can not display the image at all. It crashed here.
*/
if (player->xid != 0 )
{
gst_x_overlay_prepare_xwindow_id(GST_X_OVERLAY(GST_ELEMENT(player->video_sink)));
gst_x_overlay_set_xwindow_id(GST_X_OVERLAY(GST_ELEMENT(player->video_sink)),player->xid);
gboolean spt = gst_x_overlay_set_render_rectangle
(GST_X_OVERLAY(GST_ELEMENT(player->video_sink)),10,10,480,270);
if (!spt)
{
LOGMSG("not support the rectangle");
}
gst_x_overlay_expose(GST_X_OVERLAY(GST_ELEMENT(player->video_sink)));
}
LOGMSG("set xwinid finished");
gst_element_set_state(player->pipeline,GST_STATE_PLAYING);
loop = g_main_loop_new (NULL, FALSE);
LOGMSG("start player loop");
g_main_loop_run (loop);
Кто-нибудь может дать мне некоторую информацию об этом?
С наилучшими пожеланиями, лес