Skip to content
Dongseong Hwang edited this page Jun 8, 2016 · 8 revisions

command line

  • WebRTC
> chrome --enable-usermedia-screen-capturing --ignore-gpu-blacklist --enable-experimental-web-platform-features --enable-vaapi-accelerated-video-encode 

creation

Create VideoCaptureImpl
#1 0x7fe6ff18f4a2 content::VideoCaptureImpl::VideoCaptureImpl()
#2 0x7fe6ff192df3 content::VideoCaptureImplManager::CreateVideoCaptureImpl()
#3 0x7fe6ff1939d6 content::VideoCaptureImplManager::UseDevice()
#4 0x7fe6ff2abbcc content::VideoCapturerDelegate::VideoCapturerDelegate()
#5 0x7fe6ff2a5d3d content::MediaStreamImpl::CreateVideoSource()
#6 0x7fe6ff2a9ec7 content::MediaStreamImpl::InitializeSourceObject()
#7 0x7fe6ff2aa447 content::MediaStreamImpl::CreateVideoTracks()
#8 0x7fe6ff2aa63c content::MediaStreamImpl::OnStreamGenerated()
#9 0x7fe6ff2a53c5 content::MediaStreamDispatcher::OnStreamGenerated()
#10 0x7fe6ff2a3c4e content::MediaStreamDispatcher::OnMessageReceived()
#11 0x7fe6ff23a412 content::RenderViewImpl::OnMessageReceived()
#12 0x7fe6ff104082 content::MessageRouter::RouteMessage()
#13 0x7fe6fef9ca0a content::ChildThread::OnMessageReceived()
...
#27 0x7fe704c40c08 ChromeMain

Create MediaStreamVideoCapturerSource
#1 0x7fe6ff2abd78 content::MediaStreamVideoCapturerSource::MediaStreamVideoCapturerSource()
#2 0x7fe6ff2a5d71 content::MediaStreamImpl::CreateVideoSource()
#3 0x7fe6ff2a9ec7 content::MediaStreamImpl::InitializeSourceObject()
#4 0x7fe6ff2aa447 content::MediaStreamImpl::CreateVideoTracks()
#5 0x7fe6ff2aa63c content::MediaStreamImpl::OnStreamGenerated()
...

Start Deliver
#1 0x7fe6ff2aba62 content::VideoCapturerDelegate::StartDeliver()
#2 0x7fe6ff2ab205 content::MediaStreamVideoCapturerSource::StartSourceImpl()
#3 0x7fe6ff2ae75c content::MediaStreamVideoSource::OnSupportedFormats()
#4 0x7fe6ff2abf97 content::VideoCapturerDelegate::GetCurrentSupportedFormats()
#5 0x7fe6ff2ab0f3 content::MediaStreamVideoCapturerSource::GetCurrentSupportedFormats()
#6 0x7fe6ff2ae22a content::MediaStreamVideoSource::AddTrack()
#7 0x7fe6ff2aeb80 content::MediaStreamVideoTrack::CreateVideoTrack()
#8 0x7fe6ff2a9101 content::MediaStreamImpl::UserMediaRequestInfo::CreateAndStartVideoTrack()
#9 0x7fe6ff2aa462 content::MediaStreamImpl::CreateVideoTracks()
#10 0x7fe6ff2aa63c content::MediaStreamImpl::OnStreamGenerated()
...

Create WebMediaPlayerMS
#1 0x7fe6ff1a5b17 content::WebMediaPlayerMS::WebMediaPlayerMS()
#2 0x7fe6ff22a450 content::RenderViewImpl::CreateWebMediaPlayerForMediaStream()
#3 0x7fe6ff233fd8 content::RenderViewImpl::CreateMediaPlayer()
#4 0x7fe6ff20601d content::RenderFrameImpl::createMediaPlayer()
#5 0x7fe70024e4b8 blink::WebMediaPlayerClientImpl::load()
#6 0x7fe700d686fc WebCore::HTMLMediaElement::loadResource()
#7 0x7fe700d68bba WebCore::HTMLMediaElement::selectMediaResource()
#8 0x7fe700d68d7a WebCore::HTMLMediaElement::loadInternal()
#9 0x7fe700d68e6b WebCore::HTMLMediaElement::loadTimerFired()
#10 0x7fe703d7c6d9 WebCore::ThreadTimers::sharedTimerFiredInternal()
#11 0x7fe703d7c882 WebCore::ThreadTimers::sharedTimerFired()
...
#25 0x7fe704c40c08 ChromeMain

frame delivery

on capture thread in browser process
#1 0x7fe9ac3c3203 content::VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedData()
#2 0x7fe9ad23f70c media::VideoCaptureDeviceLinux::OnCaptureTask()
#3 0x7fe9b09e272f base::MessageLoop::RunTask()
...
#13 0x7fe9a859b9cd clone

