Server-controlled AV1 support

This commit is contained in:
Isaac 2024-12-10 22:22:47 +08:00
parent 629d2a3899
commit e8706fd71b
5 changed files with 15 additions and 13 deletions

View File

@ -3609,7 +3609,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
if case let .Video(_, _, _, _, _, videoCodec) = attribute, let videoCodec { if case let .Video(_, _, _, _, _, videoCodec) = attribute, let videoCodec {
qualityDebugText += " \(videoCodec)" qualityDebugText += " \(videoCodec)"
if videoCodec == "av1" || videoCodec == "av01" { if videoCodec == "av1" || videoCodec == "av01" {
qualityDebugText += isHardwareAv1Supported ? " (HW)" : " (SW)" qualityDebugText += internal_isHardwareAv1Supported ? " (HW)" : " (SW)"
} }
} }
} }

View File

@ -6,7 +6,7 @@ import SwiftSignalKit
import Postbox import Postbox
import VideoToolbox import VideoToolbox
public let isHardwareAv1Supported: Bool = { public let internal_isHardwareAv1Supported: Bool = {
let value = VTIsHardwareDecodeSupported(kCMVideoCodecType_AV1) let value = VTIsHardwareDecodeSupported(kCMVideoCodecType_AV1)
return value return value
}() }()
@ -39,7 +39,7 @@ public final class ChunkMediaPlayerV2: ChunkMediaPlayer {
func load() { func load() {
let reader: MediaDataReader let reader: MediaDataReader
if self.mediaType == .video && (self.codecName == "av1" || self.codecName == "av01") && isHardwareAv1Supported { if self.mediaType == .video && (self.codecName == "av1" || self.codecName == "av01") && internal_isHardwareAv1Supported {
reader = AVAssetVideoDataReader(filePath: self.tempFile.path, isVideo: self.mediaType == .video) reader = AVAssetVideoDataReader(filePath: self.tempFile.path, isVideo: self.mediaType == .video)
} else { } else {
reader = FFMpegMediaDataReader(filePath: self.tempFile.path, isVideo: self.mediaType == .video, codecName: self.codecName) reader = FFMpegMediaDataReader(filePath: self.tempFile.path, isVideo: self.mediaType == .video, codecName: self.codecName)

View File

@ -36,7 +36,7 @@ public final class FFMpegMediaDataReader: MediaDataReader {
if self.isVideo { if self.isVideo {
var passthroughDecoder = true var passthroughDecoder = true
if (codecName == "av1" || codecName == "av01") && !isHardwareAv1Supported { if (codecName == "av1" || codecName == "av01") && !internal_isHardwareAv1Supported {
passthroughDecoder = false passthroughDecoder = false
} }
let videoSource = SoftwareVideoReader(path: filePath, hintVP9: false, passthroughDecoder: passthroughDecoder) let videoSource = SoftwareVideoReader(path: filePath, hintVP9: false, passthroughDecoder: passthroughDecoder)

View File

@ -16,9 +16,11 @@ import ManagedFile
import AppBundle import AppBundle
public struct HLSCodecConfiguration { public struct HLSCodecConfiguration {
public var isHardwareAv1Supported: Bool
public var isSoftwareAv1Supported: Bool public var isSoftwareAv1Supported: Bool
public init(isSoftwareAv1Supported: Bool) { public init(isHardwareAv1Supported: Bool, isSoftwareAv1Supported: Bool) {
self.isHardwareAv1Supported = isHardwareAv1Supported
self.isSoftwareAv1Supported = isSoftwareAv1Supported self.isSoftwareAv1Supported = isSoftwareAv1Supported
} }
} }
@ -26,6 +28,7 @@ public struct HLSCodecConfiguration {
public extension HLSCodecConfiguration { public extension HLSCodecConfiguration {
init(context: AccountContext) { init(context: AccountContext) {
var isSoftwareAv1Supported = false var isSoftwareAv1Supported = false
var isHardwareAv1Supported = false
var length: Int = 4 var length: Int = 4
var cpuCount: UInt32 = 0 var cpuCount: UInt32 = 0
@ -34,11 +37,14 @@ public extension HLSCodecConfiguration {
isSoftwareAv1Supported = true isSoftwareAv1Supported = true
} }
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["ios_enable_hardware_av1"] as? Double {
isHardwareAv1Supported = value != 0.0
}
if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["ios_enable_software_av1"] as? Double { if let data = context.currentAppConfiguration.with({ $0 }).data, let value = data["ios_enable_software_av1"] as? Double {
isSoftwareAv1Supported = value != 0.0 isSoftwareAv1Supported = value != 0.0
} }
self.init(isSoftwareAv1Supported: isSoftwareAv1Supported) self.init(isHardwareAv1Supported: isHardwareAv1Supported, isSoftwareAv1Supported: isSoftwareAv1Supported)
} }
} }
@ -52,7 +58,7 @@ public final class HLSQualitySet {
if let alternativeFile = alternativeRepresentation as? TelegramMediaFile { if let alternativeFile = alternativeRepresentation as? TelegramMediaFile {
for attribute in alternativeFile.attributes { for attribute in alternativeFile.attributes {
if case let .Video(_, size, _, _, _, videoCodec) = attribute { if case let .Video(_, size, _, _, _, videoCodec) = attribute {
if let videoCodec, NativeVideoContent.isVideoCodecSupported(videoCodec: videoCodec, isSoftwareAv1Supported: codecConfiguration.isSoftwareAv1Supported) { if let videoCodec, NativeVideoContent.isVideoCodecSupported(videoCodec: videoCodec, isHardwareAv1Supported: codecConfiguration.isHardwareAv1Supported, isSoftwareAv1Supported: codecConfiguration.isSoftwareAv1Supported) {
let key = Int(min(size.width, size.height)) let key = Int(min(size.width, size.height))
if let currentFile = qualityFiles[key] { if let currentFile = qualityFiles[key] {
var currentCodec: String? var currentCodec: String?

View File

@ -59,17 +59,13 @@ public final class NativeVideoContent: UniversalVideoContent {
let displayImage: Bool let displayImage: Bool
let hasSentFramesToDisplay: (() -> Void)? let hasSentFramesToDisplay: (() -> Void)?
public static func isVideoCodecSupported(videoCodec: String, isSoftwareAv1Supported: Bool) -> Bool { public static func isVideoCodecSupported(videoCodec: String, isHardwareAv1Supported: Bool, isSoftwareAv1Supported: Bool) -> Bool {
if videoCodec == "h264" || videoCodec == "h265" || videoCodec == "avc" || videoCodec == "hevc" { if videoCodec == "h264" || videoCodec == "h265" || videoCodec == "avc" || videoCodec == "hevc" {
return true return true
} }
if videoCodec == "av1" || videoCodec == "av01" { if videoCodec == "av1" || videoCodec == "av01" {
if isHardwareAv1Supported { return isHardwareAv1Supported || isSoftwareAv1Supported
return true
} else {
return isSoftwareAv1Supported
}
} }
return false return false