html5 video 的一些流程代码追踪

来源:互联网 发布:笔记本电脑选购 知乎 编辑:程序博客网 时间:2024/05/16 06:28
1. 对于html5 的video的支持control好像还不怎么支持的情况 所以可能click的支持还不是很稳定的,现在来看之所以controls不去使用就是因为要使用android自带的videoview的方式去播放。

1.controls
2.html5 tree buildings

以及video播放的流程的使用
现在在解析到src属性的时候就是要执行
void HTMLMediaElement::attributeChanged(Attribute* attr, bool preserveDecls)
{
    HTMLElement::attributeChanged(attr, preserveDecls);

    const QualifiedName& attrName = attr->name();
    if (attrName == srcAttr) {
        // don't have a src or any <source> children, trigger load
        if (inDocument() && m_loadState == WaitingForSource)
            scheduleLoad();
    }
#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO)
    else if (attrName == controlsAttr) {
        if (!isVideo() && attached() && (controls() != (renderer() != 0))) {
            detach();
            attach();
        }
        if (renderer())
            renderer()->updateFromElement();
    }
#endif
}
这个如果存在src或者source属性才能scheduleLoad
void HTMLMediaElement::scheduleLoad()
{
    if (m_loadTimer.isActive())
        return;
    prepareForLoad();
    m_loadTimer.startOneShot(0);
}
这个就可以启动load情况了
现在我就看这个逻辑是如何调用到MediaPlayer.cpp的load中
#0  WebCore::MediaPlayer::load (this=0xa66510, url=..., contentType=...) at ../../WebCore/platform/graphics/MediaPlayer.cpp:222
#1  0x00007ffff6590fc9 in WebCore::HTMLMediaElement::loadResource (this=0xaf2a00, initialURL=..., contentType=...) at ../../WebCore/html/HTMLMediaElement.cpp:593
#2  0x00007ffff6590d5a in WebCore::HTMLMediaElement::loadNextSourceChild (this=0xaf2a00) at ../../WebCore/html/HTMLMediaElement.cpp:556
#3  0x00007ffff6590c78 in WebCore::HTMLMediaElement::selectMediaResource (this=0xaf2a00) at ../../WebCore/html/HTMLMediaElement.cpp:543
#4  0x00007ffff65909b2 in WebCore::HTMLMediaElement::loadInternal (this=0xaf2a00) at ../../WebCore/html/HTMLMediaElement.cpp:490
#5  0x00007ffff6590309 in WebCore::HTMLMediaElement::loadTimerFired (this=0xaf2a00) at ../../WebCore/html/HTMLMediaElement.cpp:338
#6  0x00007ffff6595de0 in WebCore::Timer<WebCore::HTMLMediaElement>::fired (this=0xaf2a78) at ../../WebCore/platform/Timer.h:98
#7  0x00007ffff6357630 in WebCore::ThreadTimers::sharedTimerFiredInternal (this=0x727c80) at ../../WebCore/platform/ThreadTimers.cpp:112
#8  0x00007ffff6357563 in WebCore::ThreadTimers::sharedTimerFired () at ../../WebCore/platform/ThreadTimers.cpp:90
#9  0x00007ffff6727f62 in timeout_cb () at ../../WebCore/platform/gtk/SharedTimerGtk.cpp:48
#10 0x00007ffff2ef4522 in g_main_dispatch (context=0x640210) at ../../glib/gmain.c:2440
#11 g_main_context_dispatch (context=0x640210) at ../../glib/gmain.c:3013
#12 0x00007ffff2ef8bf8 in g_main_context_iterate (context=0x640210, block=<value optimized out>, dispatch=<value optimized out>, self=<value optimized out>)
    at ../../glib/gmain.c:3091
#13 0x00007ffff2ef9105 in g_main_loop_run (loop=0x6b75e0) at ../../glib/gmain.c:3299
#14 0x00007ffff55afbb7 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0
#15 0x00000000004025d5 in main (argc=2, argv=0x7fffffffe278) at ../../WebKitTools/GtkLauncher/main.c:209
现在基本的调用的逻辑就是:
HtmlMediaElement
MediaPlayer
MediaPlayerPrivate
MediaPlayerPrivateClient