on io thread in browser process
#1 0x7f34e1abfd4d content::VideoCaptureHost::OnBufferReady()
#2 0x7f34e1abd5cf content::VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread()
#3 0x7f34e1abc1b4 base::internal::Invoker<>::Run()
...
#16 0x7f34ddc969cd clone

on io message thread in render process
#1 0x7feeb58f3873 content::VideoCapturerDelegate::OnFrameReady()
#2 0x7feeb57d9820 content::VideoCaptureImpl::OnBufferReceived()
#3 0x7feeb57dc5e7 content::VideoCaptureMessageFilter::OnBufferReceived()
#4 0x7feeb57dcaef content::VideoCaptureMessageFilter::OnMessageReceived()
#5 0x7feeb8e62ac5 IPC::ChannelProxy::Context::TryFilters()
...
#20 0x7feeb16a29cd clone

on capture(main) thread in render process
#1 0x7f405b428cdd content::WebMediaPlayerMS::OnFrameAvailable()
#2 0x7f405b54a666 content::RTCVideoRenderer::OnVideoFrame()
#3 0x7f405b532c98 content::MediaStreamVideoTrack::OnVideoFrame()
#4 0x7f405b53048f content::MediaStreamVideoSource::DeliverVideoFrame()
#5 0x7f405b52f309 content::VideoCapturerDelegate::OnFrameReadyOnCaptureThread()
#6 0x7f405b52f3b7 base::internal::Invoker<>::Run()
...
#19 0x7f4060ec4c08 ChromeMain

RTCVideoDecoder

Create RTCVideoDecoder
#1 0x7fe6ff2bda81 content::RTCVideoDecoder::Create()
#2 0x7fe6ff2c2440 content::RTCVideoDecoderFactory::CreateVideoDecoder()
#3 0x7fe6ff4242a3 cricket::WebRtcVideoMediaChannel::SetReceiveCodecs()
#4 0x7fe6ff42470c cricket::WebRtcVideoMediaChannel::SetRecvCodecs()
#5 0x7fe6ff50e355 cricket::VideoChannel::SetLocalContent_w()
#6 0x7fe6ff5031f9 talk_base::FunctorMessageHandler<>::OnMessage()
#7 0x7fe6ff3aa4b8 jingle_glue::JingleThreadWrapper::ProcessPendingSends()
#8 0x7fe7034a172f base::MessageLoop::RunTask()
...
#18 0x7fe6fb05a9cd clone

Create WebMediaPlayerMS
#1 0x7fe6ff1a5b17 content::WebMediaPlayerMS::WebMediaPlayerMS()
...

DesktopCapture

creation

// main thread in render process
#1 0x7f95fb0052fa content::VideoCaptureImplManager::StartCapture()
#2 0x7f95fb112c60 content::VideoCapturerDelegate::StartCapture()
#3 0x7f95fb1121a8 content::MediaStreamVideoCapturerSource::StartSourceImpl()
#4 0x7f95fb1165cd content::MediaStreamVideoSource::OnSupportedFormats()
#5 0x7f95fb1132a5 content::VideoCapturerDelegate::GetCurrentSupportedFormats()
#6 0x7f95fb115f2d content::MediaStreamVideoSource::AddTrack()
#7 0x7f95fb1176a8 content::MediaStreamVideoTrack::MediaStreamVideoTrack()
#8 0x7f95fb117771 content::MediaStreamVideoTrack::CreateVideoTrack()
#9 0x7f95fb10fa88 content::MediaStreamImpl::UserMediaRequestInfo::CreateAndStartVideoTrack()
#10 0x7f95fb110378 content::MediaStreamImpl::CreateVideoTracks()
#11 0x7f95fb110582 content::MediaStreamImpl::OnStreamGenerated()
#12 0x7f95fb10be0f content::MediaStreamDispatcher::OnStreamGenerated()
#13 0x7f95fb10ab8e content::MediaStreamDispatcher::OnMessageReceived()
#14 0x7f95fb0582e2 content::RenderViewImpl::OnMessageReceived()
...
#30 0x7f95fcd4d2f8 ChromeMain

// capture thread
#1 0x7f4d7530c9a6 content::VideoCaptureImpl::StartCaptureInternal()
#2 0x7f4d7530e7bd content::VideoCaptureImpl::StartCapture()
...
#13 0x7f4d6d47230d clone

// io thread in browser process
#1 0x7f6ba5b37d85 content::VideoCaptureManager::StartCaptureForClient()
#2 0x7f6ba5b3260c content::VideoCaptureHost::OnStartCapture()
#3 0x7f6ba5b31d63 content::VideoCaptureHost::OnMessageReceived()
...
#18 0x7f6ba5939ca5 content::BrowserThreadImpl::IOThreadRun()
...
#23 0x7f6b9dfa730d clone

