OLD | NEW |
---|---|
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "WebMediaPlayerClientImpl.h" | 6 #include "WebMediaPlayerClientImpl.h" |
7 | 7 |
8 #if ENABLE(VIDEO) | 8 #if ENABLE(VIDEO) |
9 | 9 |
10 #include "AudioBus.h" | 10 #include "AudioBus.h" |
11 #include "AudioSourceProvider.h" | 11 #include "AudioSourceProvider.h" |
12 #include "AudioSourceProviderClient.h" | 12 #include "AudioSourceProviderClient.h" |
13 #include "Frame.h" | 13 #include "Frame.h" |
14 #include "GraphicsContext.h" | 14 #include "GraphicsContext.h" |
15 #include "GraphicsContext3DPrivate.h" | 15 #include "GraphicsContext3DPrivate.h" |
16 #include "GraphicsLayerChromium.h" | 16 #include "GraphicsLayerChromium.h" |
17 #include "GrContext.h" | |
18 #include "GrTexture.h" | |
19 #include "GrTypes.h" | |
17 #include "HTMLMediaElement.h" | 20 #include "HTMLMediaElement.h" |
18 #include "IntSize.h" | 21 #include "IntSize.h" |
19 #include "KURL.h" | 22 #include "KURL.h" |
20 #include "MediaPlayer.h" | 23 #include "MediaPlayer.h" |
21 #include "NotImplemented.h" | 24 #include "NotImplemented.h" |
22 #include "PlatformContextSkia.h" | 25 #include "PlatformContextSkia.h" |
23 #include "RenderView.h" | 26 #include "RenderView.h" |
27 #include "SkRefCnt.h" | |
28 #include "SkBitmap.h" | |
29 #include "SkCanvas.h" | |
30 #include "SkGrPixelRef.h" | |
24 #include "TimeRanges.h" | 31 #include "TimeRanges.h" |
25 #include "WebAudioSourceProvider.h" | 32 #include "WebAudioSourceProvider.h" |
26 #include "WebDocument.h" | 33 #include "WebDocument.h" |
27 #include "WebFrameClient.h" | 34 #include "WebFrameClient.h" |
28 #include "WebFrameImpl.h" | 35 #include "WebFrameImpl.h" |
29 #include "WebHelperPluginImpl.h" | 36 #include "WebHelperPluginImpl.h" |
30 #include "WebMediaPlayer.h" | 37 #include "WebMediaPlayer.h" |
31 #include "WebMediaSourceImpl.h" | 38 #include "WebMediaSourceImpl.h" |
32 #include "WebViewImpl.h" | 39 #include "WebViewImpl.h" |
33 #include <public/Platform.h> | 40 #include <public/Platform.h> |
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
613 } | 620 } |
614 | 621 |
615 void WebMediaPlayerClientImpl::paintCurrentFrameInContext(GraphicsContext* conte xt, const IntRect& rect) | 622 void WebMediaPlayerClientImpl::paintCurrentFrameInContext(GraphicsContext* conte xt, const IntRect& rect) |
616 { | 623 { |
617 // Normally GraphicsContext operations do nothing when painting is disabled. | 624 // Normally GraphicsContext operations do nothing when painting is disabled. |
618 // Since we're accessing platformContext() directly we have to manually | 625 // Since we're accessing platformContext() directly we have to manually |
619 // check. | 626 // check. |
620 if (m_webMediaPlayer && !context->paintingDisabled()) { | 627 if (m_webMediaPlayer && !context->paintingDisabled()) { |
621 PlatformGraphicsContext* platformContext = context->platformContext(); | 628 PlatformGraphicsContext* platformContext = context->platformContext(); |
622 WebCanvas* canvas = platformContext->canvas(); | 629 WebCanvas* canvas = platformContext->canvas(); |
630 | |
631 // Go through the fast path trying to do a GPU-GPU texture copy without readback to system memory if possible. | |
632 // Otherwise, it will fallback to the normal SW path. | |
633 RefPtr<GraphicsContext3D> context3D = SharedGraphicsContext3D::get(); | |
634 if (context3D && paintVideoTextureInContext(context, context3D.get())) | |
Ken Russell (switch to Gerrit)
2013/04/05 22:43:38
This is still wrong as it's discarding the incomin
| |
635 return; | |
636 | |
637 // Normal pure SW path | |
623 m_webMediaPlayer->paint(canvas, rect, platformContext->getNormalizedAlph a()); | 638 m_webMediaPlayer->paint(canvas, rect, platformContext->getNormalizedAlph a()); |
624 } | 639 } |
625 } | 640 } |
626 | 641 |
627 bool WebMediaPlayerClientImpl::copyVideoTextureToPlatformTexture(WebCore::Graphi csContext3D* context, Platform3DObject texture, GC3Dint level, GC3Denum type, GC 3Denum internalFormat, bool premultiplyAlpha, bool flipY) | 642 bool WebMediaPlayerClientImpl::copyVideoTextureToPlatformTexture(WebCore::Graphi csContext3D* context, Platform3DObject texture, GC3Dint level, GC3Denum type, GC 3Denum internalFormat, bool premultiplyAlpha, bool flipY) |
628 { | 643 { |
629 if (!context || !m_webMediaPlayer) | 644 if (!context || !m_webMediaPlayer) |
630 return false; | 645 return false; |
631 Extensions3D* extensions = context->getExtensions(); | 646 Extensions3D* extensions = context->getExtensions(); |
632 if (!extensions || !extensions->supports("GL_CHROMIUM_copy_texture") || !ext ensions->supports("GL_CHROMIUM_flipy") || !context->makeContextCurrent()) | 647 if (!extensions || !extensions->supports("GL_CHROMIUM_copy_texture") || !ext ensions->supports("GL_CHROMIUM_flipy") || !context->makeContextCurrent()) |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
759 case WebMimeRegistry::IsNotSupported: | 774 case WebMimeRegistry::IsNotSupported: |
760 return MediaPlayer::IsNotSupported; | 775 return MediaPlayer::IsNotSupported; |
761 case WebMimeRegistry::IsSupported: | 776 case WebMimeRegistry::IsSupported: |
762 return MediaPlayer::IsSupported; | 777 return MediaPlayer::IsSupported; |
763 case WebMimeRegistry::MayBeSupported: | 778 case WebMimeRegistry::MayBeSupported: |
764 return MediaPlayer::MayBeSupported; | 779 return MediaPlayer::MayBeSupported; |
765 } | 780 } |
766 return MediaPlayer::IsNotSupported; | 781 return MediaPlayer::IsNotSupported; |
767 } | 782 } |
768 | 783 |
784 bool WebMediaPlayerClientImpl::paintVideoTextureInContext(WebCore::GraphicsConte xt* context, WebCore::GraphicsContext3D* context3D) | |
Ken Russell (switch to Gerrit)
2013/04/05 22:43:38
Either this needs to be made to work correctly on
| |
785 { | |
786 if (!context || !m_webMediaPlayer || context->paintingDisabled()) | |
787 return false; | |
788 | |
789 Extensions3D* extensions = context3D->getExtensions(); | |
790 if (!extensions || !extensions->supports("GL_CHROMIUM_copy_texture") || !ext ensions->supports("GL_CHROMIUM_flipy") | |
791 || !context3D->makeContextCurrent()) | |
792 return false; | |
793 | |
794 WebGraphicsContext3D* webGraphicsContext3D = GraphicsContext3DPrivate::extra ctWebGraphicsContext3D(context3D); | |
795 PlatformGraphicsContext* platformContext = context->platformContext(); | |
796 WebCanvas* canvas = platformContext->canvas(); | |
797 | |
798 // Create a temporary RGBA texture based SkBitmap where the video will be co pied into. | |
799 // The bitmap's size is the same as the video. | |
800 unsigned int videoWidth = naturalSize().width(); | |
801 unsigned int videoHeight = naturalSize().height(); | |
802 GrTextureDesc desc; | |
803 desc.fConfig = kSkia8888_GrPixelConfig; | |
804 desc.fWidth = videoWidth; | |
805 desc.fHeight = videoHeight; | |
806 desc.fOrigin = kTopLeft_GrSurfaceOrigin; | |
807 desc.fFlags = (kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit) ; | |
808 GrContext* ct = context3D->grContext(); | |
809 if (!ct) | |
810 return false; | |
811 SkAutoTUnref<GrTexture> texture(ct->createUncachedTexture(desc, NULL, 0)); | |
812 if (!texture.get()) | |
813 return false; | |
814 unsigned int textureId = static_cast<unsigned int>(texture->getTextureHandle ()); | |
815 | |
816 // Copy video texture to bitmap texture. | |
817 if (!m_webMediaPlayer->copyVideoTextureToPlatformTexture(webGraphicsContext3 D, textureId, 0, GraphicsContext3D::RGBA, true, false)) { return false; } | |
818 | |
819 SkBitmap bitmap; | |
820 bitmap.setConfig(SkBitmap::kARGB_8888_Config, videoWidth, videoHeight); | |
821 bitmap.setPixelRef(new SkGrPixelRef(texture))->unref(); | |
822 | |
823 // Draw the texture based bitmap onto the Canvas. If the canvas is hardware based, this will do a GPU-GPU texture copy. If the canvas is software based, | |
824 // the texture based bitmap will be readbacked to system memory then draw on to the canvas. | |
825 canvas->drawBitmap(bitmap, 0, 0); | |
826 return true; | |
827 } | |
828 | |
769 void WebMediaPlayerClientImpl::startDelayedLoad() | 829 void WebMediaPlayerClientImpl::startDelayedLoad() |
770 { | 830 { |
771 ASSERT(m_delayingLoad); | 831 ASSERT(m_delayingLoad); |
772 ASSERT(!m_webMediaPlayer); | 832 ASSERT(!m_webMediaPlayer); |
773 | 833 |
774 m_delayingLoad = false; | 834 m_delayingLoad = false; |
775 | 835 |
776 loadInternal(); | 836 loadInternal(); |
777 } | 837 } |
778 | 838 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
829 { | 889 { |
830 if (m_client) | 890 if (m_client) |
831 m_client->setFormat(numberOfChannels, sampleRate); | 891 m_client->setFormat(numberOfChannels, sampleRate); |
832 } | 892 } |
833 | 893 |
834 #endif | 894 #endif |
835 | 895 |
836 } // namespace WebKit | 896 } // namespace WebKit |
837 | 897 |
838 #endif // ENABLE(VIDEO) | 898 #endif // ENABLE(VIDEO) |
OLD | NEW |