这个
void HTMLMediaElement::loadResource(const KURL& initialURL, ContentType& contentType)
{
    ASSERT(isSafeToLoadURL(initialURL, Complain));

    Frame* frame = document()->frame();
    if (!frame)
        return;
    FrameLoader* loader = frame->loader();
    if (!loader)
        return;

    KURL url(initialURL);
    if (!loader->willLoadMediaElementURL(url))
        return;

    // The resource fetch algorithm
    m_networkState = NETWORK_LOADING;

    m_currentSrc = url;

    if (m_sendProgressEvents)
        startProgressEventTimer();

#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO)
    m_player = MediaPlayer::create(this);
#else
    if (!m_player)
        m_player = MediaPlayer::create(this);
#endif

    m_player->setAutobuffer(autobuffer());
    m_player->setPreservesPitch(m_webkitPreservesPitch);
    updateVolume();

    m_player->load(m_currentSrc, contentType);

    if (isVideo() && m_player->canLoadPoster()) {
        KURL posterUrl = static_cast<HTMLVideoElement*>(this)->poster();
        if (!posterUrl.isEmpty())
            m_player->setPoster(posterUrl);
    }

    if (renderer())
        renderer()->updateFromElement();
}
在这个load的函数内部完成了很多的工作包括:
m_player = MediaPlayer::create(this);


video play的调用流程
#0  WebCore::MediaPlayer::play (this=0xa74c40) at ../../WebCore/platform/graphics/MediaPlayer.cpp:289
#1  0x00007ffff65941d7 in WebCore::HTMLMediaElement::updatePlayState (this=0xa71600) at ../../WebCore/html/HTMLMediaElement.cpp:1668
#2  0x00007ffff659286e in WebCore::HTMLMediaElement::playInternal (this=0xa71600) at ../../WebCore/html/HTMLMediaElement.cpp:1155
#3  0x00007ffff6592721 in WebCore::HTMLMediaElement::play (this=0xa71600, isUserGesture=true) at ../../WebCore/html/HTMLMediaElement.cpp:1128
#4  0x00007ffff69f8893 in WebCore::jsHTMLMediaElementPrototypeFunctionPlay (exec=0x7fffe4e6f0a0, thisValue=..., args=...) at DerivedSources/JSHTMLMediaElement.cpp:572
#5  0x00007ffff7dfe1b4 in ?? ()
#6  0x00007fffe4e6f060 in ?? ()
#7  0x0000000000000000 in ?? ()


事件如何进行控制的那?
这个还是要知道的