// capture thread
#1 0x7f0f4a7296e3 content::ThreadSafeCaptureOracle::ThreadSafeCaptureOracle()
#2 0x7f0f4a72a55c content::ContentVideoCaptureDeviceCore::AllocateAndStart()
#3 0x7f0f4ab4ad9e content::DesktopCaptureDeviceAura::AllocateAndStart()
#4 0x7f0f4a7a4a0c content::VideoCaptureManager::DoStartDeviceOnDeviceThread()
...
#16 0x7f0f42c1530d clone

// main thread
#1 content::DesktopVideoCaptureMachine::Start() from AllocateAndStart()
...

delivery mailbox

// cc thread in browser process
#1 0x7f49fe810f75 cc::PostCopyCallbackToMainThread() -> call SendResult in main thread. see CreateRelayRequest in Layer::PushPropertiesTo()
#2 0x7f49fe8112a3 base::internal::Invoker<>::Run()
#3 0x7f49fe838611 cc::CopyOutputRequest::SendResult() -> frame for cppy
#4 0x7f49fe838914 cc::CopyOutputRequest::SendTextureResult()
#5 0x7f49fe848ef5 cc::GLRenderer::GetFramebufferPixelsAsync()
#6 0x7f49fe84957e cc::GLRenderer::CopyCurrentRenderPassToBitmap()
#7 0x7f49fe83af6d cc::DirectRenderer::DrawFrame()
#8 0x7f49fe8eaf30 cc::LayerTreeHostImpl::DrawLayers()
#9 0x7f49fe90ae3e cc::ThreadProxy::DrawSwapInternal()
#10 0x7f49fe90b277 cc::ThreadProxy::ScheduledActionDrawAndSwapIfPossible()
#11 0x7f49fe8c004e cc::Scheduler::DrawAndSwapIfPossible()
#12 0x7f49fe8c2748 cc::Scheduler::ProcessScheduledActions()
#13 0x7f49fe8c3010 cc::Scheduler::OnBeginImplFrameDeadline()
...
#23 0x7f49f868e182 start_thread

// main thread
#1 0x7f8da16fde91 content::(anonymous namespace)::DesktopVideoCaptureMachine::ProcessCopyOutputResponse()
#2 0x7f8da16fe9ee content::(anonymous namespace)::DesktopVideoCaptureMachine::DidCopyOutput()
#3 0x7f8da16fd78d base::internal::Invoker<>::Run()
#4 0x7f8d9fc443f1 cc::CopyOutputRequest::SendResult()
#5 0x7f8d9fc1cb1e cc::RunCopyCallbackOnMainThread()
...
#9 0x7fd8dae98b29 base::MessagePumpGlib::HandleDispatch()
#10 0x7fd8dae98b6d base::(anonymous namespace)::WorkSourceDispatch()
#11 0x7fd8d6378e04 g_main_context_dispatch
...
#25 0x7f8da33ad2f8 ChromeMain

WebCam

Creation

  • GetDeviceNames: in media thread in broswer process
#1 0x7f1e68a02d18 media::VideoCaptureDeviceFactoryLinux::GetDeviceNames()
#2 0x7f1e68a04ee0 media::VideoCaptureDeviceFactory::EnumerateDeviceNames()
#3 0x7f1e6a9494b3 base::debug::TaskAnnotator::RunTask()
  • GetDeviceSupportedFormats
#1 0x7f79558c6347 media::VideoCaptureDeviceFactoryLinux::GetDeviceSupportedFormats()
#2 0x7f79553dd721 content::VideoCaptureManager::ConsolidateDevicesInfoOnDeviceThread()
#3 0x7f79553e4530 RunnableAdapter<void (content::VideoCaptureManager::*)(ARG..)>::Run<..>(..)
#4 0x7f79558c7fa1 media::VideoCaptureDeviceFactory::EnumerateDeviceNames()
#5 0x7f1e6a9494b3 base::debug::TaskAnnotator::RunTask()
  • Create VideoCaptureDevice
#1 0x7f79558c5958 media::VideoCaptureDeviceFactoryLinux::Create()
#2 0x7f79553dfe1a content::VideoCaptureManager::DoStartDeviceCaptureOnDeviceThread()
#3 0x7f79553e4860 RunnableAdapter<void (content::VideoCaptureManager::*)(ARG..)>::Run<..>(..)
#4 0x7f7955161ac6 base::internal::ReturnAsParamAdapter<>()
#5 0x7f795788ee43 base::(anonymous namespace)::PostTaskAndReplyRelay::Run()
#6 0x7f795780c4b3 base::debug::TaskAnnotator::RunTask()

gpu accl point

Clone this wiki locally