Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bc2f2de6c2 | |||
| efec35afa6 | |||
| 993711ccfe | |||
| d1ef912984 | |||
| d2f8ee8b81 | |||
| 91e68c0580 | |||
| a591dcec48 | |||
| 1898fcd741 | |||
| 8bc8f14c64 | |||
| 09cf5d23ea | |||
| bec5cfe4a6 |
+3
-2
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="com.limelight"
|
package="com.limelight"
|
||||||
android:versionCode="20"
|
android:versionCode="22"
|
||||||
android:versionName="2.5" >
|
android:versionName="2.5.0.2" >
|
||||||
|
|
||||||
<uses-sdk
|
<uses-sdk
|
||||||
android:minSdkVersion="16"
|
android:minSdkVersion="16"
|
||||||
@@ -12,6 +12,7 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
|
|
||||||
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
|
<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
|
||||||
<uses-feature android:name="android.hardware.wifi" android:required="false" />
|
<uses-feature android:name="android.hardware.wifi" android:required="false" />
|
||||||
|
|||||||
@@ -3,43 +3,41 @@
|
|||||||
Limelight is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield.
|
Limelight is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield.
|
||||||
We reverse engineered the Shield streaming software, and created a version that can be run on any Android device.
|
We reverse engineered the Shield streaming software, and created a version that can be run on any Android device.
|
||||||
|
|
||||||
Limelight will allow you to stream your full collection of Steam games from your Windows PC to your Android device,
|
Limelight will allow you to stream your full collection of games from your Windows PC to your Android device,
|
||||||
in your own home, or over the internet.
|
in your own home, or over the internet.
|
||||||
|
|
||||||
[Limelight-pc](https://github.com/limelight-stream/limelight-pc) is also currently in development for Windows, OS X and Linux. Versions for [iOS](https://github.com/limelight-stream/limelight-ios) and [Windows Phone](https://github.com/limelight-stream/limelight-wp) are also in development.
|
[Limelight-pc](https://github.com/limelight-stream/limelight-pc) is also currently in development for Windows, OS X and Linux. Versions for [iOS](https://github.com/limelight-stream/limelight-ios) and [Windows Phone](https://github.com/limelight-stream/limelight-wp) are also in development.
|
||||||
|
|
||||||
##Features
|
##Features
|
||||||
|
|
||||||
* Streams Steam and all of your games from your PC to your Android device
|
* Streams any of your games from your PC to your Android device
|
||||||
* Full gamepad support for MOGA, Xbox 360, PS3, OUYA, and Shield
|
* Full gamepad support for MOGA, Xbox 360, PS3, OUYA, and Shield
|
||||||
|
* Automatically finds GameStream-compatible PCs on your network
|
||||||
|
|
||||||
##Features in development
|
##Features in development
|
||||||
|
|
||||||
* Use mDNS to scan for compatible GeForce Experience (GFE) machines on the network
|
|
||||||
* Choose from the list of available games instead of just launching Steam
|
|
||||||
* Keyboard input
|
* Keyboard input
|
||||||
|
|
||||||
##Installation
|
##Installation
|
||||||
|
|
||||||
* Download and install Limelight for Android from
|
* Download and install Limelight for Android from
|
||||||
[XDA](http://forum.xda-developers.com/showthread.php?t=2505510)
|
[Google Play](https://play.google.com/store/apps/details?id=com.limelight)
|
||||||
* Download [GeForce Experience](http://www.geforce.com/geforce-experience) and install on your Windows PC
|
* Download [GeForce Experience](http://www.geforce.com/geforce-experience) and install on your Windows PC
|
||||||
|
|
||||||
##Requirements
|
##Requirements
|
||||||
|
|
||||||
* [GFE compatible](http://shield.nvidia.com/play-pc-games/) computer with GTX 600/700 series GPU
|
* [GameStream compatible](http://shield.nvidia.com/play-pc-games/) computer with GTX 600/700 series GPU
|
||||||
* Android device running 4.1 (Jelly Bean) or higher
|
* Android device running 4.1 (Jelly Bean) or higher
|
||||||
* High-end wireless router (802.11n dual-band recommended)
|
* High-end wireless router (802.11n dual-band recommended)
|
||||||
* Exynos/Snapdragon SoC __OR__ Quad-Core 1.4 GHz Cortex-A9 or higher (Tegra 3)
|
* Exynos/Snapdragon SoC __OR__ Quad-Core 1.4 GHz Cortex-A9 or higher (Tegra 3)
|
||||||
|
|
||||||
##Usage
|
##Usage
|
||||||
|
|
||||||
* Turn on Shield Streaming in the GFE settings
|
* Turn on GameStream in the GFE settings
|
||||||
* If you are connecting from outside the same network, turn on internet
|
* If you are connecting from outside the same network, turn on internet
|
||||||
streaming
|
streaming
|
||||||
* In Limelight, enter your PC's IP or Hostname and click "Pair"
|
* When on the same network as your PC, open Limelight and tap on your PC in the list
|
||||||
* Accept the pairing confirmation on your PC
|
* Accept the pairing confirmation on your PC
|
||||||
* In Limelight, click "Start Streaming"
|
* Tap your PC again to view the list of apps to stream
|
||||||
* Play games!
|
* Play games!
|
||||||
|
|
||||||
##Contribute
|
##Contribute
|
||||||
|
|||||||
Binary file not shown.
@@ -2,6 +2,7 @@ package com.limelight;
|
|||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
|
|
||||||
import com.limelight.computers.ComputerManagerService;
|
import com.limelight.computers.ComputerManagerService;
|
||||||
import com.limelight.utils.Dialog;
|
import com.limelight.utils.Dialog;
|
||||||
@@ -22,51 +23,86 @@ import android.widget.Toast;
|
|||||||
public class AddComputerManually extends Activity {
|
public class AddComputerManually extends Activity {
|
||||||
private Button addPcButton;
|
private Button addPcButton;
|
||||||
private TextView hostText;
|
private TextView hostText;
|
||||||
|
private ComputerManagerService.ComputerManagerBinder managerBinder;
|
||||||
|
private LinkedBlockingQueue<String> computersToAdd = new LinkedBlockingQueue<String>();
|
||||||
|
private Thread addThread;
|
||||||
private ServiceConnection serviceConnection = new ServiceConnection() {
|
private ServiceConnection serviceConnection = new ServiceConnection() {
|
||||||
public void onServiceConnected(ComponentName className, final IBinder binder) {
|
public void onServiceConnected(ComponentName className, final IBinder binder) {
|
||||||
new Thread() {
|
managerBinder = ((ComputerManagerService.ComputerManagerBinder)binder);
|
||||||
@Override
|
startAddThread();
|
||||||
public void run() {
|
|
||||||
String msg;
|
|
||||||
boolean finish = false;
|
|
||||||
try {
|
|
||||||
InetAddress addr = InetAddress.getByName(hostText.getText().toString());
|
|
||||||
|
|
||||||
if (!((ComputerManagerService.ComputerManagerBinder)binder).addComputerBlocking(addr)){
|
|
||||||
msg = "Unable to connect to the specified computer. Make sure the required ports are allowed through the firewall.";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
msg = "Successfully added computer";
|
|
||||||
finish = true;
|
|
||||||
}
|
|
||||||
} catch (UnknownHostException e) {
|
|
||||||
msg = "Unable to resolve PC address. Make sure you didn't make a typo in the address.";
|
|
||||||
}
|
|
||||||
|
|
||||||
final boolean toastFinish = finish;
|
|
||||||
final String toastMsg = msg;
|
|
||||||
AddComputerManually.this.runOnUiThread(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
// Unbind from this service
|
|
||||||
unbindService(AddComputerManually.this.serviceConnection);
|
|
||||||
|
|
||||||
Toast.makeText(AddComputerManually.this, toastMsg, Toast.LENGTH_LONG).show();
|
|
||||||
|
|
||||||
if (toastFinish) {
|
|
||||||
// Close the activity
|
|
||||||
AddComputerManually.this.finish();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}.start();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onServiceDisconnected(ComponentName className) {
|
public void onServiceDisconnected(ComponentName className) {
|
||||||
|
joinAddThread();
|
||||||
|
managerBinder = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private void doAddPc(String host) {
|
||||||
|
String msg;
|
||||||
|
boolean finish = false;
|
||||||
|
try {
|
||||||
|
InetAddress addr = InetAddress.getByName(host);
|
||||||
|
|
||||||
|
if (!managerBinder.addComputerBlocking(addr)){
|
||||||
|
msg = "Unable to connect to the specified computer. Make sure the required ports are allowed through the firewall.";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg = "Successfully added computer";
|
||||||
|
finish = true;
|
||||||
|
}
|
||||||
|
} catch (UnknownHostException e) {
|
||||||
|
msg = "Unable to resolve PC address. Make sure you didn't make a typo in the address.";
|
||||||
|
}
|
||||||
|
|
||||||
|
final boolean toastFinish = finish;
|
||||||
|
final String toastMsg = msg;
|
||||||
|
AddComputerManually.this.runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Toast.makeText(AddComputerManually.this, toastMsg, Toast.LENGTH_LONG).show();
|
||||||
|
|
||||||
|
if (toastFinish && !isFinishing()) {
|
||||||
|
// Close the activity
|
||||||
|
AddComputerManually.this.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private void startAddThread() {
|
||||||
|
addThread = new Thread() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while (!isInterrupted()) {
|
||||||
|
String computer;
|
||||||
|
|
||||||
|
try {
|
||||||
|
computer = computersToAdd.take();
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
doAddPc(computer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
addThread.setName("UI - AddComputerManually");
|
||||||
|
addThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void joinAddThread() {
|
||||||
|
if (addThread != null) {
|
||||||
|
addThread.interrupt();
|
||||||
|
|
||||||
|
try {
|
||||||
|
addThread.join();
|
||||||
|
} catch (InterruptedException e) {}
|
||||||
|
|
||||||
|
addThread = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop() {
|
protected void onStop() {
|
||||||
super.onStop();
|
super.onStop();
|
||||||
@@ -74,6 +110,16 @@ public class AddComputerManually extends Activity {
|
|||||||
Dialog.closeDialogs();
|
Dialog.closeDialogs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
|
||||||
|
if (managerBinder != null) {
|
||||||
|
joinAddThread();
|
||||||
|
unbindService(serviceConnection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
@@ -82,6 +128,10 @@ public class AddComputerManually extends Activity {
|
|||||||
|
|
||||||
this.addPcButton = (Button) findViewById(R.id.addPc);
|
this.addPcButton = (Button) findViewById(R.id.addPc);
|
||||||
this.hostText = (TextView) findViewById(R.id.hostTextView);
|
this.hostText = (TextView) findViewById(R.id.hostTextView);
|
||||||
|
|
||||||
|
// Bind to the ComputerManager service
|
||||||
|
bindService(new Intent(AddComputerManually.this,
|
||||||
|
ComputerManagerService.class), serviceConnection, Service.BIND_AUTO_CREATE);
|
||||||
|
|
||||||
addPcButton.setOnClickListener(new OnClickListener() {
|
addPcButton.setOnClickListener(new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -92,9 +142,7 @@ public class AddComputerManually extends Activity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Toast.makeText(AddComputerManually.this, "Adding PC...", Toast.LENGTH_SHORT).show();
|
Toast.makeText(AddComputerManually.this, "Adding PC...", Toast.LENGTH_SHORT).show();
|
||||||
|
computersToAdd.add(hostText.getText().toString());
|
||||||
// Bind to the service which will try to add the PC
|
|
||||||
bindService(new Intent(AddComputerManually.this, ComputerManagerService.class), serviceConnection, Service.BIND_AUTO_CREATE);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,9 +148,16 @@ public class PcView extends Activity {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void stopComputerUpdates() {
|
private void stopComputerUpdates() {
|
||||||
freezeUpdates = true;
|
if (managerBinder != null) {
|
||||||
managerBinder.stopPolling();
|
if (!runningPolling) {
|
||||||
runningPolling = false;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
freezeUpdates = true;
|
||||||
|
|
||||||
|
managerBinder.stopPolling();
|
||||||
|
runningPolling = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -229,6 +236,11 @@ public class PcView extends Activity {
|
|||||||
"You must close the game before pairing.", Toast.LENGTH_LONG).show();
|
"You must close the game before pairing.", Toast.LENGTH_LONG).show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (managerBinder == null) {
|
||||||
|
Toast.makeText(PcView.this, "The ComputerManager service is not running. " +
|
||||||
|
"Please wait a few seconds or restart the app.", Toast.LENGTH_LONG).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Toast.makeText(PcView.this, "Pairing...", Toast.LENGTH_SHORT).show();
|
Toast.makeText(PcView.this, "Pairing...", Toast.LENGTH_SHORT).show();
|
||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
@@ -330,6 +342,11 @@ public class PcView extends Activity {
|
|||||||
Toast.makeText(PcView.this, "Computer is offline", Toast.LENGTH_SHORT).show();
|
Toast.makeText(PcView.this, "Computer is offline", Toast.LENGTH_SHORT).show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (managerBinder == null) {
|
||||||
|
Toast.makeText(PcView.this, "The ComputerManager service is not running. " +
|
||||||
|
"Please wait a few seconds or restart the app.", Toast.LENGTH_LONG).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Toast.makeText(PcView.this, "Unpairing...", Toast.LENGTH_SHORT).show();
|
Toast.makeText(PcView.this, "Unpairing...", Toast.LENGTH_SHORT).show();
|
||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
@@ -387,6 +404,11 @@ public class PcView extends Activity {
|
|||||||
Toast.makeText(PcView.this, "Computer is offline", Toast.LENGTH_SHORT).show();
|
Toast.makeText(PcView.this, "Computer is offline", Toast.LENGTH_SHORT).show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (managerBinder == null) {
|
||||||
|
Toast.makeText(PcView.this, "The ComputerManager service is not running. " +
|
||||||
|
"Please wait a few seconds or restart the app.", Toast.LENGTH_LONG).show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Intent i = new Intent(this, AppView.class);
|
Intent i = new Intent(this, AppView.class);
|
||||||
i.putExtra(AppView.NAME_EXTRA, computer.name);
|
i.putExtra(AppView.NAME_EXTRA, computer.name);
|
||||||
@@ -422,9 +444,12 @@ public class PcView extends Activity {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
case DELETE_ID:
|
case DELETE_ID:
|
||||||
if (managerBinder != null) {
|
if (managerBinder == null) {
|
||||||
managerBinder.removeComputer(computer.details.name);
|
Toast.makeText(PcView.this, "The ComputerManager service is not running. " +
|
||||||
}
|
"Please wait a few seconds or restart the app.", Toast.LENGTH_LONG).show();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
managerBinder.removeComputer(computer.details.name);
|
||||||
removeListView(computer.details);
|
removeListView(computer.details);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,9 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
private static final int MED_PERF = 2;
|
private static final int MED_PERF = 2;
|
||||||
private static final int HIGH_PERF = 3;
|
private static final int HIGH_PERF = 3;
|
||||||
|
|
||||||
|
private int totalFrames;
|
||||||
|
private long totalTimeMs;
|
||||||
|
|
||||||
private int cpuCount = Runtime.getRuntime().availableProcessors();
|
private int cpuCount = Runtime.getRuntime().availableProcessors();
|
||||||
|
|
||||||
private int findOptimalPerformanceLevel() {
|
private int findOptimalPerformanceLevel() {
|
||||||
@@ -155,6 +158,7 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
du = depacketizer.pollNextDecodeUnit();
|
du = depacketizer.pollNextDecodeUnit();
|
||||||
if (du != null) {
|
if (du != null) {
|
||||||
submitDecodeUnit(du);
|
submitDecodeUnit(du);
|
||||||
|
depacketizer.freeDecodeUnit(du);
|
||||||
}
|
}
|
||||||
|
|
||||||
long diff = nextFrameTime - System.currentTimeMillis();
|
long diff = nextFrameTime - System.currentTimeMillis();
|
||||||
@@ -215,7 +219,19 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return (AvcDecoder.decode(data, 0, decodeUnit.getDataLength()) == 0);
|
boolean success = (AvcDecoder.decode(data, 0, decodeUnit.getDataLength()) == 0);
|
||||||
|
if (success) {
|
||||||
|
long timeAfterDecode = System.currentTimeMillis();
|
||||||
|
|
||||||
|
// Add delta time to the totals (excluding probable outliers)
|
||||||
|
long delta = timeAfterDecode - decodeUnit.getReceiveTimestamp();
|
||||||
|
if (delta >= 0 && delta < 300) {
|
||||||
|
totalTimeMs += delta;
|
||||||
|
totalFrames++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -230,6 +246,9 @@ public class AndroidCpuDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAverageEndToEndLatency() {
|
public int getAverageEndToEndLatency() {
|
||||||
return 0;
|
if (totalFrames == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return (int)(totalTimeMs / totalFrames);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -177,27 +177,30 @@ public class MediaCodecDecoderRenderer implements VideoDecoderRenderer {
|
|||||||
du = depacketizer.pollNextDecodeUnit();
|
du = depacketizer.pollNextDecodeUnit();
|
||||||
if (du != null) {
|
if (du != null) {
|
||||||
submitDecodeUnit(du);
|
submitDecodeUnit(du);
|
||||||
|
depacketizer.freeDecodeUnit(du);
|
||||||
}
|
}
|
||||||
|
|
||||||
int outIndex = videoDecoder.dequeueOutputBuffer(info, 0);
|
int outIndex = videoDecoder.dequeueOutputBuffer(info, 0);
|
||||||
if (outIndex >= 0) {
|
if (outIndex >= 0) {
|
||||||
|
long presentationTimeUs = info.presentationTimeUs;
|
||||||
int lastIndex = outIndex;
|
int lastIndex = outIndex;
|
||||||
|
|
||||||
// Add delta time to the totals (excluding probable outliers)
|
|
||||||
long delta = System.currentTimeMillis()-(info.presentationTimeUs/1000);
|
|
||||||
if (delta > 5 && delta < 300) {
|
|
||||||
decoderTimeMs += delta;
|
|
||||||
totalTimeMs += delta;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the last output buffer in the queue
|
// Get the last output buffer in the queue
|
||||||
while ((outIndex = videoDecoder.dequeueOutputBuffer(info, 0)) >= 0) {
|
while ((outIndex = videoDecoder.dequeueOutputBuffer(info, 0)) >= 0) {
|
||||||
videoDecoder.releaseOutputBuffer(lastIndex, false);
|
videoDecoder.releaseOutputBuffer(lastIndex, false);
|
||||||
lastIndex = outIndex;
|
lastIndex = outIndex;
|
||||||
|
presentationTimeUs = info.presentationTimeUs;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render the last buffer
|
// Render the last buffer
|
||||||
videoDecoder.releaseOutputBuffer(lastIndex, true);
|
videoDecoder.releaseOutputBuffer(lastIndex, true);
|
||||||
|
|
||||||
|
// Add delta time to the totals (excluding probable outliers)
|
||||||
|
long delta = System.currentTimeMillis()-(presentationTimeUs/1000);
|
||||||
|
if (delta > 5 && delta < 300) {
|
||||||
|
decoderTimeMs += delta;
|
||||||
|
totalTimeMs += delta;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
switch (outIndex) {
|
switch (outIndex) {
|
||||||
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
|
case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED:
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ public class ComputerDatabaseManager {
|
|||||||
c.deleteDatabase(COMPUTER_DB_NAME);
|
c.deleteDatabase(COMPUTER_DB_NAME);
|
||||||
computerDb = c.openOrCreateDatabase(COMPUTER_DB_NAME, 0, null);
|
computerDb = c.openOrCreateDatabase(COMPUTER_DB_NAME, 0, null);
|
||||||
}
|
}
|
||||||
computerDb.enableWriteAheadLogging();
|
|
||||||
initializeDb();
|
initializeDb();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user