Seperate library module from app module
Signed-off-by: Leo Ma <begeekmyfriend@gmail.com>camera2
@ -0,0 +1,381 @@
|
|||||||
|
package net.ossrs.yasea.demo;
|
||||||
|
|
||||||
|
import android.content.SharedPreferences;
|
||||||
|
import android.content.pm.ActivityInfo;
|
||||||
|
import android.content.res.Configuration;
|
||||||
|
import android.hardware.Camera;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Environment;
|
||||||
|
import android.support.v7.app.AppCompatActivity;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.WindowManager;
|
||||||
|
import android.widget.Button;
|
||||||
|
import android.widget.EditText;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import com.github.faucamp.simplertmp.RtmpHandler;
|
||||||
|
import com.seu.magicfilter.utils.MagicFilterType;
|
||||||
|
|
||||||
|
import net.ossrs.yasea.SrsCameraView;
|
||||||
|
import net.ossrs.yasea.SrsNetworkHandler;
|
||||||
|
import net.ossrs.yasea.SrsPublisher;
|
||||||
|
import net.ossrs.yasea.SrsRecordHandler;
|
||||||
|
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class MainActivity extends AppCompatActivity implements RtmpHandler.RtmpListener,
|
||||||
|
SrsRecordHandler.SrsRecordListener, SrsNetworkHandler.SrsNetworkListener {
|
||||||
|
|
||||||
|
private static final String TAG = "Yasea";
|
||||||
|
|
||||||
|
Button btnPublish = null;
|
||||||
|
Button btnSwitchCamera = null;
|
||||||
|
Button btnRecord = null;
|
||||||
|
Button btnSwitchEncoder = null;
|
||||||
|
|
||||||
|
private SharedPreferences sp;
|
||||||
|
private String rtmpUrl = "rtmp://ossrs.net/" + getRandomAlphaString(3) + '/' + getRandomAlphaDigitString(5);
|
||||||
|
private String recPath = Environment.getExternalStorageDirectory().getPath() + "/test.mp4";
|
||||||
|
|
||||||
|
private SrsPublisher mPublisher;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
|
||||||
|
// response screen rotation event
|
||||||
|
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
|
||||||
|
|
||||||
|
// restore data.
|
||||||
|
sp = getSharedPreferences("Yasea", MODE_PRIVATE);
|
||||||
|
rtmpUrl = sp.getString("rtmpUrl", rtmpUrl);
|
||||||
|
|
||||||
|
// initialize url.
|
||||||
|
final EditText efu = (EditText) findViewById(R.id.url);
|
||||||
|
efu.setText(rtmpUrl);
|
||||||
|
|
||||||
|
btnPublish = (Button) findViewById(R.id.publish);
|
||||||
|
btnSwitchCamera = (Button) findViewById(R.id.swCam);
|
||||||
|
btnRecord = (Button) findViewById(R.id.record);
|
||||||
|
btnSwitchEncoder = (Button) findViewById(R.id.swEnc);
|
||||||
|
|
||||||
|
mPublisher = new SrsPublisher((SrsCameraView) findViewById(R.id.glsurfaceview_camera));
|
||||||
|
mPublisher.setRtmpHandler(new RtmpHandler(this));
|
||||||
|
mPublisher.setRecordHandler(new SrsRecordHandler(this));
|
||||||
|
mPublisher.setNetworkHandler(new SrsNetworkHandler(this));
|
||||||
|
mPublisher.setPreviewResolution(640, 480);
|
||||||
|
|
||||||
|
btnPublish.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (btnPublish.getText().toString().contentEquals("publish")) {
|
||||||
|
rtmpUrl = efu.getText().toString();
|
||||||
|
SharedPreferences.Editor editor = sp.edit();
|
||||||
|
editor.putString("rtmpUrl", rtmpUrl);
|
||||||
|
editor.apply();
|
||||||
|
|
||||||
|
mPublisher.setOutputResolution(720, 1280);
|
||||||
|
mPublisher.setVideoHDMode();
|
||||||
|
mPublisher.startPublish(rtmpUrl);
|
||||||
|
|
||||||
|
if (btnSwitchEncoder.getText().toString().contentEquals("soft encoder")) {
|
||||||
|
Toast.makeText(getApplicationContext(), "Use hard encoder", Toast.LENGTH_SHORT).show();
|
||||||
|
} else {
|
||||||
|
Toast.makeText(getApplicationContext(), "Use soft encoder", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
btnPublish.setText("stop");
|
||||||
|
btnSwitchEncoder.setEnabled(false);
|
||||||
|
} else if (btnPublish.getText().toString().contentEquals("stop")) {
|
||||||
|
mPublisher.stopPublish();
|
||||||
|
mPublisher.stopRecord();
|
||||||
|
btnPublish.setText("publish");
|
||||||
|
btnRecord.setText("record");
|
||||||
|
btnSwitchEncoder.setEnabled(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
btnSwitchCamera.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (Camera.getNumberOfCameras() > 0) {
|
||||||
|
mPublisher.switchCameraFace((mPublisher.getCamraId() + 1) % Camera.getNumberOfCameras());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
btnRecord.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (btnRecord.getText().toString().contentEquals("record")) {
|
||||||
|
mPublisher.startRecord(recPath);
|
||||||
|
btnRecord.setText("pause");
|
||||||
|
} else if (btnRecord.getText().toString().contentEquals("pause")) {
|
||||||
|
mPublisher.pauseRecord();
|
||||||
|
btnRecord.setText("resume");
|
||||||
|
} else if (btnRecord.getText().toString().contentEquals("resume")) {
|
||||||
|
mPublisher.resumeRecord();
|
||||||
|
btnRecord.setText("pause");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
btnSwitchEncoder.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
if (btnSwitchEncoder.getText().toString().contentEquals("soft encoder")) {
|
||||||
|
mPublisher.swithToSoftEncoder();
|
||||||
|
btnSwitchEncoder.setText("hard encoder");
|
||||||
|
} else if (btnSwitchEncoder.getText().toString().contentEquals("hard encoder")) {
|
||||||
|
mPublisher.swithToHardEncoder();
|
||||||
|
btnSwitchEncoder.setText("soft encoder");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
|
||||||
|
@Override
|
||||||
|
public void uncaughtException(Thread thread, Throwable ex) {
|
||||||
|
final String msg = ex.getMessage();
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
|
||||||
|
mPublisher.stopPublish();
|
||||||
|
mPublisher.stopRecord();
|
||||||
|
btnPublish.setText("publish");
|
||||||
|
btnRecord.setText("record");
|
||||||
|
btnSwitchEncoder.setEnabled(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
// Inflate the menu; this adds items to the action bar if it is present.
|
||||||
|
getMenuInflater().inflate(R.menu.menu_main, menu);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
// Handle action bar item clicks here. The action bar will
|
||||||
|
// automatically handle clicks on the Home/Up button, so long
|
||||||
|
// as you specify a parent activity in AndroidManifest.xml.
|
||||||
|
int id = item.getItemId();
|
||||||
|
|
||||||
|
//noinspection SimplifiableIfStatement
|
||||||
|
if (id == R.id.action_settings) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
switch (id) {
|
||||||
|
case R.id.cool_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.COOL);
|
||||||
|
break;
|
||||||
|
case R.id.beauty_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.BEAUTY);
|
||||||
|
break;
|
||||||
|
case R.id.early_bird_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.EARLYBIRD);
|
||||||
|
break;
|
||||||
|
case R.id.evergreen_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.EVERGREEN);
|
||||||
|
break;
|
||||||
|
case R.id.n1977_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.N1977);
|
||||||
|
break;
|
||||||
|
case R.id.nostalgia_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.NOSTALGIA);
|
||||||
|
break;
|
||||||
|
case R.id.romance_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.ROMANCE);
|
||||||
|
break;
|
||||||
|
case R.id.sunrise_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.SUNRISE);
|
||||||
|
break;
|
||||||
|
case R.id.sunset_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.SUNSET);
|
||||||
|
break;
|
||||||
|
case R.id.tender_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.TENDER);
|
||||||
|
break;
|
||||||
|
case R.id.toast_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.TOASTER2);
|
||||||
|
break;
|
||||||
|
case R.id.valencia_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.VALENCIA);
|
||||||
|
break;
|
||||||
|
case R.id.walden_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.WALDEN);
|
||||||
|
break;
|
||||||
|
case R.id.warm_filter:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.WARM);
|
||||||
|
break;
|
||||||
|
case R.id.original_filter:
|
||||||
|
default:
|
||||||
|
mPublisher.switchCameraFilter(MagicFilterType.NONE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setTitle(item.getTitle());
|
||||||
|
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
final Button btn = (Button) findViewById(R.id.publish);
|
||||||
|
btn.setEnabled(true);
|
||||||
|
mPublisher.resumeRecord();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPause() {
|
||||||
|
super.onPause();
|
||||||
|
mPublisher.pauseRecord();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
mPublisher.stopPublish();
|
||||||
|
mPublisher.stopRecord();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onConfigurationChanged(Configuration newConfig) {
|
||||||
|
super.onConfigurationChanged(newConfig);
|
||||||
|
if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||||
|
mPublisher.setPreviewRotation(90);
|
||||||
|
} else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
|
||||||
|
mPublisher.setPreviewRotation(0);
|
||||||
|
}
|
||||||
|
mPublisher.stopEncode();
|
||||||
|
mPublisher.stopRecord();
|
||||||
|
btnRecord.setText("record");
|
||||||
|
mPublisher.setScreenOrientation(newConfig.orientation);
|
||||||
|
if (btnPublish.getText().toString().contentEquals("stop")) {
|
||||||
|
mPublisher.startEncode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getRandomAlphaString(int length) {
|
||||||
|
String base = "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
Random random = new Random();
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
int number = random.nextInt(base.length());
|
||||||
|
sb.append(base.charAt(number));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getRandomAlphaDigitString(int length) {
|
||||||
|
String base = "abcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
Random random = new Random();
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
int number = random.nextInt(base.length());
|
||||||
|
sb.append(base.charAt(number));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implementation of SrsRtmpListener.
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpConnecting(String msg) {
|
||||||
|
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpConnected(String msg) {
|
||||||
|
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpVideoStreaming() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpAudioStreaming() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpStopped() {
|
||||||
|
Toast.makeText(getApplicationContext(), "Stopped", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpDisconnected() {
|
||||||
|
Toast.makeText(getApplicationContext(), "Disconnected", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpVideoFpsChanged(double fps) {
|
||||||
|
Log.i(TAG, String.format("Output Fps: %f", fps));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpVideoBitrateChanged(double bitrate) {
|
||||||
|
int rate = (int) bitrate;
|
||||||
|
if (rate / 1000 > 0) {
|
||||||
|
Log.i(TAG, String.format("Video bitrate: %f kbps", bitrate / 1000));
|
||||||
|
} else {
|
||||||
|
Log.i(TAG, String.format("Video bitrate: %d bps", rate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRtmpAudioBitrateChanged(double bitrate) {
|
||||||
|
int rate = (int) bitrate;
|
||||||
|
if (rate / 1000 > 0) {
|
||||||
|
Log.i(TAG, String.format("Audio bitrate: %f kbps", bitrate / 1000));
|
||||||
|
} else {
|
||||||
|
Log.i(TAG, String.format("Audio bitrate: %d bps", rate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implementation of SrsRecordHandler.
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRecordPause() {
|
||||||
|
Toast.makeText(getApplicationContext(), "Record paused", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRecordResume() {
|
||||||
|
Toast.makeText(getApplicationContext(), "Record resumed", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRecordStarted(String msg) {
|
||||||
|
Toast.makeText(getApplicationContext(), "Recording file: " + msg, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRecordFinished(String msg) {
|
||||||
|
Toast.makeText(getApplicationContext(), "MP4 file saved: " + msg, Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implementation of SrsNetworkHandler.
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNetworkWeak() {
|
||||||
|
Toast.makeText(getApplicationContext(), "Network weak", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onNetworkResume() {
|
||||||
|
Toast.makeText(getApplicationContext(), "Network resume", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
apply plugin: 'com.android.library'
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 24
|
||||||
|
buildToolsVersion "24.0.3"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
minSdkVersion 16
|
||||||
|
targetSdkVersion 22
|
||||||
|
versionCode 1
|
||||||
|
versionName "2.2"
|
||||||
|
|
||||||
|
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
}
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compile fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
|
||||||
|
exclude group: 'com.android.support', module: 'support-annotations'
|
||||||
|
})
|
||||||
|
compile 'com.android.support:appcompat-v7:24.2.1'
|
||||||
|
testCompile 'junit:junit:4.12'
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="net.ossrs.yasea">
|
||||||
|
|
||||||
|
<application android:allowBackup="true"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:supportsRtl="true"
|
||||||
|
>
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 608 KiB After Width: | Height: | Size: 608 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 174 B After Width: | Height: | Size: 174 B |
Before Width: | Height: | Size: 199 B After Width: | Height: | Size: 199 B |
Before Width: | Height: | Size: 229 B After Width: | Height: | Size: 229 B |
Before Width: | Height: | Size: 285 B After Width: | Height: | Size: 285 B |
Before Width: | Height: | Size: 217 B After Width: | Height: | Size: 217 B |
Before Width: | Height: | Size: 149 B After Width: | Height: | Size: 149 B |
Before Width: | Height: | Size: 142 B After Width: | Height: | Size: 142 B |
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 187 B After Width: | Height: | Size: 187 B |
Before Width: | Height: | Size: 159 B After Width: | Height: | Size: 159 B |
Before Width: | Height: | Size: 156 B After Width: | Height: | Size: 156 B |
Before Width: | Height: | Size: 208 B After Width: | Height: | Size: 208 B |
Before Width: | Height: | Size: 187 B After Width: | Height: | Size: 187 B |
Before Width: | Height: | Size: 292 KiB After Width: | Height: | Size: 292 KiB |
Before Width: | Height: | Size: 191 KiB After Width: | Height: | Size: 191 KiB |
Before Width: | Height: | Size: 223 KiB After Width: | Height: | Size: 223 KiB |
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 717 KiB After Width: | Height: | Size: 717 KiB |
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 62 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 799 KiB After Width: | Height: | Size: 799 KiB |
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
Before Width: | Height: | Size: 589 KiB After Width: | Height: | Size: 589 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 197 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.6 KiB |
Before Width: | Height: | Size: 279 B After Width: | Height: | Size: 279 B |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
Before Width: | Height: | Size: 149 B After Width: | Height: | Size: 149 B |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 237 B After Width: | Height: | Size: 237 B |
Before Width: | Height: | Size: 409 KiB After Width: | Height: | Size: 409 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
Before Width: | Height: | Size: 513 KiB After Width: | Height: | Size: 513 KiB |
Before Width: | Height: | Size: 491 KiB After Width: | Height: | Size: 491 KiB |
Before Width: | Height: | Size: 322 B After Width: | Height: | Size: 322 B |
Before Width: | Height: | Size: 297 B After Width: | Height: | Size: 297 B |
Before Width: | Height: | Size: 437 KiB After Width: | Height: | Size: 437 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 7.5 KiB After Width: | Height: | Size: 7.5 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 236 B After Width: | Height: | Size: 236 B |