WebRTC
Dongseong Hwang edited this page Jun 8, 2016
·
8 revisions
- WebRTC
> chrome --enable-usermedia-screen-capturing --ignore-gpu-blacklist --enable-experimental-web-platform-features --enable-vaapi-accelerated-video-encode
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
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
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()
...
// 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()
...
// 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
- 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()
- need huge change of VideoCaptureDeviceLinux
- V4L2 support needed: http://elinux.org/images/4/4a/Video4Linux_Current_Status_and_Future_Work.pdf
- Allow easy transfer of buffers from one video device node to another, or to gpu textures or framebuffers) through the new dmabuf API (merged in 3.3). Each buffer will be represented by a file descriptor.
- android example https://community.freescale.com/thread/309817