Skip to content

Commit 3153264

Browse files
Add video playback support for Android and iOS. Update VideoComponent API to support building custom UIs.
1 parent dc7217f commit 3153264

File tree

45 files changed

+4296
-311
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+4296
-311
lines changed

examples/DemoRunner/Builds/Android/app/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,6 +1467,7 @@ add_library( ${BINARY_NAME}
14671467
"../../../../../modules/juce_video/capture/juce_CameraDevice.cpp"
14681468
"../../../../../modules/juce_video/capture/juce_CameraDevice.h"
14691469
"../../../../../modules/juce_video/native/juce_android_CameraDevice.h"
1470+
"../../../../../modules/juce_video/native/juce_android_Video.h"
14701471
"../../../../../modules/juce_video/native/juce_ios_CameraDevice.h"
14711472
"../../../../../modules/juce_video/native/juce_mac_CameraDevice.h"
14721473
"../../../../../modules/juce_video/native/juce_mac_Video.h"
@@ -2932,6 +2933,7 @@ set_source_files_properties("../../../../../modules/juce_product_unlocking/juce_
29322933
set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.cpp" PROPERTIES HEADER_FILE_ONLY TRUE)
29332934
set_source_files_properties("../../../../../modules/juce_video/capture/juce_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
29342935
set_source_files_properties("../../../../../modules/juce_video/native/juce_android_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
2936+
set_source_files_properties("../../../../../modules/juce_video/native/juce_android_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)
29352937
set_source_files_properties("../../../../../modules/juce_video/native/juce_ios_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
29362938
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_CameraDevice.h" PROPERTIES HEADER_FILE_ONLY TRUE)
29372939
set_source_files_properties("../../../../../modules/juce_video/native/juce_mac_Video.h" PROPERTIES HEADER_FILE_ONLY TRUE)

examples/DemoRunner/Builds/Android/app/src/main/java/com/juce/demorunner/DemoRunner.java

Lines changed: 182 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
import android.content.pm.PackageInfo;
3232
import android.content.pm.PackageManager;
3333
import android.hardware.camera2.*;
34+
import android.database.ContentObserver;
35+
import android.media.session.*;
36+
import android.media.MediaMetadata;
3437
import android.net.http.SslError;
3538
import android.net.Uri;
3639
import android.os.Bundle;
@@ -94,8 +97,11 @@ public class DemoRunner extends Activity
9497
//==============================================================================
9598
public boolean isPermissionDeclaredInManifest (int permissionID)
9699
{
97-
String permissionToCheck = getAndroidPermissionName(permissionID);
100+
return isPermissionDeclaredInManifest (getAndroidPermissionName (permissionID));
101+
}
98102

103+
public boolean isPermissionDeclaredInManifest (String permissionToCheck)
104+
{
99105
try
100106
{
101107
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_PERMISSIONS);
@@ -1997,11 +2003,13 @@ public static class NativeSurfaceView extends SurfaceView
19972003
implements SurfaceHolder.Callback
19982004
{
19992005
private long nativeContext = 0;
2006+
private boolean forVideo;
20002007

2001-
NativeSurfaceView (Context context, long nativeContextPtr)
2008+
NativeSurfaceView (Context context, long nativeContextPtr, boolean createdForVideo)
20022009
{
20032010
super (context);
20042011
nativeContext = nativeContextPtr;
2012+
forVideo = createdForVideo;
20052013
}
20062014

20072015
public Surface getNativeSurface()
@@ -2019,38 +2027,51 @@ public Surface getNativeSurface()
20192027
@Override
20202028
public void surfaceChanged (SurfaceHolder holder, int format, int width, int height)
20212029
{
2022-
surfaceChangedNative (nativeContext, holder, format, width, height);
2030+
if (forVideo)
2031+
surfaceChangedNativeVideo (nativeContext, holder, format, width, height);
2032+
else
2033+
surfaceChangedNative (nativeContext, holder, format, width, height);
20232034
}
20242035

20252036
@Override
20262037
public void surfaceCreated (SurfaceHolder holder)
20272038
{
2028-
surfaceCreatedNative (nativeContext, holder);
2039+
if (forVideo)
2040+
surfaceCreatedNativeVideo (nativeContext, holder);
2041+
else
2042+
surfaceCreatedNative (nativeContext, holder);
20292043
}
20302044

20312045
@Override
20322046
public void surfaceDestroyed (SurfaceHolder holder)
20332047
{
2034-
surfaceDestroyedNative (nativeContext, holder);
2048+
if (forVideo)
2049+
surfaceDestroyedNativeVideo (nativeContext, holder);
2050+
else
2051+
surfaceDestroyedNative (nativeContext, holder);
20352052
}
20362053

20372054
@Override
20382055
protected void dispatchDraw (Canvas canvas)
20392056
{
20402057
super.dispatchDraw (canvas);
2041-
dispatchDrawNative (nativeContext, canvas);
2058+
2059+
if (forVideo)
2060+
dispatchDrawNativeVideo (nativeContext, canvas);
2061+
else
2062+
dispatchDrawNative (nativeContext, canvas);
20422063
}
20432064

20442065
//==============================================================================
20452066
@Override
2046-
protected void onAttachedToWindow ()
2067+
protected void onAttachedToWindow()
20472068
{
20482069
super.onAttachedToWindow();
20492070
getHolder().addCallback (this);
20502071
}
20512072

20522073
@Override
2053-
protected void onDetachedFromWindow ()
2074+
protected void onDetachedFromWindow()
20542075
{
20552076
super.onDetachedFromWindow();
20562077
getHolder().removeCallback (this);
@@ -2062,11 +2083,17 @@ protected void onDetachedFromWindow ()
20622083
private native void surfaceDestroyedNative (long nativeContextptr, SurfaceHolder holder);
20632084
private native void surfaceChangedNative (long nativeContextptr, SurfaceHolder holder,
20642085
int format, int width, int height);
2086+
2087+
private native void dispatchDrawNativeVideo (long nativeContextPtr, Canvas canvas);
2088+
private native void surfaceCreatedNativeVideo (long nativeContextptr, SurfaceHolder holder);
2089+
private native void surfaceDestroyedNativeVideo (long nativeContextptr, SurfaceHolder holder);
2090+
private native void surfaceChangedNativeVideo (long nativeContextptr, SurfaceHolder holder,
2091+
int format, int width, int height);
20652092
}
20662093

2067-
public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr)
2094+
public NativeSurfaceView createNativeSurfaceView (long nativeSurfacePtr, boolean forVideo)
20682095
{
2069-
return new NativeSurfaceView (this, nativeSurfacePtr);
2096+
return new NativeSurfaceView (this, nativeSurfacePtr, forVideo);
20702097
}
20712098

20722099
//==============================================================================
@@ -2826,6 +2853,151 @@ public void onOrientationChanged (int orientation)
28262853
}
28272854

28282855

2856+
//==============================================================================
2857+
public class MediaControllerCallback extends MediaController.Callback
2858+
{
2859+
private native void mediaControllerAudioInfoChanged (long host, MediaController.PlaybackInfo info);
2860+
private native void mediaControllerMetadataChanged (long host, MediaMetadata metadata);
2861+
private native void mediaControllerPlaybackStateChanged (long host, PlaybackState state);
2862+
private native void mediaControllerSessionDestroyed (long host);
2863+
2864+
MediaControllerCallback (long hostToUse)
2865+
{
2866+
host = hostToUse;
2867+
}
2868+
2869+
@Override
2870+
public void onAudioInfoChanged (MediaController.PlaybackInfo info)
2871+
{
2872+
mediaControllerAudioInfoChanged (host, info);
2873+
}
2874+
2875+
@Override
2876+
public void onMetadataChanged (MediaMetadata metadata)
2877+
{
2878+
mediaControllerMetadataChanged (host, metadata);
2879+
}
2880+
2881+
@Override
2882+
public void onPlaybackStateChanged (PlaybackState state)
2883+
{
2884+
mediaControllerPlaybackStateChanged (host, state);
2885+
}
2886+
2887+
@Override
2888+
public void onQueueChanged (List<MediaSession.QueueItem> queue) {}
2889+
2890+
@Override
2891+
public void onSessionDestroyed()
2892+
{
2893+
mediaControllerSessionDestroyed (host);
2894+
}
2895+
2896+
private long host;
2897+
}
2898+
2899+
//==============================================================================
2900+
public class MediaSessionCallback extends MediaSession.Callback
2901+
{
2902+
private native void mediaSessionPause (long host);
2903+
private native void mediaSessionPlay (long host);
2904+
private native void mediaSessionPlayFromMediaId (long host, String mediaId, Bundle extras);
2905+
private native void mediaSessionSeekTo (long host, long pos);
2906+
private native void mediaSessionStop (long host);
2907+
2908+
2909+
MediaSessionCallback (long hostToUse)
2910+
{
2911+
host = hostToUse;
2912+
}
2913+
2914+
@Override
2915+
public void onPause()
2916+
{
2917+
mediaSessionPause (host);
2918+
}
2919+
2920+
@Override
2921+
public void onPlay()
2922+
{
2923+
mediaSessionPlay (host);
2924+
}
2925+
2926+
@Override
2927+
public void onPlayFromMediaId (String mediaId, Bundle extras)
2928+
{
2929+
mediaSessionPlayFromMediaId (host, mediaId, extras);
2930+
}
2931+
2932+
@Override
2933+
public void onSeekTo (long pos)
2934+
{
2935+
mediaSessionSeekTo (host, pos);
2936+
}
2937+
2938+
@Override
2939+
public void onStop()
2940+
{
2941+
mediaSessionStop (host);
2942+
}
2943+
2944+
@Override
2945+
public void onFastForward() {}
2946+
2947+
@Override
2948+
public boolean onMediaButtonEvent (Intent mediaButtonIntent)
2949+
{
2950+
return true;
2951+
}
2952+
2953+
@Override
2954+
public void onRewind() {}
2955+
2956+
@Override
2957+
public void onSkipToNext() {}
2958+
2959+
@Override
2960+
public void onSkipToPrevious() {}
2961+
2962+
@Override
2963+
public void onSkipToQueueItem (long id) {}
2964+
2965+
private long host;
2966+
}
2967+
2968+
//==============================================================================
2969+
public class SystemVolumeObserver extends ContentObserver
2970+
{
2971+
private native void mediaSessionSystemVolumeChanged (long host);
2972+
2973+
SystemVolumeObserver (Activity activityToUse, long hostToUse)
2974+
{
2975+
super (null);
2976+
2977+
activity = activityToUse;
2978+
host = hostToUse;
2979+
}
2980+
2981+
void setEnabled (boolean shouldBeEnabled)
2982+
{
2983+
if (shouldBeEnabled)
2984+
activity.getApplicationContext().getContentResolver().registerContentObserver (android.provider.Settings.System.CONTENT_URI, true, this);
2985+
else
2986+
activity.getApplicationContext().getContentResolver().unregisterContentObserver (this);
2987+
}
2988+
2989+
@Override
2990+
public void onChange (boolean selfChange, Uri uri)
2991+
{
2992+
if (uri.toString().startsWith ("content://settings/system/volume_music"))
2993+
mediaSessionSystemVolumeChanged (host);
2994+
}
2995+
2996+
private Activity activity;
2997+
private long host;
2998+
}
2999+
3000+
28293001
//==============================================================================
28303002
public static final String getLocaleValue (boolean isRegion)
28313003
{

examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2840,6 +2840,7 @@
28402840
<ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>
28412841
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>
28422842
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>
2843+
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>
28432844
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>
28442845
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>
28452846
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>

examples/DemoRunner/Builds/VisualStudio2013/DemoRunner_App.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4827,6 +4827,9 @@
48274827
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">
48284828
<Filter>JUCE Modules\juce_video\native</Filter>
48294829
</ClInclude>
4830+
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">
4831+
<Filter>JUCE Modules\juce_video\native</Filter>
4832+
</ClInclude>
48304833
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">
48314834
<Filter>JUCE Modules\juce_video\native</Filter>
48324835
</ClInclude>

examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2840,6 +2840,7 @@
28402840
<ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>
28412841
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>
28422842
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>
2843+
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>
28432844
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>
28442845
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>
28452846
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>

examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4827,6 +4827,9 @@
48274827
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">
48284828
<Filter>JUCE Modules\juce_video\native</Filter>
48294829
</ClInclude>
4830+
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">
4831+
<Filter>JUCE Modules\juce_video\native</Filter>
4832+
</ClInclude>
48304833
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">
48314834
<Filter>JUCE Modules\juce_video\native</Filter>
48324835
</ClInclude>

examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2840,6 +2840,7 @@
28402840
<ClInclude Include="..\..\..\..\modules\juce_product_unlocking\juce_product_unlocking.h"/>
28412841
<ClInclude Include="..\..\..\..\modules\juce_video\capture\juce_CameraDevice.h"/>
28422842
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h"/>
2843+
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h"/>
28432844
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h"/>
28442845
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_CameraDevice.h"/>
28452846
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_mac_Video.h"/>

examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4827,6 +4827,9 @@
48274827
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_CameraDevice.h">
48284828
<Filter>JUCE Modules\juce_video\native</Filter>
48294829
</ClInclude>
4830+
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_android_Video.h">
4831+
<Filter>JUCE Modules\juce_video\native</Filter>
4832+
</ClInclude>
48304833
<ClInclude Include="..\..\..\..\modules\juce_video\native\juce_ios_CameraDevice.h">
48314834
<Filter>JUCE Modules\juce_video\native</Filter>
48324835
</ClInclude>

examples/DemoRunner/JuceLibraryCode/AppConfig.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,10 @@
291291
#ifndef JUCE_USE_CAMERA
292292
#define JUCE_USE_CAMERA 1
293293
#endif
294+
295+
#ifndef JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME
296+
//#define JUCE_SYNC_VIDEO_VOLUME_WITH_OS_MEDIA_VOLUME 1
297+
#endif
294298
//==============================================================================
295299
#ifndef JUCE_STANDALONE_APPLICATION
296300
#if defined(JucePlugin_Name) && defined(JucePlugin_Build_Standalone)

examples/DemoRunner/Source/Demos/DemoPIPs2.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
#include "../../../GUI/OpenGLDemo2D.h"
6262
#endif
6363
#include "../../../GUI/PropertiesDemo.h"
64-
#if JUCE_MAC || JUCE_WINDOWS
64+
#if ! JUCE_LINUX
6565
#include "../../../GUI/VideoDemo.h"
6666
#endif
6767
#include "../../../GUI/WebBrowserDemo.h"
@@ -100,7 +100,7 @@ void registerDemos_Two() noexcept
100100
REGISTER_DEMO_WITH_FILENAME (OpenGLDemoClasses::OpenGLDemo, GUI, OpenGLDemo, true)
101101
#endif
102102
REGISTER_DEMO (PropertiesDemo, GUI, false)
103-
#if JUCE_MAC || JUCE_WINDOWS
103+
#if ! JUCE_LINUX
104104
REGISTER_DEMO (VideoDemo, GUI, true)
105105
#endif
106106
REGISTER_DEMO (WebBrowserDemo, GUI, true)

0 commit comments

Comments
 (0)