fix android mediacodec encoding align (#8121)

* update ffmpeg, mediacodec encode align 64
* more d3d11 decode availablity check
* remove unused mediacodec info

Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
21pages 2024-05-22 20:18:09 +08:00 committed by GitHub
parent 91f07b4b03
commit 49b0630752
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 16 additions and 10 deletions

4
Cargo.lock generated
View File

@ -3037,8 +3037,8 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]] [[package]]
name = "hwcodec" name = "hwcodec"
version = "0.4.10" version = "0.4.11"
source = "git+https://github.com/21pages/hwcodec#9cb895fdaea198dd72bd75980109dbd05a059a60" source = "git+https://github.com/21pages/hwcodec#a5864080e41836b94feb9f73732280c651162fec"
dependencies = [ dependencies = [
"bindgen 0.59.2", "bindgen 0.59.2",
"cc", "cc",

View File

@ -265,6 +265,9 @@ class MainActivity : FlutterActivity() {
w = dm.widthPixels w = dm.widthPixels
h = dm.heightPixels h = dm.heightPixels
} }
val align = 64
w = (w + align - 1) / align * align
h = (h + align - 1) / align * align
codecs.forEach { codec -> codecs.forEach { codec ->
val codecObject = JSONObject() val codecObject = JSONObject()
codecObject.put("name", codec.name) codecObject.put("name", codec.name)
@ -281,21 +284,23 @@ class MainActivity : FlutterActivity() {
hw = true hw = true
} }
} }
if (hw != true) {
return@forEach
}
codecObject.put("hw", hw) codecObject.put("hw", hw)
var mime_type = "" var mime_type = ""
codec.supportedTypes.forEach { type -> codec.supportedTypes.forEach { type ->
if (listOf("video/avc", "video/hevc", "video/x-vnd.on2.vp8", "video/x-vnd.on2.vp9", "video/av01").contains(type)) { if (listOf("video/avc", "video/hevc").contains(type)) { // "video/x-vnd.on2.vp8", "video/x-vnd.on2.vp9", "video/av01"
mime_type = type; mime_type = type;
} }
} }
if (mime_type.isNotEmpty()) { if (mime_type.isNotEmpty()) {
codecObject.put("mime_type", mime_type) codecObject.put("mime_type", mime_type)
val caps = codec.getCapabilitiesForType(mime_type) val caps = codec.getCapabilitiesForType(mime_type)
var usable = true;
if (codec.isEncoder) { if (codec.isEncoder) {
// Encoders max_height and max_width are interchangeable // Encoders max_height and max_width are interchangeable
if (!caps.videoCapabilities.isSizeSupported(w,h) && !caps.videoCapabilities.isSizeSupported(h,w)) { if (!caps.videoCapabilities.isSizeSupported(w,h) && !caps.videoCapabilities.isSizeSupported(h,w)) {
usable = false return@forEach
} }
} }
codecObject.put("min_width", caps.videoCapabilities.supportedWidths.lower) codecObject.put("min_width", caps.videoCapabilities.supportedWidths.lower)
@ -307,7 +312,7 @@ class MainActivity : FlutterActivity() {
val nv12 = caps.colorFormats.contains(COLOR_FormatYUV420SemiPlanar) val nv12 = caps.colorFormats.contains(COLOR_FormatYUV420SemiPlanar)
codecObject.put("nv12", nv12) codecObject.put("nv12", nv12)
if (!(nv12 || surface)) { if (!(nv12 || surface)) {
usable = false return@forEach
} }
codecObject.put("min_bitrate", caps.videoCapabilities.bitrateRange.lower / 1000) codecObject.put("min_bitrate", caps.videoCapabilities.bitrateRange.lower / 1000)
codecObject.put("max_bitrate", caps.videoCapabilities.bitrateRange.upper / 1000) codecObject.put("max_bitrate", caps.videoCapabilities.bitrateRange.upper / 1000)
@ -316,9 +321,10 @@ class MainActivity : FlutterActivity() {
codecObject.put("low_latency", caps.isFeatureSupported(MediaCodecInfo.CodecCapabilities.FEATURE_LowLatency)) codecObject.put("low_latency", caps.isFeatureSupported(MediaCodecInfo.CodecCapabilities.FEATURE_LowLatency))
} }
} }
if (usable) { if (!codec.isEncoder) {
codecArray.put(codecObject) return@forEach
} }
codecArray.put(codecObject)
} }
} }
val result = JSONObject() val result = JSONObject()

View File

@ -178,8 +178,8 @@ pub struct MediaCodecInfo {
#[derive(Debug, Deserialize, Clone)] #[derive(Debug, Deserialize, Clone)]
pub struct MediaCodecInfos { pub struct MediaCodecInfos {
pub version: usize, pub version: usize,
pub w: usize, pub w: usize, // aligned
pub h: usize, pub h: usize, // aligned
pub codecs: Vec<MediaCodecInfo>, pub codecs: Vec<MediaCodecInfo>,
} }