8000 Mob 8152 browser stack minicap kotlin by antoine-carat · Pull Request #2 · antoine-carat/minicap · GitHub
[go: up one dir, main page]

Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions experimental/app/src/main/java/io/devicefarmer/minicap/Main.kt
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ class Main {
Pair(p, elem)
} else {
when (lastKey) {
"-n" -> p.socket(elem)
"-n" -> p.socketPort(elem.toInt())
"-P" -> p.projection(elem)
"-Q" -> p.quality(elem.toInt())
"-r" -> p.frameRate(elem.toFloat())
Expand Down Expand Up @@ -81,7 +81,7 @@ class Main {
//the stf process reads this
System.err.println("PID: ${android.os.Process.myPid()}")
System.err.println("INFO: ${params.projection}")
val server = SimpleServer(params.socket, provider)
val server = SimpleServer(params.socketPort, provider)
server.start()
}
}
Expand Down Expand Up @@ -135,15 +135,15 @@ data class Projection(
class Parameters private constructor(
val projection: Projection?,
val screenshot: Boolean,
val socket: String,
val socketPort: Int,
val quality: Int,
val displayInfo: Boolean,
val frameRate: Float
) {
data class Builder(
var projection: Projection? = null,
var screenshot: Boolean = false,
var socket: String = "minicap",
var socketPort: Int = 2020,
var quality: Int = 100,
var displayInfo: Boolean = false,
var frameRate: Float = Float.MAX_VALUE
Expand All @@ -161,10 +161,10 @@ class Parameters private constructor(
}

fun screenshot(s: Boolean) = apply { this.screenshot = s }
fun socket(name: String) = apply { this.socket = name }
fun socketPort(portno: Int) = apply { this.socketPort = portno }
fun quality(value: Int) = apply { this.quality = value }
fun displayInfo(enabled: Boolean) = apply { this.displayInfo = enabled }
fun frameRate(value: Float) = apply { this.frameRate = value }
fun build() = Parameters(projection, screenshot, socket, quality, displayInfo, frameRate)
fun build() = Parameters(projection, screenshot, socketPort, quality, displayInfo, frameRate)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,29 +15,29 @@

package io.devicefarmer.minicap

import android.net.LocalServerSocket
import android.net.LocalSocket
import java.net.ServerSocket
import java.net.Socket
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.io.IOException

/**
* Minimalist "server" to bootstrap development
*/
class SimpleServer(private val socket: String, private val listener: Listener) {
class SimpleServer(private val portno: Int, private val listener: Listener) {
companion object {
val log: Logger = LoggerFactory.getLogger(Main::class.java.simpleName)
}

interface Listener {
fun onConnection(socket: LocalSocket)
fun onConnection(socket: Socket)
}

fun start() {
try {
val serverSocket = LocalServerSocket(socket)
log.info("Listening on socket : ${socket}")
val clientSocket: LocalSocket = serverSocket.accept()
val serverSocket = ServerSocket(portno)
log.info("Socket listening on port: ${portno}")
val clientSocket: Socket = serverSocket.accept()
listener.onConnection(clientSocket)
} catch (e: IOException) {
log.error("error waiting connection", e)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@

package io.devicefarmer.minicap.output

import android.net.LocalSocket
import android.util.Size
import java.net.Socket
import java.nio.ByteBuffer
import java.nio.ByteOrder

Expand All @@ -27,7 +27,7 @@ import java.nio.ByteOrder
*/
@ExperimentalUnsignedTypes
class MinicapClientOutput(
private val socket: LocalSocket
private val socket: Socket
) :
DisplayOutput() {
companion object {
Expand Down
BD0
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,19 @@ import android.graphics.Bitmap
import android.graphics.PixelFormat
import android.media.Image
import android.media.ImageReader
import android.net.LocalSocket
import android.util.Size
import io.devicefarmer.minicap.output.DisplayOutput
import io.devicefarmer.minicap.output.MinicapClientOutput
import io.devicefarmer.minicap.SimpleServer
import org.slf4j.LoggerFactory
import java.io.ByteArrayOutputStream
import java.io.DataInputStream
import java.io.OutputStream
import java.io.PrintStream
import java.net.Socket
import java.nio.ByteBuffer
import java.nio.Buffer
import java.util.Scanner

/**
* Base class to provide images of the screen. Those captures can be setup from SurfaceControl - as
Expand All @@ -45,6 +49,7 @@ abstract class BaseProvider(private val targetSize: Size, val rotation: Int) : S

private lateinit var clientOutput: DisplayOutput
private lateinit var imageReader: ImageReader
private lateinit var lastImage: ByteArray
private var previousTimeStamp: Long = 0L
private var framePeriodMs: Long = 0
private var bitmap: Bitmap? = null //is used to compress the images
Expand Down Expand Up @@ -73,11 +78,18 @@ abstract class BaseProvider(private val targetSize: Size, val rotation: Int) : S
clientOutput = out
}

override fun onConnection(socket: LocalSocket) {
clientOutput = MinicapClientOutput(socket).apply {
sendBanner(getScreenSize(),getTargetSize(),rotation)
}
override fun onConnection(socket: Socket) {
clientOutput = MinicapClientOutput(socket)
log.info("New client connected")
init(clientOutput)
Thread {
val input = Scanner(socket.inputStream)
while(input.hasNext()) {
val read_byte = input.next()
log.info("Received ${read_byte}, sending the last image through")
clientOutput.send()
}
}.start()
}

override fun onImageAvailable(reader: ImageReader) {
Expand All @@ -86,8 +98,8 @@ abstract class BaseProvider(private val targetSize: Size, val rotation: Int) : S
if (image != null) {
if (currentTime - previousTimeStamp > framePeriodMs) {
previousTimeStamp = currentTime
clientOutput.imageBuffer
encode(image, quality, clientOutput.imageBuffer)
clientOutput.send()
} else {
log.warn("skipping frame ($currentTime/$previousTimeStamp)")
}
Expand Down Expand Up @@ -115,6 +127,8 @@ abstract class BaseProvider(private val targetSize: Size, val rotation: Int) : S
//the image need to be cropped
Bitmap.createBitmap(this, 0, 0, getTargetSize().width, getTargetSize().height)
}.apply {
(out as ByteArrayOutputStream).reset()
// copyPixelsToBuffer(out as Buffer)
compress(Bitmap.CompressFormat.JPEG, q, out)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package io.devicefarmer.minicap.provider

import android.graphics.Rect
import android.media.ImageReader
import android.net.LocalSocket
import android.os.Handler
import android.os.IBinder
import android.os.Looper
Expand All @@ -27,6 +26,7 @@ import io.devicefarmer.minicap.utils.DisplayInfo
import io.devicefarmer.minicap.utils.DisplayManagerGlobal
import io.devicefarmer.minicap.utils.SurfaceControl
import java.io.PrintStream
import java.net.Socket
import kotlin.system.exitProcess

/**
Expand Down Expand Up @@ -69,7 +69,7 @@ class SurfaceProvider(targetSize: Size, orientation: Int) : BaseProvider(targetS
/**
*
*/
override fun onConnection(socket: LocalSocket) {
override fun onConnection(socket: Socket) {
super.onConnection(socket)
initSurface()
}
Expand Down
0