Initial commit for release
This commit is contained in:
commit
efb8c4fd71
|
@ -0,0 +1,220 @@
|
||||||
|
# Created by https://www.gitignore.io/api/java,netbeans,node,intellij,eclipse,osx
|
||||||
|
|
||||||
|
### NetBeans ###
|
||||||
|
nbproject/
|
||||||
|
nbproject
|
||||||
|
nbproject/private/
|
||||||
|
./build/
|
||||||
|
nbbuild/
|
||||||
|
dist/
|
||||||
|
nbdist/
|
||||||
|
nbactions.xml
|
||||||
|
.nb-gradle/
|
||||||
|
|
||||||
|
|
||||||
|
### Node ###
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (http://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules
|
||||||
|
jspm_packages
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
|
||||||
|
### Intellij ###
|
||||||
|
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
||||||
|
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||||
|
.idea
|
||||||
|
*.iml
|
||||||
|
|
||||||
|
# User-specific stuff:
|
||||||
|
.idea/workspace.xml
|
||||||
|
.idea/tasks.xml
|
||||||
|
.idea/dictionaries
|
||||||
|
.idea/vcs.xml
|
||||||
|
.idea/jsLibraryMappings.xml
|
||||||
|
|
||||||
|
# Sensitive or high-churn files:
|
||||||
|
.idea/dataSources.ids
|
||||||
|
.idea/dataSources.xml
|
||||||
|
.idea/dataSources.local.xml
|
||||||
|
.idea/sqlDataSources.xml
|
||||||
|
.idea/dynamic.xml
|
||||||
|
.idea/uiDesigner.xml
|
||||||
|
|
||||||
|
# Gradle:
|
||||||
|
.idea/gradle.xml
|
||||||
|
.idea/libraries
|
||||||
|
|
||||||
|
# Mongo Explorer plugin:
|
||||||
|
.idea/mongoSettings.xml
|
||||||
|
|
||||||
|
## File-based project format:
|
||||||
|
*.iws
|
||||||
|
|
||||||
|
## Plugin-specific files:
|
||||||
|
|
||||||
|
# IntelliJ
|
||||||
|
/out/
|
||||||
|
|
||||||
|
# mpeltonen/sbt-idea plugin
|
||||||
|
.idea_modules/
|
||||||
|
|
||||||
|
# JIRA plugin
|
||||||
|
atlassian-ide-plugin.xml
|
||||||
|
|
||||||
|
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||||
|
com_crashlytics_export_strings.xml
|
||||||
|
crashlytics.properties
|
||||||
|
crashlytics-build.properties
|
||||||
|
fabric.properties
|
||||||
|
|
||||||
|
### Intellij Patch ###
|
||||||
|
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
|
||||||
|
|
||||||
|
# *.iml
|
||||||
|
# modules.xml
|
||||||
|
# .idea/misc.xml
|
||||||
|
# *.ipr
|
||||||
|
|
||||||
|
|
||||||
|
### Eclipse ###
|
||||||
|
|
||||||
|
.metadata
|
||||||
|
bin/
|
||||||
|
tmp/
|
||||||
|
*.tmp
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*~.nib
|
||||||
|
local.properties
|
||||||
|
.settings/
|
||||||
|
.loadpath
|
||||||
|
.recommenders
|
||||||
|
|
||||||
|
# Eclipse Core
|
||||||
|
.project
|
||||||
|
|
||||||
|
# External tool builders
|
||||||
|
.externalToolBuilders/
|
||||||
|
|
||||||
|
# Locally stored "Eclipse launch configurations"
|
||||||
|
*.launch
|
||||||
|
|
||||||
|
# PyDev specific (Python IDE for Eclipse)
|
||||||
|
*.pydevproject
|
||||||
|
|
||||||
|
# CDT-specific (C/C++ Development Tooling)
|
||||||
|
.cproject
|
||||||
|
|
||||||
|
# JDT-specific (Eclipse Java Development Tools)
|
||||||
|
.classpath
|
||||||
|
|
||||||
|
# Java annotation processor (APT)
|
||||||
|
.factorypath
|
||||||
|
|
||||||
|
# PDT-specific (PHP Development Tools)
|
||||||
|
.buildpath
|
||||||
|
|
||||||
|
# sbteclipse plugin
|
||||||
|
.target
|
||||||
|
|
||||||
|
# Tern plugin
|
||||||
|
.tern-project
|
||||||
|
|
||||||
|
# TeXlipse plugin
|
||||||
|
.texlipse
|
||||||
|
|
||||||
|
# STS (Spring Tool Suite)
|
||||||
|
.springBeans
|
||||||
|
|
||||||
|
# Code Recommenders
|
||||||
|
.recommenders/
|
||||||
|
|
||||||
|
|
||||||
|
### OSX ###
|
||||||
|
*.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
|
||||||
|
### Java ###
|
||||||
|
*.class
|
||||||
|
|
||||||
|
# Mobile Tools for Java (J2ME)
|
||||||
|
.mtj.tmp/
|
||||||
|
|
||||||
|
# Package Files #
|
||||||
|
*.jar
|
||||||
|
*.war
|
||||||
|
*.ear
|
||||||
|
|
||||||
|
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||||
|
hs_err_pid*
|
||||||
|
|
||||||
|
|
||||||
|
### Maven ###
|
||||||
|
target/
|
||||||
|
pom.xml.tag
|
||||||
|
pom.xml.releaseBackup
|
||||||
|
pom.xml.versionsBackup
|
||||||
|
pom.xml.next
|
||||||
|
release.properties
|
||||||
|
dependency-reduced-pom.xml
|
||||||
|
buildNumber.properties
|
||||||
|
.mvn/timing.properties
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
This is a native driver for [Webcam Capture](https://github.com/sarxos/webcam-capture) that is reliable, has very good performance, fast startup time and is able to correctly list the detailed capabilities of video devices such as resolutions and device IDs.
|
||||||
|
|
||||||
|
Currently it works on Windows only, with the `CaptureManagerDriver`, based on [CaptureManager-SDK](https://www.codeproject.com/Articles/1017223/CaptureManager-SDK-Capturing-Recording-and-Streami), which uses the MediaFoundation Windows API.
|
||||||
|
|
||||||
|
# How to use
|
||||||
|
|
||||||
|
1. Download this repository and run `mvn install`
|
||||||
|
2. Add `com.github.eduramiba:webcam-capture-driver-native:1.0.0-SNAPSHOT` dependency to your application.
|
||||||
|
3. Copy the DLLs of the `natives` folder for your system into the java library path.
|
||||||
|
4. Use the driver with `Webcam.setDriver(new CaptureManagerDriver())`
|
||||||
|
5. List the devices with `Webcam.getWebcams()` as normal and use the library in your preferred way. In JavaFX it's recommended to do it as in the example below.
|
||||||
|
|
||||||
|
# Simple example with JavaFX
|
||||||
|
|
||||||
|
```java
|
||||||
|
import com.github.eduramiba.webcamcapture.drivers.WebcamDeviceWithBufferOperations;
|
||||||
|
import com.github.eduramiba.webcamcapture.drivers.capturemanager.CaptureManagerDriver;
|
||||||
|
import com.github.sarxos.webcam.Webcam;
|
||||||
|
import com.github.sarxos.webcam.WebcamDevice;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import javafx.application.Application;
|
||||||
|
import javafx.application.Platform;
|
||||||
|
import javafx.scene.Scene;
|
||||||
|
import javafx.scene.image.ImageView;
|
||||||
|
import javafx.scene.image.WritableImage;
|
||||||
|
import javafx.scene.layout.HBox;
|
||||||
|
import javafx.stage.Stage;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class TestCaptureManagerDriver extends Application {
|
||||||
|
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(TestCaptureManagerDriver.class);
|
||||||
|
|
||||||
|
public static final ScheduledExecutorService EXECUTOR = Executors.newScheduledThreadPool(4);
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
Webcam.setDriver(new CaptureManagerDriver());
|
||||||
|
|
||||||
|
launch(args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void start(Stage stage) throws Exception {
|
||||||
|
ImageView imageView = new ImageView();
|
||||||
|
HBox root = new HBox();
|
||||||
|
root.getChildren().add(imageView);
|
||||||
|
|
||||||
|
Webcam.getWebcams().stream()
|
||||||
|
.findFirst()
|
||||||
|
.ifPresent((final Webcam camera) -> {
|
||||||
|
final WebcamDevice device = camera.getDevice();
|
||||||
|
LOG.info("Found camera: {}, device = {}", camera, device);
|
||||||
|
|
||||||
|
final int width = device.getResolution().width;
|
||||||
|
final int height = device.getResolution().height;
|
||||||
|
final WritableImage fxImage = new WritableImage(width, height);
|
||||||
|
Platform.runLater(() -> {
|
||||||
|
imageView.setImage(fxImage);
|
||||||
|
});
|
||||||
|
|
||||||
|
camera.open();
|
||||||
|
if (device instanceof WebcamDeviceWithBufferOperations) {
|
||||||
|
EXECUTOR.scheduleAtFixedRate(() -> {
|
||||||
|
((WebcamDeviceWithBufferOperations) device).updateFXIMage(fxImage);
|
||||||
|
}, 0, 16, TimeUnit.MILLISECONDS);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create the Scene
|
||||||
|
Scene scene = new Scene(root);
|
||||||
|
// Add the scene to the Stage
|
||||||
|
stage.setScene(scene);
|
||||||
|
// Set the title of the Stage
|
||||||
|
stage.setTitle("Displaying an Image");
|
||||||
|
// Display the Stage
|
||||||
|
stage.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
# Future work
|
||||||
|
|
||||||
|
* Publish this as a maven central artifact. At the moment you will need to build it yourself.
|
||||||
|
* Implement MacOS and Linux native driver that uses LibUVC.
|
||||||
|
|
||||||
|
# Notes
|
||||||
|
|
||||||
|
The source code in `natives` folder and `capturemanager` java package has been copied from [CaptureManager-SDK](https://www.codeproject.com/Articles/1017223/CaptureManager-SDK-Capturing-Recording-and-Streami) and slightly improved for this driver.
|
|
@ -0,0 +1,67 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ruleset xmlns="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" comparisonMethod="maven" xsi:schemaLocation="http://mojo.codehaus.org/versions-maven-plugin/rule/2.0.0 http://mojo.codehaus.org/versions-maven-plugin/xsd/rule-2.0.0.xsd">
|
||||||
|
<ignoreVersions>
|
||||||
|
<!-- Ignore Alpha's, Beta's, release candidates and milestones -->
|
||||||
|
<ignoreVersion type="regex">(?i).*alpha.*</ignoreVersion>
|
||||||
|
|
||||||
|
<ignoreVersion type="regex">(?i).*beta.*</ignoreVersion>
|
||||||
|
<ignoreVersion type="regex">(?i).*[-.]b([0-9]+)?</ignoreVersion>
|
||||||
|
|
||||||
|
<ignoreVersion type="regex">(?i).*[-.](rc|cr)[-]?([0-9]+)?</ignoreVersion>
|
||||||
|
|
||||||
|
<ignoreVersion type="regex">(?i).*[-.]m([0-9]+)?</ignoreVersion>
|
||||||
|
|
||||||
|
<ignoreVersion type="regex">(?i).*[-.]pr([0-9]+)?</ignoreVersion>
|
||||||
|
|
||||||
|
<ignoreVersion type="regex">(?i).*jboss.*</ignoreVersion>
|
||||||
|
|
||||||
|
<ignoreVersion type="regex">(?i).*\-b[0-9]+\.[0-9]+$</ignoreVersion>
|
||||||
|
|
||||||
|
<!-- Ignore Netbeans RCP weird versions -->
|
||||||
|
<ignoreVersion type="regex">(?i)RELEASE.*</ignoreVersion>
|
||||||
|
|
||||||
|
<!-- Ignore old jre specific versions-->
|
||||||
|
<ignoreVersion type="regex">(?i).*[-.]jre[0-9]+</ignoreVersion>
|
||||||
|
|
||||||
|
<!-- Ignore openjfx early-access versions-->
|
||||||
|
<ignoreVersion type="regex">(?i).*[-.]ea\+[0-9]+[a-zA-Z]?</ignoreVersion>
|
||||||
|
</ignoreVersions>
|
||||||
|
<rules>
|
||||||
|
<!-- Obvious mismatches -->
|
||||||
|
<rule groupId="commons-collections" artifactId="commons-collections">
|
||||||
|
<ignoreVersions>
|
||||||
|
<ignoreVersion type="regex">^200.\d+(\.\d+)?$</ignoreVersion>
|
||||||
|
</ignoreVersions>
|
||||||
|
</rule>
|
||||||
|
<rule groupId="commons-beanutils" artifactId="commons-beanutils">
|
||||||
|
<ignoreVersions>
|
||||||
|
<ignoreVersion type="regex">^200.\d+(\.\d+)?$</ignoreVersion>
|
||||||
|
</ignoreVersions>
|
||||||
|
</rule>
|
||||||
|
<rule groupId="commons-codec" artifactId="commons-codec">
|
||||||
|
<ignoreVersions>
|
||||||
|
<ignoreVersion type="regex">^200.\d+(\.\d+)?$</ignoreVersion>
|
||||||
|
</ignoreVersions>
|
||||||
|
</rule>
|
||||||
|
<rule groupId="commons-io" artifactId="commons-io">
|
||||||
|
<ignoreVersions>
|
||||||
|
<ignoreVersion type="regex">^200.\d+(\.\d+)?$</ignoreVersion>
|
||||||
|
</ignoreVersions>
|
||||||
|
</rule>
|
||||||
|
<rule groupId="commons-logging" artifactId="commons-logging">
|
||||||
|
<ignoreVersions>
|
||||||
|
<ignoreVersion>99.0-does-not-exist</ignoreVersion>
|
||||||
|
</ignoreVersions>
|
||||||
|
</rule>
|
||||||
|
<rule groupId="org.hamcrest">
|
||||||
|
<ignoreVersions>
|
||||||
|
<ignoreVersion>1.4-atlassian-1</ignoreVersion>
|
||||||
|
</ignoreVersions>
|
||||||
|
</rule>
|
||||||
|
<rule groupId="org.nd4j">
|
||||||
|
<ignoreVersions>
|
||||||
|
<ignoreVersion>9.0.0</ignoreVersion>
|
||||||
|
</ignoreVersions>
|
||||||
|
</rule>
|
||||||
|
</rules>
|
||||||
|
</ruleset>
|
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 2013
|
||||||
|
VisualStudioVersion = 12.0.30501.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CaptureManagerNativeProxy", "CaptureManagerNativeProxy\CaptureManagerNativeProxy.vcxproj", "{1D0E9171-8D1E-4A94-A48A-F5E92326908C}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Win32 = Debug|Win32
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Release|Win32 = Release|Win32
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{1D0E9171-8D1E-4A94-A48A-F5E92326908C}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{1D0E9171-8D1E-4A94-A48A-F5E92326908C}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{1D0E9171-8D1E-4A94-A48A-F5E92326908C}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{1D0E9171-8D1E-4A94-A48A-F5E92326908C}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{1D0E9171-8D1E-4A94-A48A-F5E92326908C}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{1D0E9171-8D1E-4A94-A48A-F5E92326908C}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{1D0E9171-8D1E-4A94-A48A-F5E92326908C}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{1D0E9171-8D1E-4A94-A48A-F5E92326908C}.Release|x64.Build.0 = Release|x64
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
|
@ -0,0 +1,114 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_CaptureManagerControlNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerControlNative
|
||||||
|
* Method: createControl
|
||||||
|
* Signature: (JLjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_CaptureManagerControlNative_createControl
|
||||||
|
(JNIEnv *aPtrEnv, jobject, jlong aPtr, jstring aStringIID)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ICaptureManagerControl> lICaptureManagerControl;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lICaptureManagerControl));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringIID = aPtrEnv->GetStringChars(aStringIID, nullptr);
|
||||||
|
|
||||||
|
CLSID lIID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringIID, &lIID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lIUnknown;
|
||||||
|
|
||||||
|
lhr = lICaptureManagerControl->createControl(
|
||||||
|
lIID,
|
||||||
|
&lIUnknown);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lIUnknown.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerControlNative
|
||||||
|
* Method: createMisc
|
||||||
|
* Signature: (JLjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_CaptureManagerControlNative_createMisc
|
||||||
|
(JNIEnv *aPtrEnv, jobject, jlong aPtr, jstring aStringIID)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ICaptureManagerControl> lICaptureManagerControl;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lICaptureManagerControl));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringIID = aPtrEnv->GetStringChars(aStringIID, nullptr);
|
||||||
|
|
||||||
|
CLSID lIID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringIID, &lIID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lIUnknown;
|
||||||
|
|
||||||
|
lhr = lICaptureManagerControl->createMisc(
|
||||||
|
lIID,
|
||||||
|
&lIUnknown);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lIUnknown.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,156 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include <Commdlg.h>
|
||||||
|
#include <Objbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_CaptureManagerNativeProxy.h"
|
||||||
|
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
BOOL gComInit = FALSE;
|
||||||
|
|
||||||
|
typedef HRESULT(STDAPICALLTYPE *PDllGetClassObject) (REFCLSID, REFIID, void**);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerNativeProxy_getPtrClass
|
||||||
|
* Method: explicitGetPtrClass
|
||||||
|
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_CaptureManagerNativeProxy_explicitGetPtrClass
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jstring aStringFilePath, jstring aStringCLSID, jstring aStringGUID)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
HRESULT lhresult(E_FAIL);
|
||||||
|
|
||||||
|
gComInit = TRUE;
|
||||||
|
|
||||||
|
HMODULE lhLibrary = nullptr;
|
||||||
|
|
||||||
|
if (lhLibrary == nullptr)
|
||||||
|
{
|
||||||
|
const jchar *lPtrStringFilePath = aPtrEnv->GetStringChars(aStringFilePath, nullptr);
|
||||||
|
|
||||||
|
lhLibrary = GetModuleHandle((wchar_t*)lPtrStringFilePath);
|
||||||
|
|
||||||
|
if (lhLibrary == nullptr)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
PDllGetClassObject lPtrFuncDllGetClassObject = nullptr;
|
||||||
|
|
||||||
|
lPtrFuncDllGetClassObject = (PDllGetClassObject)GetProcAddress(lhLibrary, "DllGetClassObject");
|
||||||
|
|
||||||
|
if (lPtrFuncDllGetClassObject == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringCLSID = aPtrEnv->GetStringChars(aStringCLSID, nullptr);
|
||||||
|
|
||||||
|
CLSID lCLSID;
|
||||||
|
|
||||||
|
lhresult = CLSIDFromString((wchar_t*)lPtrStringCLSID, &lCLSID);
|
||||||
|
|
||||||
|
if (FAILED(lhresult))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IClassFactory> lClassFactory;
|
||||||
|
|
||||||
|
lhresult = lPtrFuncDllGetClassObject(lCLSID, IID_PPV_ARGS(&lClassFactory));
|
||||||
|
|
||||||
|
if (FAILED(lhresult))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!lClassFactory)
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringGUID = aPtrEnv->GetStringChars(aStringGUID, nullptr);
|
||||||
|
|
||||||
|
CLSID lInterfaceID;
|
||||||
|
|
||||||
|
lhresult = CLSIDFromString((wchar_t*)lPtrStringGUID, &lInterfaceID);
|
||||||
|
|
||||||
|
if (FAILED(lhresult))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lIUnknown;
|
||||||
|
|
||||||
|
lhresult = lClassFactory->CreateInstance(
|
||||||
|
nullptr,
|
||||||
|
lInterfaceID,
|
||||||
|
(void**)&lIUnknown);
|
||||||
|
|
||||||
|
if (FAILED(lhresult))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!lIUnknown)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lIUnknown.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerNativeProxy_getPtrClass
|
||||||
|
* Method: getPtrClass
|
||||||
|
* Signature: (Ljava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_CaptureManagerNativeProxy_freeLibrary
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jstring aFileName)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
HMODULE lhLibrary = nullptr;
|
||||||
|
|
||||||
|
const jchar *lPtrFileName = aPtrEnv->GetStringChars(aFileName, nullptr);
|
||||||
|
|
||||||
|
lhLibrary = GetModuleHandle((wchar_t*)lPtrFileName);
|
||||||
|
|
||||||
|
if (lhLibrary == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
BOOL lresult = FreeLibrary(lhLibrary);
|
||||||
|
|
||||||
|
while (lresult != FALSE)
|
||||||
|
{
|
||||||
|
lresult = FreeLibrary(lhLibrary);
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerNativeProxy_Release
|
||||||
|
* Method: Release
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_CaptureManagerNativeProxy_Release
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr != 0)
|
||||||
|
{
|
||||||
|
IUnknown* aPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
if (aPtrIUnknown != nullptr)
|
||||||
|
aPtrIUnknown->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,200 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{1D0E9171-8D1E-4A94-A48A-F5E92326908C}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>CaptureManagerNativeProxy</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IncludePath>.\Includes;$(IncludePath)</IncludePath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<IncludePath>.\Includes;$(IncludePath)</IncludePath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IncludePath>.\Includes;$(IncludePath)</IncludePath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<IncludePath>.\Includes;$(IncludePath)</IncludePath>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CAPTUREMANAGERNATIVEPROXY_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>jawt.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(ProjectDir)JavaLib\$(PlatformTarget);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;CAPTUREMANAGERNATIVEPROXY_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>C:\Program Files\Java\jdk1.8.0_92\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>jawt.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CAPTUREMANAGERNATIVEPROXY_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<CompileAs>Default</CompileAs>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalLibraryDirectories>$(ProjectDir)JavaLib\$(PlatformTarget);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>jawt.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;CAPTUREMANAGERNATIVEPROXY_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<CompileAs>Default</CompileAs>
|
||||||
|
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Windows</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<AdditionalDependencies>jawt.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
<AdditionalLibraryDirectories>$(ProjectDir)JavaLib\$(PlatformTarget);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="CaptureManagerTypeInfo.h" />
|
||||||
|
<ClInclude Include="ComPtrCustom.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_CaptureManagerControlNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_CaptureManagerNativeProxy.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_EncoderControlNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_EncoderNodeFactoryNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_EVRSinkFactoryNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_FileSinkFactoryNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_LogPrintOutControlNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SampleGrabberCallbackSinkFactoryNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SampleGrabberCallNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SampleGrabberCallSinkFactoryNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SessionControlNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SessionNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SinkControlNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SourceControlNative.h" />
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_StrideForBitmapNative.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="CaptureManagerControlNative.cpp" />
|
||||||
|
<ClCompile Include="CaptureManagerNativeProxy.cpp" />
|
||||||
|
<ClCompile Include="EncoderControlNative.cpp" />
|
||||||
|
<ClCompile Include="EncoderNodeFactoryNative.cpp" />
|
||||||
|
<ClCompile Include="EVRSinkFactoryNative.cpp" />
|
||||||
|
<ClCompile Include="FileSinkFactoryNative.cpp" />
|
||||||
|
<ClCompile Include="LogPrintOutControlNative.cpp" />
|
||||||
|
<ClCompile Include="SampleGrabberCallbackSinkFactoryNative.cpp" />
|
||||||
|
<ClCompile Include="SampleGrabberCallNative.cpp" />
|
||||||
|
<ClCompile Include="SampleGrabberCallSinkFactoryNative.cpp" />
|
||||||
|
<ClCompile Include="SessionControlNative.cpp" />
|
||||||
|
<ClCompile Include="SessionNative.cpp" />
|
||||||
|
<ClCompile Include="SinkControlNative.cpp" />
|
||||||
|
<ClCompile Include="SourceControlNative.cpp" />
|
||||||
|
<ClCompile Include="StrideForBitmapNative.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,117 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Resource Files">
|
||||||
|
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||||
|
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_LogPrintOutControlNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="ComPtrCustom.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_CaptureManagerNativeProxy.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="CaptureManagerTypeInfo.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_CaptureManagerControlNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SourceControlNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SinkControlNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_EVRSinkFactoryNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SessionControlNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SessionNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_StrideForBitmapNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SampleGrabberCallNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SampleGrabberCallSinkFactoryNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_SampleGrabberCallbackSinkFactoryNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_EncoderControlNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_EncoderNodeFactoryNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="JNI\capturemanager_classes_FileSinkFactoryNative.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="CaptureManagerNativeProxy.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="LogPrintOutControlNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="CaptureManagerControlNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SourceControlNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SinkControlNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="EVRSinkFactoryNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SessionControlNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SessionNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="StrideForBitmapNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SampleGrabberCallNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SampleGrabberCallSinkFactoryNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SampleGrabberCallbackSinkFactoryNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="EncoderControlNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="EncoderNodeFactoryNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="FileSinkFactoryNative.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,263 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
class CComPtrCustom
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
CComPtrCustom(T *aPtrElement)
|
||||||
|
:element(aPtrElement)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CComPtrCustom()
|
||||||
|
:element(nullptr)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~CComPtrCustom()
|
||||||
|
{
|
||||||
|
Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
T* Detach()
|
||||||
|
{
|
||||||
|
auto lOutPtr = element;
|
||||||
|
|
||||||
|
element = nullptr;
|
||||||
|
|
||||||
|
return lOutPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
T* detach()
|
||||||
|
{
|
||||||
|
return Detach();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Release()
|
||||||
|
{
|
||||||
|
if (element == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto k = element->Release();
|
||||||
|
|
||||||
|
element = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
CComPtrCustom& operator = (T *pElement)
|
||||||
|
{
|
||||||
|
Release();
|
||||||
|
|
||||||
|
if (pElement == nullptr)
|
||||||
|
return *this;
|
||||||
|
|
||||||
|
auto k = pElement->AddRef();
|
||||||
|
|
||||||
|
element = pElement;
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Swap(CComPtrCustom& other)
|
||||||
|
{
|
||||||
|
T* pTemp = element;
|
||||||
|
element = other.element;
|
||||||
|
other.element = pTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
T* operator->()
|
||||||
|
{
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator T*()
|
||||||
|
{
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator T*() const
|
||||||
|
{
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
T* get()
|
||||||
|
{
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
T* get() const
|
||||||
|
{
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
|
||||||
|
T** operator &()
|
||||||
|
{
|
||||||
|
return &element;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator !()const
|
||||||
|
{
|
||||||
|
return element == nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator bool()const
|
||||||
|
{
|
||||||
|
return element != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator == (const T *pElement)const
|
||||||
|
{
|
||||||
|
return element == pElement;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CComPtrCustom(const CComPtrCustom& aCComPtrCustom)
|
||||||
|
{
|
||||||
|
if (aCComPtrCustom.operator!())
|
||||||
|
{
|
||||||
|
element = nullptr;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
element = aCComPtrCustom;
|
||||||
|
|
||||||
|
auto h = element->AddRef();
|
||||||
|
|
||||||
|
h++;
|
||||||
|
}
|
||||||
|
|
||||||
|
CComPtrCustom& operator = (const CComPtrCustom& aCComPtrCustom)
|
||||||
|
{
|
||||||
|
Release();
|
||||||
|
|
||||||
|
element = aCComPtrCustom;
|
||||||
|
|
||||||
|
auto k = element->AddRef();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
_Check_return_ HRESULT CopyTo(T** ppT) throw()
|
||||||
|
{
|
||||||
|
if (ppT == NULL)
|
||||||
|
return E_POINTER;
|
||||||
|
|
||||||
|
*ppT = element;
|
||||||
|
|
||||||
|
if (element)
|
||||||
|
element->AddRef();
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT CoCreateInstance(const CLSID aCLSID)
|
||||||
|
{
|
||||||
|
T* lPtrTemp;
|
||||||
|
|
||||||
|
auto lresult = ::CoCreateInstance(aCLSID, NULL, CLSCTX_INPROC, IID_PPV_ARGS(&lPtrTemp));
|
||||||
|
|
||||||
|
if (SUCCEEDED(lresult))
|
||||||
|
{
|
||||||
|
if (lPtrTemp != nullptr)
|
||||||
|
{
|
||||||
|
Release();
|
||||||
|
|
||||||
|
element = lPtrTemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
T* element;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T, const IID* piid = &__uuidof(T)>
|
||||||
|
class CComQIPtrCustom :
|
||||||
|
public CComPtrCustom<T>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CComQIPtrCustom() throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
CComQIPtrCustom(decltype(__nullptr)) throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
CComQIPtrCustom(_Inout_opt_ T* lp) throw() :
|
||||||
|
CComPtrCustom<T>(lp)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CComQIPtrCustom(_Inout_opt_ IUnknown* lp) throw()
|
||||||
|
{
|
||||||
|
if (lp != NULL)
|
||||||
|
{
|
||||||
|
if (FAILED(lp->QueryInterface(*piid, (void **)&element)))
|
||||||
|
element = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
T* operator=(decltype(__nullptr)) throw()
|
||||||
|
{
|
||||||
|
CComQIPtrCustom(nullptr).Swap(*this);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
T* operator=(_Inout_opt_ T* lp) throw()
|
||||||
|
{
|
||||||
|
if (*this != lp)
|
||||||
|
{
|
||||||
|
CComQIPtrCustom(lp).Swap(*this);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
T* operator=(_Inout_opt_ IUnknown* lp) throw()
|
||||||
|
{
|
||||||
|
if (*this != lp)
|
||||||
|
{
|
||||||
|
if (FAILED(lp->QueryInterface(*piid, (void **)&element)))
|
||||||
|
element = NULL;
|
||||||
|
else
|
||||||
|
return element;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
class CComQIPtrCustom<IUnknown, &IID_IUnknown> :
|
||||||
|
public CComPtrCustom<IUnknown>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CComQIPtrCustom() throw()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
CComQIPtrCustom(_Inout_opt_ IUnknown* lp) throw()
|
||||||
|
{
|
||||||
|
if (lp != NULL)
|
||||||
|
{
|
||||||
|
if (FAILED(lp->QueryInterface(__uuidof(IUnknown), (void **)&element)))
|
||||||
|
element = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CComQIPtrCustom(_Inout_ const CComQIPtrCustom<IUnknown, &IID_IUnknown>& lp) throw()
|
||||||
|
{
|
||||||
|
this->element = lp.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
IUnknown* operator=(_Inout_ const CComQIPtrCustom<IUnknown, &IID_IUnknown>& lp) throw()
|
||||||
|
{
|
||||||
|
if (this->get() != lp.get())
|
||||||
|
{
|
||||||
|
this->element = lp.get();
|
||||||
|
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef CComQIPtrCustom<IDispatch, &__uuidof(IDispatch)> CComDispatchDriver;
|
|
@ -0,0 +1,91 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
#include "jawt_md.h"
|
||||||
|
#include "JNI\capturemanager_classes_EVRSinkFactoryNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EVRSinkFactoryNative
|
||||||
|
* Method: createOutputNode
|
||||||
|
* Signature: (JLjava/awt/Component;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_EVRSinkFactoryNative_createOutputNode
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jobject aGraphicComponent)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aGraphicComponent == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IEVRSinkFactory> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
JAWT lJAWT;
|
||||||
|
|
||||||
|
JAWT_DrawingSurface* lPtrJAWT_DrawingSurface;
|
||||||
|
|
||||||
|
JAWT_DrawingSurfaceInfo* lPtrJAWT_DrawingSurfaceInfo;
|
||||||
|
|
||||||
|
JAWT_Win32DrawingSurfaceInfo* lPtrJAWT_Win32DrawingSurfaceInfo;
|
||||||
|
|
||||||
|
jboolean result;
|
||||||
|
|
||||||
|
jint lock;
|
||||||
|
|
||||||
|
|
||||||
|
lJAWT.version = JAWT_VERSION_1_3;
|
||||||
|
|
||||||
|
if (JAWT_GetAWT(aPtrEnv, &lJAWT) == JNI_FALSE)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lPtrJAWT_DrawingSurface = lJAWT.GetDrawingSurface(aPtrEnv, aGraphicComponent);
|
||||||
|
|
||||||
|
lock = lPtrJAWT_DrawingSurface->Lock(lPtrJAWT_DrawingSurface);
|
||||||
|
|
||||||
|
lPtrJAWT_DrawingSurfaceInfo = lPtrJAWT_DrawingSurface->GetDrawingSurfaceInfo(lPtrJAWT_DrawingSurface);
|
||||||
|
|
||||||
|
lPtrJAWT_Win32DrawingSurfaceInfo = (JAWT_Win32DrawingSurfaceInfo*)lPtrJAWT_DrawingSurfaceInfo->platformInfo;
|
||||||
|
|
||||||
|
HWND lHWND = lPtrJAWT_Win32DrawingSurfaceInfo->hwnd;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lEVRTopologyNode;
|
||||||
|
|
||||||
|
lhr = lObject->createOutputNode(lHWND, &lEVRTopologyNode);
|
||||||
|
|
||||||
|
lPtrJAWT_DrawingSurface->Unlock(lPtrJAWT_DrawingSurface);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lEVRTopologyNode.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,192 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_EncoderControlNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderControlNative
|
||||||
|
* Method: createSinkFactory
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_EncoderControlNative_createEncoderNodeFactory
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aStringContainerTypeGUID, jstring aStringIID)
|
||||||
|
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IEncoderControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringContainerTypeGUID = aPtrEnv->GetStringChars(aStringContainerTypeGUID, nullptr);
|
||||||
|
|
||||||
|
CLSID lContainerTypeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringContainerTypeGUID, &lContainerTypeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringIID = aPtrEnv->GetStringChars(aStringIID, nullptr);
|
||||||
|
|
||||||
|
CLSID lInterfaceID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringIID, &lInterfaceID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lIUnknown;
|
||||||
|
|
||||||
|
lhr = lObject->createEncoderNodeFactory(
|
||||||
|
lContainerTypeGUID,
|
||||||
|
lInterfaceID,
|
||||||
|
&lIUnknown);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!lIUnknown)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lIUnknown.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderControlNative
|
||||||
|
* Method: getCollectionOfSinks
|
||||||
|
* Signature: (J)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_capturemanager_classes_EncoderControlNative_getCollectionOfEncoders
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr)
|
||||||
|
{
|
||||||
|
jstring lresult = nullptr;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IEncoderControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
BSTR lXMLstring = nullptr;
|
||||||
|
|
||||||
|
lhr = lObject->getCollectionOfEncoders(&lXMLstring);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
auto lLength = SysStringLen(lXMLstring);
|
||||||
|
|
||||||
|
lresult = aPtrEnv->NewString((jchar*)lXMLstring, lLength);
|
||||||
|
|
||||||
|
SysFreeString(lXMLstring);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderControlNative
|
||||||
|
* Method: getMediaTypeCollectionOfEncoder
|
||||||
|
* Signature: (JJLjava/lang/String;)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_capturemanager_classes_EncoderControlNative_getMediaTypeCollectionOfEncoder
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jlong aIndex, jstring aStringEncoderCLSID)
|
||||||
|
{
|
||||||
|
jstring lresult = nullptr;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringEncoderCLSID == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IEncoderControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
const jchar *lPtrStringEncoderCLSID = aPtrEnv->GetStringChars(aStringEncoderCLSID, nullptr);
|
||||||
|
|
||||||
|
CLSID lEncoderCLSID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringEncoderCLSID, &lEncoderCLSID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
lPtrIUnknown = (IUnknown*)aIndex;
|
||||||
|
|
||||||
|
BSTR lXMLstring = nullptr;
|
||||||
|
|
||||||
|
lhr = lObject->getMediaTypeCollectionOfEncoder(
|
||||||
|
lPtrIUnknown,
|
||||||
|
lEncoderCLSID,
|
||||||
|
&lXMLstring);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
auto lLength = SysStringLen(lXMLstring);
|
||||||
|
|
||||||
|
lresult = aPtrEnv->NewString((jchar*)lXMLstring, lLength);
|
||||||
|
|
||||||
|
SysFreeString(lXMLstring);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,161 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_EncoderNodeFactoryNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderNodeFactoryNative
|
||||||
|
* Method: createCompressedMediaType
|
||||||
|
* Signature: (JJLjava/lang/String;II)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_EncoderNodeFactoryNative_createCompressedMediaType
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jlong aPtrUncompressedMediaType,
|
||||||
|
jstring aStringEncodingModeGUID, jint aEncoderModeValue, jint aCompressedMediaTypeIndex)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrUncompressedMediaType == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringEncodingModeGUID == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IEncoderNodeFactory> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringEncodingModeGUID = aPtrEnv->GetStringChars(aStringEncodingModeGUID, nullptr);
|
||||||
|
|
||||||
|
CLSID lEncodingModeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringEncodingModeGUID, &lEncodingModeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lPtrIUnknown = (IUnknown*)aPtrUncompressedMediaType;
|
||||||
|
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> l_CompressedMediaType;
|
||||||
|
|
||||||
|
lhr = lObject->createCompressedMediaType(
|
||||||
|
lPtrIUnknown,
|
||||||
|
lEncodingModeGUID,
|
||||||
|
aEncoderModeValue,
|
||||||
|
aCompressedMediaTypeIndex,
|
||||||
|
&l_CompressedMediaType);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!l_CompressedMediaType)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)l_CompressedMediaType.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderNodeFactoryNative
|
||||||
|
* Method: createEncoderNode
|
||||||
|
* Signature: (JJLjava/lang/String;IIJ)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_EncoderNodeFactoryNative_createEncoderNode
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jlong aPtrUncompressedMediaType,
|
||||||
|
jstring aStringEncodingModeGUID, jint aEncodingModeValue, jint aIndexCompressedMediaType,
|
||||||
|
jlong aPtrDownStreamNode)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrUncompressedMediaType == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringEncodingModeGUID == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrDownStreamNode == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IEncoderNodeFactory> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringEncodingModeGUID = aPtrEnv->GetStringChars(aStringEncodingModeGUID, nullptr);
|
||||||
|
|
||||||
|
CLSID lEncodingModeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringEncodingModeGUID, &lEncodingModeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lPtrIUnknown = (IUnknown*)aPtrUncompressedMediaType;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknownDownStreamNode = (IUnknown*)aPtrDownStreamNode;
|
||||||
|
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> l_Unknown;
|
||||||
|
|
||||||
|
lhr = lObject->createEncoderNode(
|
||||||
|
lPtrIUnknown,
|
||||||
|
lEncodingModeGUID,
|
||||||
|
aEncodingModeValue,
|
||||||
|
aIndexCompressedMediaType,
|
||||||
|
lPtrIUnknownDownStreamNode,
|
||||||
|
&l_Unknown);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!l_Unknown)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)l_Unknown.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,196 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
|
#include "jawt_md.h"
|
||||||
|
#include "JNI\capturemanager_classes_FileSinkFactoryNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_FileSinkFactoryNative
|
||||||
|
* Method: createOutputNodes
|
||||||
|
* Signature: (J[JLjava/lang/String;)[J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlongArray JNICALL Java_capturemanager_classes_FileSinkFactoryNative_createOutputNodes
|
||||||
|
(JNIEnv * aPtrEnv,
|
||||||
|
jobject aClass,
|
||||||
|
jlong aPtr,
|
||||||
|
jlongArray aArrayPtrCompressedMediaTypes,
|
||||||
|
jstring aPtrFileName)
|
||||||
|
{
|
||||||
|
jlongArray lresult = nullptr;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aArrayPtrCompressedMediaTypes == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrFileName == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IFileSinkFactory> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const jchar *lPtrFileName = aPtrEnv->GetStringChars(aPtrFileName, nullptr);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
auto lPtrSourceNodesOfTopologys = aPtrEnv->GetLongArrayElements(aArrayPtrCompressedMediaTypes, nullptr);
|
||||||
|
|
||||||
|
if (lPtrSourceNodesOfTopologys == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
auto lArrayLength = aPtrEnv->GetArrayLength(aArrayPtrCompressedMediaTypes);
|
||||||
|
|
||||||
|
SAFEARRAY* pSA = NULL;
|
||||||
|
SAFEARRAYBOUND bound[1];
|
||||||
|
bound[0].lLbound = 0;
|
||||||
|
bound[0].cElements = lArrayLength;
|
||||||
|
pSA = SafeArrayCreate(VT_VARIANT, 1, bound);
|
||||||
|
|
||||||
|
for (long i = 0; i < lArrayLength; i++)
|
||||||
|
{
|
||||||
|
jlong lPtr = lPtrSourceNodesOfTopologys[i];
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)lPtr;
|
||||||
|
|
||||||
|
VARIANT lVar;
|
||||||
|
|
||||||
|
VariantInit(&lVar);
|
||||||
|
|
||||||
|
lVar.vt = VT_UNKNOWN;
|
||||||
|
|
||||||
|
lVar.punkVal = lPtrIUnknown;
|
||||||
|
|
||||||
|
lhr = SafeArrayPutElement(pSA, &i, &lVar);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VARIANT theArray;
|
||||||
|
|
||||||
|
VariantInit(&theArray);
|
||||||
|
|
||||||
|
theArray.vt = VT_SAFEARRAY | VT_UNKNOWN;
|
||||||
|
|
||||||
|
theArray.parray = pSA;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VARIANT theOutputNodes;
|
||||||
|
|
||||||
|
VariantInit(&theOutputNodes);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lSession;
|
||||||
|
|
||||||
|
lhr = lObject->createOutputNodes(
|
||||||
|
theArray,
|
||||||
|
(wchar_t*)lPtrFileName,
|
||||||
|
&theOutputNodes);
|
||||||
|
|
||||||
|
SafeArrayDestroy(pSA);
|
||||||
|
|
||||||
|
VariantClear(&theArray);
|
||||||
|
|
||||||
|
std::vector<IUnknown*> lCompressedMediaTypes;
|
||||||
|
|
||||||
|
if (theOutputNodes.vt == VT_SAFEARRAY | VT_UNKNOWN && theOutputNodes.parray != nullptr)
|
||||||
|
{
|
||||||
|
LONG lBoundMediaTypes(0);
|
||||||
|
|
||||||
|
LONG uBoundMediaTypes(0);
|
||||||
|
|
||||||
|
SafeArrayGetUBound( theOutputNodes.parray, 1, &uBoundMediaTypes);
|
||||||
|
|
||||||
|
SafeArrayGetLBound( theOutputNodes.parray, 1, &lBoundMediaTypes);
|
||||||
|
|
||||||
|
for (LONG lIndex = lBoundMediaTypes; lIndex <= uBoundMediaTypes; lIndex++)
|
||||||
|
{
|
||||||
|
VARIANT lVar;
|
||||||
|
|
||||||
|
auto lr = SafeArrayGetElement(theOutputNodes.parray, &lIndex, &lVar);
|
||||||
|
|
||||||
|
if (SUCCEEDED(lr) && lVar.vt == VT_UNKNOWN && lVar.punkVal != nullptr)
|
||||||
|
{
|
||||||
|
lCompressedMediaTypes.push_back(lVar.punkVal);
|
||||||
|
}
|
||||||
|
|
||||||
|
//VariantClear(&lVar);
|
||||||
|
}
|
||||||
|
|
||||||
|
SafeArrayDestroy(theOutputNodes.parray);
|
||||||
|
|
||||||
|
theOutputNodes.parray = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VariantClear(&theOutputNodes);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
lresult = aPtrEnv->NewLongArray(lCompressedMediaTypes.size());
|
||||||
|
|
||||||
|
if (lresult == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
jlong* l_longs = new jlong[lCompressedMediaTypes.size()];
|
||||||
|
|
||||||
|
int l_index = 0;
|
||||||
|
|
||||||
|
for (auto& l_item : lCompressedMediaTypes)
|
||||||
|
{
|
||||||
|
l_longs[l_index++] = (jlong)l_item;
|
||||||
|
}
|
||||||
|
|
||||||
|
aPtrEnv->SetLongArrayRegion(lresult, 0, lCompressedMediaTypes.size(), l_longs);
|
||||||
|
|
||||||
|
delete[] l_longs;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,299 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _JAVASOFT_JAWT_H_
|
||||||
|
#define _JAVASOFT_JAWT_H_
|
||||||
|
|
||||||
|
#include "jni.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AWT native interface (new in JDK 1.3)
|
||||||
|
*
|
||||||
|
* The AWT native interface allows a native C or C++ application a means
|
||||||
|
* by which to access native structures in AWT. This is to facilitate moving
|
||||||
|
* legacy C and C++ applications to Java and to target the needs of the
|
||||||
|
* community who, at present, wish to do their own native rendering to canvases
|
||||||
|
* for performance reasons. Standard extensions such as Java3D also require a
|
||||||
|
* means to access the underlying native data structures of AWT.
|
||||||
|
*
|
||||||
|
* There may be future extensions to this API depending on demand.
|
||||||
|
*
|
||||||
|
* A VM does not have to implement this API in order to pass the JCK.
|
||||||
|
* It is recommended, however, that this API is implemented on VMs that support
|
||||||
|
* standard extensions, such as Java3D.
|
||||||
|
*
|
||||||
|
* Since this is a native API, any program which uses it cannot be considered
|
||||||
|
* 100% pure java.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* AWT Native Drawing Surface (JAWT_DrawingSurface).
|
||||||
|
*
|
||||||
|
* For each platform, there is a native drawing surface structure. This
|
||||||
|
* platform-specific structure can be found in jawt_md.h. It is recommended
|
||||||
|
* that additional platforms follow the same model. It is also recommended
|
||||||
|
* that VMs on Win32 and Solaris support the existing structures in jawt_md.h.
|
||||||
|
*
|
||||||
|
*******************
|
||||||
|
* EXAMPLE OF USAGE:
|
||||||
|
*******************
|
||||||
|
*
|
||||||
|
* In Win32, a programmer wishes to access the HWND of a canvas to perform
|
||||||
|
* native rendering into it. The programmer has declared the paint() method
|
||||||
|
* for their canvas subclass to be native:
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* MyCanvas.java:
|
||||||
|
*
|
||||||
|
* import java.awt.*;
|
||||||
|
*
|
||||||
|
* public class MyCanvas extends Canvas {
|
||||||
|
*
|
||||||
|
* static {
|
||||||
|
* System.loadLibrary("mylib");
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* public native void paint(Graphics g);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* myfile.c:
|
||||||
|
*
|
||||||
|
* #include "jawt_md.h"
|
||||||
|
* #include <assert.h>
|
||||||
|
*
|
||||||
|
* JNIEXPORT void JNICALL
|
||||||
|
* Java_MyCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics)
|
||||||
|
* {
|
||||||
|
* JAWT awt;
|
||||||
|
* JAWT_DrawingSurface* ds;
|
||||||
|
* JAWT_DrawingSurfaceInfo* dsi;
|
||||||
|
* JAWT_Win32DrawingSurfaceInfo* dsi_win;
|
||||||
|
* jboolean result;
|
||||||
|
* jint lock;
|
||||||
|
*
|
||||||
|
* // Get the AWT
|
||||||
|
* awt.version = JAWT_VERSION_1_3;
|
||||||
|
* result = JAWT_GetAWT(env, &awt);
|
||||||
|
* assert(result != JNI_FALSE);
|
||||||
|
*
|
||||||
|
* // Get the drawing surface
|
||||||
|
* ds = awt.GetDrawingSurface(env, canvas);
|
||||||
|
* assert(ds != NULL);
|
||||||
|
*
|
||||||
|
* // Lock the drawing surface
|
||||||
|
* lock = ds->Lock(ds);
|
||||||
|
* assert((lock & JAWT_LOCK_ERROR) == 0);
|
||||||
|
*
|
||||||
|
* // Get the drawing surface info
|
||||||
|
* dsi = ds->GetDrawingSurfaceInfo(ds);
|
||||||
|
*
|
||||||
|
* // Get the platform-specific drawing info
|
||||||
|
* dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
|
||||||
|
*
|
||||||
|
* //////////////////////////////
|
||||||
|
* // !!! DO PAINTING HERE !!! //
|
||||||
|
* //////////////////////////////
|
||||||
|
*
|
||||||
|
* // Free the drawing surface info
|
||||||
|
* ds->FreeDrawingSurfaceInfo(dsi);
|
||||||
|
*
|
||||||
|
* // Unlock the drawing surface
|
||||||
|
* ds->Unlock(ds);
|
||||||
|
*
|
||||||
|
* // Free the drawing surface
|
||||||
|
* awt.FreeDrawingSurface(ds);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JAWT_Rectangle
|
||||||
|
* Structure for a native rectangle.
|
||||||
|
*/
|
||||||
|
typedef struct jawt_Rectangle {
|
||||||
|
jint x;
|
||||||
|
jint y;
|
||||||
|
jint width;
|
||||||
|
jint height;
|
||||||
|
} JAWT_Rectangle;
|
||||||
|
|
||||||
|
struct jawt_DrawingSurface;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JAWT_DrawingSurfaceInfo
|
||||||
|
* Structure for containing the underlying drawing information of a component.
|
||||||
|
*/
|
||||||
|
typedef struct jawt_DrawingSurfaceInfo {
|
||||||
|
/*
|
||||||
|
* Pointer to the platform-specific information. This can be safely
|
||||||
|
* cast to a JAWT_Win32DrawingSurfaceInfo on Windows or a
|
||||||
|
* JAWT_X11DrawingSurfaceInfo on Solaris. On Mac OS X this is a
|
||||||
|
* pointer to a NSObject that conforms to the JAWT_SurfaceLayers
|
||||||
|
* protocol. See jawt_md.h for details.
|
||||||
|
*/
|
||||||
|
void* platformInfo;
|
||||||
|
/* Cached pointer to the underlying drawing surface */
|
||||||
|
struct jawt_DrawingSurface* ds;
|
||||||
|
/* Bounding rectangle of the drawing surface */
|
||||||
|
JAWT_Rectangle bounds;
|
||||||
|
/* Number of rectangles in the clip */
|
||||||
|
jint clipSize;
|
||||||
|
/* Clip rectangle array */
|
||||||
|
JAWT_Rectangle* clip;
|
||||||
|
} JAWT_DrawingSurfaceInfo;
|
||||||
|
|
||||||
|
#define JAWT_LOCK_ERROR 0x00000001
|
||||||
|
#define JAWT_LOCK_CLIP_CHANGED 0x00000002
|
||||||
|
#define JAWT_LOCK_BOUNDS_CHANGED 0x00000004
|
||||||
|
#define JAWT_LOCK_SURFACE_CHANGED 0x00000008
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JAWT_DrawingSurface
|
||||||
|
* Structure for containing the underlying drawing information of a component.
|
||||||
|
* All operations on a JAWT_DrawingSurface MUST be performed from the same
|
||||||
|
* thread as the call to GetDrawingSurface.
|
||||||
|
*/
|
||||||
|
typedef struct jawt_DrawingSurface {
|
||||||
|
/*
|
||||||
|
* Cached reference to the Java environment of the calling thread.
|
||||||
|
* If Lock(), Unlock(), GetDrawingSurfaceInfo() or
|
||||||
|
* FreeDrawingSurfaceInfo() are called from a different thread,
|
||||||
|
* this data member should be set before calling those functions.
|
||||||
|
*/
|
||||||
|
JNIEnv* env;
|
||||||
|
/* Cached reference to the target object */
|
||||||
|
jobject target;
|
||||||
|
/*
|
||||||
|
* Lock the surface of the target component for native rendering.
|
||||||
|
* When finished drawing, the surface must be unlocked with
|
||||||
|
* Unlock(). This function returns a bitmask with one or more of the
|
||||||
|
* following values:
|
||||||
|
*
|
||||||
|
* JAWT_LOCK_ERROR - When an error has occurred and the surface could not
|
||||||
|
* be locked.
|
||||||
|
*
|
||||||
|
* JAWT_LOCK_CLIP_CHANGED - When the clip region has changed.
|
||||||
|
*
|
||||||
|
* JAWT_LOCK_BOUNDS_CHANGED - When the bounds of the surface have changed.
|
||||||
|
*
|
||||||
|
* JAWT_LOCK_SURFACE_CHANGED - When the surface itself has changed
|
||||||
|
*/
|
||||||
|
jint (JNICALL *Lock)
|
||||||
|
(struct jawt_DrawingSurface* ds);
|
||||||
|
/*
|
||||||
|
* Get the drawing surface info.
|
||||||
|
* The value returned may be cached, but the values may change if
|
||||||
|
* additional calls to Lock() or Unlock() are made.
|
||||||
|
* Lock() must be called before this can return a valid value.
|
||||||
|
* Returns NULL if an error has occurred.
|
||||||
|
* When finished with the returned value, FreeDrawingSurfaceInfo must be
|
||||||
|
* called.
|
||||||
|
*/
|
||||||
|
JAWT_DrawingSurfaceInfo* (JNICALL *GetDrawingSurfaceInfo)
|
||||||
|
(struct jawt_DrawingSurface* ds);
|
||||||
|
/*
|
||||||
|
* Free the drawing surface info.
|
||||||
|
*/
|
||||||
|
void (JNICALL *FreeDrawingSurfaceInfo)
|
||||||
|
(JAWT_DrawingSurfaceInfo* dsi);
|
||||||
|
/*
|
||||||
|
* Unlock the drawing surface of the target component for native rendering.
|
||||||
|
*/
|
||||||
|
void (JNICALL *Unlock)
|
||||||
|
(struct jawt_DrawingSurface* ds);
|
||||||
|
} JAWT_DrawingSurface;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* JAWT
|
||||||
|
* Structure for containing native AWT functions.
|
||||||
|
*/
|
||||||
|
typedef struct jawt {
|
||||||
|
/*
|
||||||
|
* Version of this structure. This must always be set before
|
||||||
|
* calling JAWT_GetAWT()
|
||||||
|
*/
|
||||||
|
jint version;
|
||||||
|
/*
|
||||||
|
* Return a drawing surface from a target jobject. This value
|
||||||
|
* may be cached.
|
||||||
|
* Returns NULL if an error has occurred.
|
||||||
|
* Target must be a java.awt.Component (should be a Canvas
|
||||||
|
* or Window for native rendering).
|
||||||
|
* FreeDrawingSurface() must be called when finished with the
|
||||||
|
* returned JAWT_DrawingSurface.
|
||||||
|
*/
|
||||||
|
JAWT_DrawingSurface* (JNICALL *GetDrawingSurface)
|
||||||
|
(JNIEnv* env, jobject target);
|
||||||
|
/*
|
||||||
|
* Free the drawing surface allocated in GetDrawingSurface.
|
||||||
|
*/
|
||||||
|
void (JNICALL *FreeDrawingSurface)
|
||||||
|
(JAWT_DrawingSurface* ds);
|
||||||
|
/*
|
||||||
|
* Since 1.4
|
||||||
|
* Locks the entire AWT for synchronization purposes
|
||||||
|
*/
|
||||||
|
void (JNICALL *Lock)(JNIEnv* env);
|
||||||
|
/*
|
||||||
|
* Since 1.4
|
||||||
|
* Unlocks the entire AWT for synchronization purposes
|
||||||
|
*/
|
||||||
|
void (JNICALL *Unlock)(JNIEnv* env);
|
||||||
|
/*
|
||||||
|
* Since 1.4
|
||||||
|
* Returns a reference to a java.awt.Component from a native
|
||||||
|
* platform handle. On Windows, this corresponds to an HWND;
|
||||||
|
* on Solaris and Linux, this is a Drawable. For other platforms,
|
||||||
|
* see the appropriate machine-dependent header file for a description.
|
||||||
|
* The reference returned by this function is a local
|
||||||
|
* reference that is only valid in this environment.
|
||||||
|
* This function returns a NULL reference if no component could be
|
||||||
|
* found with matching platform information.
|
||||||
|
*/
|
||||||
|
jobject (JNICALL *GetComponent)(JNIEnv* env, void* platformInfo);
|
||||||
|
|
||||||
|
} JAWT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the AWT native structure. This function returns JNI_FALSE if
|
||||||
|
* an error occurs.
|
||||||
|
*/
|
||||||
|
_JNI_IMPORT_OR_EXPORT_
|
||||||
|
jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt);
|
||||||
|
|
||||||
|
#define JAWT_VERSION_1_3 0x00010003
|
||||||
|
#define JAWT_VERSION_1_4 0x00010004
|
||||||
|
#define JAWT_VERSION_1_7 0x00010007
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
} /* extern "C" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !_JAVASOFT_JAWT_H_ */
|
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _JAVASOFT_JAWT_MD_H_
|
||||||
|
#define _JAVASOFT_JAWT_MD_H_
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
#include "jawt.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Win32-specific declarations for AWT native interface.
|
||||||
|
* See notes in jawt.h for an example of use.
|
||||||
|
*/
|
||||||
|
typedef struct jawt_Win32DrawingSurfaceInfo {
|
||||||
|
/* Native window, DDB, or DIB handle */
|
||||||
|
union {
|
||||||
|
HWND hwnd;
|
||||||
|
HBITMAP hbitmap;
|
||||||
|
void* pbits;
|
||||||
|
};
|
||||||
|
/*
|
||||||
|
* This HDC should always be used instead of the HDC returned from
|
||||||
|
* BeginPaint() or any calls to GetDC().
|
||||||
|
*/
|
||||||
|
HDC hdc;
|
||||||
|
HPALETTE hpalette;
|
||||||
|
} JAWT_Win32DrawingSurfaceInfo;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* !_JAVASOFT_JAWT_MD_H_ */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 1996, 1998, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _JAVASOFT_JNI_MD_H_
|
||||||
|
#define _JAVASOFT_JNI_MD_H_
|
||||||
|
|
||||||
|
#define JNIEXPORT __declspec(dllexport)
|
||||||
|
#define JNIIMPORT __declspec(dllimport)
|
||||||
|
#define JNICALL __stdcall
|
||||||
|
|
||||||
|
typedef long jint;
|
||||||
|
typedef __int64 jlong;
|
||||||
|
typedef signed char jbyte;
|
||||||
|
|
||||||
|
#endif /* !_JAVASOFT_JNI_MD_H_ */
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_CaptureManagerControlNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_CaptureManagerControlNative
|
||||||
|
#define _Included_capturemanager_classes_CaptureManagerControlNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerControlNative
|
||||||
|
* Method: createControl
|
||||||
|
* Signature: (JLjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_CaptureManagerControlNative_createControl
|
||||||
|
(JNIEnv *, jobject, jlong, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerControlNative
|
||||||
|
* Method: createMisc
|
||||||
|
* Signature: (JLjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_CaptureManagerControlNative_createMisc
|
||||||
|
(JNIEnv *, jobject, jlong, jstring);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,37 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_CaptureManagerNativeProxy */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_CaptureManagerNativeProxy
|
||||||
|
#define _Included_capturemanager_classes_CaptureManagerNativeProxy
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerNativeProxy
|
||||||
|
* Method: explicitGetPtrClass
|
||||||
|
* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_CaptureManagerNativeProxy_explicitGetPtrClass
|
||||||
|
(JNIEnv *, jobject, jstring, jstring, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerNativeProxy
|
||||||
|
* Method: getPtrClass
|
||||||
|
* Signature: (Ljava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_CaptureManagerNativeProxy_freeLibrary
|
||||||
|
(JNIEnv *, jobject, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_CaptureManagerNativeProxy
|
||||||
|
* Method: Release
|
||||||
|
* Signature: (J)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_CaptureManagerNativeProxy_Release
|
||||||
|
(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_EVRSinkFactoryNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_EVRSinkFactoryNative
|
||||||
|
#define _Included_capturemanager_classes_EVRSinkFactoryNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EVRSinkFactoryNative
|
||||||
|
* Method: createOutputNode
|
||||||
|
* Signature: (JLjava/awt/Component;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_EVRSinkFactoryNative_createOutputNode
|
||||||
|
(JNIEnv *, jobject, jlong, jobject);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,37 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_EncoderControlNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_EncoderControlNative
|
||||||
|
#define _Included_capturemanager_classes_EncoderControlNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderControlNative
|
||||||
|
* Method: createEncoderNodeFactory
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_EncoderControlNative_createEncoderNodeFactory
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderControlNative
|
||||||
|
* Method: getCollectionOfEncoders
|
||||||
|
* Signature: (J)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_capturemanager_classes_EncoderControlNative_getCollectionOfEncoders
|
||||||
|
(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderControlNative
|
||||||
|
* Method: getMediaTypeCollectionOfEncoder
|
||||||
|
* Signature: (JJLjava/lang/String;)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_capturemanager_classes_EncoderControlNative_getMediaTypeCollectionOfEncoder
|
||||||
|
(JNIEnv *, jobject, jlong, jlong, jstring);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_EncoderNodeFactoryNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_EncoderNodeFactoryNative
|
||||||
|
#define _Included_capturemanager_classes_EncoderNodeFactoryNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderNodeFactoryNative
|
||||||
|
* Method: createCompressedMediaType
|
||||||
|
* Signature: (JJLjava/lang/String;II)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_EncoderNodeFactoryNative_createCompressedMediaType
|
||||||
|
(JNIEnv *, jobject, jlong, jlong, jstring, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_EncoderNodeFactoryNative
|
||||||
|
* Method: createEncoderNode
|
||||||
|
* Signature: (JJLjava/lang/String;IIJ)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_EncoderNodeFactoryNative_createEncoderNode
|
||||||
|
(JNIEnv *, jobject, jlong, jlong, jstring, jint, jint, jlong);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_FileSinkFactoryNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_FileSinkFactoryNative
|
||||||
|
#define _Included_capturemanager_classes_FileSinkFactoryNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_FileSinkFactoryNative
|
||||||
|
* Method: createOutputNodes
|
||||||
|
* Signature: (J[JLjava/lang/String;)[J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlongArray JNICALL Java_capturemanager_classes_FileSinkFactoryNative_createOutputNodes
|
||||||
|
(JNIEnv *, jobject, jlong, jlongArray, jstring);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,37 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_LogPrintOutControlNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_LogPrintOutControlNative
|
||||||
|
#define _Included_capturemanager_classes_LogPrintOutControlNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_LogPrintOutControlNative
|
||||||
|
* Method: addPrintOutDestinationNative
|
||||||
|
* Signature: (JILjava/lang/String;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_LogPrintOutControlNative_addPrintOutDestinationNative
|
||||||
|
(JNIEnv *, jobject, jlong, jint, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_LogPrintOutControlNative
|
||||||
|
* Method: removePrintOutDestinationNative
|
||||||
|
* Signature: (JILjava/lang/String;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_LogPrintOutControlNative_removePrintOutDestinationNative
|
||||||
|
(JNIEnv *, jobject, jlong, jint, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_LogPrintOutControlNative
|
||||||
|
* Method: setVerboseNative
|
||||||
|
* Signature: (JILjava/lang/String;Ljava/lang/Boolean;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_LogPrintOutControlNative_setVerboseNative
|
||||||
|
(JNIEnv *, jobject, jlong, jint, jstring, jboolean);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_SampleGrabberCallNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_SampleGrabberCallNative
|
||||||
|
#define _Included_capturemanager_classes_SampleGrabberCallNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SampleGrabberCallNative
|
||||||
|
* Method: readData
|
||||||
|
* Signature: (J[B)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_capturemanager_classes_SampleGrabberCallNative_readData
|
||||||
|
(JNIEnv *, jobject, jlong, jobject);
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_SampleGrabberCallNative_RGB32ToARGB
|
||||||
|
(JNIEnv*, jobject, jobject);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_SampleGrabberCallSinkFactoryNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_SampleGrabberCallSinkFactoryNative
|
||||||
|
#define _Included_capturemanager_classes_SampleGrabberCallSinkFactoryNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SampleGrabberCallSinkFactoryNative
|
||||||
|
* Method: createOutputNode
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;ILjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SampleGrabberCallSinkFactoryNative_createOutputNode
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jstring, jint, jstring);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_SampleGrabberCallbackSinkFactoryNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_SampleGrabberCallbackSinkFactoryNative
|
||||||
|
#define _Included_capturemanager_classes_SampleGrabberCallbackSinkFactoryNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SampleGrabberCallbackSinkFactoryNative
|
||||||
|
* Method: createOutputNode
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/Object;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SampleGrabberCallbackSinkFactoryNative_createOutputNode
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jstring, jobject);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_SessionControlNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_SessionControlNative
|
||||||
|
#define _Included_capturemanager_classes_SessionControlNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionControlNative
|
||||||
|
* Method: createSession
|
||||||
|
* Signature: (J[JLjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SessionControlNative_createSession
|
||||||
|
(JNIEnv *, jobject, jlong, jlongArray, jstring);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,61 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_SessionNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_SessionNative
|
||||||
|
#define _Included_capturemanager_classes_SessionNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: closeSession
|
||||||
|
* Signature: (J)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_closeSession
|
||||||
|
(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: addIUpdateStateListener
|
||||||
|
* Signature: (JLjava/lang/Object;)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_addIUpdateStateListener
|
||||||
|
(JNIEnv *, jobject, jlong, jobject);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: getSessionDescriptor
|
||||||
|
* Signature: (J)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_capturemanager_classes_SessionNative_getSessionDescriptor
|
||||||
|
(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: pauseSession
|
||||||
|
* Signature: (J)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_pauseSession
|
||||||
|
(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: startSession
|
||||||
|
* Signature: (JJLjava/lang/String;)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_startSession
|
||||||
|
(JNIEnv *, jobject, jlong, jlong, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: stopSession
|
||||||
|
* Signature: (J)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_stopSession
|
||||||
|
(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,29 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_SinkControlNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_SinkControlNative
|
||||||
|
#define _Included_capturemanager_classes_SinkControlNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SinkControlNative
|
||||||
|
* Method: createSinkFactory
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SinkControlNative_createSinkFactory
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SinkControlNative
|
||||||
|
* Method: getCollectionOfSinks
|
||||||
|
* Signature: (J)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_capturemanager_classes_SinkControlNative_getCollectionOfSinks
|
||||||
|
(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,53 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_SourceControlNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_SourceControlNative
|
||||||
|
#define _Included_capturemanager_classes_SourceControlNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: createSourceControl
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SourceControlNative_createSourceControl
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jstring);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: createSourceNode
|
||||||
|
* Signature: (JLjava/lang/String;II)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SourceControlNative_createSourceNode
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jint, jint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: createSourceNodeWithDownStreamConnection
|
||||||
|
* Signature: (JLjava/lang/String;IIJ)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SourceControlNative_createSourceNodeWithDownStreamConnection
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jint, jint, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: getCollectionOfSources
|
||||||
|
* Signature: (J)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_capturemanager_classes_SourceControlNative_getCollectionOfSources
|
||||||
|
(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: getSourceOutputMediaType
|
||||||
|
* Signature: (JLjava/lang/String;II)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SourceControlNative_getSourceOutputMediaType
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jint, jint);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,21 @@
|
||||||
|
/* DO NOT EDIT THIS FILE - it is machine generated */
|
||||||
|
#include <jni.h>
|
||||||
|
/* Header for class capturemanager_classes_StrideForBitmapNative */
|
||||||
|
|
||||||
|
#ifndef _Included_capturemanager_classes_StrideForBitmapNative
|
||||||
|
#define _Included_capturemanager_classes_StrideForBitmapNative
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_StrideForBitmapNative
|
||||||
|
* Method: getStrideForBitmap
|
||||||
|
* Signature: (JLjava/lang/String;I)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_capturemanager_classes_StrideForBitmapNative_getStrideForBitmap
|
||||||
|
(JNIEnv *, jobject, jlong, jstring, jint);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -0,0 +1,102 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_LogPrintOutControlNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_LogPrintOutControlNative
|
||||||
|
* Method: addPrintOutDestinationNative
|
||||||
|
* Signature: (JILjava/lang/String;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_LogPrintOutControlNative_addPrintOutDestinationNative
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jint aLevel, jstring aFilePath)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ILogPrintOutControl* lPtrILogPrintOutControl = (ILogPrintOutControl*)aPtr;
|
||||||
|
|
||||||
|
const jchar *lPtrFilePath = aPtrEnv->GetStringChars(aFilePath, nullptr);
|
||||||
|
|
||||||
|
HRESULT lres = lPtrILogPrintOutControl->addPrintOutDestination(
|
||||||
|
aLevel,
|
||||||
|
(BSTR)lPtrFilePath);
|
||||||
|
|
||||||
|
if (FAILED(lres))
|
||||||
|
{
|
||||||
|
lres = E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_LogPrintOutControlNative
|
||||||
|
* Method: removePrintOutDestinationNative
|
||||||
|
* Signature: (JILjava/lang/String;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_LogPrintOutControlNative_removePrintOutDestinationNative
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jint aLevel, jstring aFilePath)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ILogPrintOutControl* lPtrILogPrintOutControl = (ILogPrintOutControl*)aPtr;
|
||||||
|
|
||||||
|
const jchar *lPtrFilePath = aPtrEnv->GetStringChars(aFilePath, nullptr);
|
||||||
|
|
||||||
|
lPtrILogPrintOutControl->removePrintOutDestination(
|
||||||
|
aLevel,
|
||||||
|
(BSTR)lPtrFilePath);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_LogPrintOutControlNative
|
||||||
|
* Method: setVerboseNative
|
||||||
|
* Signature: (JILjava/lang/String;Ljava/lang/Boolean;)V
|
||||||
|
*/
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_LogPrintOutControlNative_setVerboseNative
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jint aLevel, jstring aFilePath, jboolean aState)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ILogPrintOutControl* lPtrILogPrintOutControl = (ILogPrintOutControl*)aPtr;
|
||||||
|
|
||||||
|
const jchar *lPtrFilePath = aPtrEnv->GetStringChars(aFilePath, nullptr);
|
||||||
|
|
||||||
|
lPtrILogPrintOutControl->setVerbose(
|
||||||
|
aLevel,
|
||||||
|
(BSTR)lPtrFilePath,
|
||||||
|
aState);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,83 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_SampleGrabberCallNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SampleGrabberCallNative
|
||||||
|
* Method: readData
|
||||||
|
* Signature: (J[B)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_capturemanager_classes_SampleGrabberCallNative_readData
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jobject byteBuffer)
|
||||||
|
{
|
||||||
|
jint lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (byteBuffer == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISampleGrabberCall> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
void* bufferAddress = aPtrEnv->GetDirectBufferAddress(byteBuffer);
|
||||||
|
|
||||||
|
if (bufferAddress == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
DWORD lReadSize;
|
||||||
|
|
||||||
|
lhr = lObject->readData(
|
||||||
|
bufferAddress,
|
||||||
|
&lReadSize);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jint) lReadSize;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT void JNICALL Java_capturemanager_classes_SampleGrabberCallNative_RGB32ToBGRA
|
||||||
|
(JNIEnv* aPtrEnv, jobject aClass, jobject byteBuffer)
|
||||||
|
{
|
||||||
|
jbyte* bufferAddress = (jbyte*) aPtrEnv->GetDirectBufferAddress(byteBuffer);
|
||||||
|
|
||||||
|
if (bufferAddress == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
jlong capacity = aPtrEnv->GetDirectBufferCapacity(byteBuffer);
|
||||||
|
|
||||||
|
//We just actually need to fill the alpha, all other values are in place for Java's BGRA. RGB32 does not set alpha (is 0).
|
||||||
|
for (jlong i = 0; i < capacity; i += 4) {
|
||||||
|
bufferAddress[i + 3] = 0xFF;//Alpha = 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,98 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_SampleGrabberCallSinkFactoryNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SampleGrabberCallSinkFactoryNative
|
||||||
|
* Method: createOutputNode
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;ILjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SampleGrabberCallSinkFactoryNative_createOutputNode
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aStringMajorType, jstring aStringSubType, jint aSampleByteSize, jstring aStringIID)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringMajorType == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringSubType == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringIID == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISampleGrabberCallSinkFactory> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringMajorType = aPtrEnv->GetStringChars(aStringMajorType, nullptr);
|
||||||
|
|
||||||
|
CLSID lMajorTypeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringMajorType, &lMajorTypeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringSubType = aPtrEnv->GetStringChars(aStringSubType, nullptr);
|
||||||
|
|
||||||
|
CLSID lSubTypeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringSubType, &lSubTypeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringIID = aPtrEnv->GetStringChars(aStringIID, nullptr);
|
||||||
|
|
||||||
|
CLSID lIID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringIID, &lIID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lOutputNode;
|
||||||
|
|
||||||
|
lhr = lObject->createOutputNode(
|
||||||
|
lMajorTypeGUID,
|
||||||
|
lSubTypeGUID,
|
||||||
|
aSampleByteSize,
|
||||||
|
lIID,
|
||||||
|
&lOutputNode);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lOutputNode.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,283 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_SampleGrabberCallbackSinkFactoryNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
|
||||||
|
class SampleGrabberCallback : public ISampleGrabberCallback
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
JavaVM * mPtrJavaVM = nullptr;
|
||||||
|
|
||||||
|
jobject mIUpdateStateListener = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
SampleGrabberCallback(
|
||||||
|
JavaVM * aPtrJavaVM,
|
||||||
|
jobject aIUpdateStateListener) :
|
||||||
|
mRefCount(1),
|
||||||
|
mPtrJavaVM(aPtrJavaVM),
|
||||||
|
mIUpdateStateListener(aIUpdateStateListener)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE invoke(
|
||||||
|
/* [in] */ REFGUID aGUIDMajorMediaType,
|
||||||
|
/* [in] */ DWORD aSampleFlags,
|
||||||
|
/* [in] */ LONGLONG aSampleTime,
|
||||||
|
/* [in] */ LONGLONG aSampleDuration,
|
||||||
|
/* [in] */ LPVOID aPtrSampleBuffer,
|
||||||
|
/* [in] */ DWORD aSampleSize)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (mPtrJavaVM == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
JNIEnv * lPtrEnv;
|
||||||
|
|
||||||
|
// double check it's all ok
|
||||||
|
int getEnvStat = mPtrJavaVM->GetEnv((void **)&lPtrEnv, JNI_VERSION_1_6);
|
||||||
|
|
||||||
|
if (getEnvStat == JNI_EDETACHED) {
|
||||||
|
|
||||||
|
if (mPtrJavaVM->AttachCurrentThread((void **)&lPtrEnv, NULL) != 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (getEnvStat == JNI_OK) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else if (getEnvStat == JNI_EVERSION) {
|
||||||
|
//std::cout << "GetEnv: version not supported" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (mIUpdateStateListener == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
jclass thisClass = lPtrEnv->GetObjectClass(mIUpdateStateListener);
|
||||||
|
|
||||||
|
if (thisClass == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
jmethodID linvoke = lPtrEnv->GetMethodID(thisClass,
|
||||||
|
"invoke", "([BI)V");
|
||||||
|
|
||||||
|
if (linvoke == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
jbyteArray lByteArray = lPtrEnv->NewByteArray(aSampleSize);
|
||||||
|
|
||||||
|
//jdouble average = lPtrEnv->CallIntMethod(
|
||||||
|
// mIUpdateStateListener, linvoke, aCallbackEventCode, aSessionDescriptor);
|
||||||
|
|
||||||
|
mPtrJavaVM->DetachCurrentThread();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, _COM_Outptr_ void __RPC_FAR *__RPC_FAR *ppvObject)
|
||||||
|
{
|
||||||
|
HRESULT lhresult = E_NOINTERFACE;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (ppvObject == NULL)
|
||||||
|
{
|
||||||
|
lhresult = E_POINTER;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lhresult = S_OK;
|
||||||
|
|
||||||
|
if (riid == IID_IUnknown)
|
||||||
|
{
|
||||||
|
*ppvObject = static_cast<IUnknown*>(this);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (riid ==
|
||||||
|
__uuidof(ISessionCallback))
|
||||||
|
{
|
||||||
|
*ppvObject = static_cast<ISampleGrabberCallback*>(this);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppvObject = NULL;
|
||||||
|
|
||||||
|
lhresult = E_NOINTERFACE;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
if (SUCCEEDED(lhresult))
|
||||||
|
AddRef();
|
||||||
|
|
||||||
|
return lhresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ULONG STDMETHODCALLTYPE AddRef(void)
|
||||||
|
{
|
||||||
|
return ++mRefCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ULONG STDMETHODCALLTYPE Release(void)
|
||||||
|
{
|
||||||
|
ULONG lCount = --mRefCount;
|
||||||
|
|
||||||
|
if (lCount == 0)
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
return lCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::atomic<ULONG> mRefCount;
|
||||||
|
|
||||||
|
virtual ~SampleGrabberCallback()
|
||||||
|
{
|
||||||
|
if (mPtrJavaVM == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
JNIEnv * lPtrEnv;
|
||||||
|
|
||||||
|
int getEnvStat = mPtrJavaVM->GetEnv((void **)&lPtrEnv, JNI_VERSION_1_6);
|
||||||
|
|
||||||
|
if (getEnvStat == JNI_EDETACHED) {
|
||||||
|
|
||||||
|
if (mPtrJavaVM->AttachCurrentThread((void **)&lPtrEnv, NULL) != 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (getEnvStat == JNI_OK) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else if (getEnvStat == JNI_EVERSION) {
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lPtrEnv)
|
||||||
|
lPtrEnv->DeleteGlobalRef(mIUpdateStateListener);
|
||||||
|
|
||||||
|
mPtrJavaVM->DetachCurrentThread();
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SampleGrabberCallbackSinkFactoryNative
|
||||||
|
* Method: createOutputNode
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/Object;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SampleGrabberCallbackSinkFactoryNative_createOutputNode
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aStringMajorType, jstring aStringSubType, jobject aPtrISampleGrabberCallback)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringMajorType == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringSubType == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrISampleGrabberCallback == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISampleGrabberCallbackSinkFactory> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringMajorType = aPtrEnv->GetStringChars(aStringMajorType, nullptr);
|
||||||
|
|
||||||
|
CLSID lMajorTypeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringMajorType, &lMajorTypeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringSubType = aPtrEnv->GetStringChars(aStringSubType, nullptr);
|
||||||
|
|
||||||
|
CLSID lSubTypeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringSubType, &lSubTypeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
auto lGlobalISampleGrabberCallback = aPtrEnv->NewGlobalRef(aPtrISampleGrabberCallback);
|
||||||
|
|
||||||
|
JavaVM * lPtrJavaVM;
|
||||||
|
|
||||||
|
auto EnvStat = aPtrEnv->GetJavaVM(&lPtrJavaVM);
|
||||||
|
|
||||||
|
if (EnvStat != JNI_OK)
|
||||||
|
break;
|
||||||
|
|
||||||
|
//JNI_VERSION_1_8
|
||||||
|
|
||||||
|
CComPtrCustom<ISampleGrabberCallback> lSampleGrabberCallback = new SampleGrabberCallback(
|
||||||
|
lPtrJavaVM,
|
||||||
|
lGlobalISampleGrabberCallback);
|
||||||
|
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lOutputNode;
|
||||||
|
|
||||||
|
lhr = lObject->createOutputNode(
|
||||||
|
lMajorTypeGUID,
|
||||||
|
lSubTypeGUID,
|
||||||
|
lSampleGrabberCallback,
|
||||||
|
&lOutputNode);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lOutputNode.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,138 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
#include "jawt_md.h"
|
||||||
|
#include "JNI\capturemanager_classes_SessionControlNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionControlNative
|
||||||
|
* Method: createSession
|
||||||
|
* Signature: (J[JLjava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SessionControlNative_createSession
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jlongArray aPtrSourceNodesOfTopologys, jstring aStringIID)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aClass == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrSourceNodesOfTopologys == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringIID == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISessionControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
const jchar *lPtrStringIID = aPtrEnv->GetStringChars(aStringIID, nullptr);
|
||||||
|
|
||||||
|
CLSID lInterfaceID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringIID, &lInterfaceID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
auto lPtrSourceNodesOfTopologys = aPtrEnv->GetLongArrayElements(aPtrSourceNodesOfTopologys, nullptr);
|
||||||
|
|
||||||
|
if (lPtrSourceNodesOfTopologys == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
auto lArrayLength = aPtrEnv->GetArrayLength(aPtrSourceNodesOfTopologys);
|
||||||
|
|
||||||
|
SAFEARRAY* pSA = NULL;
|
||||||
|
SAFEARRAYBOUND bound[1];
|
||||||
|
bound[0].lLbound = 0;
|
||||||
|
bound[0].cElements = lArrayLength;
|
||||||
|
pSA = SafeArrayCreate(VT_VARIANT, 1, bound);
|
||||||
|
|
||||||
|
for (long i = 0; i < lArrayLength; i++)
|
||||||
|
{
|
||||||
|
jlong lPtr = lPtrSourceNodesOfTopologys[i];
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)lPtr;
|
||||||
|
|
||||||
|
VARIANT lVar;
|
||||||
|
|
||||||
|
VariantInit(&lVar);
|
||||||
|
|
||||||
|
lVar.vt = VT_UNKNOWN;
|
||||||
|
|
||||||
|
lVar.punkVal = lPtrIUnknown;
|
||||||
|
|
||||||
|
lhr = SafeArrayPutElement(pSA, &i, &lVar);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
VARIANT theArray;
|
||||||
|
|
||||||
|
VariantInit(&theArray);
|
||||||
|
|
||||||
|
theArray.vt = VT_SAFEARRAY | VT_UNKNOWN;
|
||||||
|
|
||||||
|
theArray.parray = pSA;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lSession;
|
||||||
|
|
||||||
|
lhr = lObject->createSession(
|
||||||
|
theArray,
|
||||||
|
lInterfaceID,
|
||||||
|
&lSession);
|
||||||
|
|
||||||
|
SafeArrayDestroy(pSA);
|
||||||
|
|
||||||
|
VariantClear(&theArray);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lSession.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,475 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_SessionNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#define IID_PPV_ARGSIUnknown(ppType) __uuidof(**(ppType)), (IUnknown**)(ppType)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class SessionCallback : public ISessionCallback
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
|
||||||
|
JavaVM * mPtrJavaVM = nullptr;
|
||||||
|
|
||||||
|
jobject mIUpdateStateListener = nullptr;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
SessionCallback(
|
||||||
|
JavaVM * aPtrJavaVM,
|
||||||
|
jobject aIUpdateStateListener) :
|
||||||
|
mRefCount(1),
|
||||||
|
mPtrJavaVM(aPtrJavaVM),
|
||||||
|
mIUpdateStateListener(aIUpdateStateListener)
|
||||||
|
{}
|
||||||
|
|
||||||
|
virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE invoke(
|
||||||
|
/* [in] */ DWORD aCallbackEventCode,
|
||||||
|
/* [in] */ DWORD aSessionDescriptor)
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (mPtrJavaVM == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
JNIEnv * lPtrEnv;
|
||||||
|
|
||||||
|
// double check it's all ok
|
||||||
|
int getEnvStat = mPtrJavaVM->GetEnv((void **)&lPtrEnv, JNI_VERSION_1_6);
|
||||||
|
|
||||||
|
if (getEnvStat == JNI_EDETACHED) {
|
||||||
|
|
||||||
|
if (mPtrJavaVM->AttachCurrentThread((void **)&lPtrEnv, NULL) != 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (getEnvStat == JNI_OK) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else if (getEnvStat == JNI_EVERSION) {
|
||||||
|
//std::cout << "GetEnv: version not supported" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if (mIUpdateStateListener == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
jclass thisClass = lPtrEnv->GetObjectClass(mIUpdateStateListener);
|
||||||
|
|
||||||
|
if (thisClass == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
jmethodID linvoke = lPtrEnv->GetMethodID(thisClass,
|
||||||
|
"invoke", "(II)V");
|
||||||
|
|
||||||
|
if (linvoke == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
jdouble average = lPtrEnv->CallIntMethod(
|
||||||
|
mIUpdateStateListener, linvoke, aCallbackEventCode, aSessionDescriptor);
|
||||||
|
|
||||||
|
mPtrJavaVM->DetachCurrentThread();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
|
||||||
|
return S_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, _COM_Outptr_ void __RPC_FAR *__RPC_FAR *ppvObject)
|
||||||
|
{
|
||||||
|
HRESULT lhresult = E_NOINTERFACE;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (ppvObject == NULL)
|
||||||
|
{
|
||||||
|
lhresult = E_POINTER;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lhresult = S_OK;
|
||||||
|
|
||||||
|
if (riid == IID_IUnknown)
|
||||||
|
{
|
||||||
|
*ppvObject = static_cast<IUnknown*>(this);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (riid ==
|
||||||
|
__uuidof(ISessionCallback))
|
||||||
|
{
|
||||||
|
*ppvObject = static_cast<ISessionCallback*>(this);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppvObject = NULL;
|
||||||
|
|
||||||
|
lhresult = E_NOINTERFACE;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
if (SUCCEEDED(lhresult))
|
||||||
|
AddRef();
|
||||||
|
|
||||||
|
return lhresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ULONG STDMETHODCALLTYPE AddRef(void)
|
||||||
|
{
|
||||||
|
return ++mRefCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ULONG STDMETHODCALLTYPE Release(void)
|
||||||
|
{
|
||||||
|
ULONG lCount = --mRefCount;
|
||||||
|
|
||||||
|
if (lCount == 0)
|
||||||
|
{
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
return lCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::atomic<ULONG> mRefCount;
|
||||||
|
|
||||||
|
virtual ~SessionCallback()
|
||||||
|
{
|
||||||
|
if (mPtrJavaVM == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
JNIEnv * lPtrEnv;
|
||||||
|
|
||||||
|
int getEnvStat = mPtrJavaVM->GetEnv((void **)&lPtrEnv, JNI_VERSION_1_6);
|
||||||
|
|
||||||
|
if (getEnvStat == JNI_EDETACHED) {
|
||||||
|
|
||||||
|
if (mPtrJavaVM->AttachCurrentThread((void **)&lPtrEnv, NULL) != 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (getEnvStat == JNI_OK) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
else if (getEnvStat == JNI_EVERSION) {
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lPtrEnv)
|
||||||
|
lPtrEnv->DeleteGlobalRef(mIUpdateStateListener);
|
||||||
|
|
||||||
|
mPtrJavaVM->DetachCurrentThread();
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: closeSession
|
||||||
|
* Signature: (J)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_closeSession
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr)
|
||||||
|
{
|
||||||
|
jboolean lresult = JNI_FALSE;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISession> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lhr = lObject->closeSession();
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = JNI_TRUE;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: addIUpdateStateListener
|
||||||
|
* Signature: (JLjava/lang/Object;)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_addIUpdateStateListener
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jobject aIUpdateStateListener)
|
||||||
|
{
|
||||||
|
jboolean lresult = JNI_FALSE;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISession> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
CComPtrCustom<IConnectionPointContainer> IConnectionPointContainer;
|
||||||
|
|
||||||
|
lhr = lObject->getIConnectionPointContainer(
|
||||||
|
IID_PPV_ARGSIUnknown(&IConnectionPointContainer));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IConnectionPoint> lConnectionPoint;
|
||||||
|
|
||||||
|
lhr = IConnectionPointContainer->FindConnectionPoint(
|
||||||
|
__uuidof(ISessionCallback),
|
||||||
|
&lConnectionPoint);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
auto lGlobalIUpdateStateListener = aPtrEnv->NewGlobalRef(aIUpdateStateListener);
|
||||||
|
|
||||||
|
JavaVM * lPtrJavaVM;
|
||||||
|
|
||||||
|
auto EnvStat = aPtrEnv->GetJavaVM(&lPtrJavaVM);
|
||||||
|
|
||||||
|
if (EnvStat != JNI_OK)
|
||||||
|
break;
|
||||||
|
|
||||||
|
//JNI_VERSION_1_8
|
||||||
|
|
||||||
|
CComPtrCustom<ISessionCallback> lSessionCallback = new SessionCallback(
|
||||||
|
lPtrJavaVM,
|
||||||
|
lGlobalIUpdateStateListener);
|
||||||
|
|
||||||
|
DWORD lStreamID;
|
||||||
|
|
||||||
|
lhr = lConnectionPoint->Advise(
|
||||||
|
lSessionCallback,
|
||||||
|
&lStreamID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = JNI_TRUE;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: getSessionDescriptor
|
||||||
|
* Signature: (J)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_capturemanager_classes_SessionNative_getSessionDescriptor
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr)
|
||||||
|
{
|
||||||
|
jint lresult = -1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISession> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
DWORD lSessionDescriptor = 0;
|
||||||
|
|
||||||
|
lhr = lObject->getSessionDescriptor(&lSessionDescriptor);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = lSessionDescriptor;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: pauseSession
|
||||||
|
* Signature: (J)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_pauseSession
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr)
|
||||||
|
{
|
||||||
|
jboolean lresult = JNI_FALSE;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISession> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lhr = lObject->pauseSession();
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = JNI_TRUE;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: startSession
|
||||||
|
* Signature: (JJLjava/lang/String;)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_startSession
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jlong aStartTime, jstring aStringGUIDTimeType)
|
||||||
|
{
|
||||||
|
jboolean lresult = JNI_FALSE;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISession> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringIID = aPtrEnv->GetStringChars(aStringGUIDTimeType, nullptr);
|
||||||
|
|
||||||
|
CLSID lGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringIID, &lGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lhr = lObject->startSession(
|
||||||
|
aStartTime,
|
||||||
|
lGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = JNI_TRUE;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SessionNative
|
||||||
|
* Method: stopSession
|
||||||
|
* Signature: (J)Z
|
||||||
|
*/
|
||||||
|
JNIEXPORT jboolean JNICALL Java_capturemanager_classes_SessionNative_stopSession
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr)
|
||||||
|
{
|
||||||
|
jboolean lresult = JNI_FALSE;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISession> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lhr = lObject->stopSession();
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = JNI_TRUE;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,127 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_SinkControlNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SinkControlNative
|
||||||
|
* Method: createSinkFactory
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SinkControlNative_createSinkFactory
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aStringContainerTypeGUID, jstring aStringIID)
|
||||||
|
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISinkControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringContainerTypeGUID = aPtrEnv->GetStringChars(aStringContainerTypeGUID, nullptr);
|
||||||
|
|
||||||
|
CLSID lContainerTypeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringContainerTypeGUID, &lContainerTypeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringIID = aPtrEnv->GetStringChars(aStringIID, nullptr);
|
||||||
|
|
||||||
|
CLSID lInterfaceID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringIID, &lInterfaceID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lIUnknown;
|
||||||
|
|
||||||
|
lhr = lObject->createSinkFactory(
|
||||||
|
lContainerTypeGUID,
|
||||||
|
lInterfaceID,
|
||||||
|
&lIUnknown);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (!lIUnknown)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lIUnknown.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SinkControlNative
|
||||||
|
* Method: getCollectionOfSinks
|
||||||
|
* Signature: (J)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_capturemanager_classes_SinkControlNative_getCollectionOfSinks
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr)
|
||||||
|
{
|
||||||
|
jstring lresult = nullptr;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISinkControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
BSTR lXMLstring = nullptr;
|
||||||
|
|
||||||
|
lhr = lObject->getCollectionOfSinks(&lXMLstring);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
auto lLength = SysStringLen(lXMLstring);
|
||||||
|
|
||||||
|
lresult = aPtrEnv->NewString((jchar*)lXMLstring, lLength);
|
||||||
|
|
||||||
|
SysFreeString(lXMLstring);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,273 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_SourceControlNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: createSourceControl
|
||||||
|
* Signature: (JLjava/lang/String;Ljava/lang/String;)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SourceControlNative_createSourceControl
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aSymbolicLink, jstring aStringIID)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aSymbolicLink == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISourceControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
const jchar *lPtrStringIID = aPtrEnv->GetStringChars(aStringIID, nullptr);
|
||||||
|
|
||||||
|
CLSID lIID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringIID, &lIID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lControl;
|
||||||
|
|
||||||
|
const jchar *lPtrSymbolicLink = aPtrEnv->GetStringChars(aSymbolicLink, nullptr);
|
||||||
|
|
||||||
|
lhr = lObject->createSourceControl(
|
||||||
|
(wchar_t*)lPtrSymbolicLink,
|
||||||
|
lIID,
|
||||||
|
&lControl);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lControl.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: createSourceNode
|
||||||
|
* Signature: (JLjava/lang/String;II)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SourceControlNative_createSourceNode
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aSymbolicLink, jint aStreamIndex, jint aMediaTypeIndex)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aSymbolicLink == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISourceControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lSourceNode;
|
||||||
|
|
||||||
|
const jchar *lPtrSymbolicLink = aPtrEnv->GetStringChars(aSymbolicLink, nullptr);
|
||||||
|
|
||||||
|
lhr = lObject->createSourceNode(
|
||||||
|
(wchar_t*)lPtrSymbolicLink,
|
||||||
|
aStreamIndex,
|
||||||
|
aMediaTypeIndex,
|
||||||
|
&lSourceNode);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lSourceNode.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: createSourceNodeWithDownStreamConnection
|
||||||
|
* Signature: (JLjava/lang/String;IIJ)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SourceControlNative_createSourceNodeWithDownStreamConnection
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aSymbolicLink, jint aStreamIndex, jint aMediaTypeIndex, jlong aDownStreamPtr)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aDownStreamPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISourceControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrDownStream = (IUnknown*)aDownStreamPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lSourceNode;
|
||||||
|
|
||||||
|
const jchar *lPtrSymbolicLink = aPtrEnv->GetStringChars(aSymbolicLink, nullptr);
|
||||||
|
|
||||||
|
lhr = lObject->createSourceNodeWithDownStreamConnection(
|
||||||
|
(wchar_t*)lPtrSymbolicLink,
|
||||||
|
aStreamIndex,
|
||||||
|
aMediaTypeIndex,
|
||||||
|
lPtrDownStream,
|
||||||
|
&lSourceNode);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lSourceNode.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: getCollectionOfSources
|
||||||
|
* Signature: (J)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jstring JNICALL Java_capturemanager_classes_SourceControlNative_getCollectionOfSources
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr)
|
||||||
|
{
|
||||||
|
jstring lresult = nullptr;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISourceControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
BSTR lXMLstring = nullptr;
|
||||||
|
|
||||||
|
lhr = lObject->getCollectionOfSources(&lXMLstring);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
auto lLength = SysStringLen(lXMLstring);
|
||||||
|
|
||||||
|
lresult = aPtrEnv->NewString((jchar*)lXMLstring, lLength);
|
||||||
|
|
||||||
|
SysFreeString(lXMLstring);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_SourceControlNative
|
||||||
|
* Method: getSourceOutputMediaType
|
||||||
|
* Signature: (JLjava/lang/String;II)J
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_capturemanager_classes_SourceControlNative_getSourceOutputMediaType
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aSymbolicLink, jint aStreamIndex, jint aMediaTypeIndex)
|
||||||
|
{
|
||||||
|
jlong lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aSymbolicLink == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<ISourceControl> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
CComPtrCustom<IUnknown> lMediaType;
|
||||||
|
|
||||||
|
const jchar *lPtrSymbolicLink = aPtrEnv->GetStringChars(aSymbolicLink, nullptr);
|
||||||
|
|
||||||
|
lhr = lObject->getSourceOutputMediaType(
|
||||||
|
(wchar_t*)lPtrSymbolicLink,
|
||||||
|
aStreamIndex,
|
||||||
|
aMediaTypeIndex,
|
||||||
|
&lMediaType);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jlong)lMediaType.detach();
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,72 @@
|
||||||
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
|
||||||
|
|
||||||
|
#include <Unknwnbase.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "JNI\capturemanager_classes_StrideForBitmapNative.h"
|
||||||
|
#include "CaptureManagerTypeInfo.h"
|
||||||
|
#include "ComPtrCustom.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
/*
|
||||||
|
* Class: capturemanager_classes_StrideForBitmapNative
|
||||||
|
* Method: getStrideForBitmap
|
||||||
|
* Signature: (JLjava/lang/String;I)I
|
||||||
|
*/
|
||||||
|
JNIEXPORT jint JNICALL Java_capturemanager_classes_StrideForBitmapNative_getStrideForBitmap
|
||||||
|
(JNIEnv * aPtrEnv, jobject aClass, jlong aPtr, jstring aStringMediaType, jint aWidthInPixels)
|
||||||
|
{
|
||||||
|
jint lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrEnv == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aStringMediaType == nullptr)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IUnknown* lPtrIUnknown = (IUnknown*)aPtr;
|
||||||
|
|
||||||
|
CComPtrCustom<IStrideForBitmap> lObject;
|
||||||
|
|
||||||
|
HRESULT lhr = lPtrIUnknown->QueryInterface(IID_PPV_ARGS(&lObject));
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
const jchar *lPtrStringContainerTypeGUID = aPtrEnv->GetStringChars(aStringMediaType, nullptr);
|
||||||
|
|
||||||
|
CLSID lMediaTypeGUID;
|
||||||
|
|
||||||
|
lhr = CLSIDFromString((wchar_t*)lPtrStringContainerTypeGUID, &lMediaTypeGUID);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
LONG lStride = 0;
|
||||||
|
|
||||||
|
lhr = lObject->getStrideForBitmap(
|
||||||
|
lMediaTypeGUID,
|
||||||
|
aWidthInPixels,
|
||||||
|
&lStride);
|
||||||
|
|
||||||
|
if (FAILED(lhr))
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = (jint)lStride;
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -0,0 +1,9 @@
|
||||||
|
# Introduction
|
||||||
|
|
||||||
|
This is the code for the proxy DLL that the Java JNI code in this repository uses to communicate with the real CaptureManagerSDK DLL.
|
||||||
|
|
||||||
|
I have not coded this, it's just a copy of `CaptureManagerToJavaProxy.zip` downloaded from https://www.codeproject.com/Articles/1017223/CaptureManager-SDK-Capturing-Recording-and-Streami with a very simple modification in method `Java_capturemanager_classes_SampleGrabberCallNative_readData` of file `SampleGrabberCallNative.cpp` to avoid very high memory usage due to copying. This method received an array argument where data was copied. With my modified version it receives a direct Java ByteBuffer instance.
|
||||||
|
|
||||||
|
The already-built DLLs can be found in the natives directory of this same repository. The code is here for reference and bulding a custom DLL.
|
||||||
|
|
||||||
|
Note: Only `SampleGrabberCallNative` mode is used in the Java driver. I was not able to make Callback mode work correctly. Fortunately reading directly from the buffer into JavaFX images is possible, avoiding the conversion to a `BufferedImage` every frame.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,346 @@
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
|
<groupId>com.github.eduramiba</groupId>
|
||||||
|
<artifactId>webcam-capture-driver-native</artifactId>
|
||||||
|
<version>1.0.0-SNAPSHOT</version>
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
|
<name>Webcam Capture Driver Native</name>
|
||||||
|
<description>Native driver for Webcam-capture project</description>
|
||||||
|
<inceptionYear>2021</inceptionYear>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<java.version>11</java.version>
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
|
|
||||||
|
<!-- Dependencies versions -->
|
||||||
|
<driver.slf4j.version>1.7.30</driver.slf4j.version>
|
||||||
|
|
||||||
|
<driver.webcam-capture.version>0.3.13-SNAPSHOT</driver.webcam-capture.version>
|
||||||
|
<driver.aalto-xml.version>1.3.0</driver.aalto-xml.version>
|
||||||
|
<driver.commons-lang3.version>3.12.0</driver.commons-lang3.version>
|
||||||
|
|
||||||
|
<driver.javafx.version>16</driver.javafx.version>
|
||||||
|
|
||||||
|
<!-- Plugins versions -->
|
||||||
|
<driver.maven-compiler-plugin.version>3.8.1</driver.maven-compiler-plugin.version>
|
||||||
|
<driver.maven-assembly-plugin.version>3.3.0</driver.maven-assembly-plugin.version>
|
||||||
|
<driver.maven-clean-plugin.version>3.1.0</driver.maven-clean-plugin.version>
|
||||||
|
<driver.maven-deploy-plugin.version>2.8.2</driver.maven-deploy-plugin.version>
|
||||||
|
<driver.maven-install-plugin.version>2.5.2</driver.maven-install-plugin.version>
|
||||||
|
<driver.maven-jar-plugin.version>3.2.0</driver.maven-jar-plugin.version>
|
||||||
|
<driver.maven-dependency-plugin.version>3.2.0</driver.maven-dependency-plugin.version>
|
||||||
|
<driver.maven-resources-plugin.version>3.2.0</driver.maven-resources-plugin.version>
|
||||||
|
<driver.copy-rename-maven-plugin.version>1.0.1</driver.copy-rename-maven-plugin.version>
|
||||||
|
<driver.maven-site-plugin.version>3.9.1</driver.maven-site-plugin.version>
|
||||||
|
<driver.build-helper-maven-plugin.version>3.2.0</driver.build-helper-maven-plugin.version>
|
||||||
|
<driver.maven-surefire-plugin.version>2.22.2</driver.maven-surefire-plugin.version>
|
||||||
|
<driver.maven-failsafe-plugin.version>2.22.2</driver.maven-failsafe-plugin.version>
|
||||||
|
<driver.maven-exec-plugin.version>3.0.0</driver.maven-exec-plugin.version>
|
||||||
|
<driver.modernizer-plugin.version>2.2.0</driver.modernizer-plugin.version>
|
||||||
|
<driver.versions-maven-plugin.version>2.8.1</driver.versions-maven-plugin.version>
|
||||||
|
<driver.help-maven-plugin.version>3.2.0</driver.help-maven-plugin.version>
|
||||||
|
<driver.maven-enforcer-plugin.version>3.0.0-M2</driver.maven-enforcer-plugin.version>
|
||||||
|
<driver.maven-enforcer-plugin.extra-rules.version>1.3</driver.maven-enforcer-plugin.extra-rules.version>
|
||||||
|
<driver.errorprone-plugin.version>2.7.1</driver.errorprone-plugin.version>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencyManagement>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.sarxos</groupId>
|
||||||
|
<artifactId>webcam-capture</artifactId>
|
||||||
|
<version>${driver.webcam-capture.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml</groupId>
|
||||||
|
<artifactId>aalto-xml</artifactId>
|
||||||
|
<version>${driver.aalto-xml.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-graphics</artifactId>
|
||||||
|
<version>${driver.javafx.version}</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Logging -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
<version>${driver.slf4j.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</dependencyManagement>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.sarxos</groupId>
|
||||||
|
<artifactId>webcam-capture</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.fasterxml</groupId>
|
||||||
|
<artifactId>aalto-xml</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.openjfx</groupId>
|
||||||
|
<artifactId>javafx-graphics</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Logging -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.slf4j</groupId>
|
||||||
|
<artifactId>slf4j-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<pluginManagement>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${driver.maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
<release>${java.version}</release><!-- Ensure Java version compatibility by checking APIs used -->
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
|
<version>${driver.maven-assembly-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
|
<version>${driver.maven-clean-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-deploy-plugin</artifactId>
|
||||||
|
<version>${driver.maven-deploy-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-install-plugin</artifactId>
|
||||||
|
<version>${driver.maven-install-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
|
<version>${driver.maven-jar-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-dependency-plugin</artifactId>
|
||||||
|
<version>${driver.maven-dependency-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
|
<version>${driver.maven-resources-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>com.coderplus.maven.plugins</groupId>
|
||||||
|
<artifactId>copy-rename-maven-plugin</artifactId>
|
||||||
|
<version>${driver.copy-rename-maven-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-site-plugin</artifactId>
|
||||||
|
<version>${driver.maven-site-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>build-helper-maven-plugin</artifactId>
|
||||||
|
<version>${driver.build-helper-maven-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>${driver.maven-surefire-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<trimStackTrace>false</trimStackTrace>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-failsafe-plugin</artifactId>
|
||||||
|
<version>${driver.maven-failsafe-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<trimStackTrace>false</trimStackTrace>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
<version>${driver.maven-exec-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.gaul</groupId>
|
||||||
|
<artifactId>modernizer-maven-plugin</artifactId>
|
||||||
|
<version>${driver.modernizer-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-enforcer-plugin</artifactId>
|
||||||
|
<version>${driver.maven-enforcer-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<!--
|
||||||
|
Check new versions with:
|
||||||
|
mvn versions:display-property-updates
|
||||||
|
-->
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>versions-maven-plugin</artifactId>
|
||||||
|
<version>${driver.versions-maven-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<!--suppress UnresolvedMavenProperty -->
|
||||||
|
<rulesUri>file:///${session.executionRootDirectory}/maven-version-rules.xml</rulesUri>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-help-plugin</artifactId>
|
||||||
|
<version>${driver.help-maven-plugin.version}</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
|
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-enforcer-plugin</artifactId>
|
||||||
|
<version>${driver.maven-enforcer-plugin.version}</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>maven-enforcer-check</id>
|
||||||
|
<goals>
|
||||||
|
<goal>enforce</goal>
|
||||||
|
</goals>
|
||||||
|
<configuration>
|
||||||
|
<rules>
|
||||||
|
<requireMavenVersion>
|
||||||
|
<version>[3.6.0,)</version>
|
||||||
|
<message>Maven 3.6.0 or newer required</message>
|
||||||
|
</requireMavenVersion>
|
||||||
|
<enforceBytecodeVersion>
|
||||||
|
<maxJdkVersion>${java.version}</maxJdkVersion>
|
||||||
|
<ignoreClasses>
|
||||||
|
<ignoreClass>module-info</ignoreClass>
|
||||||
|
</ignoreClasses>
|
||||||
|
<ignoredScopes>test</ignoredScopes>
|
||||||
|
</enforceBytecodeVersion>
|
||||||
|
<banCircularDependencies/>
|
||||||
|
<banDuplicateClasses>
|
||||||
|
<findAllDuplicates>true</findAllDuplicates>
|
||||||
|
<ignoreWhenIdentical>true</ignoreWhenIdentical>
|
||||||
|
</banDuplicateClasses>
|
||||||
|
<requireReleaseDeps>
|
||||||
|
<message>No Snapshots Allowed For Release Versions</message>
|
||||||
|
<onlyWhenRelease>true</onlyWhenRelease>
|
||||||
|
</requireReleaseDeps>
|
||||||
|
<dependencyConvergence/>
|
||||||
|
<reactorModuleConvergence>
|
||||||
|
<message>The reactor is not valid</message>
|
||||||
|
<ignoreModuleDependencies>true</ignoreModuleDependencies>
|
||||||
|
</reactorModuleConvergence>
|
||||||
|
</rules>
|
||||||
|
<fail>true</fail>
|
||||||
|
<failFast>true</failFast>
|
||||||
|
</configuration>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>extra-enforcer-rules</artifactId>
|
||||||
|
<version>${driver.maven-enforcer-plugin.extra-rules.version}</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<!-- Checks uses of deprecated Java APIs and fails the build if any is
|
||||||
|
present -->
|
||||||
|
<groupId>org.gaul</groupId>
|
||||||
|
<artifactId>modernizer-maven-plugin</artifactId>
|
||||||
|
<configuration>
|
||||||
|
<javaVersion>${java.version}</javaVersion>
|
||||||
|
<failOnViolations>true</failOnViolations>
|
||||||
|
<ignorePackages>org.driver.os.rest.security.html</ignorePackages>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>modernizer</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>modernizer</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>check-error-prone</id>
|
||||||
|
<activation>
|
||||||
|
<activeByDefault>true</activeByDefault>
|
||||||
|
</activation>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
|
<version>${driver.maven-compiler-plugin.version}</version>
|
||||||
|
<configuration>
|
||||||
|
<source>${java.version}</source>
|
||||||
|
<target>${java.version}</target>
|
||||||
|
<release>${java.version}</release><!-- Ensure Java version compatibility by checking APIs used -->
|
||||||
|
<compilerArgs>
|
||||||
|
<arg>-XDcompilePolicy=simple</arg>
|
||||||
|
<arg>-Xplugin:ErrorProne</arg>
|
||||||
|
</compilerArgs>
|
||||||
|
<annotationProcessorPaths>
|
||||||
|
<path>
|
||||||
|
<groupId>com.google.errorprone</groupId>
|
||||||
|
<artifactId>error_prone_core</artifactId>
|
||||||
|
<version>${driver.errorprone-plugin.version}</version>
|
||||||
|
</path>
|
||||||
|
</annotationProcessorPaths>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
<profile>
|
||||||
|
<id>deployment</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<!-- Attach sources when deploying -->
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar-no-fork</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
|
@ -0,0 +1,145 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.*;
|
||||||
|
|
||||||
|
public class CaptureManager {
|
||||||
|
|
||||||
|
private static CaptureManager mInstance = null;
|
||||||
|
|
||||||
|
private ICaptureManagerNativeProxy mCaptureManagerNativeProxy = null;
|
||||||
|
|
||||||
|
private ICaptureManagerControl mICaptureManagerControl = null;
|
||||||
|
|
||||||
|
private ILogPrintOutControl mILogPrintOutControl = null;
|
||||||
|
|
||||||
|
private static Object mlockObject = new Object();
|
||||||
|
|
||||||
|
public static CaptureManager getInstance() {
|
||||||
|
synchronized (mlockObject) {
|
||||||
|
if (mInstance != null)
|
||||||
|
return mInstance;
|
||||||
|
|
||||||
|
boolean lstate = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (mInstance == null) {
|
||||||
|
mInstance = new CaptureManager();
|
||||||
|
|
||||||
|
mInstance.mCaptureManagerNativeProxy = CaptureManagerNativeProxy.getInstance();
|
||||||
|
|
||||||
|
lstate = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
|
||||||
|
if (mInstance != null && lstate == false)
|
||||||
|
mInstance.mCaptureManagerNativeProxy = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private CaptureManager() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean checkFailNative() {
|
||||||
|
return mCaptureManagerNativeProxy == null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void freeLibrary() {
|
||||||
|
do {
|
||||||
|
if (checkFailNative())
|
||||||
|
break;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (mICaptureManagerControl != null)
|
||||||
|
mICaptureManagerControl.release();
|
||||||
|
|
||||||
|
if (mILogPrintOutControl != null)
|
||||||
|
mILogPrintOutControl.release();
|
||||||
|
|
||||||
|
mCaptureManagerNativeProxy.freeLibrary(
|
||||||
|
CaptureManagerNativeProxy.CaptureManagerFileName
|
||||||
|
);
|
||||||
|
|
||||||
|
mCaptureManagerNativeProxy = null;
|
||||||
|
|
||||||
|
CaptureManagerNativeProxy.freeInstance();
|
||||||
|
|
||||||
|
CaptureManagerNativeProxy.release();
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ILogPrintOutControl getILogPrintOutControl() {
|
||||||
|
ILogPrintOutControl lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (checkFailNative())
|
||||||
|
break;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
long aPtr = mCaptureManagerNativeProxy.explicitGetPtrClass(
|
||||||
|
CaptureManagerNativeProxy.CaptureManagerFileName,
|
||||||
|
LogPrintOutControl.CLSID_CoLogPrintOut,
|
||||||
|
LogPrintOutControl.IID_ILogPrintOutControl);
|
||||||
|
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new LogPrintOutControl(aPtr);
|
||||||
|
|
||||||
|
mILogPrintOutControl = lresult;
|
||||||
|
} finally {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return mILogPrintOutControl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ICaptureManagerControl getICaptureManagerControl() {
|
||||||
|
ICaptureManagerControl lresult = new CaptureManagerControl(0);
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (checkFailNative())
|
||||||
|
break;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (mICaptureManagerControl != null) {
|
||||||
|
lresult = mICaptureManagerControl;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
long aPtr = mCaptureManagerNativeProxy.explicitGetPtrClass(
|
||||||
|
CaptureManagerNativeProxy.CaptureManagerFileName,
|
||||||
|
CaptureManagerControl.CLSID_CoCaptureManager,
|
||||||
|
CaptureManagerControl.IID_ICaptureManagerControl);
|
||||||
|
|
||||||
|
if (aPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new CaptureManagerControl(aPtr);
|
||||||
|
|
||||||
|
mICaptureManagerControl = lresult;
|
||||||
|
} finally {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,235 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.*;
|
||||||
|
|
||||||
|
final class CaptureManagerControl extends CaptureManagerControlNative implements ICaptureManagerControl {
|
||||||
|
|
||||||
|
protected static final String CLSID_CoCaptureManager = "{D5F07FB8-CE60-4017-B215-95C8A0DDF42A}";
|
||||||
|
|
||||||
|
protected static final String IID_ICaptureManagerControl = "{D4F5F10A-8F70-43CF-8CF1-EC331DA2F829}";
|
||||||
|
|
||||||
|
CaptureManagerControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
public void release() {
|
||||||
|
if (mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCollectionOfSources() {
|
||||||
|
String lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createControl(
|
||||||
|
mPtr,
|
||||||
|
SourceControl.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ISourceControl lISourceControl = new SourceControl(lPtr);
|
||||||
|
|
||||||
|
lresult = lISourceControl.getCollectionOfSources();
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCollectionOfSinks() {
|
||||||
|
String lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createControl(
|
||||||
|
mPtr,
|
||||||
|
SinkControl.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
ISinkControl lISinkControl = new SinkControl(lPtr);
|
||||||
|
|
||||||
|
lresult = lISinkControl.getCollectionOfSinks();
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISourceControl createSourceControl() {
|
||||||
|
ISourceControl lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createControl(
|
||||||
|
mPtr,
|
||||||
|
SourceControl.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new SourceControl(lPtr);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISessionControl createSessionControl() {
|
||||||
|
ISessionControl lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createControl(
|
||||||
|
mPtr,
|
||||||
|
SessionControl.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new SessionControl(lPtr);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISinkControl createSinkControl() {
|
||||||
|
ISinkControl lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createControl(
|
||||||
|
mPtr,
|
||||||
|
SinkControl.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new SinkControl(lPtr);
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamControl createStreamControl() {
|
||||||
|
IStreamControl lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createControl(
|
||||||
|
mPtr,
|
||||||
|
StreamControl.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new StreamControl(lPtr);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IEncoderControl createEncoderControl() {
|
||||||
|
IEncoderControl lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createControl(
|
||||||
|
mPtr,
|
||||||
|
EncoderControl.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new EncoderControl(lPtr);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getStrideForBitmapInfoHeader(
|
||||||
|
String aStringMFVideoFormat,
|
||||||
|
int aWidthInPixels) {
|
||||||
|
|
||||||
|
int lresult = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createMisc(
|
||||||
|
mPtr,
|
||||||
|
StrideForBitmap.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
IStrideForBitmap lStrideForBitmap = new StrideForBitmap(lPtr);
|
||||||
|
|
||||||
|
lresult = lStrideForBitmap.getStrideForBitmap(aStringMFVideoFormat, aWidthInPixels);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IVersionControl getVersionControl() {
|
||||||
|
|
||||||
|
IVersionControl lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createMisc(
|
||||||
|
mPtr,
|
||||||
|
VersionControl.IID);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new VersionControl(lPtr);
|
||||||
|
|
||||||
|
} while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class CaptureManagerControlNative {
|
||||||
|
|
||||||
|
native protected long createControl(
|
||||||
|
long aPtr,
|
||||||
|
String aStringIID);
|
||||||
|
|
||||||
|
native protected long createMisc(
|
||||||
|
long aPtr,
|
||||||
|
String aStringIID);
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.ICaptureManagerNativeProxy;
|
||||||
|
import capturemanager.utils.NativeUtils;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
final class CaptureManagerNativeProxy implements ICaptureManagerNativeProxy {
|
||||||
|
private static final Logger LOG = LoggerFactory.getLogger(CaptureManagerNativeProxy.class);
|
||||||
|
|
||||||
|
private static final String NativeProxyFile = "CaptureManagerNativeProxy.dll";
|
||||||
|
|
||||||
|
private static final String CaptureManagerFile = "CaptureManager.dll";
|
||||||
|
|
||||||
|
public static String CaptureManagerFileName = "";
|
||||||
|
|
||||||
|
public static String NativeProxyFileName = "";
|
||||||
|
|
||||||
|
private static File CaptureManagerFileRef = null;
|
||||||
|
|
||||||
|
private static File NativeProxyFilePath = null;
|
||||||
|
|
||||||
|
static {
|
||||||
|
|
||||||
|
try {
|
||||||
|
CaptureManagerFileRef = NativeUtils.loadLibrary(CaptureManagerFile);
|
||||||
|
|
||||||
|
CaptureManagerFileName = CaptureManagerFileRef.getName();
|
||||||
|
|
||||||
|
NativeProxyFilePath = NativeUtils.loadLibrary(NativeProxyFile);
|
||||||
|
|
||||||
|
NativeProxyFileName = NativeProxyFilePath.getName();
|
||||||
|
|
||||||
|
} catch (IOException ex) {
|
||||||
|
LOG.error("Unexpected error loading CaptureManager libraries", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ICaptureManagerNativeProxy mInstance = null;
|
||||||
|
|
||||||
|
private CaptureManagerNativeProxy() {
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static ICaptureManagerNativeProxy getInstance() {
|
||||||
|
if (mInstance == null) {
|
||||||
|
mInstance = new CaptureManagerNativeProxy();
|
||||||
|
}
|
||||||
|
|
||||||
|
return mInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void freeInstance() {
|
||||||
|
mInstance = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
static public void release() {
|
||||||
|
//NOOP
|
||||||
|
//This used to delete the dll file. Not nice idea
|
||||||
|
}
|
||||||
|
|
||||||
|
public native long explicitGetPtrClass(String aStringFilePath, String aStringCLSID, String aStringGUID);
|
||||||
|
|
||||||
|
public native void freeLibrary(String aFileName);
|
||||||
|
|
||||||
|
public native void Release(long aPtr);
|
||||||
|
}
|
|
@ -0,0 +1,74 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import java.io.BufferedInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Simple custom class loader implementation
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class CustomClassLoader extends ClassLoader {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The HashMap where the classes will be cached
|
||||||
|
*/
|
||||||
|
private Map<String, Class<?>> classes = new HashMap<String, Class<?>>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return CustomClassLoader.class.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Class<?> findClass(String name) throws ClassNotFoundException {
|
||||||
|
|
||||||
|
if (classes.containsKey(name)) {
|
||||||
|
return classes.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
byte[] classData;
|
||||||
|
|
||||||
|
try {
|
||||||
|
classData = loadClassData(name);
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new ClassNotFoundException("Class [" + name
|
||||||
|
+ "] could not be found", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
Class<?> c = defineClass(name, classData, 0, classData.length);
|
||||||
|
resolveClass(c);
|
||||||
|
classes.put(name, c);
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load the class file into byte array
|
||||||
|
*
|
||||||
|
* @param name
|
||||||
|
* The name of the class e.g. com.codeslices.test.TestClass}
|
||||||
|
* @return The class file as byte array
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
private byte[] loadClassData(String name) throws IOException {
|
||||||
|
BufferedInputStream in = new BufferedInputStream(
|
||||||
|
ClassLoader.getSystemResourceAsStream(name.replace(".", "/")
|
||||||
|
+ ".class"));
|
||||||
|
ByteArrayOutputStream out = new ByteArrayOutputStream();
|
||||||
|
int i;
|
||||||
|
|
||||||
|
while ((i = in.read()) != -1) {
|
||||||
|
out.write(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
in.close();
|
||||||
|
byte[] classData = out.toByteArray();
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
return classData;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IEVRSinkFactory;
|
||||||
|
import capturemanager.interfaces.IStreamNode;
|
||||||
|
import java.awt.Component;
|
||||||
|
|
||||||
|
final class EVRSinkFactory extends EVRSinkFactoryNative implements IEVRSinkFactory {
|
||||||
|
|
||||||
|
|
||||||
|
EVRSinkFactory(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamNode createOutputNode(Component aGraphicComponent) {
|
||||||
|
|
||||||
|
IStreamNode lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
long lPtr = createOutputNode(
|
||||||
|
mPtr,
|
||||||
|
aGraphicComponent);
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new StreamNode(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
|
||||||
|
abstract class EVRSinkFactoryNative {
|
||||||
|
|
||||||
|
native protected long createOutputNode(
|
||||||
|
long aPtr,
|
||||||
|
Component aGraphicComponent);
|
||||||
|
}
|
|
@ -0,0 +1,88 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IEncoderControl;
|
||||||
|
import capturemanager.interfaces.IEncoderNodeFactory;
|
||||||
|
import capturemanager.interfaces.IMediaType;
|
||||||
|
|
||||||
|
class EncoderControl extends EncoderControlNative implements IEncoderControl {
|
||||||
|
|
||||||
|
protected static final String IID = "{96223507-D8FF-4EC1-B125-71AA7F9726A4}";
|
||||||
|
|
||||||
|
EncoderControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IEncoderNodeFactory createEncoderNodeFactory(String aEncoderCLSID) {
|
||||||
|
|
||||||
|
IEncoderNodeFactory lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createEncoderNodeFactory(
|
||||||
|
mPtr,
|
||||||
|
aEncoderCLSID,
|
||||||
|
"{A56E11D8-D602-4792-8570-38C283FC0AA3}");
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new EncoderNodeFactory(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCollectionOfEncoders() {
|
||||||
|
return super.getCollectionOfEncoders(
|
||||||
|
mPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getMediaTypeCollectionOfEncoder(
|
||||||
|
IMediaType aPtrUncompressedMediaType,
|
||||||
|
String aEncoderCLSID) {
|
||||||
|
|
||||||
|
|
||||||
|
String lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
MediaType lMediaType = (MediaType)aPtrUncompressedMediaType;
|
||||||
|
|
||||||
|
if(lMediaType == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = super.getMediaTypeCollectionOfEncoder(
|
||||||
|
mPtr,
|
||||||
|
lMediaType.mPtr,
|
||||||
|
aEncoderCLSID);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class EncoderControlNative {
|
||||||
|
|
||||||
|
native protected long createEncoderNodeFactory(
|
||||||
|
long aPtr,
|
||||||
|
String aStringEncoderCLSID,
|
||||||
|
String aStringIID);
|
||||||
|
|
||||||
|
native protected String getCollectionOfEncoders(
|
||||||
|
long aPtr);
|
||||||
|
|
||||||
|
native protected String getMediaTypeCollectionOfEncoder(
|
||||||
|
long aPtr,
|
||||||
|
long aPtrUncompressedMediaType,
|
||||||
|
String aStringEncoderCLSID);
|
||||||
|
}
|
|
@ -0,0 +1,106 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.*;
|
||||||
|
|
||||||
|
final class EncoderNodeFactory extends EncoderNodeFactoryNative implements IEncoderNodeFactory {
|
||||||
|
|
||||||
|
EncoderNodeFactory(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IMediaType createCompressedMediaType(
|
||||||
|
IMediaType aPtrUncompressedMediaType,
|
||||||
|
String aStringEncodingModeGUID,
|
||||||
|
int aEncodingModeValue,
|
||||||
|
int aIndexCompressedMediaType) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
IMediaType lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
MediaType lMediaType = (MediaType)aPtrUncompressedMediaType;
|
||||||
|
|
||||||
|
if(lMediaType == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = super.createCompressedMediaType(
|
||||||
|
mPtr,
|
||||||
|
lMediaType.mPtr,
|
||||||
|
aStringEncodingModeGUID,
|
||||||
|
aEncodingModeValue,
|
||||||
|
aIndexCompressedMediaType);
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new MediaType(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamNode createEncoderNode(
|
||||||
|
IMediaType aPtrUncompressedMediaType,
|
||||||
|
String aStringEncodingModeGUID,
|
||||||
|
int aEncodingModeValue,
|
||||||
|
int aIndexCompressedMediaType,
|
||||||
|
IStreamNode aPtrDownStreamNode) {
|
||||||
|
|
||||||
|
|
||||||
|
IStreamNode lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
MediaType lMediaType = (MediaType)aPtrUncompressedMediaType;
|
||||||
|
|
||||||
|
if(lMediaType == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
StreamNode lStreamNode = (StreamNode)aPtrDownStreamNode;
|
||||||
|
|
||||||
|
if(lStreamNode == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = super.createEncoderNode(
|
||||||
|
mPtr,
|
||||||
|
lMediaType.mPtr,
|
||||||
|
aStringEncodingModeGUID,
|
||||||
|
aEncodingModeValue,
|
||||||
|
aIndexCompressedMediaType,
|
||||||
|
lStreamNode.mPtr);
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new StreamNode(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class EncoderNodeFactoryNative {
|
||||||
|
|
||||||
|
native protected long createCompressedMediaType(
|
||||||
|
long aPtr,
|
||||||
|
long aPtrUncompressedMediaType,
|
||||||
|
String aStringEncodingModeGUID,
|
||||||
|
int aEncodingModeValue,
|
||||||
|
int aIndexCompressedMediaType);
|
||||||
|
|
||||||
|
native protected long createEncoderNode(
|
||||||
|
long aPtr,
|
||||||
|
long aPtrUncompressedMediaType,
|
||||||
|
String aStringEncodingModeGUID,
|
||||||
|
int aEncodingModeValue,
|
||||||
|
int aIndexCompressedMediaType,
|
||||||
|
long aPtrDownStreamNode);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IFileSinkFactory;
|
||||||
|
import capturemanager.interfaces.IMediaType;
|
||||||
|
import capturemanager.interfaces.IStreamNode;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
final class FileSinkFactory extends FileSinkFactoryNative implements IFileSinkFactory {
|
||||||
|
|
||||||
|
FileSinkFactory(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<IStreamNode> createOutputNodes(
|
||||||
|
List<IMediaType> aArrayPtrCompressedMediaTypes,
|
||||||
|
String aPtrFileName) {
|
||||||
|
|
||||||
|
List<IStreamNode> lresult = new ArrayList<IStreamNode>();
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(aArrayPtrCompressedMediaTypes == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long[] PtrCompressedMediaTypes = new long[aArrayPtrCompressedMediaTypes.size()];
|
||||||
|
|
||||||
|
for(int lIndex = 0; lIndex < aArrayPtrCompressedMediaTypes.size(); lIndex++)
|
||||||
|
{
|
||||||
|
MediaType lMediaType = (MediaType)aArrayPtrCompressedMediaTypes.get(lIndex);
|
||||||
|
|
||||||
|
if(lMediaType != null)
|
||||||
|
PtrCompressedMediaTypes[lIndex] = lMediaType.mPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
long[] lPtrOutputNodes = super.createOutputNodes(
|
||||||
|
mPtr,
|
||||||
|
PtrCompressedMediaTypes,
|
||||||
|
aPtrFileName);
|
||||||
|
|
||||||
|
if(lPtrOutputNodes == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
for(int lIndex = 0; lIndex < lPtrOutputNodes.length; lIndex++)
|
||||||
|
{
|
||||||
|
lresult.add(new StreamNode(lPtrOutputNodes[lIndex]));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class FileSinkFactoryNative {
|
||||||
|
|
||||||
|
native protected long[] createOutputNodes(
|
||||||
|
long aPtr,
|
||||||
|
long[] aArrayPtrCompressedMediaTypes,
|
||||||
|
String aPtrFileName);
|
||||||
|
}
|
|
@ -0,0 +1,59 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.ILogPrintOutControl;
|
||||||
|
|
||||||
|
class LogPrintOutControl extends LogPrintOutControlNative implements ILogPrintOutControl {
|
||||||
|
|
||||||
|
protected static final String CLSID_CoLogPrintOut = "{4563EE3E-DA1E-4911-9F40-88A284E2DD69}";
|
||||||
|
|
||||||
|
protected static final String IID_ILogPrintOutControl = "{73B67834-E7BD-40B7-9730-8C13BF098B9F}";
|
||||||
|
|
||||||
|
LogPrintOutControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
public void release()
|
||||||
|
{
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addPrintOutDestination(int aLevelType, String aFilePath) {
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
addPrintOutDestinationNative(
|
||||||
|
mPtr,
|
||||||
|
aLevelType,
|
||||||
|
aFilePath);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removePrintOutDestination(int aLevelType, String aFilePath) {
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
removePrintOutDestinationNative(
|
||||||
|
mPtr,
|
||||||
|
aLevelType,
|
||||||
|
aFilePath);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setVerbose(int aLevelType, String aFilePath, Boolean aState) {
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
setVerboseNative(
|
||||||
|
mPtr,
|
||||||
|
aLevelType,
|
||||||
|
aFilePath,
|
||||||
|
aState);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class LogPrintOutControlNative
|
||||||
|
{
|
||||||
|
|
||||||
|
native protected void addPrintOutDestinationNative(
|
||||||
|
long aPtr,
|
||||||
|
int aLevelType,
|
||||||
|
String aFilePath);
|
||||||
|
|
||||||
|
native protected void removePrintOutDestinationNative(
|
||||||
|
long aPtr,
|
||||||
|
int aLevelType,
|
||||||
|
String aFilePath);
|
||||||
|
|
||||||
|
native protected void setVerboseNative(
|
||||||
|
long aPtr,
|
||||||
|
int aLevelType,
|
||||||
|
String aFilePath,
|
||||||
|
boolean aState);
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IMediaType;
|
||||||
|
|
||||||
|
final class MediaType implements IMediaType {
|
||||||
|
|
||||||
|
MediaType(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,34 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.ISampleGrabberCall;
|
||||||
|
import capturemanager.interfaces.IStreamNode;
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
final class SampleGrabberCall extends SampleGrabberCallNative implements ISampleGrabberCall {
|
||||||
|
|
||||||
|
private StreamNode mStreamNode = null;
|
||||||
|
|
||||||
|
SampleGrabberCall(long aPtr) {
|
||||||
|
mStreamNode = new StreamNode(aPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int readData(ByteBuffer byteBuffer) {
|
||||||
|
if (!byteBuffer.isDirect()) {
|
||||||
|
throw new IllegalArgumentException("You must user a direct byte buffer");
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.readData(mStreamNode.mPtr, byteBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void RGB32ToBGRA(ByteBuffer byteBuffer) {
|
||||||
|
super.RGB32ToBGRA(byteBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamNode getStreamNode() {
|
||||||
|
return mStreamNode;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
|
||||||
|
abstract class SampleGrabberCallNative {
|
||||||
|
|
||||||
|
native protected int readData(
|
||||||
|
long aPtr,
|
||||||
|
ByteBuffer byteBuffer);
|
||||||
|
|
||||||
|
native protected void RGB32ToBGRA(
|
||||||
|
ByteBuffer byteBuffer);
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.*;
|
||||||
|
|
||||||
|
|
||||||
|
final class SampleGrabberCallSinkFactory extends SampleGrabberCallSinkFactoryNative
|
||||||
|
implements ISampleGrabberCallSinkFactory {
|
||||||
|
|
||||||
|
SampleGrabberCallSinkFactory(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISampleGrabberCall createOutputNode(
|
||||||
|
String aStringMajorType,
|
||||||
|
String aStringSubType,
|
||||||
|
int aSampleByteSize) {
|
||||||
|
|
||||||
|
ISampleGrabberCall lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createOutputNode(
|
||||||
|
mPtr,
|
||||||
|
aStringMajorType,
|
||||||
|
aStringSubType,
|
||||||
|
aSampleByteSize,
|
||||||
|
"{118AD3F7-D9A3-4146-AB35-F16421DC995E}");
|
||||||
|
|
||||||
|
SampleGrabberCall lSampleGrabberCall = new SampleGrabberCall(lPtr);
|
||||||
|
|
||||||
|
lresult = lSampleGrabberCall;
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class SampleGrabberCallSinkFactoryNative {
|
||||||
|
native protected long createOutputNode(
|
||||||
|
long aPtr,
|
||||||
|
String aStringMajorType,
|
||||||
|
String aStringSubType,
|
||||||
|
int aSampleByteSize,
|
||||||
|
String aStringIID);
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
final class SampleGrabberCallback extends SampleGrabberCallbackNative implements ISampleGrabberCallback {
|
||||||
|
|
||||||
|
|
||||||
|
private StreamNode mStreamNode = null;
|
||||||
|
|
||||||
|
SampleGrabberCallback() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void setPtr(long aPtr) {
|
||||||
|
mStreamNode = new StreamNode(aPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void invoke(byte[] aSampleBuffer, int aSampleSize)
|
||||||
|
{
|
||||||
|
synchronized(listeners)
|
||||||
|
{
|
||||||
|
for(int lIndex=0; lIndex < listeners.size(); ++lIndex)
|
||||||
|
{
|
||||||
|
listeners.get(lIndex).invoke(aSampleBuffer, aSampleSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ICallbackListener> listeners = new ArrayList<ICallbackListener>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addCallbackListener(ICallbackListener aICallbackListener) {
|
||||||
|
|
||||||
|
synchronized(listeners)
|
||||||
|
{
|
||||||
|
listeners.add(aICallbackListener);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamNode getStreamNode() {
|
||||||
|
return mStreamNode;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class SampleGrabberCallbackNative {
|
||||||
|
|
||||||
|
native protected int registerCallback(
|
||||||
|
long aPtr);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.ISampleGrabberCallback;
|
||||||
|
import capturemanager.interfaces.ISampleGrabberCallbackSinkFactory;
|
||||||
|
|
||||||
|
class SampleGrabberCallbackSinkFactory extends SampleGrabberCallbackSinkFactoryNative
|
||||||
|
implements ISampleGrabberCallbackSinkFactory {
|
||||||
|
|
||||||
|
SampleGrabberCallbackSinkFactory(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable {
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if (mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISampleGrabberCallback createOutputNode(
|
||||||
|
String aStringMajorType,
|
||||||
|
String aStringSubType) {
|
||||||
|
|
||||||
|
ISampleGrabberCallback lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
SampleGrabberCallback lSampleGrabberCallback = new SampleGrabberCallback();
|
||||||
|
|
||||||
|
long lPtr = createOutputNode(
|
||||||
|
mPtr,
|
||||||
|
aStringMajorType,
|
||||||
|
aStringSubType,
|
||||||
|
lSampleGrabberCallback
|
||||||
|
);
|
||||||
|
|
||||||
|
if (lPtr == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
lSampleGrabberCallback.setPtr(lPtr);
|
||||||
|
|
||||||
|
lresult = lSampleGrabberCallback;
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class SampleGrabberCallbackSinkFactoryNative {
|
||||||
|
|
||||||
|
native protected long createOutputNode(
|
||||||
|
long aPtr,
|
||||||
|
String aStringMajorType,
|
||||||
|
String aStringSubType,
|
||||||
|
Object aPtrISampleGrabberCallback);
|
||||||
|
}
|
|
@ -0,0 +1,131 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.ISession;
|
||||||
|
import capturemanager.interfaces.IUpdateStateListener;
|
||||||
|
|
||||||
|
final class Session extends SessionNative implements ISession {
|
||||||
|
|
||||||
|
|
||||||
|
Session(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean startSession(
|
||||||
|
long aStartPositionInHundredNanosecondUnits,
|
||||||
|
String aStringGUIDTimeFormat) {
|
||||||
|
boolean lresult = false;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = startSession(
|
||||||
|
mPtr,
|
||||||
|
aStartPositionInHundredNanosecondUnits,
|
||||||
|
aStringGUIDTimeFormat);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean pauseSession() {
|
||||||
|
boolean lresult = false;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = pauseSession(
|
||||||
|
mPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stopSession() {
|
||||||
|
boolean lresult = false;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = stopSession(
|
||||||
|
mPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean closeSession() {
|
||||||
|
boolean lresult = false;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = closeSession(
|
||||||
|
mPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getSessionDescriptor() {
|
||||||
|
int lresult = -1;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = getSessionDescriptor(
|
||||||
|
mPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addUpdateStateListener(IUpdateStateListener aIUpdateStateListener) {
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
addIUpdateStateListener(
|
||||||
|
mPtr,
|
||||||
|
aIUpdateStateListener);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.ISession;
|
||||||
|
import capturemanager.interfaces.ISessionControl;
|
||||||
|
import capturemanager.interfaces.IStreamNode;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
final class SessionControl extends SessionControlNative implements ISessionControl {
|
||||||
|
|
||||||
|
protected static final String IID = "{D0C58520-A941-4C0F-81B0-3ED8A4DE11ED}";
|
||||||
|
|
||||||
|
|
||||||
|
SessionControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISession createSession(
|
||||||
|
List<IStreamNode> aArrayPtrSourceNodesOfTopology) {
|
||||||
|
|
||||||
|
ISession lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long[] lPtrSourceNodesOfTopologys = new long[aArrayPtrSourceNodesOfTopology.size()];
|
||||||
|
|
||||||
|
for(int lIndex = 0; lIndex < aArrayPtrSourceNodesOfTopology.size(); ++lIndex)
|
||||||
|
{
|
||||||
|
StreamNode lStreamNode = (StreamNode)aArrayPtrSourceNodesOfTopology.get(lIndex);
|
||||||
|
|
||||||
|
if(lStreamNode == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
lPtrSourceNodesOfTopologys[lIndex] = lStreamNode.mPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
long lPtr = createSession(
|
||||||
|
mPtr,
|
||||||
|
lPtrSourceNodesOfTopologys,
|
||||||
|
"{742AC001-D1E0-40A8-8EFE-BA1A550F8805}");
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new Session(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class SessionControlNative {
|
||||||
|
native protected long createSession(
|
||||||
|
long aPtr,
|
||||||
|
long[] aArrayPtrSourceNodesOfTopology,
|
||||||
|
String aStringIID);
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class SessionNative {
|
||||||
|
|
||||||
|
native protected boolean closeSession(long aPtr);
|
||||||
|
|
||||||
|
native protected boolean addIUpdateStateListener(
|
||||||
|
long aPtr,
|
||||||
|
Object aIUpdateStateListener);
|
||||||
|
|
||||||
|
native protected int getSessionDescriptor(long aPtr);
|
||||||
|
|
||||||
|
native protected boolean pauseSession(long aPtr);
|
||||||
|
|
||||||
|
native protected boolean startSession(
|
||||||
|
long aPtr,
|
||||||
|
long aStartPositionInHundredNanosecondUnits,
|
||||||
|
String aStringGUIDTimeFormat);
|
||||||
|
|
||||||
|
native protected boolean stopSession(long aPtr);
|
||||||
|
}
|
|
@ -0,0 +1,146 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IEVRSinkFactory;
|
||||||
|
import capturemanager.interfaces.IFileSinkFactory;
|
||||||
|
import capturemanager.interfaces.ISampleGrabberCallSinkFactory;
|
||||||
|
import capturemanager.interfaces.ISampleGrabberCallbackSinkFactory;
|
||||||
|
import capturemanager.interfaces.ISinkControl;
|
||||||
|
|
||||||
|
final class SinkControl extends SinkControlNative implements ISinkControl {
|
||||||
|
|
||||||
|
protected static final String IID = "{C6BA3732-197E-438B-8E73-277759A7B58F}";
|
||||||
|
|
||||||
|
|
||||||
|
SinkControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IFileSinkFactory createFileSinkFactory(String aStringContainerTypeGUID) {
|
||||||
|
|
||||||
|
IFileSinkFactory lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createSinkFactory(
|
||||||
|
mPtr,
|
||||||
|
aStringContainerTypeGUID,
|
||||||
|
"{D6E342E3-7DDD-4858-AB91-4253643864C2}");
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new FileSinkFactory(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISampleGrabberCallSinkFactory createSampleGrabberCallSinkFactory(String aStringContainerTypeGUID) {
|
||||||
|
|
||||||
|
ISampleGrabberCallSinkFactory lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createSinkFactory(
|
||||||
|
mPtr,
|
||||||
|
aStringContainerTypeGUID,
|
||||||
|
"{759D24FF-C5D6-4B65-8DDF-8A2B2BECDE39}");
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new SampleGrabberCallSinkFactory(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISampleGrabberCallbackSinkFactory createSampleGrabberCallbackSinkFactory(String aStringContainerTypeGUID) {
|
||||||
|
|
||||||
|
ISampleGrabberCallbackSinkFactory lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createSinkFactory(
|
||||||
|
mPtr,
|
||||||
|
aStringContainerTypeGUID,
|
||||||
|
"{3D64C48E-EDA4-4EE1-8436-58B64DD7CF13}");
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new SampleGrabberCallbackSinkFactory(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IEVRSinkFactory createEVRSinkFactory(String aStringContainerTypeGUID) {
|
||||||
|
|
||||||
|
IEVRSinkFactory lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createSinkFactory(
|
||||||
|
mPtr,
|
||||||
|
aStringContainerTypeGUID,
|
||||||
|
"{2F34AF87-D349-45AA-A5F1-E4104D5C458E}");
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new EVRSinkFactory(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCollectionOfSinks() {
|
||||||
|
String lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
lresult = getCollectionOfSinks(mPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class SinkControlNative {
|
||||||
|
|
||||||
|
native protected long createSinkFactory(
|
||||||
|
long aPtr,
|
||||||
|
String aStringContainerTypeGUID,
|
||||||
|
String aStringIID);
|
||||||
|
|
||||||
|
native protected String getCollectionOfSinks(
|
||||||
|
long aPtr);
|
||||||
|
}
|
|
@ -0,0 +1,144 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IMediaType;
|
||||||
|
import capturemanager.interfaces.ISourceControl;
|
||||||
|
import capturemanager.interfaces.IStreamNode;
|
||||||
|
|
||||||
|
final class SourceControl extends SourceControlNative implements ISourceControl {
|
||||||
|
|
||||||
|
protected static final String IID = "{1276CC17-BCA8-4200-87BB-7180EF562447}";
|
||||||
|
|
||||||
|
SourceControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable {
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if (mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamNode createSourceNode(
|
||||||
|
String aSymbolicLink,
|
||||||
|
int aIndexStream,
|
||||||
|
int aIndexMediaType,
|
||||||
|
IStreamNode aPtrDownStreamTopologyNode) {
|
||||||
|
|
||||||
|
IStreamNode lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aPtrDownStreamTopologyNode == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
StreamNode lPtrDownStreamTopologyNode = (StreamNode) aPtrDownStreamTopologyNode;
|
||||||
|
|
||||||
|
long lPtr = createSourceNodeWithDownStreamConnection(
|
||||||
|
mPtr,
|
||||||
|
aSymbolicLink,
|
||||||
|
aIndexStream,
|
||||||
|
aIndexMediaType,
|
||||||
|
lPtrDownStreamTopologyNode.mPtr);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new StreamNode(lPtr);
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamNode createSourceNode(
|
||||||
|
String aSymbolicLink,
|
||||||
|
int aIndexStream,
|
||||||
|
int aIndexMediaType) {
|
||||||
|
|
||||||
|
IStreamNode lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (aSymbolicLink == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createSourceNode(
|
||||||
|
mPtr,
|
||||||
|
aSymbolicLink,
|
||||||
|
aIndexStream,
|
||||||
|
aIndexMediaType);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new StreamNode(lPtr);
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCollectionOfSources() {
|
||||||
|
|
||||||
|
String lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = getCollectionOfSources(
|
||||||
|
mPtr);
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IMediaType getSourceOutputMediaType(
|
||||||
|
String aSymbolicLink,
|
||||||
|
int aIndexStream,
|
||||||
|
int aIndexMediaType) {
|
||||||
|
|
||||||
|
IMediaType lresult = null;
|
||||||
|
|
||||||
|
do {
|
||||||
|
|
||||||
|
if (mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = getSourceOutputMediaType(
|
||||||
|
mPtr,
|
||||||
|
aSymbolicLink,
|
||||||
|
aIndexStream,
|
||||||
|
aIndexMediaType);
|
||||||
|
|
||||||
|
if (lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new MediaType(lPtr);
|
||||||
|
}
|
||||||
|
while (false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class SourceControlNative {
|
||||||
|
|
||||||
|
// native protected long createSource(
|
||||||
|
// String aSymbolicLink,
|
||||||
|
// out object aPtrPtrMediaSource);
|
||||||
|
|
||||||
|
native protected long createSourceControl(
|
||||||
|
long aPtr,
|
||||||
|
String aSymbolicLink,
|
||||||
|
String aStringIID);
|
||||||
|
|
||||||
|
// void createSourceFromCaptureProcessor(object aPtrCaptureProcessor, out object aPtrPtrMediaSource);
|
||||||
|
|
||||||
|
native protected long createSourceNode(
|
||||||
|
long aPtr,
|
||||||
|
String aSymbolicLink,
|
||||||
|
int aIndexStream,
|
||||||
|
int aIndexMediaType);
|
||||||
|
|
||||||
|
// void createSourceNodeFromExternalSource(object aPtrMediaSource, uint aIndexStream, uint aIndexMediaType, out object aPtrPtrTopologyNode);
|
||||||
|
|
||||||
|
// void createSourceNodeFromExternalSourceWithDownStreamConnection(object aPtrMediaSource, uint aIndexStream, uint aIndexMediaType, object aPtrDownStreamTopologyNode, out object aPtrPtrTopologyNode);
|
||||||
|
|
||||||
|
native protected long createSourceNodeWithDownStreamConnection(
|
||||||
|
long aPtr,
|
||||||
|
String aSymbolicLink,
|
||||||
|
int aIndexStream,
|
||||||
|
int aIndexMediaType,
|
||||||
|
long aPtrDownStreamTopologyNode);
|
||||||
|
|
||||||
|
native protected String getCollectionOfSources(
|
||||||
|
long aPtr);
|
||||||
|
|
||||||
|
native protected long getSourceOutputMediaType(
|
||||||
|
long aPtr,
|
||||||
|
String aSymbolicLink,
|
||||||
|
int aIndexStream,
|
||||||
|
int aIndexMediaType);
|
||||||
|
|
||||||
|
// void getSourceOutputMediaTypeFromMediaSource(object aPtrMediaSource, uint aIndexStream, uint aIndexMediaType, out object aPtrPtrOutputMediaType);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.ISpreaderNodeFactory;
|
||||||
|
import capturemanager.interfaces.IStreamNode;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
final class SpreaderNodeFactory extends SpreaderNodeFactoryNative implements ISpreaderNodeFactory {
|
||||||
|
|
||||||
|
SpreaderNodeFactory(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IStreamNode createSpreaderNode(List<IStreamNode> aDownStreamTopologyNodelist) {
|
||||||
|
IStreamNode lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(aDownStreamTopologyNodelist == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long[] lDownStreamTopologyNodelist = new long[aDownStreamTopologyNodelist.size()];
|
||||||
|
|
||||||
|
for(int lIndex = 0; lIndex < aDownStreamTopologyNodelist.size(); lIndex++)
|
||||||
|
{
|
||||||
|
|
||||||
|
StreamNode lStreamNode = (StreamNode)aDownStreamTopologyNodelist.get(lIndex);
|
||||||
|
|
||||||
|
if(lStreamNode != null)
|
||||||
|
lDownStreamTopologyNodelist[lIndex] = lStreamNode.mPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
long lPtr = createSpreaderNode(
|
||||||
|
mPtr,
|
||||||
|
lDownStreamTopologyNodelist);
|
||||||
|
|
||||||
|
if(lPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new StreamNode(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class SpreaderNodeFactoryNative {
|
||||||
|
native protected long createSpreaderNode(
|
||||||
|
long aPtr,
|
||||||
|
long[] aArrayPtrDownStreamTopologyNodes);
|
||||||
|
}
|
|
@ -0,0 +1,93 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.ISpreaderNodeFactory;
|
||||||
|
import capturemanager.interfaces.IStreamControl;
|
||||||
|
|
||||||
|
final class StreamControl extends StreamControlNative implements IStreamControl {
|
||||||
|
|
||||||
|
protected static final String IID = "{E8F25B4A-8C71-4C9E-BD8C-82260DC4C21B}";
|
||||||
|
|
||||||
|
StreamControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCollectionOfStreamControlNodeFactories() {
|
||||||
|
String lresult = "";
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = getCollectionOfStreamControlNodeFactories(mPtr);
|
||||||
|
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISpreaderNodeFactory createStreamControlNodeFactory() {
|
||||||
|
ISpreaderNodeFactory lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createStreamControlNodeFactory(
|
||||||
|
mPtr,
|
||||||
|
"{85DFAAA1-4CC0-4A88-AE28-8F492E552CCA}");
|
||||||
|
|
||||||
|
if(lPtr != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new SpreaderNodeFactory(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ISpreaderNodeFactory createStreamControlNodeFactory(String aStringIID) {
|
||||||
|
ISpreaderNodeFactory lresult = null;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
long lPtr = createStreamControlNodeFactory(
|
||||||
|
mPtr,
|
||||||
|
aStringIID);
|
||||||
|
|
||||||
|
if(lPtr != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = new SpreaderNodeFactory(lPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class StreamControlNative {
|
||||||
|
|
||||||
|
native protected long createStreamControlNodeFactory(
|
||||||
|
long aPtr,
|
||||||
|
String aStringIID);
|
||||||
|
|
||||||
|
native protected String getCollectionOfStreamControlNodeFactories(
|
||||||
|
long aPtr);
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IStreamNode;
|
||||||
|
|
||||||
|
final class StreamNode implements IStreamNode {
|
||||||
|
|
||||||
|
StreamNode(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable {
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if (mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IStrideForBitmap;
|
||||||
|
|
||||||
|
class StrideForBitmap extends StrideForBitmapNative implements IStrideForBitmap {
|
||||||
|
|
||||||
|
protected static final String IID = "{74D903C9-69E6-4FC7-BF7A-9F47605C52BE}";
|
||||||
|
|
||||||
|
StrideForBitmap(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getStrideForBitmap(String aStringMFVideoFormat, int aWidthInPixels) {
|
||||||
|
|
||||||
|
int lresult = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(aStringMFVideoFormat == null)
|
||||||
|
break;
|
||||||
|
|
||||||
|
lresult = getStrideForBitmap(
|
||||||
|
mPtr,
|
||||||
|
aStringMFVideoFormat,
|
||||||
|
aWidthInPixels);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class StrideForBitmapNative {
|
||||||
|
native protected int getStrideForBitmap(
|
||||||
|
long aPtr,
|
||||||
|
String aStringMFVideoFormat,
|
||||||
|
int aWidthInPixels);
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IVersionControl;
|
||||||
|
|
||||||
|
final class VersionControl extends VersionControlNative implements IVersionControl {
|
||||||
|
|
||||||
|
protected static final String IID = "{39DC3AEF-3B59-4C0D-A1B2-54BF2653C056}";
|
||||||
|
|
||||||
|
VersionControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getXMLStringVersion() {
|
||||||
|
return getXMLStringVersion(mPtr);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class VersionControlNative {
|
||||||
|
native protected String getXMLStringVersion(long aPtr);
|
||||||
|
}
|
|
@ -0,0 +1,58 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
import capturemanager.interfaces.IWebCamControl;
|
||||||
|
|
||||||
|
final class WebCamControl extends WebCamControlNative implements IWebCamControl {
|
||||||
|
|
||||||
|
WebCamControl(long aPtr) {
|
||||||
|
mPtr = aPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected long mPtr = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void finalize() throws Throwable
|
||||||
|
{
|
||||||
|
super.finalize();
|
||||||
|
|
||||||
|
if(mPtr != 0)
|
||||||
|
CaptureManagerNativeProxy.getInstance().Release(mPtr);
|
||||||
|
|
||||||
|
mPtr = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getCamParametrs() {
|
||||||
|
String lresult = "";
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
lresult = getCamParametrs(mPtr);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
return lresult;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCamParametr(
|
||||||
|
int aParametrIndex,
|
||||||
|
int aNewValue,
|
||||||
|
int aFlag) {
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(mPtr == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
setCamParametr(
|
||||||
|
mPtr,
|
||||||
|
aParametrIndex,
|
||||||
|
aNewValue,
|
||||||
|
aFlag);
|
||||||
|
}
|
||||||
|
while(false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
package capturemanager.classes;
|
||||||
|
|
||||||
|
abstract class WebCamControlNative {
|
||||||
|
native protected String getCamParametrs(
|
||||||
|
long aPtr);
|
||||||
|
native protected void setCamParametr(
|
||||||
|
long aPtr,
|
||||||
|
int aParametrIndex,
|
||||||
|
int aNewValue,
|
||||||
|
int aFlag);
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
public interface ICallbackListener {
|
||||||
|
void invoke(byte[] aSampleBuffer, int aSampleSize);
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
public interface ICaptureManagerControl {
|
||||||
|
|
||||||
|
String getCollectionOfSources();
|
||||||
|
|
||||||
|
String getCollectionOfSinks();
|
||||||
|
|
||||||
|
ISourceControl createSourceControl();
|
||||||
|
|
||||||
|
ISessionControl createSessionControl();
|
||||||
|
|
||||||
|
ISinkControl createSinkControl();
|
||||||
|
|
||||||
|
IStreamControl createStreamControl();
|
||||||
|
|
||||||
|
IEncoderControl createEncoderControl();
|
||||||
|
|
||||||
|
int getStrideForBitmapInfoHeader(
|
||||||
|
String aStringMFVideoFormat,
|
||||||
|
int aWidthInPixels);
|
||||||
|
|
||||||
|
IVersionControl getVersionControl();
|
||||||
|
|
||||||
|
void release();
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
public interface ICaptureManagerNativeProxy {
|
||||||
|
|
||||||
|
public long explicitGetPtrClass(String aStringFilePath, String aStringCLSID, String aStringGUID);
|
||||||
|
|
||||||
|
public void freeLibrary(String aFileName);
|
||||||
|
|
||||||
|
public void Release(long aPtr);
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
|
||||||
|
public interface IEVRSinkFactory {
|
||||||
|
IStreamNode createOutputNode(Component aGraphicComponent);
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
public interface IEncoderControl {
|
||||||
|
IEncoderNodeFactory createEncoderNodeFactory(String aEncoderCLSID);
|
||||||
|
String getCollectionOfEncoders();
|
||||||
|
String getMediaTypeCollectionOfEncoder(IMediaType aPtrUncompressedMediaType, String aEncoderCLSID);
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
public interface IEncoderNodeFactory {
|
||||||
|
|
||||||
|
IMediaType createCompressedMediaType(
|
||||||
|
IMediaType aPtrUncompressedMediaType,
|
||||||
|
String aStringEncodingModeGUID,
|
||||||
|
int aEncodingModeValue,
|
||||||
|
int aIndexCompressedMediaType);
|
||||||
|
|
||||||
|
IStreamNode createEncoderNode(
|
||||||
|
IMediaType aPtrUncompressedMediaType,
|
||||||
|
String aStringEncodingModeGUID,
|
||||||
|
int aEncodingModeValue,
|
||||||
|
int aIndexCompressedMediaType,
|
||||||
|
IStreamNode aPtrDownStreamNode);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface IFileSinkFactory {
|
||||||
|
List<IStreamNode> createOutputNodes(
|
||||||
|
List<IMediaType> aArrayPtrCompressedMediaTypes,
|
||||||
|
String aPtrFileName);
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
public interface ILogPrintOutControl {
|
||||||
|
void addPrintOutDestination(int aLevelType, String aFilePath);
|
||||||
|
void removePrintOutDestination(int aLevelType, String aFilePath);
|
||||||
|
void setVerbose(int aLevelType, String aFilePath, Boolean aState);
|
||||||
|
void release();
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
package capturemanager.interfaces;
|
||||||
|
|
||||||
|
public interface IMediaType {
|
||||||
|
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue