Skip to content

Commit

Permalink
Set the preferred bitmap config in VideoFrameDecoder on API 30+. (#1487)
Browse files Browse the repository at this point in the history
* Set the preferred bitmap config in VideoFrameDecoder on API 30+.

* Fix tests.
  • Loading branch information
colinrtwhite committed Oct 1, 2022
1 parent 456d1fc commit 6a0fac7
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
6 changes: 4 additions & 2 deletions coil-video/src/main/java/coil/decode/VideoFrameDecoder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ import coil.request.videoFramePercent
import coil.size.Dimension.Pixels
import coil.size.Size
import coil.size.pxOrElse
import coil.util.getFrameAtTime
import coil.util.getScaledFrameAtTime
import coil.util.heightPx
import coil.util.use
import coil.util.widthPx
Expand Down Expand Up @@ -80,9 +82,9 @@ class VideoFrameDecoder(

val (dstWidth, dstHeight) = dstSize
val rawBitmap: Bitmap? = if (SDK_INT >= 27 && dstWidth is Pixels && dstHeight is Pixels) {
retriever.getScaledFrameAtTime(frameMicros, option, dstWidth.px, dstHeight.px)
retriever.getScaledFrameAtTime(frameMicros, option, dstWidth.px, dstHeight.px, options.config)
} else {
retriever.getFrameAtTime(frameMicros, option)?.also {
retriever.getFrameAtTime(frameMicros, option, options.config)?.also {
srcWidth = it.width
srcHeight = it.height
}
Expand Down
28 changes: 28 additions & 0 deletions coil-video/src/main/java/coil/util/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

package coil.util

import android.graphics.Bitmap
import android.media.MediaMetadataRetriever
import android.media.MediaMetadataRetriever.BitmapParams
import android.os.Build.VERSION.SDK_INT
import androidx.annotation.RequiresApi
import coil.size.Dimension
import coil.size.Scale
import coil.size.Size
Expand All @@ -24,6 +27,31 @@ internal inline fun <T> MediaMetadataRetriever.use(block: (MediaMetadataRetrieve
}
}

internal fun MediaMetadataRetriever.getFrameAtTime(
timeUs: Long,
option: Int,
config: Bitmap.Config,
): Bitmap? = if (SDK_INT >= 30) {
val params = BitmapParams().apply { preferredConfig = config }
getFrameAtTime(timeUs, option, params)
} else {
getFrameAtTime(timeUs, option)
}

@RequiresApi(27)
internal fun MediaMetadataRetriever.getScaledFrameAtTime(
timeUs: Long,
option: Int,
dstWidth: Int,
dstHeight: Int,
config: Bitmap.Config,
): Bitmap? = if (SDK_INT >= 30) {
val params = BitmapParams().apply { preferredConfig = config }
getScaledFrameAtTime(timeUs, option, dstWidth, dstHeight, params)
} else {
getScaledFrameAtTime(timeUs, option, dstWidth, dstHeight)
}

internal inline fun Size.widthPx(scale: Scale, original: () -> Int): Int {
return if (isOriginal) original() else width.toPx(scale)
}
Expand Down

0 comments on commit 6a0fac7

Please sign in to comment.