From 55fb631952f59d8bb560936256d5b6b65ff24833 Mon Sep 17 00:00:00 2001 From: tateisu Date: Thu, 20 Jul 2023 10:50:15 +0900 Subject: [PATCH] =?UTF-8?q?=E5=8B=95=E7=94=BB=E3=81=AE=E5=86=8D=E3=82=A8?= =?UTF-8?q?=E3=83=B3=E3=82=B3=E3=83=BC=E3=83=89=E6=99=82=E3=81=AB=E3=83=94?= =?UTF-8?q?=E3=82=AF=E3=82=BB=E3=83=AB=E3=82=B5=E3=82=A4=E3=82=BA=E3=81=8C?= =?UTF-8?q?=E5=A5=87=E6=95=B0=E3=81=AB=E3=81=AA=E3=82=89=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../subwaytooter/util/AttachmentRequest.kt | 8 ++-- .../java/jp/juggler/util/media/MovieUtils.kt | 47 ++++++++++++++----- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentRequest.kt b/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentRequest.kt index f2471b95..7d45a80a 100644 --- a/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentRequest.kt +++ b/app/src/main/java/jp/juggler/subwaytooter/util/AttachmentRequest.kt @@ -97,13 +97,11 @@ class AttachmentRequest( suspend fun createOpener(): InputStreamOpener { val mimeType = this.mimeType - // GIFはそのまま投げる if (mimeType == MIME_TYPE_GIF) { + // GIFはそのまま投げる return contentUriOpener(context.contentResolver, uri, mimeType, isImage = true) - } - - // 静止画 - if (mimeType.startsWith("image")) { + }else if (mimeType.startsWith("image")) { + // 静止画 return createResizedImageOpener() } diff --git a/base/src/main/java/jp/juggler/util/media/MovieUtils.kt b/base/src/main/java/jp/juggler/util/media/MovieUtils.kt index da92fb21..80c44cf3 100644 --- a/base/src/main/java/jp/juggler/util/media/MovieUtils.kt +++ b/base/src/main/java/jp/juggler/util/media/MovieUtils.kt @@ -68,6 +68,36 @@ data class MovieResizeConfig( } } +/** + * レシーバが奇数なら+1した値を返す + * + * `[OMX.qcom.video.encoder.avc] video encoder does not support odd resolution 1018x2263` + */ +private fun Int.fixOdd() = if (and(1) == 0) this else this + 1 + +/** + * 動画のピクセルサイズを制限に合わせてスケーリングする + */ +private fun createScaledSize(inSize: Size, limitSquarePixels: Int): Size { + + if (inSize.major <= 0 || inSize.minor <= 0) { + // 入力サイズの縦横が0以下の場合、アスペクト比を計算できないのでリサイズできない + log.w("createScaledSize: video size not valid. major=${inSize.major}, minor=${inSize.minor}") + return inSize + } + + val squarePixels = inSize.major * inSize.minor + if (squarePixels <= limitSquarePixels) { + return inSize + } + + val aspect = inSize.major.toFloat() / inSize.minor.toFloat() + return Size( + max(1f, sqrt(limitSquarePixels.toFloat() * aspect)).toInt().fixOdd(), + max(1f, sqrt(limitSquarePixels.toFloat() / aspect)).toInt().fixOdd(), + ) +} + @Suppress("BlockingMethodInNonBlockingContext") suspend fun transcodeVideo( info: VideoInfo, @@ -122,19 +152,10 @@ suspend fun transcodeVideo( .addDataSource(inStream.fd) .setVideoTrackStrategy(DefaultVideoStrategy.Builder() .addResizer { inSize -> - val squarePixels = inSize.major * inSize.minor - val limit = resizeConfig.limitSquarePixels - if (squarePixels <= limit || inSize.major <= 0 || inSize.minor <= 0) { - // 入力サイズが0以下の場合もアスペクト計算に支障がでるのでリサイズできない - inSize - } else { - // アスペクト比を維持しつつ平方ピクセルが指定に収まるようにする - val aspect = inSize.major.toFloat() / inSize.minor.toFloat() - Size( - max(1, (sqrt(limit.toFloat() * aspect) + 0.5f).toInt()), - max(1, (sqrt(limit.toFloat() / aspect) + 0.5f).toInt()), - ) - } + createScaledSize( + inSize = inSize, + limitSquarePixels = resizeConfig.limitSquarePixels + ) } .frameRate(resizeConfig.limitFrameRate) .keyFrameInterval(10f)