controls的调用流程
#0  MediaControlElement (this=0xb4be90, document=0x89e620, pseudo=WebCore::MEDIA_CONTROLS_PANEL, mediaElement=0xaef200) at ../../WebCore/rendering/MediaControlElements.cpp:93
#1  0x00007ffff65a0b0e in WebCore::RenderMedia::createPanel (this=0xa57418) at ../../WebCore/rendering/RenderMedia.cpp:180
#2  0x00007ffff65a1d58 in WebCore::RenderMedia::updateControls (this=0xa57418) at ../../WebCore/rendering/RenderMedia.cpp:330
#3  0x00007ffff65a1aca in WebCore::RenderMedia::updateFromElement (this=0xa57418) at ../../WebCore/rendering/RenderMedia.cpp:295
#4  0x00007ffff65a5728 in WebCore::RenderVideo::updateFromElement (this=0xa57418) at ../../WebCore/rendering/RenderVideo.cpp:187
#5  0x00007ffff65900c9 in WebCore::HTMLMediaElement::attach (this=0xaef200) at ../../WebCore/html/HTMLMediaElement.cpp:290
#6  0x00007ffff6596831 in WebCore::HTMLVideoElement::attach (this=0xaef200) at ../../WebCore/html/HTMLVideoElement.cpp:70
#7  0x00007ffff61b7877 in WebCore::HTMLParser::insertNode (this=0x89bb40, n=0xaef200, flat=false) at ../../WebCore/html/HTMLParser.cpp:396
#8  0x00007ffff61bf6f6 in WebCore::HTMLParser::insertNodeAfterLimitBlockDepth (this=0x89bb40, n=0xaef200, flat=false) at ../../WebCore/html/HTMLParser.cpp:227
#9  0x00007ffff61b7079 in WebCore::HTMLParser::parseToken (this=0x89bb40, t=0x84b3e8) at ../../WebCore/html/HTMLParser.cpp:299
#10 0x00007ffff61dab2f in WebCore::HTMLTokenizer::processToken (this=0x84b3b0) at ../../WebCore/html/HTMLTokenizer.cpp:1949
#11 0x00007ffff61d8e08 in WebCore::HTMLTokenizer::parseTag (this=0x84b3b0, src=..., state=...) at ../../WebCore/html/HTMLTokenizer.cpp:1521
#12 0x00007ffff61d9d4b in WebCore::HTMLTokenizer::write (this=0x84b3b0, str=..., appendData=true) at ../../WebCore/html/HTMLTokenizer.cpp:1772
#13 0x00007ffff626847c in WebCore::FrameLoader::write (this=0x7bbc50, str=0x0, len=0, flush=true) at ../../WebCore/loader/FrameLoader.cpp:936
#14 0x00007ffff6268646 in WebCore::FrameLoader::endIfNotLoadingMainResource (this=0x7bbc50) at ../../WebCore/loader/FrameLoader.cpp:971
#15 0x00007ffff62685bf in WebCore::FrameLoader::end (this=0x7bbc50) at ../../WebCore/loader/FrameLoader.cpp:957
#16 0x00007ffff624fce5 in WebCore::DocumentLoader::finishedLoading (this=0x852690) at ../../WebCore/loader/DocumentLoader.cpp:268
#17 0x00007ffff6271393 in WebCore::FrameLoader::finishedLoading (this=0x7bbc50) at ../../WebCore/loader/FrameLoader.cpp:2753
#18 0x00007ffff6283b75 in WebCore::MainResourceLoader::didFinishLoading (this=0x68d000) at ../../WebCore/loader/MainResourceLoader.cpp:424
#19 0x00007ffff628fb2d in WebCore::ResourceLoader::didFinishLoading (this=0x68d000) at ../../WebCore/loader/ResourceLoader.cpp:403
#20 0x00007ffff6743cd3 in closeCallback (source=0x68ce40, res=0x859c00) at ../../WebCore/platform/network/soup/ResourceHandleSoup.cpp:714
#21 0x00007ffff4cd8910 in async_ready_close_callback_wrapper (source_object=0x68ce40, res=0x859c00, user_data=0x0) at ../../gio/ginputstream.c:484
#22 0x00007ffff4ce9508 in complete_in_idle_cb_for_thread (_data=<value optimized out>) at ../../gio/gsimpleasyncresult.c:812
#23 0x00007ffff2ef4522 in g_main_dispatch (context=0x640210) at ../../glib/gmain.c:2440
#24 g_main_context_dispatch (context=0x640210) at ../../glib/gmain.c:3013
#25 0x00007ffff2ef8bf8 in g_main_context_iterate (context=0x640210, block=<value optimized out>, dispatch=<value optimized out>, self=<value optimized out>)
    at ../../glib/gmain.c:3091
#26 0x00007ffff2ef9105 in g_main_loop_run (loop=0x6aff60) at ../../glib/gmain.c:3299
#27 0x00007ffff55afbb7 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0
#28 0x00000000004025d5 in main (argc=2, argv=0x7fffffffe278) at ../../WebKitTools/GtkLauncher/main.c:209

在renderMedia.cpp中有创建各种格式的控件样式。

随着版本的升高就是把需要代码完成的事情都放在css中去简化了代码,在新的版本中已经来使用
0 0
原创粉丝点击