diff --git a/Telegram/BUILD b/Telegram/BUILD index c9378ffa2a..a41cc73d2d 100644 --- a/Telegram/BUILD +++ b/Telegram/BUILD @@ -1693,6 +1693,8 @@ plist_fragment( UIAppFonts SFCompactRounded-Semibold.otf + AremacFS-Regular.otf + AremacFS-Semibold.otf UIBackgroundModes diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 72dce6668f..e173067741 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -6597,3 +6597,8 @@ Sorry for the inconvenience."; "TwoFactorRemember.Done.Title" = "Perfect!"; "TwoFactorRemember.Done.Text" = "You still remember your password."; "TwoFactorRemember.Done.Action" = "Back to Settings"; + +"VoiceChat.VideoPreviewFrontCamera" = "Front Camera"; +"VoiceChat.VideoPreviewBackCamera" = "Back Camera"; +"VoiceChat.VideoPreviewContinue" = "Continue"; +"VoiceChat.VideoPreviewShareScreenInfo" = "Everything on your screen, including notifications, will be shared."; diff --git a/submodules/AccountContext/Sources/GalleryController.swift b/submodules/AccountContext/Sources/GalleryController.swift index 376252b271..fbfab81a96 100644 --- a/submodules/AccountContext/Sources/GalleryController.swift +++ b/submodules/AccountContext/Sources/GalleryController.swift @@ -18,10 +18,10 @@ public final class GalleryControllerActionInteraction { public let openHashtag: (String?, String) -> Void public let openBotCommand: (String) -> Void public let addContact: (String) -> Void - public let storeMediaPlaybackState: (MessageId, Double?) -> Void + public let storeMediaPlaybackState: (MessageId, Double?, Double) -> Void public let editMedia: (MessageId, [UIView], @escaping () -> Void) -> Void - public init(openUrl: @escaping (String, Bool) -> Void, openUrlIn: @escaping (String) -> Void, openPeerMention: @escaping (String) -> Void, openPeer: @escaping (PeerId) -> Void, openHashtag: @escaping (String?, String) -> Void, openBotCommand: @escaping (String) -> Void, addContact: @escaping (String) -> Void, storeMediaPlaybackState: @escaping (MessageId, Double?) -> Void, editMedia: @escaping (MessageId, [UIView], @escaping () -> Void) -> Void) { + public init(openUrl: @escaping (String, Bool) -> Void, openUrlIn: @escaping (String) -> Void, openPeerMention: @escaping (String) -> Void, openPeer: @escaping (PeerId) -> Void, openHashtag: @escaping (String?, String) -> Void, openBotCommand: @escaping (String) -> Void, addContact: @escaping (String) -> Void, storeMediaPlaybackState: @escaping (MessageId, Double?, Double) -> Void, editMedia: @escaping (MessageId, [UIView], @escaping () -> Void) -> Void) { self.openUrl = openUrl self.openUrlIn = openUrlIn self.openPeerMention = openPeerMention diff --git a/submodules/ChatListUI/Sources/Node/ChatListNodeEntries.swift b/submodules/ChatListUI/Sources/Node/ChatListNodeEntries.swift index 96eb178e95..e42428259f 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListNodeEntries.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListNodeEntries.swift @@ -347,7 +347,7 @@ func chatListNodeEntriesForView(_ view: ChatListView, state: ChatListNodeState, } } - result.append(.PeerEntry(index: ChatListIndex.absoluteUpperBound.predecessor, presentationData: state.presentationData, messages: [], readState: nil, isRemovedFromTotalUnreadCount: false, embeddedInterfaceState: nil, peer: RenderedPeer(peerId: savedMessagesPeer.id, peers: SimpleDictionary([savedMessagesPeer.id: savedMessagesPeer])), presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(), editing: state.editing, hasActiveRevealControls: false, selected: false, inputActivities: nil, promoInfo: nil, hasFailedMessages: false, isContact: false)) + result.append(.PeerEntry(index: ChatListIndex.absoluteUpperBound.predecessor, presentationData: state.presentationData, messages: [], readState: nil, isRemovedFromTotalUnreadCount: false, embeddedInterfaceState: nil, peer: RenderedPeer(peerId: savedMessagesPeer.id, peers: SimpleDictionary([savedMessagesPeer.id: savedMessagesPeer])), presence: nil, summaryInfo: ChatListMessageTagSummaryInfo(), editing: state.editing, hasActiveRevealControls: false, selected: state.selectedPeerIds.contains(savedMessagesPeer.id), inputActivities: nil, promoInfo: nil, hasFailedMessages: false, isContact: false)) } else { if !filteredAdditionalItemEntries.isEmpty { for item in filteredAdditionalItemEntries.reversed() { diff --git a/submodules/Display/Source/NavigationBar.swift b/submodules/Display/Source/NavigationBar.swift index 8f677e6c73..11f2cf8a17 100644 --- a/submodules/Display/Source/NavigationBar.swift +++ b/submodules/Display/Source/NavigationBar.swift @@ -239,7 +239,7 @@ open class NavigationBar: ASDisplayNode { var presentationData: NavigationBarPresentationData - private var validLayout: (size: CGSize, defaultHeight: CGFloat, additionalTopHeight: CGFloat, additionalContentHeight: CGFloat, additionalBackgroundHeight: CGFloat, leftInset: CGFloat, rightInset: CGFloat, appearsHidden: Bool)? + private var validLayout: (size: CGSize, defaultHeight: CGFloat, additionalTopHeight: CGFloat, additionalContentHeight: CGFloat, additionalBackgroundHeight: CGFloat, leftInset: CGFloat, rightInset: CGFloat, appearsHidden: Bool, isLandscape: Bool)? private var requestedLayout: Bool = false var requestContainerLayout: (ContainedViewLayoutTransition) -> Void = { _ in } @@ -940,16 +940,16 @@ open class NavigationBar: ASDisplayNode { if let validLayout = self.validLayout, self.requestedLayout { self.requestedLayout = false - self.updateLayout(size: validLayout.size, defaultHeight: validLayout.defaultHeight, additionalTopHeight: validLayout.additionalTopHeight, additionalContentHeight: validLayout.additionalContentHeight, additionalBackgroundHeight: validLayout.additionalBackgroundHeight, leftInset: validLayout.leftInset, rightInset: validLayout.rightInset, appearsHidden: validLayout.appearsHidden, transition: .immediate) + self.updateLayout(size: validLayout.size, defaultHeight: validLayout.defaultHeight, additionalTopHeight: validLayout.additionalTopHeight, additionalContentHeight: validLayout.additionalContentHeight, additionalBackgroundHeight: validLayout.additionalBackgroundHeight, leftInset: validLayout.leftInset, rightInset: validLayout.rightInset, appearsHidden: validLayout.appearsHidden, isLandscape: validLayout.isLandscape, transition: .immediate) } } - func updateLayout(size: CGSize, defaultHeight: CGFloat, additionalTopHeight: CGFloat, additionalContentHeight: CGFloat, additionalBackgroundHeight: CGFloat, leftInset: CGFloat, rightInset: CGFloat, appearsHidden: Bool, transition: ContainedViewLayoutTransition) { + func updateLayout(size: CGSize, defaultHeight: CGFloat, additionalTopHeight: CGFloat, additionalContentHeight: CGFloat, additionalBackgroundHeight: CGFloat, leftInset: CGFloat, rightInset: CGFloat, appearsHidden: Bool, isLandscape: Bool, transition: ContainedViewLayoutTransition) { if self.layoutSuspended { return } - self.validLayout = (size, defaultHeight, additionalTopHeight, additionalContentHeight, additionalBackgroundHeight, leftInset, rightInset, appearsHidden) + self.validLayout = (size, defaultHeight, additionalTopHeight, additionalContentHeight, additionalBackgroundHeight, leftInset, rightInset, appearsHidden, isLandscape) let backgroundFrame = CGRect(origin: CGPoint(), size: CGSize(width: size.width, height: size.height + additionalBackgroundHeight)) if self.backgroundNode.frame != backgroundFrame { @@ -995,7 +995,7 @@ open class NavigationBar: ASDisplayNode { var leftTitleInset: CGFloat = leftInset + 1.0 var rightTitleInset: CGFloat = rightInset + 1.0 if self.backButtonNode.supernode != nil { - let backButtonSize = self.backButtonNode.updateLayout(constrainedSize: CGSize(width: size.width, height: nominalHeight)) + let backButtonSize = self.backButtonNode.updateLayout(constrainedSize: CGSize(width: size.width, height: nominalHeight), isLandscape: isLandscape) leftTitleInset += backButtonSize.width + backButtonInset + 1.0 let topHitTestSlop = (nominalHeight - backButtonSize.height) * 0.5 @@ -1047,7 +1047,7 @@ open class NavigationBar: ASDisplayNode { self.badgeNode.alpha = 1.0 } } else if self.leftButtonNode.supernode != nil { - let leftButtonSize = self.leftButtonNode.updateLayout(constrainedSize: CGSize(width: size.width, height: nominalHeight)) + let leftButtonSize = self.leftButtonNode.updateLayout(constrainedSize: CGSize(width: size.width, height: nominalHeight), isLandscape: isLandscape) leftTitleInset += leftButtonSize.width + leftButtonInset + 1.0 self.leftButtonNode.alpha = 1.0 @@ -1059,7 +1059,7 @@ open class NavigationBar: ASDisplayNode { transition.updateFrame(node: self.badgeNode, frame: CGRect(origin: backButtonArrowFrame.origin.offsetBy(dx: 7.0, dy: -9.0), size: badgeSize)) if self.rightButtonNode.supernode != nil { - let rightButtonSize = self.rightButtonNode.updateLayout(constrainedSize: (CGSize(width: size.width, height: nominalHeight))) + let rightButtonSize = self.rightButtonNode.updateLayout(constrainedSize: (CGSize(width: size.width, height: nominalHeight)), isLandscape: isLandscape) rightTitleInset += rightButtonSize.width + leftButtonInset + 1.0 self.rightButtonNode.alpha = 1.0 transition.updateFrame(node: self.rightButtonNode, frame: CGRect(origin: CGPoint(x: size.width - leftButtonInset - rightButtonSize.width, y: contentVerticalOrigin + floor((nominalHeight - rightButtonSize.height) / 2.0)), size: rightButtonSize)) @@ -1073,7 +1073,7 @@ open class NavigationBar: ASDisplayNode { break case .bottom: if let transitionBackButtonNode = self.transitionBackButtonNode { - let transitionBackButtonSize = transitionBackButtonNode.updateLayout(constrainedSize: CGSize(width: size.width, height: nominalHeight)) + let transitionBackButtonSize = transitionBackButtonNode.updateLayout(constrainedSize: CGSize(width: size.width, height: nominalHeight), isLandscape: isLandscape) let initialX: CGFloat = backButtonInset + size.width * 0.3 let finalX: CGFloat = floor((size.width - transitionBackButtonSize.width) / 2.0) @@ -1204,7 +1204,7 @@ open class NavigationBar: ASDisplayNode { node.updateManualText(self.backButtonNode.manualText) node.color = accentColor if let validLayout = self.validLayout { - let _ = node.updateLayout(constrainedSize: CGSize(width: validLayout.size.width, height: validLayout.defaultHeight)) + let _ = node.updateLayout(constrainedSize: CGSize(width: validLayout.size.width, height: validLayout.defaultHeight), isLandscape: validLayout.isLandscape) node.frame = self.backButtonNode.frame } return node @@ -1227,7 +1227,7 @@ open class NavigationBar: ASDisplayNode { node.updateItems(items) node.color = accentColor if let validLayout = self.validLayout { - let _ = node.updateLayout(constrainedSize: CGSize(width: validLayout.size.width, height: validLayout.defaultHeight)) + let _ = node.updateLayout(constrainedSize: CGSize(width: validLayout.size.width, height: validLayout.defaultHeight), isLandscape: validLayout.isLandscape) node.frame = self.backButtonNode.frame } return node diff --git a/submodules/Display/Source/NavigationButtonNode.swift b/submodules/Display/Source/NavigationButtonNode.swift index 4ad1cd4318..8cb826e190 100644 --- a/submodules/Display/Source/NavigationButtonNode.swift +++ b/submodules/Display/Source/NavigationButtonNode.swift @@ -255,8 +255,6 @@ private final class NavigationButtonItemNode: ImmediateTextNode { public override func touchesMoved(_ touches: Set, with event: UIEvent?) { super.touchesMoved(touches, with: event) - - //self.updateHighlightedState(self.touchInsideApparentBounds(touches.first!), animated: true) } public override func touchesEnded(_ touches: Set, with event: UIEvent?) { @@ -274,6 +272,15 @@ private final class NavigationButtonItemNode: ImmediateTextNode { self.pressed() } } + + public override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { + if let node = self.node as? HighlightableButtonNode { + let result = node.view.hitTest(self.view.convert(point, to: node.view), with: event) + return result + } else { + return super.hitTest(point, with: event) + } + } public override func touchesCancelled(_ touches: Set?, with event: UIEvent?) { super.touchesCancelled(touches, with: event) @@ -453,7 +460,7 @@ public final class NavigationButtonNode: ASDisplayNode { } } - public func updateLayout(constrainedSize: CGSize) -> CGSize { + public func updateLayout(constrainedSize: CGSize, isLandscape: Bool) -> CGSize { var nodeOrigin = CGPoint() var totalSize = CGSize() for node in self.nodes { @@ -468,6 +475,9 @@ public final class NavigationButtonNode: ASDisplayNode { totalSize.height = max(totalSize.height, nodeSize.height) node.frame = CGRect(origin: CGPoint(x: nodeOrigin.x, y: floor((totalSize.height - nodeSize.height) / 2.0)), size: nodeSize) nodeOrigin.x += node.bounds.width + if isLandscape { + nodeOrigin.x += 16.0 + } } return totalSize } diff --git a/submodules/Display/Source/ViewController.swift b/submodules/Display/Source/ViewController.swift index 924cd07fe6..b5b9e7cac5 100644 --- a/submodules/Display/Source/ViewController.swift +++ b/submodules/Display/Source/ViewController.swift @@ -381,6 +381,8 @@ public enum TabBarItemContextActionType { } self.navigationBarOrigin = navigationBarFrame.origin.y + + let isLandscape = layout.size.width > layout.size.height if let navigationBar = self.navigationBar { if let contentNode = navigationBar.contentNode, case .expansion = contentNode.mode, !self.displayNavigationBar { @@ -392,7 +394,7 @@ public enum TabBarItemContextActionType { navigationBarFrame.size.height += NavigationBar.defaultSecondaryContentHeight //navigationBarFrame.origin.y += NavigationBar.defaultSecondaryContentHeight } - navigationBar.updateLayout(size: navigationBarFrame.size, defaultHeight: navigationLayout.defaultContentHeight, additionalTopHeight: statusBarHeight, additionalContentHeight: self.additionalNavigationBarHeight, additionalBackgroundHeight: additionalBackgroundHeight, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, appearsHidden: !self.displayNavigationBar, transition: transition) + navigationBar.updateLayout(size: navigationBarFrame.size, defaultHeight: navigationLayout.defaultContentHeight, additionalTopHeight: statusBarHeight, additionalContentHeight: self.additionalNavigationBarHeight, additionalBackgroundHeight: additionalBackgroundHeight, leftInset: layout.safeInsets.left, rightInset: layout.safeInsets.right, appearsHidden: !self.displayNavigationBar, isLandscape: isLandscape, transition: transition) if !transition.isAnimated { navigationBar.layer.cancelAnimationsRecursive(key: "bounds") navigationBar.layer.cancelAnimationsRecursive(key: "position") diff --git a/submodules/FFMpegBinding/Sources/FFMpegSWResample.m b/submodules/FFMpegBinding/Sources/FFMpegSWResample.m index 16c2a888dc..f8e68d51b0 100644 --- a/submodules/FFMpegBinding/Sources/FFMpegSWResample.m +++ b/submodules/FFMpegBinding/Sources/FFMpegSWResample.m @@ -6,11 +6,16 @@ #import "libswresample/swresample.h" @interface FFMpegSWResample () { - int _sourceChannelCount; + int _sourceSampleRate; + FFMpegAVSampleFormat _sourceSampleFormat; + int _destinationChannelCount; + int _destinationSampleRate; + FFMpegAVSampleFormat _destinationSampleFormat; + + int _currentSourceChannelCount; + SwrContext *_context; NSUInteger _ratio; - NSInteger _destinationChannelCount; - enum FFMpegAVSampleFormat _destinationSampleFormat; void *_buffer; int _bufferSize; } @@ -22,36 +27,57 @@ - (instancetype)initWithSourceChannelCount:(NSInteger)sourceChannelCount sourceSampleRate:(NSInteger)sourceSampleRate sourceSampleFormat:(enum FFMpegAVSampleFormat)sourceSampleFormat destinationChannelCount:(NSInteger)destinationChannelCount destinationSampleRate:(NSInteger)destinationSampleRate destinationSampleFormat:(enum FFMpegAVSampleFormat)destinationSampleFormat { self = [super init]; if (self != nil) { - _sourceChannelCount = sourceChannelCount; - _destinationChannelCount = destinationChannelCount; + _sourceSampleRate = (int)sourceSampleRate; + _sourceSampleFormat = sourceSampleFormat; + _destinationChannelCount = (int)destinationChannelCount; + _destinationSampleRate = (int)destinationSampleRate; _destinationSampleFormat = destinationSampleFormat; - _context = swr_alloc_set_opts(NULL, - av_get_default_channel_layout((int)destinationChannelCount), - (enum AVSampleFormat)destinationSampleFormat, - (int)destinationSampleRate, - av_get_default_channel_layout((int)sourceChannelCount), - (enum AVSampleFormat)sourceSampleFormat, - (int)sourceSampleRate, - 0, - NULL); - _ratio = MAX(1, destinationSampleRate / MAX(sourceSampleRate, 1)) * MAX(1, destinationChannelCount / sourceChannelCount) * 2; - swr_init(_context); + + _currentSourceChannelCount = -1; } return self; } - (void)dealloc { - swr_free(&_context); + if (_context) { + swr_free(&_context); + } if (_buffer) { free(_buffer); } } +- (void)resetContextForChannelCount:(int)channelCount { + if (_context) { + swr_free(&_context); + _context = NULL; + } + + _context = swr_alloc_set_opts(NULL, + av_get_default_channel_layout((int)_destinationChannelCount), + (enum AVSampleFormat)_destinationSampleFormat, + (int)_destinationSampleRate, + av_get_default_channel_layout(channelCount), + (enum AVSampleFormat)_sourceSampleFormat, + (int)_sourceSampleRate, + 0, + NULL); + _currentSourceChannelCount = channelCount; + _ratio = MAX(1, _destinationSampleRate / MAX(_sourceSampleRate, 1)) * MAX(1, _destinationChannelCount / channelCount) * 2; + if (_context) { + swr_init(_context); + } +} + - (NSData * _Nullable)resample:(FFMpegAVFrame *)frame { AVFrame *frameImpl = (AVFrame *)[frame impl]; int numChannels = frameImpl->channels; - if (numChannels != _sourceChannelCount) { + if (numChannels != _currentSourceChannelCount) { + [self resetContextForChannelCount:numChannels]; + } + + if (!_context) { return nil; } diff --git a/submodules/GalleryData/Sources/GalleryData.swift b/submodules/GalleryData/Sources/GalleryData.swift index b3482de298..ba873e0d3c 100644 --- a/submodules/GalleryData/Sources/GalleryData.swift +++ b/submodules/GalleryData/Sources/GalleryData.swift @@ -230,20 +230,20 @@ public func chatMessageGalleryControllerData(context: AccountContext, chatLocati let gallery = SecretMediaPreviewController(context: context, messageId: message.id) return .secretGallery(gallery) } else { - let startTimecode: Signal + let startState: Signal<(timecode: Double?, rate: Double), NoError> if let timecode = timecode { - startTimecode = .single(timecode) + startState = .single((timecode: timecode, rate: 1.0)) } else { - startTimecode = mediaPlaybackStoredState(postbox: context.account.postbox, messageId: message.id) + startState = mediaPlaybackStoredState(postbox: context.account.postbox, messageId: message.id) |> map { state in - return state?.timestamp + return (state?.timestamp, state?.playbackRate.doubleValue ?? 1.0) } } - return .gallery(startTimecode + return .gallery(startState |> deliverOnMainQueue - |> map { timecode in - let gallery = GalleryController(context: context, source: source ?? (standalone ? .standaloneMessage(message) : .peerMessagesAtId(messageId: message.id, chatLocation: chatLocation ?? .peer(message.id.peerId), chatLocationContextHolder: chatLocationContextHolder ?? Atomic(value: nil))), invertItemOrder: reverseMessageGalleryOrder, streamSingleVideo: stream, fromPlayingVideo: autoplayingVideo, landscape: landscape, timecode: timecode, synchronousLoad: synchronousLoad, replaceRootController: { [weak navigationController] controller, ready in + |> map { startState in + let gallery = GalleryController(context: context, source: source ?? (standalone ? .standaloneMessage(message) : .peerMessagesAtId(messageId: message.id, chatLocation: chatLocation ?? .peer(message.id.peerId), chatLocationContextHolder: chatLocationContextHolder ?? Atomic(value: nil))), invertItemOrder: reverseMessageGalleryOrder, streamSingleVideo: stream, fromPlayingVideo: autoplayingVideo, landscape: landscape, timecode: startState.timecode, playbackRate: startState.rate, synchronousLoad: synchronousLoad, replaceRootController: { [weak navigationController] controller, ready in navigationController?.replaceTopController(controller, animated: false, ready: ready) }, baseNavigationController: navigationController, actionInteraction: actionInteraction) gallery.temporaryDoNotWaitForReady = autoplayingVideo diff --git a/submodules/GalleryUI/BUILD b/submodules/GalleryUI/BUILD index 6a06062b21..59860c2bf8 100644 --- a/submodules/GalleryUI/BUILD +++ b/submodules/GalleryUI/BUILD @@ -28,7 +28,10 @@ swift_library( "//submodules/OverlayStatusController:OverlayStatusController", "//submodules/PresentationDataUtils:PresentationDataUtils", "//submodules/UrlEscaping:UrlEscaping", - "//submodules/ManagedAnimationNode:ManagedAnimationNode" + "//submodules/ManagedAnimationNode:ManagedAnimationNode", + "//submodules/ContextUI:ContextUI", + "//submodules/SaveToCameraRoll:SaveToCameraRoll", + "//submodules/TelegramUIPreferences:TelegramUIPreferences", ], visibility = [ "//visibility:public", diff --git a/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift b/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift index 754909b00a..55d8a248a0 100644 --- a/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift +++ b/submodules/GalleryUI/Sources/ChatItemGalleryFooterContentNode.swift @@ -31,6 +31,9 @@ private let forwardImage = generateTintedImage(image: UIImage(bundleImageName: " private let cloudFetchIcon = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/FileCloudFetch"), color: UIColor.white) +private let fullscreenOnImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Expand"), color: .white) +private let fullscreenOffImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Collapse"), color: .white) + private let captionMaskImage = generateImage(CGSize(width: 1.0, height: 17.0), opaque: false, rotatedContext: { size, context in let bounds = CGRect(origin: CGPoint(), size: size) context.clear(bounds) @@ -119,6 +122,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll private let contentNode: ASDisplayNode private let deleteButton: UIButton + private let fullscreenButton: UIButton private let actionButton: UIButton private let editButton: UIButton private let maskNode: ASDisplayNode @@ -152,6 +156,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll var seekBackward: ((Double) -> Void)? var seekForward: ((Double) -> Void)? var setPlayRate: ((Double) -> Void)? + var toggleFullscreen: (() -> Void)? var fetchControl: (() -> Void)? var interacting: ((Bool) -> Void)? @@ -161,7 +166,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll private var seekRate: Double = 1.0 var performAction: ((GalleryControllerInteractionTapAction) -> Void)? - var openActionOptions: ((GalleryControllerInteractionTapAction) -> Void)? + var openActionOptions: ((GalleryControllerInteractionTapAction, Message) -> Void)? var content: ChatItemGalleryFooterContent = .info { didSet { @@ -286,6 +291,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.contentNode = ASDisplayNode() self.deleteButton = UIButton() + self.fullscreenButton = UIButton() self.actionButton = UIButton() self.editButton = UIButton() @@ -357,12 +363,13 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll } } self.textNode.longTapAttributeAction = { [weak self] attributes, index in - if let strongSelf = self, let action = strongSelf.actionForAttributes(attributes, index) { - strongSelf.openActionOptions?(action) + if let strongSelf = self, let action = strongSelf.actionForAttributes(attributes, index), let message = strongSelf.currentMessage { + strongSelf.openActionOptions?(action, message) } } self.contentNode.view.addSubview(self.deleteButton) + self.contentNode.view.addSubview(self.fullscreenButton) self.contentNode.view.addSubview(self.actionButton) self.contentNode.view.addSubview(self.editButton) self.contentNode.addSubnode(self.scrollWrapperNode) @@ -381,6 +388,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.contentNode.addSubnode(self.statusButtonNode) self.deleteButton.addTarget(self, action: #selector(self.deleteButtonPressed), for: [.touchUpInside]) + self.fullscreenButton.addTarget(self, action: #selector(self.fullscreenButtonPressed), for: [.touchUpInside]) self.actionButton.addTarget(self, action: #selector(self.actionButtonPressed), for: [.touchUpInside]) self.editButton.addTarget(self, action: #selector(self.editButtonPressed), for: [.touchUpInside]) @@ -559,6 +567,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll if origin == nil { self.editButton.isHidden = true self.deleteButton.isHidden = true + self.fullscreenButton.isHidden = true self.editButton.isHidden = true } } @@ -568,12 +577,22 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll let canDelete: Bool var canShare = !message.containsSecretMedia + + var canFullscreen = false var canEdit = false for media in message.media { if media is TelegramMediaImage { canEdit = true - break + } else if let media = media as? TelegramMediaFile, !media.isAnimated { + for attribute in media.attributes { + switch attribute { + case .Video: + canFullscreen = true + default: + break + } + } } } @@ -637,7 +656,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll messageText = galleryCaptionStringWithAppliedEntities(message.text, entities: entities) } - if self.currentMessageText != messageText || canDelete != !self.deleteButton.isHidden || canShare != !self.actionButton.isHidden || canEdit != !self.editButton.isHidden || self.currentAuthorNameText != authorNameText || self.currentDateText != dateText { + if self.currentMessageText != messageText || canDelete != !self.deleteButton.isHidden || canFullscreen != !self.fullscreenButton.isHidden || canShare != !self.actionButton.isHidden || canEdit != !self.editButton.isHidden || self.currentAuthorNameText != authorNameText || self.currentDateText != dateText { self.currentMessageText = messageText if messageText.length == 0 { @@ -654,8 +673,15 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.authorNameNode.attributedText = nil } self.dateNode.attributedText = NSAttributedString(string: dateText, font: dateFont, textColor: .white) - - self.deleteButton.isHidden = !canDelete + + if canFullscreen { + self.fullscreenButton.isHidden = false + self.deleteButton.isHidden = true + } else { + self.deleteButton.isHidden = !canDelete + self.fullscreenButton.isHidden = true + } + self.actionButton.isHidden = !canShare self.editButton.isHidden = !canEdit @@ -683,6 +709,9 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll panelHeight += contentInset let isLandscape = size.width > size.height + + self.fullscreenButton.setImage(isLandscape ? fullscreenOffImage : fullscreenOnImage, for: [.normal]) + let displayCaption: Bool if case .compact = metrics.widthClass { displayCaption = !self.textNode.isHidden && !isLandscape @@ -776,10 +805,11 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll let deleteFrame = CGRect(origin: CGPoint(x: width - 44.0 - rightInset, y: panelHeight - bottomInset - 44.0), size: CGSize(width: 44.0, height: 44.0)) var editFrame = CGRect(origin: CGPoint(x: width - 44.0 - 50.0 - rightInset, y: panelHeight - bottomInset - 44.0), size: CGSize(width: 44.0, height: 44.0)) - if self.deleteButton.isHidden { + if self.deleteButton.isHidden && self.fullscreenButton.isHidden { editFrame = deleteFrame } self.deleteButton.frame = deleteFrame + self.fullscreenButton.frame = deleteFrame self.editButton.frame = editFrame if let image = self.backwardButton.backgroundIconNode.image { @@ -789,7 +819,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.forwardButton.frame = CGRect(origin: CGPoint(x: floor((width - image.size.width) / 2.0) + 66.0, y: panelHeight - bottomInset - 44.0 + 7.0), size: image.size) } - self.playbackControlButton.frame = CGRect(origin: CGPoint(x: floor((width - 44.0) / 2.0), y: panelHeight - bottomInset - 44.0), size: CGSize(width: 44.0, height: 44.0)) + self.playbackControlButton.frame = CGRect(origin: CGPoint(x: floor((width - 44.0) / 2.0), y: panelHeight - bottomInset - 44.0 - 2.0), size: CGSize(width: 44.0, height: 44.0)) self.playPauseIconNode.frame = self.playbackControlButton.bounds.offsetBy(dx: 2.0, dy: 2.0) let statusSize = CGSize(width: 28.0, height: 28.0) @@ -855,6 +885,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.dateNode.alpha = 1.0 self.authorNameNode.alpha = 1.0 self.deleteButton.alpha = 1.0 + self.fullscreenButton.alpha = 1.0 self.actionButton.alpha = 1.0 self.editButton.alpha = 1.0 self.backwardButton.alpha = 1.0 @@ -878,6 +909,7 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll self.dateNode.alpha = 0.0 self.authorNameNode.alpha = 0.0 self.deleteButton.alpha = 0.0 + self.fullscreenButton.alpha = 0.0 self.actionButton.alpha = 0.0 self.editButton.alpha = 0.0 self.backwardButton.alpha = 0.0 @@ -888,6 +920,10 @@ final class ChatItemGalleryFooterContentNode: GalleryFooterContentNode, UIScroll completion() }) } + + @objc func fullscreenButtonPressed() { + self.toggleFullscreen?() + } @objc func deleteButtonPressed() { if let currentMessage = self.currentMessage { diff --git a/submodules/GalleryUI/Sources/GalleryController.swift b/submodules/GalleryUI/Sources/GalleryController.swift index d55e5ff53f..cb1bce5c5b 100644 --- a/submodules/GalleryUI/Sources/GalleryController.swift +++ b/submodules/GalleryUI/Sources/GalleryController.swift @@ -145,7 +145,7 @@ private func galleryMessageCaptionText(_ message: Message) -> String { return message.text } -public func galleryItemForEntry(context: AccountContext, presentationData: PresentationData, entry: MessageHistoryEntry, isCentral: Bool = false, streamVideos: Bool, loopVideos: Bool = false, hideControls: Bool = false, fromPlayingVideo: Bool = false, landscape: Bool = false, timecode: Double? = nil, displayInfoOnTop: Bool = false, configuration: GalleryConfiguration? = nil, tempFilePath: String? = nil, playbackCompleted: @escaping () -> Void = {}, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void = { _ in }, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void = { _ in }, storeMediaPlaybackState: @escaping (MessageId, Double?) -> Void = { _, _ in }, present: @escaping (ViewController, Any?) -> Void) -> GalleryItem? { +public func galleryItemForEntry(context: AccountContext, presentationData: PresentationData, entry: MessageHistoryEntry, isCentral: Bool = false, streamVideos: Bool, loopVideos: Bool = false, hideControls: Bool = false, fromPlayingVideo: Bool = false, isSecret: Bool = false, landscape: Bool = false, timecode: Double? = nil, playbackRate: Double = 1.0, displayInfoOnTop: Bool = false, configuration: GalleryConfiguration? = nil, tempFilePath: String? = nil, playbackCompleted: @escaping () -> Void = {}, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void = { _ in }, openActionOptions: @escaping (GalleryControllerInteractionTapAction, Message) -> Void = { _, _ in }, storeMediaPlaybackState: @escaping (MessageId, Double?, Double) -> Void = { _, _, _ in }, present: @escaping (ViewController, Any?) -> Void) -> GalleryItem? { let message = entry.message let location = entry.location if let (media, mediaImage) = mediaForMessage(message: message) { @@ -178,7 +178,7 @@ public func galleryItemForEntry(context: AccountContext, presentationData: Prese } let caption = galleryCaptionStringWithAppliedEntities(text, entities: entities) - return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: GalleryItemOriginData(title: message.effectiveAuthor?.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder), timestamp: message.timestamp), indexData: location.flatMap { GalleryItemIndexData(position: Int32($0.index), totalCount: Int32($0.count)) }, contentInfo: .message(message), caption: caption, displayInfoOnTop: displayInfoOnTop, hideControls: hideControls, fromPlayingVideo: fromPlayingVideo, landscape: landscape, timecode: timecode, configuration: configuration, playbackCompleted: playbackCompleted, performAction: performAction, openActionOptions: openActionOptions, storeMediaPlaybackState: storeMediaPlaybackState, present: present) + return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: GalleryItemOriginData(title: message.effectiveAuthor?.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder), timestamp: message.timestamp), indexData: location.flatMap { GalleryItemIndexData(position: Int32($0.index), totalCount: Int32($0.count)) }, contentInfo: .message(message), caption: caption, displayInfoOnTop: displayInfoOnTop, hideControls: hideControls, fromPlayingVideo: fromPlayingVideo, isSecret: isSecret, landscape: landscape, timecode: timecode, playbackRate: playbackRate, configuration: configuration, playbackCompleted: playbackCompleted, performAction: performAction, openActionOptions: openActionOptions, storeMediaPlaybackState: storeMediaPlaybackState, present: present) } else { if let fileName = file.fileName, (fileName as NSString).pathExtension.lowercased() == "json" { return ChatAnimationGalleryItem(context: context, presentationData: presentationData, message: message, location: location) @@ -188,7 +188,7 @@ public func galleryItemForEntry(context: AccountContext, presentationData: Prese if let dimensions = file.dimensions { pixelsCount = Int(dimensions.width) * Int(dimensions.height) } - if (file.size == nil || file.size! < 4 * 1024 * 1024) && pixelsCount < 4096 * 4096 { + if pixelsCount < 10000 * 10000 { return ChatImageGalleryItem(context: context, presentationData: presentationData, message: message, location: location, displayInfoOnTop: displayInfoOnTop, performAction: performAction, openActionOptions: openActionOptions, present: present) } else { return ChatDocumentGalleryItem(context: context, presentationData: presentationData, message: message, location: location) @@ -219,7 +219,7 @@ public func galleryItemForEntry(context: AccountContext, presentationData: Prese } } if let content = content { - return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: GalleryItemOriginData(title: message.effectiveAuthor?.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder), timestamp: message.timestamp), indexData: location.flatMap { GalleryItemIndexData(position: Int32($0.index), totalCount: Int32($0.count)) }, contentInfo: .message(message), caption: NSAttributedString(string: ""), displayInfoOnTop: displayInfoOnTop, fromPlayingVideo: fromPlayingVideo, landscape: landscape, timecode: timecode, configuration: configuration, performAction: performAction, openActionOptions: openActionOptions, storeMediaPlaybackState: storeMediaPlaybackState, present: present) + return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: GalleryItemOriginData(title: message.effectiveAuthor?.displayTitle(strings: presentationData.strings, displayOrder: presentationData.nameDisplayOrder), timestamp: message.timestamp), indexData: location.flatMap { GalleryItemIndexData(position: Int32($0.index), totalCount: Int32($0.count)) }, contentInfo: .message(message), caption: NSAttributedString(string: ""), displayInfoOnTop: displayInfoOnTop, fromPlayingVideo: fromPlayingVideo, isSecret: isSecret, landscape: landscape, timecode: timecode, playbackRate: playbackRate, configuration: configuration, performAction: performAction, openActionOptions: openActionOptions, storeMediaPlaybackState: storeMediaPlaybackState, present: present) } else { return nil } @@ -349,6 +349,7 @@ public class GalleryController: ViewController, StandalonePresentableController private let fromPlayingVideo: Bool private let landscape: Bool private let timecode: Double? + private let playbackRate: Double private let accountInUseDisposable = MetaDisposable() private let disposable = MetaDisposable() @@ -378,7 +379,7 @@ public class GalleryController: ViewController, StandalonePresentableController private let actionInteraction: GalleryControllerActionInteraction? private var performAction: (GalleryControllerInteractionTapAction) -> Void - private var openActionOptions: (GalleryControllerInteractionTapAction) -> Void + private var openActionOptions: (GalleryControllerInteractionTapAction, Message) -> Void private let updateVisibleDisposable = MetaDisposable() @@ -388,7 +389,7 @@ public class GalleryController: ViewController, StandalonePresentableController private var initialOrientation: UIInterfaceOrientation? - public init(context: AccountContext, source: GalleryControllerItemSource, invertItemOrder: Bool = false, streamSingleVideo: Bool = false, fromPlayingVideo: Bool = false, landscape: Bool = false, timecode: Double? = nil, synchronousLoad: Bool = false, replaceRootController: @escaping (ViewController, Promise?) -> Void, baseNavigationController: NavigationController?, actionInteraction: GalleryControllerActionInteraction? = nil) { + public init(context: AccountContext, source: GalleryControllerItemSource, invertItemOrder: Bool = false, streamSingleVideo: Bool = false, fromPlayingVideo: Bool = false, landscape: Bool = false, timecode: Double? = nil, playbackRate: Double = 1.0, synchronousLoad: Bool = false, replaceRootController: @escaping (ViewController, Promise?) -> Void, baseNavigationController: NavigationController?, actionInteraction: GalleryControllerActionInteraction? = nil) { self.context = context self.source = source self.invertItemOrder = invertItemOrder @@ -399,6 +400,7 @@ public class GalleryController: ViewController, StandalonePresentableController self.fromPlayingVideo = fromPlayingVideo self.landscape = landscape self.timecode = timecode + self.playbackRate = playbackRate self.presentationData = context.sharedContext.currentPresentationData.with { $0 } @@ -407,9 +409,9 @@ public class GalleryController: ViewController, StandalonePresentableController performActionImpl?(action) } - var openActionOptionsImpl: ((GalleryControllerInteractionTapAction) -> Void)? - self.openActionOptions = { action in - openActionOptionsImpl?(action) + var openActionOptionsImpl: ((GalleryControllerInteractionTapAction, Message) -> Void)? + self.openActionOptions = { action, message in + openActionOptionsImpl?(action, message) } super.init(navigationBarPresentationData: NavigationBarPresentationData(theme: GalleryController.darkNavigationTheme, strings: NavigationBarStrings(presentationStrings: self.presentationData.strings))) @@ -537,7 +539,7 @@ public class GalleryController: ViewController, StandalonePresentableController if entry.message.stableId == strongSelf.centralEntryStableId { isCentral = true } - if let item = galleryItemForEntry(context: context, presentationData: strongSelf.presentationData, entry: entry, isCentral: isCentral, streamVideos: streamSingleVideo, fromPlayingVideo: isCentral && fromPlayingVideo, landscape: isCentral && landscape, timecode: isCentral ? timecode : nil, displayInfoOnTop: displayInfoOnTop, configuration: configuration, performAction: strongSelf.performAction, openActionOptions: strongSelf.openActionOptions, storeMediaPlaybackState: strongSelf.actionInteraction?.storeMediaPlaybackState ?? { _, _ in }, present: { [weak self] c, a in + if let item = galleryItemForEntry(context: context, presentationData: strongSelf.presentationData, entry: entry, isCentral: isCentral, streamVideos: streamSingleVideo, fromPlayingVideo: isCentral && fromPlayingVideo, landscape: isCentral && landscape, timecode: isCentral ? timecode : nil, playbackRate: isCentral ? playbackRate : 1.0, displayInfoOnTop: displayInfoOnTop, configuration: configuration, performAction: strongSelf.performAction, openActionOptions: strongSelf.openActionOptions, storeMediaPlaybackState: strongSelf.actionInteraction?.storeMediaPlaybackState ?? { _, _, _ in }, present: { [weak self] c, a in if let strongSelf = self { strongSelf.presentInGlobalOverlay(c, with: a) } @@ -667,7 +669,7 @@ public class GalleryController: ViewController, StandalonePresentableController } } - openActionOptionsImpl = { [weak self] action in + openActionOptionsImpl = { [weak self] action, message in if let strongSelf = self { var presentationData = strongSelf.presentationData if !presentationData.theme.overallDarkAppearance { @@ -847,6 +849,13 @@ public class GalleryController: ViewController, StandalonePresentableController ]) strongSelf.present(actionSheet, in: .window(.root)) case let .timecode(timecode, text): + let isCopyLink: Bool + if message.id.namespace == Namespaces.Message.Cloud, let _ = message.peers[message.id.peerId] as? TelegramChannel, !(message.media.first is TelegramMediaAction) { + isCopyLink = true + } else { + isCopyLink = false + } + let actionSheet = ActionSheetController(presentationData: presentationData) actionSheet.setItemGroups([ActionSheetItemGroup(items: [ ActionSheetTextItem(title: text), @@ -857,12 +866,50 @@ public class GalleryController: ViewController, StandalonePresentableController strongSelf.galleryNode.pager.centralItemNode()?.processAction(.timecode(timecode)) } }), - ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet, weak self] in + ActionSheetButtonItem(title: isCopyLink ? strongSelf.presentationData.strings.Conversation_ContextMenuCopyLink : strongSelf.presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet, weak self] in actionSheet?.dismissAnimated() - UIPasteboard.general.string = text + if isCopyLink, let channel = message.peers[message.id.peerId] as? TelegramChannel { + var threadMessageId: MessageId? +// if case let .replyThread(replyThreadMessage) = chatPresentationInterfaceState.chatLocation { +// threadMessageId = replyThreadMessage.messageId +// } + let _ = (context.engine.messages.exportMessageLink(peerId: message.id.peerId, messageId: message.id, isThread: threadMessageId != nil) + |> map { result -> String? in + return result + } + |> deliverOnMainQueue).start(next: { link in + if let link = link { + UIPasteboard.general.string = link + "?t=\(Int32(timecode))" + + let presentationData = context.sharedContext.currentPresentationData.with { $0 } + + var warnAboutPrivate = false + if channel.addressName == nil { + warnAboutPrivate = true + } + + Queue.mainQueue().after(0.2, { + let content: UndoOverlayContent + if warnAboutPrivate { + content = .linkCopied(text: presentationData.strings.Conversation_PrivateMessageLinkCopiedLong) + } else { + content = .linkCopied(text: presentationData.strings.Conversation_LinkCopied) + } + self?.present(UndoOverlayController(presentationData: presentationData, content: content, elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root)) + }) + } else { + UIPasteboard.general.string = text + + let content: UndoOverlayContent = .copy(text: presentationData.strings.Conversation_TextCopied) + self?.present(UndoOverlayController(presentationData: presentationData, content: content, elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current) + } + }) + } else { + UIPasteboard.general.string = text - let content: UndoOverlayContent = .copy(text: presentationData.strings.Conversation_TextCopied) - self?.present(UndoOverlayController(presentationData: presentationData, content: content, elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root)) + let content: UndoOverlayContent = .copy(text: presentationData.strings.Conversation_TextCopied) + self?.present(UndoOverlayController(presentationData: presentationData, content: content, elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root)) + } }) ]), ActionSheetItemGroup(items: [ ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in @@ -1040,6 +1087,9 @@ public class GalleryController: ViewController, StandalonePresentableController self.galleryNode.baseNavigationController = { [weak baseNavigationController] in return baseNavigationController } + self.galleryNode.galleryController = { [weak self] in + return self + } var displayInfoOnTop = false if case .custom = source { @@ -1053,7 +1103,7 @@ public class GalleryController: ViewController, StandalonePresentableController if entry.message.stableId == self.centralEntryStableId { isCentral = true } - if let item = galleryItemForEntry(context: self.context, presentationData: self.presentationData, entry: entry, streamVideos: self.streamVideos, fromPlayingVideo: isCentral && self.fromPlayingVideo, landscape: isCentral && self.landscape, timecode: isCentral ? self.timecode : nil, displayInfoOnTop: displayInfoOnTop, configuration: self.configuration, performAction: self.performAction, openActionOptions: self.openActionOptions, storeMediaPlaybackState: self.actionInteraction?.storeMediaPlaybackState ?? { _, _ in }, present: { [weak self] c, a in + if let item = galleryItemForEntry(context: self.context, presentationData: self.presentationData, entry: entry, streamVideos: self.streamVideos, fromPlayingVideo: isCentral && self.fromPlayingVideo, landscape: isCentral && self.landscape, timecode: isCentral ? self.timecode : nil, playbackRate: isCentral ? self.playbackRate : 1.0, displayInfoOnTop: displayInfoOnTop, configuration: self.configuration, performAction: self.performAction, openActionOptions: self.openActionOptions, storeMediaPlaybackState: self.actionInteraction?.storeMediaPlaybackState ?? { _, _, _ in }, present: { [weak self] c, a in if let strongSelf = self { strongSelf.presentInGlobalOverlay(c, with: a) } @@ -1133,7 +1183,7 @@ public class GalleryController: ViewController, StandalonePresentableController if entry.message.stableId == strongSelf.centralEntryStableId { isCentral = true } - if let item = galleryItemForEntry(context: strongSelf.context, presentationData: strongSelf.presentationData, entry: entry, isCentral: isCentral, streamVideos: false, fromPlayingVideo: isCentral && strongSelf.fromPlayingVideo, landscape: isCentral && strongSelf.landscape, timecode: isCentral ? strongSelf.timecode : nil, displayInfoOnTop: displayInfoOnTop, configuration: strongSelf.configuration, performAction: strongSelf.performAction, openActionOptions: strongSelf.openActionOptions, storeMediaPlaybackState: strongSelf.actionInteraction?.storeMediaPlaybackState ?? { _, _ in }, present: { [weak self] c, a in + if let item = galleryItemForEntry(context: strongSelf.context, presentationData: strongSelf.presentationData, entry: entry, isCentral: isCentral, streamVideos: false, fromPlayingVideo: isCentral && strongSelf.fromPlayingVideo, landscape: isCentral && strongSelf.landscape, timecode: isCentral ? strongSelf.timecode : nil, displayInfoOnTop: displayInfoOnTop, configuration: strongSelf.configuration, performAction: strongSelf.performAction, openActionOptions: strongSelf.openActionOptions, storeMediaPlaybackState: strongSelf.actionInteraction?.storeMediaPlaybackState ?? { _, _, _ in }, present: { [weak self] c, a in if let strongSelf = self { strongSelf.presentInGlobalOverlay(c, with: a) } @@ -1185,7 +1235,7 @@ public class GalleryController: ViewController, StandalonePresentableController if entry.message.stableId == strongSelf.centralEntryStableId { isCentral = true } - if let item = galleryItemForEntry(context: strongSelf.context, presentationData: strongSelf.presentationData, entry: entry, isCentral: isCentral, streamVideos: false, fromPlayingVideo: isCentral && strongSelf.fromPlayingVideo, landscape: isCentral && strongSelf.landscape, timecode: isCentral ? strongSelf.timecode : nil, displayInfoOnTop: displayInfoOnTop, configuration: strongSelf.configuration, performAction: strongSelf.performAction, openActionOptions: strongSelf.openActionOptions, storeMediaPlaybackState: strongSelf.actionInteraction?.storeMediaPlaybackState ?? { _, _ in }, present: { [weak self] c, a in + if let item = galleryItemForEntry(context: strongSelf.context, presentationData: strongSelf.presentationData, entry: entry, isCentral: isCentral, streamVideos: false, fromPlayingVideo: isCentral && strongSelf.fromPlayingVideo, landscape: isCentral && strongSelf.landscape, timecode: isCentral ? strongSelf.timecode : nil, displayInfoOnTop: displayInfoOnTop, configuration: strongSelf.configuration, performAction: strongSelf.performAction, openActionOptions: strongSelf.openActionOptions, storeMediaPlaybackState: strongSelf.actionInteraction?.storeMediaPlaybackState ?? { _, _, _ in }, present: { [weak self] c, a in if let strongSelf = self { strongSelf.presentInGlobalOverlay(c, with: a) } diff --git a/submodules/GalleryUI/Sources/GalleryControllerNode.swift b/submodules/GalleryUI/Sources/GalleryControllerNode.swift index 06780433d2..1ec92c83e3 100644 --- a/submodules/GalleryUI/Sources/GalleryControllerNode.swift +++ b/submodules/GalleryUI/Sources/GalleryControllerNode.swift @@ -22,6 +22,7 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture public var beginCustomDismiss: () -> Void = { } public var completeCustomDismiss: () -> Void = { } public var baseNavigationController: () -> NavigationController? = { return nil } + public var galleryController: () -> ViewController? = { return nil } private var presentationState = GalleryControllerPresentationState() @@ -120,6 +121,9 @@ open class GalleryControllerNode: ASDisplayNode, UIScrollViewDelegate, UIGesture self.pager.baseNavigationController = { [weak self] in return self?.baseNavigationController() } + self.pager.galleryController = { [weak self] in + return self?.galleryController() + } self.addSubnode(self.backgroundNode) diff --git a/submodules/GalleryUI/Sources/GalleryItemNode.swift b/submodules/GalleryUI/Sources/GalleryItemNode.swift index 6903789863..2dc6cf9672 100644 --- a/submodules/GalleryUI/Sources/GalleryItemNode.swift +++ b/submodules/GalleryUI/Sources/GalleryItemNode.swift @@ -27,6 +27,7 @@ open class GalleryItemNode: ASDisplayNode { public var beginCustomDismiss: () -> Void = { } public var completeCustomDismiss: () -> Void = { } public var baseNavigationController: () -> NavigationController? = { return nil } + public var galleryController: () -> ViewController? = { return nil } public var alternativeDismiss: () -> Bool = { return false } override public init() { diff --git a/submodules/GalleryUI/Sources/GalleryPagerNode.swift b/submodules/GalleryUI/Sources/GalleryPagerNode.swift index b6d9e6b6fa..80217fe39e 100644 --- a/submodules/GalleryUI/Sources/GalleryPagerNode.swift +++ b/submodules/GalleryUI/Sources/GalleryPagerNode.swift @@ -112,6 +112,7 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate, UIGest public var beginCustomDismiss: () -> Void = { } public var completeCustomDismiss: () -> Void = { } public var baseNavigationController: () -> NavigationController? = { return nil } + public var galleryController: () -> ViewController? = { return nil } public init(pageGap: CGFloat, disableTapNavigation: Bool) { self.pageGap = pageGap @@ -480,6 +481,7 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate, UIGest node.beginCustomDismiss = self.beginCustomDismiss node.completeCustomDismiss = self.completeCustomDismiss node.baseNavigationController = self.baseNavigationController + node.galleryController = self.galleryController node.index = index return node } diff --git a/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift b/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift index 2d12bf290d..d94ba4aee8 100644 --- a/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/ChatImageGalleryItem.swift @@ -106,10 +106,10 @@ class ChatImageGalleryItem: GalleryItem { let location: MessageHistoryEntryLocation? let displayInfoOnTop: Bool let performAction: (GalleryControllerInteractionTapAction) -> Void - let openActionOptions: (GalleryControllerInteractionTapAction) -> Void + let openActionOptions: (GalleryControllerInteractionTapAction, Message) -> Void let present: (ViewController, Any?) -> Void - init(context: AccountContext, presentationData: PresentationData, message: Message, location: MessageHistoryEntryLocation?, displayInfoOnTop: Bool, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void, present: @escaping (ViewController, Any?) -> Void) { + init(context: AccountContext, presentationData: PresentationData, message: Message, location: MessageHistoryEntryLocation?, displayInfoOnTop: Bool, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction, Message) -> Void, present: @escaping (ViewController, Any?) -> Void) { self.context = context self.presentationData = presentationData self.message = message @@ -206,7 +206,7 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode { private let dataDisposable = MetaDisposable() private var status: MediaResourceStatus? - init(context: AccountContext, presentationData: PresentationData, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void, present: @escaping (ViewController, Any?) -> Void) { + init(context: AccountContext, presentationData: PresentationData, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction, Message) -> Void, present: @escaping (ViewController, Any?) -> Void) { self.context = context self.imageNode = TransformImageNode() diff --git a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift index f145e15a82..086dbb9da1 100644 --- a/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift +++ b/submodules/GalleryUI/Sources/Items/UniversalVideoGalleryItem.swift @@ -15,6 +15,11 @@ import PresentationDataUtils import OverlayStatusController import StickerPackPreviewUI import AppBundle +import AnimationUI +import ContextUI +import SaveToCameraRoll +import UndoUI +import TelegramUIPreferences public enum UniversalVideoGalleryItemContentInfo { case message(Message) @@ -37,16 +42,18 @@ public class UniversalVideoGalleryItem: GalleryItem { let displayInfoOnTop: Bool let hideControls: Bool let fromPlayingVideo: Bool + let isSecret: Bool let landscape: Bool let timecode: Double? + let playbackRate: Double let configuration: GalleryConfiguration? let playbackCompleted: () -> Void let performAction: (GalleryControllerInteractionTapAction) -> Void - let openActionOptions: (GalleryControllerInteractionTapAction) -> Void - let storeMediaPlaybackState: (MessageId, Double?) -> Void + let openActionOptions: (GalleryControllerInteractionTapAction, Message) -> Void + let storeMediaPlaybackState: (MessageId, Double?, Double) -> Void let present: (ViewController, Any?) -> Void - public init(context: AccountContext, presentationData: PresentationData, content: UniversalVideoContent, originData: GalleryItemOriginData?, indexData: GalleryItemIndexData?, contentInfo: UniversalVideoGalleryItemContentInfo?, caption: NSAttributedString, credit: NSAttributedString? = nil, displayInfoOnTop: Bool = false, hideControls: Bool = false, fromPlayingVideo: Bool = false, landscape: Bool = false, timecode: Double? = nil, configuration: GalleryConfiguration? = nil, playbackCompleted: @escaping () -> Void = {}, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void, storeMediaPlaybackState: @escaping (MessageId, Double?) -> Void, present: @escaping (ViewController, Any?) -> Void) { + public init(context: AccountContext, presentationData: PresentationData, content: UniversalVideoContent, originData: GalleryItemOriginData?, indexData: GalleryItemIndexData?, contentInfo: UniversalVideoGalleryItemContentInfo?, caption: NSAttributedString, credit: NSAttributedString? = nil, displayInfoOnTop: Bool = false, hideControls: Bool = false, fromPlayingVideo: Bool = false, isSecret: Bool = false, landscape: Bool = false, timecode: Double? = nil, playbackRate: Double = 1.0, configuration: GalleryConfiguration? = nil, playbackCompleted: @escaping () -> Void = {}, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction, Message) -> Void, storeMediaPlaybackState: @escaping (MessageId, Double?, Double) -> Void, present: @escaping (ViewController, Any?) -> Void) { self.context = context self.presentationData = presentationData self.content = content @@ -58,8 +65,10 @@ public class UniversalVideoGalleryItem: GalleryItem { self.displayInfoOnTop = displayInfoOnTop self.hideControls = hideControls self.fromPlayingVideo = fromPlayingVideo + self.isSecret = isSecret self.landscape = landscape self.timecode = timecode + self.playbackRate = playbackRate self.configuration = configuration self.playbackCompleted = playbackCompleted self.performAction = performAction @@ -129,6 +138,8 @@ public class UniversalVideoGalleryItem: GalleryItem { private let pictureInPictureImage = UIImage(bundleImageName: "Media Gallery/PictureInPictureIcon")?.precomposed() private let pictureInPictureButtonImage = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/PictureInPictureButton"), color: .white) +private let moreButtonImage = generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/More"), color: .white) + private let placeholderFont = Font.regular(16.0) private final class UniversalVideoGalleryItemPictureInPictureNode: ASDisplayNode { @@ -251,6 +262,196 @@ private struct FetchControls { let cancel: () -> Void } +func optionsBackgroundImage(dark: Bool) -> UIImage? { + return generateImage(CGSize(width: 28.0, height: 28.0), contextGenerator: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + + context.setFillColor(UIColor(rgb: dark ? 0x1c1c1e : 0x2c2c2e).cgColor) + context.fillEllipse(in: CGRect(origin: CGPoint(), size: size)) + })?.stretchableImage(withLeftCapWidth: 14, topCapHeight: 14) +} + +private func optionsCircleImage(dark: Bool) -> UIImage? { + return generateImage(CGSize(width: 22.0, height: 22.0), contextGenerator: { size, context in + context.clear(CGRect(origin: CGPoint(), size: size)) + + context.setStrokeColor(UIColor.white.cgColor) + let lineWidth: CGFloat = 1.3 + context.setLineWidth(lineWidth) + + context.strokeEllipse(in: CGRect(origin: CGPoint(), size: size).insetBy(dx: lineWidth, dy: lineWidth)) + }) +} + +private func optionsRateImage(rate: String, isLarge: Bool, color: UIColor = .white) -> UIImage? { + return generateImage(isLarge ? CGSize(width: 30.0, height: 30.0) : CGSize(width: 24.0, height: 24.0), rotatedContext: { size, context in + UIGraphicsPushContext(context) + + context.clear(CGRect(origin: CGPoint(), size: size)) + + if let image = generateTintedImage(image: UIImage(bundleImageName: isLarge ? "Chat/Context Menu/Playspeed30" : "Chat/Context Menu/Playspeed24"), color: .white) { + image.draw(at: CGPoint(x: 0.0, y: 0.0)) + } + + let string = NSMutableAttributedString(string: rate, font: Font.with(size: isLarge ? 11.0 : 10.0, design: .round, weight: .semibold), textColor: color) + + var offset = CGPoint(x: 1.0, y: 0.0) + if rate.count >= 3 { + if rate == "0.5x" { + string.addAttribute(.kern, value: -0.8 as NSNumber, range: NSRange(string.string.startIndex ..< string.string.endIndex, in: string.string)) + offset.x += -0.5 + } else { + string.addAttribute(.kern, value: -0.5 as NSNumber, range: NSRange(string.string.startIndex ..< string.string.endIndex, in: string.string)) + offset.x += -0.3 + } + } else { + offset.x += -0.3 + } + + if !isLarge { + offset.x *= 0.5 + offset.y *= 0.5 + } + + let boundingRect = string.boundingRect(with: size, options: [], context: nil) + string.draw(at: CGPoint(x: offset.x + floor((size.width - boundingRect.width) / 2.0), y: offset.y + floor((size.height - boundingRect.height) / 2.0))) + + UIGraphicsPopContext() + }) +} + +private final class MoreHeaderButton: HighlightableButtonNode { + enum Content { + case image(UIImage?) + case more(UIImage?) + } + + let referenceNode: ContextReferenceContentNode + let containerNode: ContextControllerSourceNode + private let iconNode: ASImageNode + private var animationNode: AnimationNode? + + var contextAction: ((ASDisplayNode, ContextGesture?) -> Void)? + + private let wide: Bool + + init(wide: Bool = false) { + self.wide = wide + + self.referenceNode = ContextReferenceContentNode() + self.containerNode = ContextControllerSourceNode() + self.containerNode.animateScale = false + self.iconNode = ASImageNode() + self.iconNode.displaysAsynchronously = false + self.iconNode.displayWithoutProcessing = true + self.iconNode.contentMode = .scaleToFill + + super.init() + + self.containerNode.addSubnode(self.referenceNode) + self.referenceNode.addSubnode(self.iconNode) + self.addSubnode(self.containerNode) + + self.containerNode.shouldBegin = { [weak self] location in + guard let strongSelf = self, let _ = strongSelf.contextAction else { + return false + } + return true + } + self.containerNode.activated = { [weak self] gesture, _ in + guard let strongSelf = self else { + return + } + strongSelf.contextAction?(strongSelf.containerNode, gesture) + } + + self.containerNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: wide ? 32.0 : 22.0, height: 22.0)) + self.referenceNode.frame = self.containerNode.bounds + + self.iconNode.image = optionsCircleImage(dark: false) + if let image = self.iconNode.image { + self.iconNode.frame = CGRect(origin: CGPoint(x: floor((self.containerNode.bounds.width - image.size.width) / 2.0), y: floor((self.containerNode.bounds.height - image.size.height) / 2.0)), size: image.size) + } + } + + private var content: Content? + func setContent(_ content: Content, animated: Bool = false) { + if case .more = content, self.animationNode == nil { + let iconColor = UIColor(rgb: 0xffffff) + let animationNode = AnimationNode(animation: "anim_profilemore", colors: ["Point 2.Group 1.Fill 1": iconColor, + "Point 3.Group 1.Fill 1": iconColor, + "Point 1.Group 1.Fill 1": iconColor], scale: 1.0) + animationNode.frame = self.containerNode.bounds + self.addSubnode(animationNode) + self.animationNode = animationNode + } + if animated { + if let snapshotView = self.referenceNode.view.snapshotContentTree() { + snapshotView.frame = self.referenceNode.frame + self.view.addSubview(snapshotView) + + snapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false, completion: { [weak snapshotView] _ in + snapshotView?.removeFromSuperview() + }) + snapshotView.layer.animateScale(from: 1.0, to: 0.1, duration: 0.3, removeOnCompletion: false) + + self.iconNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) + self.iconNode.layer.animateScale(from: 0.1, to: 1.0, duration: 0.3) + + self.animationNode?.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3) + self.animationNode?.layer.animateScale(from: 0.1, to: 1.0, duration: 0.3) + } + + switch content { + case let .image(image): + if let image = image { + self.iconNode.frame = CGRect(origin: CGPoint(x: floor((self.containerNode.bounds.width - image.size.width) / 2.0), y: floor((self.containerNode.bounds.height - image.size.height) / 2.0)), size: image.size) + } + + self.iconNode.image = image + self.iconNode.isHidden = false + self.animationNode?.isHidden = true + case let .more(image): + if let image = image { + self.iconNode.frame = CGRect(origin: CGPoint(x: floor((self.containerNode.bounds.width - image.size.width) / 2.0), y: floor((self.containerNode.bounds.height - image.size.height) / 2.0)), size: image.size) + } + + self.iconNode.image = image + self.iconNode.isHidden = false + self.animationNode?.isHidden = false + } + } else { + self.content = content + switch content { + case let .image(image): + self.iconNode.image = image + self.iconNode.isHidden = false + self.animationNode?.isHidden = true + case let .more(image): + self.iconNode.image = image + self.iconNode.isHidden = false + self.animationNode?.isHidden = false + } + } + } + + override func didLoad() { + super.didLoad() + self.view.isOpaque = false + } + + override func calculateSizeThatFits(_ constrainedSize: CGSize) -> CGSize { + return CGSize(width: wide ? 32.0 : 22.0, height: 22.0) + } + + func onLayout() { + } + + func play() { + self.animationNode?.playOnce() + } +} + final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private let context: AccountContext private let presentationData: PresentationData @@ -264,6 +465,10 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private let scrubberView: ChatVideoGalleryItemScrubberView private let footerContentNode: ChatItemGalleryFooterContentNode private let overlayContentNode: UniversalVideoGalleryItemOverlayNode + + private let moreBarButton: MoreHeaderButton + private var moreBarButtonRate: Double = 1.0 + private var moreBarButtonRateTimestamp: Double? private var videoNode: UniversalVideoNode? private var videoNodeUserInteractionEnabled: Bool = false @@ -292,6 +497,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private var item: UniversalVideoGalleryItem? private let statusDisposable = MetaDisposable() + private let moreButtonStateDisposable = MetaDisposable() private let mediaPlaybackStateDisposable = MetaDisposable() private let fetchDisposable = MetaDisposable() @@ -305,13 +511,14 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private let isPlayingPromise = ValuePromise(false, ignoreRepeated: true) private let isInteractingPromise = ValuePromise(false, ignoreRepeated: true) private let controlsVisiblePromise = ValuePromise(true, ignoreRepeated: true) + private let isShowingContextMenuPromise = ValuePromise(false, ignoreRepeated: true) private var hideControlsDisposable: Disposable? var playbackCompleted: (() -> Void)? private var customUnembedWhenPortrait: ((OverlayMediaItemNode) -> Bool)? - init(context: AccountContext, presentationData: PresentationData, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction) -> Void, present: @escaping (ViewController, Any?) -> Void) { + init(context: AccountContext, presentationData: PresentationData, performAction: @escaping (GalleryControllerInteractionTapAction) -> Void, openActionOptions: @escaping (GalleryControllerInteractionTapAction, Message) -> Void, present: @escaping (ViewController, Any?) -> Void) { self.context = context self.presentationData = presentationData self.scrubberView = ChatVideoGalleryItemScrubberView() @@ -328,8 +535,14 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { self.statusNode.frame = CGRect(origin: CGPoint(), size: CGSize(width: 50.0, height: 50.0)) self._title.set(.single("")) + + self.moreBarButton = MoreHeaderButton() + self.moreBarButton.isUserInteractionEnabled = true + self.moreBarButton.setContent(.more(optionsCircleImage(dark: false))) super.init() + + self.moreBarButton.addTarget(self, action: #selector(self.moreButtonPressed), forControlEvents: .touchUpInside) self.footerContentNode.interacting = { [weak self] value in self?.isInteractingPromise.set(value) @@ -426,6 +639,19 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { break } } + + self.footerContentNode.toggleFullscreen = { [weak self] in + guard let strongSelf = self else { + return + } + var toLandscape = false + let size = strongSelf.bounds.size + if size.width < size.height { + toLandscape = true + } + strongSelf.updateControlsVisibility(!toLandscape) + strongSelf.updateOrientation(toLandscape ? .landscapeRight : .portrait) + } self.scrubbingFrameDisposable = (self.scrubbingFrame.get() |> deliverOnMainQueue).start(next: { [weak self] result in @@ -451,12 +677,19 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { strongSelf.pictureInPictureButtonPressed() return true } + + self.moreBarButton.contextAction = { [weak self] sourceNode, gesture in + self?.openMoreMenu(sourceNode: sourceNode, gesture: gesture) + } self.titleContentView = GalleryTitleView(frame: CGRect()) self._titleView.set(.single(self.titleContentView)) - let shouldHideControlsSignal: Signal = combineLatest(self.isPlayingPromise.get(), self.isInteractingPromise.get(), self.controlsVisiblePromise.get()) - |> mapToSignal { isPlaying, isIntracting, controlsVisible -> Signal in + let shouldHideControlsSignal: Signal = combineLatest(self.isPlayingPromise.get(), self.isInteractingPromise.get(), self.controlsVisiblePromise.get(), self.isShowingContextMenuPromise.get()) + |> mapToSignal { isPlaying, isIntracting, controlsVisible, isShowingContextMenu -> Signal in + if isShowingContextMenu { + return .complete() + } if isPlaying && !isIntracting && controlsVisible { return .single(Void()) |> delay(4.0, queue: Queue.mainQueue()) @@ -475,6 +708,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { deinit { self.statusDisposable.dispose() + self.moreButtonStateDisposable.dispose() self.mediaPlaybackStateDisposable.dispose() self.scrubbingFrameDisposable?.dispose() self.hideControlsDisposable?.dispose() @@ -644,7 +878,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { if status.timestamp > 5.0 && status.timestamp < status.duration - 5.0 { timestamp = status.timestamp } - item.storeMediaPlaybackState(message.id, timestamp) + item.storeMediaPlaybackState(message.id, timestamp, status.baseRate) } })) } @@ -685,6 +919,56 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } } + self.moreButtonStateDisposable.set(combineLatest(queue: .mainQueue(), + videoNode.status, + self.isShowingContextMenuPromise.get() + ).start(next: { [weak self] status, isShowingContextMenu in + guard let strongSelf = self else { + return + } + guard let status = status else { + return + } + + let effectiveBaseRate: Double + if isShowingContextMenu { + effectiveBaseRate = 1.0 + } else { + effectiveBaseRate = status.baseRate + } + + if abs(effectiveBaseRate - strongSelf.moreBarButtonRate) > 0.01 { + strongSelf.moreBarButtonRate = effectiveBaseRate + let animated: Bool + if let moreBarButtonRateTimestamp = strongSelf.moreBarButtonRateTimestamp { + animated = CFAbsoluteTimeGetCurrent() > (moreBarButtonRateTimestamp + 0.2) + } else { + animated = false + } + strongSelf.moreBarButtonRateTimestamp = CFAbsoluteTimeGetCurrent() + + if abs(effectiveBaseRate - 1.0) > 0.01 { + let rateString: String + if abs(effectiveBaseRate - 0.5) < 0.01 { + rateString = "0.5x" + } else if abs(effectiveBaseRate - 1.5) < 0.01 { + rateString = "1.5x" + } else if abs(effectiveBaseRate - 2.0) < 0.01 { + rateString = "2x" + } else { + rateString = "x" + } + strongSelf.moreBarButton.setContent(.image(optionsRateImage(rate: rateString, isLarge: true)), animated: animated) + } else { + strongSelf.moreBarButton.setContent(.more(optionsCircleImage(dark: false)), animated: animated) + } + } else { + if strongSelf.moreBarButtonRateTimestamp == nil { + strongSelf.moreBarButtonRateTimestamp = CFAbsoluteTimeGetCurrent() + } + } + })) + self.statusDisposable.set((combineLatest(queue: .mainQueue(), videoNode.status, mediaFileStatus) |> deliverOnMainQueue).start(next: { [weak self] value, fetchStatus in if let strongSelf = self { @@ -823,6 +1107,27 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } else { self.hasPictureInPicture = false } + + if let contentInfo = item.contentInfo, case let .message(message) = contentInfo { + var file: TelegramMediaFile? + var isWebpage = false + for m in message.media { + if let m = m as? TelegramMediaFile, m.isVideo { + file = m + break + } else if let m = m as? TelegramMediaWebpage, case let .Loaded(content) = m.content, let f = content.file, f.isVideo { + file = f + isWebpage = true + break + } + } + + if !isWebpage, let file = file, !file.isAnimated { + let moreMenuItem = UIBarButtonItem(customDisplayNode: self.moreBarButton)! + barButtonItems.append(moreMenuItem) + } + } + self._rightBarButtonItems.set(.single(barButtonItems)) videoNode.playbackCompleted = { [weak self, weak videoNode] in @@ -999,18 +1304,21 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { var isAnimated = false var seek = MediaPlayerSeek.start + var playbackRate: Double = 1.0 if let item = self.item { if let content = item.content as? NativeVideoContent { isAnimated = content.fileReference.media.isAnimated if let time = item.timecode { seek = .timecode(time) } + playbackRate = item.playbackRate } else if let _ = item.content as? WebEmbedVideoContent { if let time = item.timecode { seek = .timecode(time) } } } + videoNode.setBaseRate(playbackRate) if isAnimated { videoNode.seek(0.0) videoNode.play() @@ -1024,7 +1332,7 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { private var actionAtEnd: MediaPlayerPlayOnceWithSoundActionAtEnd { if let item = self.item { - if let content = item.content as? NativeVideoContent, content.duration <= 30 { + if !item.isSecret, let content = item.content as? NativeVideoContent, content.duration <= 30 { return .loop } } @@ -1613,7 +1921,208 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } } } - + + private func contentInfo() -> (message: Message, file: TelegramMediaFile, isWebpage: Bool)? { + guard let item = self.item else { + return nil + } + if let contentInfo = item.contentInfo, case let .message(message) = contentInfo { + var file: TelegramMediaFile? + var isWebpage = false + for m in message.media { + if let m = m as? TelegramMediaFile, m.isVideo { + file = m + break + } else if let m = m as? TelegramMediaWebpage, case let .Loaded(content) = m.content, let f = content.file, f.isVideo { + file = f + isWebpage = true + break + } + } + + if let file = file { + return (message, file, isWebpage) + } + } + return nil + } + + private func canDelete() -> Bool { + guard let (message, _, _) = self.contentInfo() else { + return false + } + + var canDelete = false + if let peer = message.peers[message.id.peerId] { + if peer is TelegramUser || peer is TelegramSecretChat { + canDelete = true + } else if let _ = peer as? TelegramGroup { + canDelete = true + } else if let channel = peer as? TelegramChannel { + if message.flags.contains(.Incoming) { + canDelete = channel.hasPermission(.deleteAllMessages) + } else { + canDelete = true + } + } else { + canDelete = false + } + } else { + canDelete = false + } + return canDelete + } + + @objc private func moreButtonPressed() { + self.moreBarButton.play() + self.moreBarButton.contextAction?(self.moreBarButton.containerNode, nil) + } + + private func openMoreMenu(sourceNode: ASDisplayNode, gesture: ContextGesture?) { + let items: Signal<[ContextMenuItem], NoError> = self.contextMenuMainItems() + guard let controller = self.baseNavigationController()?.topViewController as? ViewController else { + return + } + + let contextController = ContextController(account: self.context.account, presentationData: self.presentationData.withUpdated(theme: defaultDarkColorPresentationTheme), source: .reference(HeaderContextReferenceContentSource(controller: controller, sourceNode: self.moreBarButton.referenceNode)), items: items, reactionItems: [], gesture: gesture) + self.isShowingContextMenuPromise.set(true) + controller.presentInGlobalOverlay(contextController) + + contextController.dismissed = { [weak self] in + Queue.mainQueue().after(0.1, { + self?.isShowingContextMenuPromise.set(false) + }) + } + } + + private func speedList() -> [(String, String, Double)] { + let speedList: [(String, String, Double)] = [ + ("0.5x", "0.5x", 0.5), + ("Normal", "1x", 1.0), + ("1.5x", "1.5x", 1.5), + ("2x", "2x", 2.0) + ] + + return speedList + } + + private func contextMenuMainItems() -> Signal<[ContextMenuItem], NoError> { + guard let videoNode = self.videoNode else { + return .single([]) + } + + return videoNode.status + |> take(1) + |> deliverOnMainQueue + |> map { [weak self] status -> [ContextMenuItem] in + guard let status = status, let strongSelf = self else { + return [] + } + + var items: [ContextMenuItem] = [] + + var speedValue: String = "Normal" + var speedIconText: String = "1x" + for (text, iconText, speed) in strongSelf.speedList() { + if abs(speed - status.baseRate) < 0.01 { + speedValue = text + speedIconText = iconText + break + } + } + + items.append(.action(ContextMenuActionItem(text: "Playback Speed", textLayout: .secondLineWithValue(speedValue), icon: { theme in + return optionsRateImage(rate: speedIconText, isLarge: false, color: theme.contextMenu.primaryColor) + }, action: { c, _ in + guard let strongSelf = self else { + c.dismiss(completion: nil) + return + } + + c.setItems(strongSelf.contextMenuSpeedItems()) + }))) + if let (message, file, isWebpage) = strongSelf.contentInfo(), !isWebpage { + items.append(.action(ContextMenuActionItem(text: "Save to Gallery", icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Download"), color: theme.actionSheet.primaryTextColor) }, action: { _, f in + f(.default) + + if let strongSelf = self { + let _ = (SaveToCameraRoll.saveToCameraRoll(context: strongSelf.context, postbox: strongSelf.context.account.postbox, mediaReference: .message(message: MessageReference(message), media: file)) + |> deliverOnMainQueue).start(completed: { + guard let strongSelf = self else { + return + } + guard let controller = strongSelf.galleryController() else { + return + } + //TODO:localize + controller.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .mediaSaved(text: "Video Saved"), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root)) + }) + } + }))) + } + if strongSelf.canDelete() { + items.append(.action(ContextMenuActionItem(text: "Delete", textColor: .destructive, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Delete"), color: theme.contextMenu.destructiveColor) }, action: { _, f in + f(.default) + + if let strongSelf = self { + strongSelf.footerContentNode.deleteButtonPressed() + } + }))) + } + + return items + } + } + + private func contextMenuSpeedItems() -> Signal<[ContextMenuItem], NoError> { + guard let videoNode = self.videoNode else { + return .single([]) + } + + return videoNode.status + |> take(1) + |> deliverOnMainQueue + |> map { [weak self] status -> [ContextMenuItem] in + guard let status = status, let strongSelf = self else { + return [] + } + + var items: [ContextMenuItem] = [] + + for (text, _, rate) in strongSelf.speedList() { + let isSelected = abs(status.baseRate - rate) < 0.01 + items.append(.action(ContextMenuActionItem(text: text, icon: { theme in + if isSelected { + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor) + } else { + return nil + } + }, action: { _, f in + f(.default) + + guard let strongSelf = self, let videoNode = strongSelf.videoNode else { + return + } + + videoNode.setBaseRate(rate) + }))) + } + + items.append(.separator) + items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Common_Back, icon: { theme in + return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Back"), color: theme.actionSheet.primaryTextColor) + }, action: { c, _ in + guard let strongSelf = self else { + c.dismiss(completion: nil) + return + } + c.setItems(strongSelf.contextMenuMainItems()) + }))) + + return items + } + } + @objc func openStickersButtonPressed() { if let content = self.item?.content as? NativeVideoContent { let media = content.fileReference.abstract @@ -1665,6 +2174,20 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode { } override func footerContent() -> Signal<(GalleryFooterContentNode?, GalleryOverlayContentNode?), NoError> { - return .single((self.footerContentNode, self.overlayContentNode)) + return .single((self.footerContentNode, nil)) + } +} + +private final class HeaderContextReferenceContentSource: ContextReferenceContentSource { + private let controller: ViewController + private let sourceNode: ContextReferenceContentNode + + init(controller: ViewController, sourceNode: ContextReferenceContentNode) { + self.controller = controller + self.sourceNode = sourceNode + } + + func transitionInfo() -> ContextControllerReferenceViewInfo? { + return ContextControllerReferenceViewInfo(referenceNode: self.sourceNode, contentAreaInScreenSpace: UIScreen.main.bounds) } } diff --git a/submodules/GalleryUI/Sources/SecretMediaPreviewController.swift b/submodules/GalleryUI/Sources/SecretMediaPreviewController.swift index 1cb9e541d0..61a66ece31 100644 --- a/submodules/GalleryUI/Sources/SecretMediaPreviewController.swift +++ b/submodules/GalleryUI/Sources/SecretMediaPreviewController.swift @@ -438,7 +438,7 @@ public final class SecretMediaPreviewController: ViewController { } } - guard let item = galleryItemForEntry(context: self.context, presentationData: self.presentationData, entry: MessageHistoryEntry(message: message, isRead: false, location: nil, monthLocation: nil, attributes: MutableMessageHistoryEntryAttributes(authorIsContact: false)), streamVideos: false, hideControls: true, tempFilePath: tempFilePath, playbackCompleted: { [weak self] in + guard let item = galleryItemForEntry(context: self.context, presentationData: self.presentationData, entry: MessageHistoryEntry(message: message, isRead: false, location: nil, monthLocation: nil, attributes: MutableMessageHistoryEntryAttributes(authorIsContact: false)), streamVideos: false, hideControls: true, isSecret: true, tempFilePath: tempFilePath, playbackCompleted: { [weak self] in self?.dismiss(forceAway: false) }, present: { _, _ in }) else { self._ready.set(.single(true)) diff --git a/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift b/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift index fa8909089b..5f9ec94ef5 100644 --- a/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift +++ b/submodules/InstantPageUI/Sources/InstantPageGalleryController.swift @@ -113,7 +113,7 @@ public struct InstantPageGalleryEntry: Equatable { nativeId = .instantPage(self.pageId, file.fileId) } - return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: NativeVideoContent(id: nativeId, fileReference: .webPage(webPage: WebpageReference(webPage), media: file), streamVideo: isMediaStreamable(media: file) ? .conservative : .none), originData: nil, indexData: indexData, contentInfo: .webPage(webPage, file, nil), caption: caption, credit: credit, fromPlayingVideo: fromPlayingVideo, landscape: landscape, performAction: { _ in }, openActionOptions: { _ in }, storeMediaPlaybackState: { _, _ in }, present: { _, _ in }) + return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: NativeVideoContent(id: nativeId, fileReference: .webPage(webPage: WebpageReference(webPage), media: file), streamVideo: isMediaStreamable(media: file) ? .conservative : .none), originData: nil, indexData: indexData, contentInfo: .webPage(webPage, file, nil), caption: caption, credit: credit, fromPlayingVideo: fromPlayingVideo, landscape: landscape, performAction: { _ in }, openActionOptions: { _, _ in }, storeMediaPlaybackState: { _, _, _ in }, present: { _, _ in }) } else { var representations: [TelegramMediaImageRepresentation] = [] representations.append(contentsOf: file.previewRepresentations) @@ -135,12 +135,12 @@ public struct InstantPageGalleryEntry: Equatable { present(gallery, InstantPageGalleryControllerPresentationArguments(transitionArguments: { entry -> GalleryTransitionArguments? in return makeArguments() })) - }), caption: NSAttributedString(string: ""), fromPlayingVideo: fromPlayingVideo, landscape: landscape, performAction: { _ in }, openActionOptions: { _ in }, storeMediaPlaybackState: { _, _ in }, present: { _, _ in }) + }), caption: NSAttributedString(string: ""), fromPlayingVideo: fromPlayingVideo, landscape: landscape, performAction: { _ in }, openActionOptions: { _, _ in }, storeMediaPlaybackState: { _, _, _ in }, present: { _, _ in }) } else { if let content = WebEmbedVideoContent(webPage: embedWebpage, webpageContent: webpageContent, openUrl: { url in }) { - return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: nil, indexData: nil, contentInfo: .webPage(webPage, embedWebpage, nil), caption: NSAttributedString(string: ""), fromPlayingVideo: fromPlayingVideo, landscape: landscape, performAction: { _ in }, openActionOptions: { _ in }, storeMediaPlaybackState: { _, _ in }, present: { _, _ in }) + return UniversalVideoGalleryItem(context: context, presentationData: presentationData, content: content, originData: nil, indexData: nil, contentInfo: .webPage(webPage, embedWebpage, nil), caption: NSAttributedString(string: ""), fromPlayingVideo: fromPlayingVideo, landscape: landscape, performAction: { _ in }, openActionOptions: { _, _ in }, storeMediaPlaybackState: { _, _, _ in }, present: { _, _ in }) } else { preconditionFailure() } diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Cancel.imageset/Contents.json b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Cancel.imageset/Contents.json new file mode 100644 index 0000000000..1e9abf3aa5 --- /dev/null +++ b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Cancel.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_cam_close.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Cancel.imageset/ic_cam_close.pdf b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Cancel.imageset/ic_cam_close.pdf new file mode 100644 index 0000000000..e6a89ea929 Binary files /dev/null and b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Cancel.imageset/ic_cam_close.pdf differ diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Contents.json b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Contents.json new file mode 100644 index 0000000000..6e965652df --- /dev/null +++ b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Contents.json @@ -0,0 +1,9 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "provides-namespace" : true + } +} diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/Contents.json b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/Contents.json new file mode 100644 index 0000000000..3d7da8444b --- /dev/null +++ b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_cam_flashoff (1).pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/ic_cam_flashoff (1).pdf b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/ic_cam_flashoff (1).pdf new file mode 100644 index 0000000000..883bcd2938 Binary files /dev/null and b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOff.imageset/ic_cam_flashoff (1).pdf differ diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOn.imageset/Contents.json b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOn.imageset/Contents.json new file mode 100644 index 0000000000..8aacf1b5de --- /dev/null +++ b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOn.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_cam_flashon.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOn.imageset/ic_cam_flashon.pdf b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOn.imageset/ic_cam_flashon.pdf new file mode 100644 index 0000000000..25896a3a6e Binary files /dev/null and b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/FlashOn.imageset/ic_cam_flashon.pdf differ diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Flip.imageset/Contents.json b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Flip.imageset/Contents.json new file mode 100644 index 0000000000..e6f1b93d3e --- /dev/null +++ b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Flip.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_cam_flip.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Flip.imageset/ic_cam_flip.pdf b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Flip.imageset/ic_cam_flip.pdf new file mode 100644 index 0000000000..5084218a29 Binary files /dev/null and b/submodules/LegacyComponents/LegacyImages.xcassets/Camera/Flip.imageset/ic_cam_flip.pdf differ diff --git a/submodules/LegacyComponents/LegacyImages.xcassets/Contents.json b/submodules/LegacyComponents/LegacyImages.xcassets/Contents.json index da4a164c91..73c00596a7 100644 --- a/submodules/LegacyComponents/LegacyImages.xcassets/Contents.json +++ b/submodules/LegacyComponents/LegacyImages.xcassets/Contents.json @@ -1,6 +1,6 @@ { "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/LegacyComponents.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/LegacyComponents.h index 92120ba582..df30d859e9 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/LegacyComponents.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/LegacyComponents.h @@ -80,7 +80,6 @@ #import #import #import -#import #import #import #import diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCamera.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCamera.h index 23ac166b8d..b6465ca803 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCamera.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCamera.h @@ -26,7 +26,8 @@ typedef enum PGCameraModeVideo, PGCameraModeSquarePhoto, PGCameraModeSquareVideo, - PGCameraModeSquareSwing + PGCameraModeSquareSwing, + PGCameraModePhotoScan } PGCameraMode; typedef enum @@ -132,4 +133,7 @@ typedef enum + (PGCameraAuthorizationStatus)cameraAuthorizationStatus; + (PGMicrophoneAuthorizationStatus)microphoneAuthorizationStatus; ++ (bool)isPhotoCameraMode:(PGCameraMode)mode; ++ (bool)isVideoCameraMode:(PGCameraMode)mode; + @end diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCameraCaptureSession.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCameraCaptureSession.h index 92c90b3592..9269470d96 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCameraCaptureSession.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCameraCaptureSession.h @@ -3,6 +3,7 @@ #import @class PGCameraMovieWriter; +@class PGRectangleDetector; @interface PGCameraCaptureSession : AVCaptureSession @@ -12,6 +13,7 @@ @property (nonatomic, readonly) AVCaptureAudioDataOutput *audioOutput; @property (nonatomic, readonly) AVCaptureMetadataOutput *metadataOutput; @property (nonatomic, readonly) PGCameraMovieWriter *movieWriter; +@property (nonatomic, readonly) PGRectangleDetector *rectangleDetector; @property (nonatomic, assign) bool alwaysSetFlash; @property (nonatomic, assign) PGCameraMode currentMode; diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCameraShotMetadata.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCameraShotMetadata.h index 59a07a7051..7243b67cf3 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCameraShotMetadata.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGCameraShotMetadata.h @@ -1,9 +1,12 @@ #import #import +@class PGRectangle; + @interface PGCameraShotMetadata : NSObject @property (nonatomic, assign) CGFloat deviceAngle; +@property (nonatomic, strong) PGRectangle *rectangle; + (CGFloat)relativeDeviceAngleFromAngle:(CGFloat)angle orientation:(UIInterfaceOrientation)orientation; diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGPhotoEditorValues.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGPhotoEditorValues.h index 3e01cb40f6..12a0296d78 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGPhotoEditorValues.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/PGPhotoEditorValues.h @@ -1,9 +1,16 @@ #import @class TGPaintingData; +@class PGRectangle; @interface PGPhotoEditorValues : NSObject +@property (nonatomic, readonly) PGRectangle *cropRectangle; +@property (nonatomic, readonly) CGSize cropSize; +@property (nonatomic, readonly) bool enhanceDocument; + ++ (instancetype)editorValuesWithOriginalSize:(CGSize)originalSize cropRectangle:(PGRectangle *)cropRectangle cropOrientation:(UIImageOrientation)cropOrientation cropSize:(CGSize)cropSize enhanceDocument:(bool)enhanceDocument paintingData:(TGPaintingData *)paintingData; + + (instancetype)editorValuesWithOriginalSize:(CGSize)originalSize cropRect:(CGRect)cropRect cropRotation:(CGFloat)cropRotation cropOrientation:(UIImageOrientation)cropOrientation cropLockedAspectRatio:(CGFloat)cropLockedAspectRatio cropMirrored:(bool)cropMirrored toolValues:(NSDictionary *)toolValues paintingData:(TGPaintingData *)paintingData sendAsGif:(bool)sendAsGif; @end diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraCapturedPhoto.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraCapturedPhoto.h index 251ff85651..0eb043274a 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraCapturedPhoto.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraCapturedPhoto.h @@ -3,15 +3,19 @@ #import @class PGCameraShotMetadata; +@class PGRectangle; @interface TGCameraCapturedPhoto : NSObject @property (nonatomic, readonly) NSURL *url; @property (nonatomic, readonly) PGCameraShotMetadata *metadata; +@property (nonatomic, readonly) PGRectangle *rectangle; - (instancetype)initWithImage:(UIImage *)image metadata:(PGCameraShotMetadata *)metadata; - (instancetype)initWithExistingImage:(UIImage *)image; +- (instancetype)initWithImage:(UIImage *)image rectangle:(PGRectangle *)rectangle; + - (void)_cleanUp; @end diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraFlipButton.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraFlipButton.h index f774b427b9..6cc971ee6b 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraFlipButton.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraFlipButton.h @@ -2,7 +2,12 @@ @interface TGCameraFlipButton : TGModernButton -- (instancetype)initWithFrame:(CGRect)frame large:(bool)large; +- (void)setHidden:(bool)hidden animated:(bool)animated; + +@end + +@interface TGCameraCancelButton : TGModernButton + - (void)setHidden:(bool)hidden animated:(bool)animated; @end diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraInterfaceAssets.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraInterfaceAssets.h index ab8c131569..727ade0b88 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraInterfaceAssets.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraInterfaceAssets.h @@ -10,7 +10,9 @@ + (UIColor *)panelBackgroundColor; + (UIColor *)transparentPanelBackgroundColor; + (UIColor *)transparentOverlayBackgroundColor; ++ (UIColor *)buttonColor; -+ (UIFont *)normalFontOfSize:(CGFloat)size; ++ (UIFont *)regularFontOfSize:(CGFloat)size; ++ (UIFont *)boldFontOfSize:(CGFloat)size; @end diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraMainView.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraMainView.h index ab2a225b1e..c116134d7d 100644 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraMainView.h +++ b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraMainView.h @@ -10,7 +10,7 @@ @class TGCameraFlipButton; @class TGCameraTimeCodeView; @class TGCameraZoomView; -@class TGCameraSegmentsView; +@class TGCameraToastView; @class TGMediaPickerPhotoCounterButton; @class TGMediaPickerPhotoStripView; @class TGMediaPickerGallerySelectedItemsModel; @@ -26,6 +26,8 @@ TGCameraFlipButton *_flipButton; TGCameraTimeCodeView *_timecodeView; + TGCameraToastView *_toastView; + TGMediaPickerPhotoCounterButton *_photoCounterButton; TGMediaPickerPhotoStripView *_selectedPhotosView; @@ -51,8 +53,6 @@ @property (nonatomic, copy) void(^resultPressed)(NSInteger index); @property (nonatomic, copy) void(^itemRemoved)(NSInteger index); -@property (nonatomic, copy) void (^deleteSegmentButtonPressed)(void); - @property (nonatomic, copy) NSTimeInterval(^requestedVideoRecordingDuration)(void); @property (nonatomic, assign) CGRect previewViewFrame; @@ -64,6 +64,8 @@ - (void)updateForCameraModeChangeWithPreviousMode:(PGCameraMode)previousMode; - (void)updateForCameraModeChangeAfterResize; +- (void)setToastMessage:(NSString *)message animated:(bool)animated; + - (void)setFlashMode:(PGCameraFlashMode)mode; - (void)setFlashActive:(bool)active; - (void)setFlashUnavailable:(bool)unavailable; diff --git a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraSegmentsView.h b/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraSegmentsView.h deleted file mode 100644 index b2f0c2ba73..0000000000 --- a/submodules/LegacyComponents/PublicHeaders/LegacyComponents/TGCameraSegmentsView.h +++ /dev/null @@ -1,20 +0,0 @@ -#import - -@interface TGCameraSegmentsView : UIView - -@property (nonatomic, copy) void (^deletePressed)(void); - -- (void)setSegments:(NSArray *)segments; - -- (void)startCurrentSegment; -- (void)setCurrentSegment:(CGFloat)length; -- (void)commitCurrentSegmentWithCompletion:(void (^)(void))completion; - -- (void)highlightLastSegment; -- (void)removeLastSegment; - -- (void)setHidden:(bool)hidden animated:(bool)animated delay:(NSTimeInterval)delay; - -- (void)setDeleteButtonHidden:(bool)hidden animated:(bool)animated; - -@end diff --git a/submodules/LegacyComponents/Sources/PGCamera.m b/submodules/LegacyComponents/Sources/PGCamera.m index 6431e15773..d8088a1124 100644 --- a/submodules/LegacyComponents/Sources/PGCamera.m +++ b/submodules/LegacyComponents/Sources/PGCamera.m @@ -843,4 +843,14 @@ NSString *const PGCameraAdjustingFocusKey = @"adjustingFocus"; } } ++ (bool)isPhotoCameraMode:(PGCameraMode)mode +{ + return mode == PGCameraModePhoto || mode == PGCameraModeSquarePhoto || mode == PGCameraModePhotoScan; +} + ++ (bool)isVideoCameraMode:(PGCameraMode)mode +{ + return mode == PGCameraModeVideo || mode == PGCameraModeSquareVideo; +} + @end diff --git a/submodules/LegacyComponents/Sources/PGCameraCaptureSession.m b/submodules/LegacyComponents/Sources/PGCameraCaptureSession.m index e651da1ae3..ade29d5063 100644 --- a/submodules/LegacyComponents/Sources/PGCameraCaptureSession.m +++ b/submodules/LegacyComponents/Sources/PGCameraCaptureSession.m @@ -1,5 +1,6 @@ #import "PGCameraCaptureSession.h" #import "PGCameraMovieWriter.h" +#import "PGRectangleDetector.h" #import #import @@ -261,10 +262,15 @@ const NSInteger PGCameraFrameRate = 30; { case PGCameraModePhoto: case PGCameraModeSquarePhoto: + case PGCameraModePhotoScan: { [self _removeAudioInputEndAudioSession:true]; self.sessionPreset = AVCaptureSessionPresetPhoto; [self setFrameRate:0 forDevice:_videoDevice]; + + if (mode == PGCameraModePhotoScan) { + [self setCurrentCameraPosition:PGCameraPositionRear]; + } } break; @@ -287,6 +293,14 @@ const NSInteger PGCameraFrameRate = 30; [self _enableVideoStabilization]; [self commitConfiguration]; + + if (mode == PGCameraModePhotoScan) { + if (_rectangleDetector == nil) { + _rectangleDetector = [[PGRectangleDetector alloc] init]; + } + } else { + _rectangleDetector = nil; + } } - (void)switchToBestVideoFormatForDevice:(AVCaptureDevice *)device @@ -630,9 +644,11 @@ const NSInteger PGCameraFrameRate = 30; - (void)setCurrentCameraPosition:(PGCameraPosition)position { - NSError *error; - AVCaptureDevice *deviceForTargetPosition = [PGCameraCaptureSession _deviceWithCameraPosition:position]; + if ([_videoDevice isEqual:deviceForTargetPosition]) + return; + + NSError *error; AVCaptureDeviceInput *newVideoInput = [[AVCaptureDeviceInput alloc] initWithDevice:deviceForTargetPosition error:&error]; if (newVideoInput != nil) @@ -924,6 +940,11 @@ static UIImageOrientation TGSnapshotOrientationForVideoOrientation(bool mirrored if (_movieWriter.isRecording) [_movieWriter _processSampleBuffer:sampleBuffer]; + if (_rectangleDetector != nil) { + CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); + [_rectangleDetector detectRectangle:imageBuffer]; + } + if (!_captureNextFrame || captureOutput != _videoOutput) return; diff --git a/submodules/LegacyComponents/Sources/PGPhotoEditorValues.m b/submodules/LegacyComponents/Sources/PGPhotoEditorValues.m index ffb2aa828c..3257dd4b08 100644 --- a/submodules/LegacyComponents/Sources/PGPhotoEditorValues.m +++ b/submodules/LegacyComponents/Sources/PGPhotoEditorValues.m @@ -15,6 +15,20 @@ @synthesize sendAsGif = _sendAsGif; @synthesize toolValues = _toolValues; ++ (instancetype)editorValuesWithOriginalSize:(CGSize)originalSize cropRectangle:(PGRectangle *)cropRectangle cropOrientation:(UIImageOrientation)cropOrientation cropSize:(CGSize)cropSize enhanceDocument:(bool)enhanceDocument paintingData:(TGPaintingData *)paintingData +{ + PGPhotoEditorValues *values = [[PGPhotoEditorValues alloc] init]; + values->_originalSize = originalSize; + values->_cropRect = CGRectMake(0.0, 0.0, cropSize.width, cropSize.height); + values->_cropSize = cropSize; + values->_cropRectangle = cropRectangle; + values->_cropOrientation = cropOrientation; + values->_enhanceDocument = enhanceDocument; + values->_paintingData = paintingData; + return values; +} + + + (instancetype)editorValuesWithOriginalSize:(CGSize)originalSize cropRect:(CGRect)cropRect cropRotation:(CGFloat)cropRotation cropOrientation:(UIImageOrientation)cropOrientation cropLockedAspectRatio:(CGFloat)cropLockedAspectRatio cropMirrored:(bool)cropMirrored toolValues:(NSDictionary *)toolValues paintingData:(TGPaintingData *)paintingData sendAsGif:(bool)sendAsGif { PGPhotoEditorValues *values = [[PGPhotoEditorValues alloc] init]; @@ -27,7 +41,6 @@ values->_toolValues = toolValues; values->_paintingData = paintingData; values->_sendAsGif = sendAsGif; - return values; } @@ -38,6 +51,9 @@ - (bool)cropAppliedForAvatar:(bool)forAvatar { + if (_cropRectangle != nil) + return true; + CGRect defaultCropRect = CGRectMake(0, 0, _originalSize.width, _originalSize.height); if (forAvatar) { @@ -65,6 +81,9 @@ - (bool)toolsApplied { + if (_enhanceDocument) + return true; + if (self.toolValues.count > 0) return true; @@ -112,6 +131,9 @@ if (self.paintingData != values.paintingData && ![self.paintingData isEqual:values.paintingData]) return false; + if (self.enhanceDocument != values.enhanceDocument) + return false; + return true; } diff --git a/submodules/LegacyComponents/Sources/PGRectangleDetector.h b/submodules/LegacyComponents/Sources/PGRectangleDetector.h new file mode 100644 index 0000000000..1c68d5938f --- /dev/null +++ b/submodules/LegacyComponents/Sources/PGRectangleDetector.h @@ -0,0 +1,24 @@ +#import + +@interface PGRectangle : NSObject + +@property (nonatomic, readonly) CGPoint topLeft; +@property (nonatomic, readonly) CGPoint topRight; +@property (nonatomic, readonly) CGPoint bottomLeft; +@property (nonatomic, readonly) CGPoint bottomRight; + +- (PGRectangle *)transform:(CGAffineTransform)transform; +- (PGRectangle *)rotate90; +- (PGRectangle *)sort; +- (PGRectangle *)cartesian:(CGFloat)height; + +@end + +@interface PGRectangleDetector : NSObject + +@property (nonatomic, copy) void(^update)(bool, PGRectangle *); + +- (void)detectRectangle:(CVPixelBufferRef)pixelBuffer; + +@end + diff --git a/submodules/LegacyComponents/Sources/PGRectangleDetector.m b/submodules/LegacyComponents/Sources/PGRectangleDetector.m new file mode 100644 index 0000000000..aa41ae4b90 --- /dev/null +++ b/submodules/LegacyComponents/Sources/PGRectangleDetector.m @@ -0,0 +1,362 @@ +#import "PGRectangleDetector.h" +#import "LegacyComponentsInternal.h" + +#import +#import + +#import + +@interface PGRectangle () + +- (instancetype)initWithRectangleFeature:(CIRectangleFeature *)rectangleFeature; +- (instancetype)initWithRectangleObservation:(VNRectangleObservation *)rectangleObservation API_AVAILABLE(ios(11.0)); + +- (CGFloat)size; + +@end + +@interface PGRectangleEntry : NSObject + +@property (nonatomic, readonly) PGRectangle *rectangle; +@property (nonatomic, assign) NSInteger rate; + +- (instancetype)initWithRectangle:(PGRectangle *)rectangle; + +@end + +@implementation PGRectangleEntry + +- (instancetype)initWithRectangle:(PGRectangle *)rectangle +{ + self = [super init]; + if (self != nil) + { + _rectangle = rectangle; + _rate = 0; + } + return self; +} + +@end + +@implementation PGRectangle + +- (instancetype)initWithRectangleFeature:(CIRectangleFeature *)rectangleFeature +{ + self = [super init]; + if (self != nil) { + _topLeft = rectangleFeature.topLeft; + _topRight = rectangleFeature.topRight; + _bottomLeft = rectangleFeature.bottomLeft; + _bottomRight = rectangleFeature.bottomRight; + } + return self; +} + +- (instancetype)initWithRectangleObservation:(VNRectangleObservation *)rectangleObservation API_AVAILABLE(ios(11.0)) +{ + self = [super init]; + if (self != nil) { + _topLeft = rectangleObservation.topLeft; + _topRight = rectangleObservation.topRight; + _bottomLeft = rectangleObservation.bottomLeft; + _bottomRight = rectangleObservation.bottomRight; + } + return self; +} + +- (PGRectangle *)transform:(CGAffineTransform)transform +{ + PGRectangle *rectangle = [[PGRectangle alloc] init]; + rectangle->_topLeft = CGPointApplyAffineTransform(_topLeft, transform); + rectangle->_topRight = CGPointApplyAffineTransform(_topRight, transform); + rectangle->_bottomLeft = CGPointApplyAffineTransform(_bottomLeft, transform); + rectangle->_bottomRight = CGPointApplyAffineTransform(_bottomRight, transform); + return rectangle; +} + +- (PGRectangle *)rotate90 +{ + PGRectangle *rectangle = [[PGRectangle alloc] init]; + rectangle->_topLeft = CGPointMake(_topLeft.y, _topLeft.x); + rectangle->_topRight = CGPointMake(_topRight.y, _topRight.x); + rectangle->_bottomLeft = CGPointMake(_bottomLeft.y, _bottomLeft.x); + rectangle->_bottomRight = CGPointMake(_bottomRight.y, _bottomRight.x); + return rectangle; +} + +- (PGRectangle *)sort +{ + NSArray *points = @[ [NSValue valueWithCGPoint:_topLeft], [NSValue valueWithCGPoint:_topRight], [NSValue valueWithCGPoint:_bottomLeft], [NSValue valueWithCGPoint:_bottomRight] ]; + + NSArray *ySorted = [points sortedArrayUsingComparator:^NSComparisonResult(id firstObject, id secondObject) { + CGPoint firstPoint = [firstObject CGPointValue]; + CGPoint secondPoint = [secondObject CGPointValue]; + if (firstPoint.y < secondPoint.y) { + return NSOrderedAscending; + } else { + return NSOrderedDescending; + } + }]; + + NSArray *top = [ySorted subarrayWithRange:NSMakeRange(0, 2)]; + NSArray *bottom = [ySorted subarrayWithRange:NSMakeRange(2, 2)]; + + NSArray *xSortedTop = [top sortedArrayUsingComparator:^NSComparisonResult(id firstObject, id secondObject) { + CGPoint firstPoint = [firstObject CGPointValue]; + CGPoint secondPoint = [secondObject CGPointValue]; + if (firstPoint.x < secondPoint.x) { + return NSOrderedAscending; + } else { + return NSOrderedDescending; + } + }]; + + NSArray *xSortedBottom = [bottom sortedArrayUsingComparator:^NSComparisonResult(id firstObject, id secondObject) { + CGPoint firstPoint = [firstObject CGPointValue]; + CGPoint secondPoint = [secondObject CGPointValue]; + if (firstPoint.x < secondPoint.x) { + return NSOrderedAscending; + } else { + return NSOrderedDescending; + } + }]; + + PGRectangle *rectangle = [[PGRectangle alloc] init]; + rectangle->_topLeft = [xSortedTop[0] CGPointValue]; + rectangle->_topRight = [xSortedTop[1] CGPointValue]; + rectangle->_bottomLeft = [xSortedBottom[0] CGPointValue]; + rectangle->_bottomRight = [xSortedBottom[1] CGPointValue]; + return rectangle; +} + +- (PGRectangle *)cartesian:(CGFloat)height +{ + PGRectangle *rectangle = [[PGRectangle alloc] init]; + rectangle->_topLeft = CGPointMake(_topLeft.x, height - _topLeft.y); + rectangle->_topRight = CGPointMake(_topRight.x, height - _topRight.y); + rectangle->_bottomLeft = CGPointMake(_bottomLeft.x, height - _bottomLeft.y); + rectangle->_bottomRight = CGPointMake(_bottomRight.x, height - _bottomRight.y); + return rectangle; +} + +- (PGRectangle *)normalize:(CGSize)size +{ + return [self transform:CGAffineTransformMakeScale(1.0 / size.width, 1.0 / size.height)]; +} + ++ (CGFloat)distance:(CGPoint)a to:(CGPoint)b +{ + return hypot(a.x - b.x, a.y - b.y); +} + +- (CGFloat)size +{ + CGFloat sum = 0.0f; + sum += [PGRectangle distance:self.topLeft to:self.topRight]; + sum += [PGRectangle distance:self.topRight to:self.bottomRight]; + sum += [PGRectangle distance:self.bottomRight to:self.bottomLeft]; + sum += [PGRectangle distance:self.bottomLeft to:self.topLeft]; + return sum; +} + ++ (CGRect)pointSquare:(CGPoint)point size:(CGFloat)size +{ + return CGRectMake(point.x - size / 2.0, point.y - size / 2.0, size, size); +} + +- (bool)matches:(PGRectangle *)other threshold:(CGFloat)threshold +{ + if (!CGRectContainsPoint([PGRectangle pointSquare:self.topLeft size:threshold], other.topLeft)) + return false; + + if (!CGRectContainsPoint([PGRectangle pointSquare:self.topRight size:threshold], other.topRight)) + return false; + + if (!CGRectContainsPoint([PGRectangle pointSquare:self.bottomLeft size:threshold], other.bottomLeft)) + return false; + + if (!CGRectContainsPoint([PGRectangle pointSquare:self.bottomRight size:threshold], other.bottomRight)) + return false; + + return true; +} + +@end + +@implementation PGRectangleDetector +{ + SQueue *_queue; + CIDetector *_detector; + + bool _disabled; + + CGSize _imageSize; + NSInteger _notFoundCount; + NSMutableArray *_rectangles; + + PGRectangle *_detectedRectangle; + NSInteger _autoscanCount; +} + +- (instancetype)init +{ + self = [super init]; + if (self != nil) { + _queue = [[SQueue alloc] init]; + _rectangles = [[NSMutableArray alloc] init]; + } + return self; +} + +- (void)updateEntries +{ + for (PGRectangleEntry *entry in _rectangles) { + entry.rate = 1; + } + + for (NSInteger i = 0; i < _rectangles.count; i++) { + for (NSInteger j = 0; i < _rectangles.count; i++) { + if (j > i && [[_rectangles[i] rectangle] matches:_rectangles[j] threshold:40.0]) { + ((PGRectangleEntry *)_rectangles[i]).rate += 1; + ((PGRectangleEntry *)_rectangles[j]).rate += 1; + } + } + } +} + +- (void)addRectangle:(PGRectangle *)rectangle +{ + if (_disabled) + return; + + PGRectangleEntry *entry = [[PGRectangleEntry alloc] initWithRectangle:rectangle]; + [_rectangles addObject:entry]; + + if (_rectangles.count < 3) + return; + + if (_rectangles.count > 8) + [_rectangles removeObjectAtIndex:0]; + + [self updateEntries]; + + __block PGRectangleEntry *best = nil; + [_rectangles enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(PGRectangleEntry *rectangle, NSUInteger idx, BOOL * stop) { + if (best == nil) { + best = rectangle; + return; + } + + if (rectangle.rate > best.rate) { + best = rectangle; + } else if (rectangle.rate == best.rate) { + if (_detectedRectangle != nil) { + if ([rectangle.rectangle matches:_detectedRectangle threshold:40.0]) { + best = rectangle; + } + } + } + }]; + + if (_detectedRectangle != nil && [best.rectangle matches:_detectedRectangle threshold:24.0f]) { + _autoscanCount += 1; + _detectedRectangle = best.rectangle; + if (_autoscanCount > 20) { + _autoscanCount = 0; + self.update(true, [_detectedRectangle normalize:_imageSize]); + + _detectedRectangle = nil; + + _disabled = true; + TGDispatchAfter(2.0, _queue._dispatch_queue, ^{ + _disabled = false; + }); + } + } else { + _autoscanCount = 0; + _detectedRectangle = best.rectangle; + self.update(false, [_detectedRectangle normalize:_imageSize]); + } +} + +- (void)processRectangle:(PGRectangle *)rectangle imageSize:(CGSize)imageSize +{ + _imageSize = imageSize; + + if (rectangle != nil) { + _notFoundCount = 0; + + [self addRectangle:rectangle]; + } else { + _notFoundCount += 1; + + if (_notFoundCount > 3) { + _autoscanCount = 0; + _detectedRectangle = nil; + + self.update(false, nil); + } + } +} + +- (void)detectRectangle:(CVPixelBufferRef)pixelBuffer +{ + CGSize size = CGSizeMake(CVPixelBufferGetWidth(pixelBuffer), CVPixelBufferGetHeight(pixelBuffer)); + if (@available(iOS 11.0, *)) { + CVPixelBufferRetain(pixelBuffer); + NSError *error; + VNImageRequestHandler *handler = [[VNImageRequestHandler alloc] initWithCVPixelBuffer:pixelBuffer options:@{}]; + VNDetectRectanglesRequest *request = [[VNDetectRectanglesRequest alloc] initWithCompletionHandler:^(VNRequest * _Nonnull request, NSError * _Nullable error) { + CVPixelBufferRelease(pixelBuffer); + + [_queue dispatch:^{ + if (error == nil && request.results.count > 0) { + PGRectangle *largestRectangle = nil; + for (VNRectangleObservation *result in request.results) { + if (![result isKindOfClass:[VNRectangleObservation class]]) + continue; + + PGRectangle *rectangle = [[PGRectangle alloc] initWithRectangleObservation:result]; + if (largestRectangle == nil || largestRectangle.size < rectangle.size) { + largestRectangle = rectangle; + } + } + [self processRectangle:[largestRectangle transform:CGAffineTransformMakeScale(size.width, size.height)] imageSize:size]; + } else { + [self processRectangle:nil imageSize:size]; + } + }]; + }]; + request.minimumConfidence = 0.85f; + request.maximumObservations = 15; + request.minimumAspectRatio = 0.33; + request.minimumSize = 0.4; + [handler performRequests:@[request] error:&error]; + } else { + CVPixelBufferRetain(pixelBuffer); + [_queue dispatch:^{ + if (_detector == nil) { + _detector = [CIDetector detectorOfType:CIDetectorTypeRectangle context:[CIContext contextWithOptions:nil] options:@{ CIDetectorAccuracy: CIDetectorAccuracyHigh }]; + } + + CIImage *image = [[CIImage alloc] initWithCVPixelBuffer:pixelBuffer]; + NSArray *results = [_detector featuresInImage:image]; + CVPixelBufferRelease(pixelBuffer); + + PGRectangle *largestRectangle = nil; + for (CIRectangleFeature *result in results) { + if (![result isKindOfClass:[CIRectangleFeature class]]) + continue; + + PGRectangle *rectangle = [[PGRectangle alloc] initWithRectangleFeature:result]; + if (largestRectangle == nil || largestRectangle.size < rectangle.size) { + largestRectangle = rectangle; + } + } + [self processRectangle:largestRectangle imageSize:size]; + }]; + } +} + +@end diff --git a/submodules/LegacyComponents/Sources/TGCameraCapturedPhoto.m b/submodules/LegacyComponents/Sources/TGCameraCapturedPhoto.m index 88cb73db87..445a794977 100644 --- a/submodules/LegacyComponents/Sources/TGCameraCapturedPhoto.m +++ b/submodules/LegacyComponents/Sources/TGCameraCapturedPhoto.m @@ -32,6 +32,23 @@ return self; } +- (instancetype)initWithImage:(UIImage *)image rectangle:(PGRectangle *)rectangle +{ + self = [super init]; + if (self != nil) + { + _identifier = [NSString stringWithFormat:@"%ld", lrand48()]; + _dimensions = CGSizeMake(image.size.width * image.scale, image.size.height * image.scale); + PGCameraShotMetadata *metadata = [[PGCameraShotMetadata alloc] init]; + metadata.rectangle = rectangle; + _metadata = metadata; + _thumbnail = [[SVariable alloc] init]; + + [self _saveToDisk:image]; + } + return self; +} + - (instancetype)initWithExistingImage:(UIImage *)image { self = [super init]; @@ -110,6 +127,11 @@ return [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSString alloc] initWithFormat:@"camphoto_%@.jpg", _identifier]]; } +- (PGRectangle *)rectangle +{ + return _metadata.rectangle; +} + - (NSURL *)url { return [NSURL fileURLWithPath:[self filePath]]; diff --git a/submodules/LegacyComponents/Sources/TGCameraController.m b/submodules/LegacyComponents/Sources/TGCameraController.m index f4c5f28c0e..5ab43a29e8 100644 --- a/submodules/LegacyComponents/Sources/TGCameraController.m +++ b/submodules/LegacyComponents/Sources/TGCameraController.m @@ -17,6 +17,7 @@ #import #import #import "TGCameraFocusCrosshairsControl.h" +#import "TGCameraRectangleView.h" #import #import @@ -50,6 +51,8 @@ #import "TGCameraCapturedVideo.h" #import "PGPhotoEditor.h" +#import "PGRectangleDetector.h" +#import "TGWarpedView.h" #import "TGAnimationUtils.h" @@ -106,9 +109,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus TGCameraMainView *_interfaceView; UIView *_overlayView; TGCameraFocusCrosshairsControl *_focusControl; - - TGModernGalleryVideoView *_segmentPreviewView; - bool _previewingSegment; + TGCameraRectangleView *_rectangleView; UISwipeGestureRecognizer *_photoSwipeGestureRecognizer; UISwipeGestureRecognizer *_videoSwipeGestureRecognizer; @@ -281,6 +282,11 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [_focusControl setInterfaceOrientation:interfaceOrientation animated:false]; [_overlayView addSubview:_focusControl]; + _rectangleView = [[TGCameraRectangleView alloc] initWithFrame:_overlayView.bounds]; + _rectangleView.previewView = _previewView; + _rectangleView.hidden = true; + [_overlayView addSubview:_rectangleView]; + if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { _panGestureRecognizer = [[TGModernGalleryZoomableScrollViewSwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)]; @@ -360,7 +366,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus if (strongSelf == nil) return; - [strongSelf->_camera setCameraMode:mode]; + [strongSelf _updateCameraMode:mode updateInterface:false]; }; _interfaceView.flashModeChanged = ^(PGCameraFlashMode mode) @@ -478,6 +484,25 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [self _configureCamera]; } +- (void)_updateCameraMode:(PGCameraMode)mode updateInterface:(bool)updateInterface { + [_camera setCameraMode:mode]; + if (updateInterface) + [_interfaceView setCameraMode:mode]; + + _focusControl.hidden = mode == PGCameraModePhotoScan; + _rectangleView.hidden = mode != PGCameraModePhotoScan; + + if (mode == PGCameraModePhotoScan) { + [self _createContextsIfNeeded]; + + if (_items.count == 0) { + [_interfaceView setToastMessage:@"Position the document in view" animated:true]; + } else { + + } + } +} + - (void)_configureCamera { __weak TGCameraController *weakSelf = self; @@ -514,9 +539,11 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus strongSelf.view.userInteractionEnabled = false; PGCameraMode currentMode = strongSelf->_camera.cameraMode; - bool generalModeNotChanged = (mode == PGCameraModePhoto && currentMode == PGCameraModeSquarePhoto) || (mode == PGCameraModeSquarePhoto && currentMode == PGCameraModePhoto) || (mode == PGCameraModeVideo && currentMode == PGCameraModeSquareVideo) || (mode == PGCameraModeSquareVideo && currentMode == PGCameraModeVideo); - - if ((mode == PGCameraModeVideo || mode == PGCameraModeSquareVideo) && !generalModeNotChanged) + bool generalModeNotChanged = [PGCamera isPhotoCameraMode:mode] == [PGCamera isPhotoCameraMode:currentMode]; + if (strongSelf->_camera.captureSession.currentCameraPosition == PGCameraPositionFront && mode == PGCameraModePhotoScan) { + generalModeNotChanged = false; + } + if ([PGCamera isVideoCameraMode:mode] && !generalModeNotChanged) { [[LegacyComponentsGlobals provider] pauseMusicPlayback]; } @@ -570,6 +597,21 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus [[[LegacyComponentsGlobals provider] accessChecker] checkMicrophoneAuthorizationStatusForIntent:TGMicrophoneAccessIntentVideo alertDismissCompletion:nil]; strongSelf->_shownMicrophoneAlert = true; } + + if (strongSelf->_camera.cameraMode == PGCameraModePhotoScan) { + strongSelf->_camera.captureSession.rectangleDetector.update = ^(bool capture, PGRectangle *rectangle) { + __strong TGCameraController *strongSelf = weakSelf; + if (strongSelf == nil) + return; + + TGDispatchOnMainThread(^{ + [strongSelf->_rectangleView drawRectangle:rectangle]; + if (capture) { + [strongSelf _makeScan:rectangle]; + } + }); + }; + } } }); }; @@ -874,9 +916,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus }]; }; _camera.autoStartVideoRecording = true; - - [_camera setCameraMode:PGCameraModeVideo]; - [_interfaceView setCameraMode:PGCameraModeVideo]; + [self _updateCameraMode:PGCameraModeVideo updateInterface:true]; } else if (_camera.cameraMode == PGCameraModeVideo) { @@ -968,7 +1008,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus __weak TGCameraController *weakSelf = self; PGCameraMode cameraMode = _camera.cameraMode; - if (cameraMode == PGCameraModePhoto || cameraMode == PGCameraModeSquarePhoto) + if (cameraMode == PGCameraModePhoto || cameraMode == PGCameraModeSquarePhoto || cameraMode == PGCameraModePhotoScan) { _camera.disabled = true; @@ -987,7 +1027,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus _buttonHandler.enabled = false; [_buttonHandler ignoreEventsFor:1.5f andDisable:true]; } - + [_camera takePhotoWithCompletion:^(UIImage *result, PGCameraShotMetadata *metadata) { __strong TGCameraController *strongSelf = weakSelf; @@ -1060,6 +1100,140 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus } } +- (void)_makeScan:(PGRectangle *)rectangle +{ + if (_shutterIsBusy) + return; + + _camera.disabled = true; + _shutterIsBusy = true; + + __weak TGCameraController *weakSelf = self; + [_camera takePhotoWithCompletion:^(UIImage *result, PGCameraShotMetadata *metadata) + { + __strong TGCameraController *strongSelf = weakSelf; + if (strongSelf == nil) + return; + + TGDispatchOnMainThread(^ + { + [strongSelf->_interfaceView setToastMessage:nil animated:true]; + + strongSelf->_shutterIsBusy = false; + + [strongSelf->_rectangleView drawRectangle:nil]; + strongSelf->_rectangleView.enabled = false; + + TGDispatchAfter(2.0, dispatch_get_main_queue(), ^{ + strongSelf->_rectangleView.enabled = true; + }); + + TGCameraCapturedPhoto *capturedPhoto = [[TGCameraCapturedPhoto alloc] initWithImage:result rectangle:rectangle]; + [strongSelf addResultItem:capturedPhoto]; + + PGRectangle *cropRectangle = [[rectangle rotate90] transform:CGAffineTransformMakeScale(result.size.width, result.size.height)]; + PGRectangle *convertedRectangle = [cropRectangle sort]; + convertedRectangle = [convertedRectangle cartesian:result.size.height]; + + CIImage *ciImage = [[CIImage alloc] initWithImage:result]; + CIImage *croppedImage = [ciImage imageByApplyingFilter:@"CIPerspectiveCorrection" withInputParameters:@{ + @"inputTopLeft": [CIVector vectorWithCGPoint:convertedRectangle.topLeft], + @"inputTopRight": [CIVector vectorWithCGPoint:convertedRectangle.topRight], + @"inputBottomLeft": [CIVector vectorWithCGPoint:convertedRectangle.bottomLeft], + @"inputBottomRight": [CIVector vectorWithCGPoint:convertedRectangle.bottomRight] + }]; + CIImage *enhancedImage = [croppedImage imageByApplyingFilter:@"CIDocumentEnhancer" withInputParameters:@{}]; + + CIContext *context = [CIContext contextWithOptions:nil]; + UIImage *editedImage = [UIImage imageWithCGImage:[context createCGImage:enhancedImage fromRect:enhancedImage.extent]]; + UIImage *thumbnailImage = TGScaleImage(editedImage, TGScaleToFillSize(editedImage.size, TGPhotoThumbnailSizeForCurrentScreen())); + [strongSelf->_editingContext setImage:editedImage thumbnailImage:thumbnailImage forItem:capturedPhoto synchronous:true]; + [strongSelf->_editingContext setAdjustments:[PGPhotoEditorValues editorValuesWithOriginalSize:result.size cropRectangle:cropRectangle cropOrientation:UIImageOrientationUp cropSize:editedImage.size enhanceDocument:true paintingData:nil] forItem:capturedPhoto]; + + [strongSelf _playScanAnimation:editedImage rectangle:rectangle completion:^{ + [strongSelf->_selectedItemsModel addSelectedItem:capturedPhoto]; + [strongSelf->_selectionContext setItem:capturedPhoto selected:true]; + [strongSelf->_interfaceView setResults:[strongSelf->_items copy]]; + + TGDispatchAfter(0.5, dispatch_get_main_queue(), ^{ + [strongSelf->_interfaceView setToastMessage:@"Ready for next scan" animated:true]; + }); + }]; + + strongSelf->_camera.disabled = false; + }); + }]; +} + +- (void)_playScanAnimation:(UIImage *)image rectangle:(PGRectangle *)rectangle completion:(void(^)(void))completion +{ + TGWarpedView *warpedView = [[TGWarpedView alloc] initWithImage:image]; + warpedView.layer.anchorPoint = CGPointMake(0, 0); + warpedView.frame = _rectangleView.frame; + [_rectangleView.superview addSubview:warpedView]; + + CGAffineTransform transform = CGAffineTransformMakeScale(_previewView.frame.size.width, _previewView.frame.size.height); + PGRectangle *displayRectangle = [[[rectangle rotate90] transform:transform] sort]; + [warpedView transformToFitQuadTopLeft:displayRectangle.topLeft topRight:displayRectangle.topRight bottomLeft:displayRectangle.bottomLeft bottomRight:displayRectangle.bottomRight]; + + CGFloat inset = 16.0f; + CGSize targetSize = TGScaleToFit(image.size, CGSizeMake(_previewView.frame.size.width - inset * 2.0, _previewView.frame.size.height - inset * 2.0)); + CGRect targetRect = CGRectMake(floor((_previewView.frame.size.width - targetSize.width) / 2.0), floor((_previewView.frame.size.height - targetSize.height) / 2.0), targetSize.width, targetSize.height); + + [UIView animateWithDuration:0.3 delay:0.0 options:(7 << 16) animations:^{ + [warpedView transformToFitQuadTopLeft:CGPointMake(targetRect.origin.x, targetRect.origin.y) topRight:CGPointMake(targetRect.origin.x + targetRect.size.width, targetRect.origin.y) bottomLeft:CGPointMake(targetRect.origin.x, targetRect.origin.y + targetRect.size.height) bottomRight:CGPointMake(targetRect.origin.x + targetRect.size.width, targetRect.origin.y + targetRect.size.height)]; + } completion:^(BOOL finished) { + UIImageView *outView = [[UIImageView alloc] initWithImage:image]; + outView.frame = targetRect; + [warpedView.superview addSubview:outView]; + [warpedView removeFromSuperview]; + + TGDispatchAfter(0.2, dispatch_get_main_queue(), ^{ + CGPoint sourcePoint = outView.center; + CGPoint targetPoint = CGPointMake(_previewView.frame.size.width - 44.0, _previewView.frame.size.height - 44.0); + CGPoint midPoint = CGPointMake((sourcePoint.x + targetPoint.x) / 2.0, sourcePoint.y - 30.0); + + CGFloat x1 = sourcePoint.x; + CGFloat y1 = sourcePoint.y; + CGFloat x2 = midPoint.x; + CGFloat y2 = midPoint.y; + CGFloat x3 = targetPoint.x; + CGFloat y3 = targetPoint.y; + + CGFloat a = (x3 * (y2 - y1) + x2 * (y1 - y3) + x1 * (y3 - y2)) / ((x1 - x2) * (x1 - x3) * (x2 - x3)); + CGFloat b = (x1 * x1 * (y2 - y3) + x3 * x3 * (y1 - y2) + x2 * x2 * (y3 - y1)) / ((x1 - x2) * (x1 - x3) * (x2 - x3)); + CGFloat c = (x2 * x2 * (x3 * y1 - x1 * y3) + x2 * (x1 * x1 * y3 - x3 * x3 * y1) + x1 * x3 * (x3 - x1) * y2) / ((x1 - x2) * (x1 - x3) * (x2 - x3)); + + [UIView animateWithDuration:0.3 animations:^{ + outView.transform = CGAffineTransformMakeScale(0.1, 0.1); + } completion:^(BOOL finished) { + [outView removeFromSuperview]; + }]; + + TGDispatchAfter(0.28, dispatch_get_main_queue(), ^{ + completion(); + }); + + CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"]; + NSMutableArray *values = [[NSMutableArray alloc] init]; + NSMutableArray *keyTimes = [[NSMutableArray alloc] init]; + for (NSInteger i = 0; i < 10; i++) { + CGFloat k = (CGFloat)i / (CGFloat)(10 - 1); + CGFloat x = sourcePoint.x * (1.0 - k) + targetPoint.x * k; + CGFloat y = a * x * x + b * x + c; + + [values addObject:[NSValue valueWithCGPoint:CGPointMake(x, y)]]; + [keyTimes addObject:@(k)]; + } + animation.values = values; + animation.keyTimes = keyTimes; + animation.duration = 0.35; + animation.removedOnCompletion = false; + [outView.layer addAnimation:animation forKey:@"position"]; + }); + }]; +} + - (void)cancelPressed { if (_items.count > 0) @@ -1182,27 +1356,34 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus return galleryItems; } +- (void)_createContextsIfNeeded +{ + TGMediaEditingContext *editingContext = _editingContext; + if (editingContext == nil) + { + editingContext = [[TGMediaEditingContext alloc] init]; + if (self.forcedCaption != nil) + [editingContext setForcedCaption:self.forcedCaption entities:self.forcedEntities]; + _editingContext = editingContext; + _interfaceView.editingContext = editingContext; + } + TGMediaSelectionContext *selectionContext = _selectionContext; + if (selectionContext == nil) + { + selectionContext = [[TGMediaSelectionContext alloc] initWithGroupingAllowed:self.allowGrouping selectionLimit:100]; + if (self.allowGrouping) + selectionContext.grouping = true; + _selectionContext = selectionContext; + } +} + - (void)presentResultControllerForItem:(id)editableItemValue completion:(void (^)(void))completion { __block id editableItem = editableItemValue; UIViewController *(^begin)(id) = ^(id windowContext) { + [self _createContextsIfNeeded]; TGMediaEditingContext *editingContext = _editingContext; - if (editingContext == nil) - { - editingContext = [[TGMediaEditingContext alloc] init]; - if (self.forcedCaption != nil) - [editingContext setForcedCaption:self.forcedCaption entities:self.forcedEntities]; - _editingContext = editingContext; - _interfaceView.editingContext = editingContext; - } TGMediaSelectionContext *selectionContext = _selectionContext; - if (selectionContext == nil) - { - selectionContext = [[TGMediaSelectionContext alloc] initWithGroupingAllowed:self.allowGrouping selectionLimit:100]; - if (self.allowGrouping) - selectionContext.grouping = true; - _selectionContext = selectionContext; - } if (editableItem == nil) editableItem = _items.lastObject; @@ -1989,6 +2170,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus self.view.userInteractionEnabled = false; _focusControl.active = false; + _rectangleView.hidden = true; [UIView animateWithDuration:0.3f animations:^ { @@ -2256,21 +2438,27 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus PGCameraMode newMode = PGCameraModeUndefined; if (gestureRecognizer == _photoSwipeGestureRecognizer) { - newMode = PGCameraModePhoto; + if (_camera.cameraMode == PGCameraModePhoto && _intent == TGCameraControllerGenericIntent) + newMode = PGCameraModePhotoScan; + else if (_camera.cameraMode != PGCameraModePhotoScan) + newMode = PGCameraModePhoto; } else if (gestureRecognizer == _videoSwipeGestureRecognizer) { - if (_intent == TGCameraControllerAvatarIntent) { - newMode = PGCameraModeSquareVideo; + if (_camera.cameraMode == PGCameraModePhotoScan) { + if (_items.count == 0) + newMode = PGCameraModePhoto; } else { - newMode = PGCameraModeVideo; + if (_intent == TGCameraControllerAvatarIntent) { + newMode = PGCameraModeSquareVideo; + } else { + newMode = PGCameraModeVideo; + } } } - if (newMode != PGCameraModeUndefined && _camera.cameraMode != newMode) - { - [_camera setCameraMode:newMode]; - [_interfaceView setCameraMode:newMode]; + if (newMode != PGCameraModeUndefined && _camera.cameraMode != newMode) { + [self _updateCameraMode:newMode updateInterface:true]; } } @@ -2403,6 +2591,8 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus { if (widescreenWidth == 896.0f) return CGRectMake(0, 121, screenSize.width, screenSize.height - 121 - 223); + else if (widescreenWidth == 844.0f) + return CGRectMake(0, 77, screenSize.width, screenSize.height - 77 - 191); else if (widescreenWidth == 812.0f) return CGRectMake(0, 121, screenSize.width, screenSize.height - 121 - 191); else if (widescreenWidth >= 736.0f - FLT_EPSILON) @@ -2459,11 +2649,22 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus if (selectedItems.count == 0 && currentItem != nil) [selectedItems addObject:currentItem]; - if (storeAssets) - { + bool isScan = false; + for (id item in selectedItems) { + if ([item isKindOfClass:[TGCameraCapturedPhoto class]] && ((TGCameraCapturedPhoto *)item).rectangle != nil) { + isScan = true; + break; + } + } + + if (storeAssets && !isScan) { NSMutableArray *fullSizeSignals = [[NSMutableArray alloc] init]; for (id item in selectedItems) { + if ([item isKindOfClass:[TGCameraCapturedPhoto class]] && ((TGCameraCapturedPhoto *)item).rectangle != nil) { + isScan = true; + } + if ([editingContext timerForItem:item] == nil) { SSignal *saveMedia = [SSignal defer:^SSignal * @@ -2583,9 +2784,15 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus dict[@"timer"] = timer; else if (groupedId != nil && !hasAnyTimers) dict[@"groupedId"] = groupedId; - - id generatedItem = descriptionGenerator(dict, caption, entities, nil); - return generatedItem; + + if (isScan) { + if (caption != nil) + dict[@"caption"] = caption; + return dict; + } else { + id generatedItem = descriptionGenerator(dict, caption, entities, nil); + return generatedItem; + } }]; SSignal *assetSignal = inlineSignal; @@ -2611,12 +2818,13 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus return [SSignal complete]; }] onCompletion:^ { - __strong TGMediaEditingContext *strongEditingContext = editingContext; - [strongEditingContext description]; + }]; + } else { + NSLog(@"Editing context is nil"); } - [signals addObject:[[imageSignal map:^NSDictionary *(UIImage *image) + [signals addObject:[[[imageSignal map:^NSDictionary *(UIImage *image) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; dict[@"type"] = @"editedPhoto"; @@ -2663,11 +2871,19 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus else if (groupedId != nil && !hasAnyTimers) dict[@"groupedId"] = groupedId; - id generatedItem = descriptionGenerator(dict, caption, entities, nil); - return generatedItem; + if (isScan) { + if (caption != nil) + dict[@"caption"] = caption; + return dict; + } else { + id generatedItem = descriptionGenerator(dict, caption, entities, nil); + return generatedItem; + } }] catch:^SSignal *(__unused id error) { return inlineSignal; + }] onCompletion:^{ + [editingContext description]; }]]; i++; @@ -2750,6 +2966,54 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus groupedId = @([TGCameraController generateGroupedId]); } } + + if (isScan) { + SSignal *scanSignal = [[SSignal combineSignals:signals] map:^NSDictionary *(NSArray *results) { + NSMutableData *data = [[NSMutableData alloc] init]; + UIImage *previewImage = nil; + UIGraphicsBeginPDFContextToData(data, CGRectZero, nil); + for (NSDictionary *dict in results) { + if ([dict[@"type"] isEqual:@"editedPhoto"]) { + UIImage *image = dict[@"image"]; + if (previewImage == nil) { + previewImage = image; + } + if (image != nil) { + CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height); + UIGraphicsBeginPDFPageWithInfo(rect, nil); + CGContextRef pdfContext = UIGraphicsGetCurrentContext(); + + CGContextTranslateCTM(pdfContext, 0, image.size.height); + CGContextScaleCTM(pdfContext, 1.0, -1.0); + + NSData *jpegData = UIImageJPEGRepresentation(image, 0.65); + CGDataProviderRef dataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)jpegData); + CGImageRef cgImage = CGImageCreateWithJPEGDataProvider(dataProvider, NULL, true, kCGRenderingIntentDefault); + CGContextDrawImage(pdfContext, rect, cgImage); + + CGDataProviderRelease(dataProvider); + CGImageRelease(cgImage); + } + } + } + UIGraphicsEndPDFContext(); + + NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:[[NSString alloc] initWithFormat:@"scan_%x.pdf", (int)arc4random()]]; + [data writeToFile:filePath atomically:true]; + + NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + dict[@"type"] = @"file"; + dict[@"previewImage"] = previewImage; + dict[@"tempFileUrl"] = [NSURL fileURLWithPath:filePath]; + dict[@"fileName"] = @"Document Scan.pdf"; + dict[@"mimeType"] = @"application/pdf"; + + id generatedItem = descriptionGenerator(dict, dict[@"caption"], nil, nil); + return generatedItem; + }]; + signals = [NSMutableArray arrayWithObject:scanSignal]; + } + return signals; } diff --git a/submodules/LegacyComponents/Sources/TGCameraFlashControl.m b/submodules/LegacyComponents/Sources/TGCameraFlashControl.m index 4962d217f6..65bec10499 100644 --- a/submodules/LegacyComponents/Sources/TGCameraFlashControl.m +++ b/submodules/LegacyComponents/Sources/TGCameraFlashControl.m @@ -29,79 +29,16 @@ const CGFloat TGCameraFlashControlHeight = 44.0f; { self.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); - _flashIconView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 34, 44)]; + _flashIconView = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)]; _flashIconView.adjustsImageWhenHighlighted = false; _flashIconView.contentMode = UIViewContentModeCenter; _flashIconView.exclusiveTouch = true; _flashIconView.hitTestEdgeInsets = UIEdgeInsetsMake(0, -10, 0, -10); _flashIconView.tag = -1; - [_flashIconView setImage:TGComponentsImageNamed(@"CameraFlashButton") forState:UIControlStateNormal]; + [_flashIconView setImage:[UIImage imageNamed:@"Camera/FlashOff"] forState:UIControlStateNormal]; [_flashIconView addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:_flashIconView]; - - static UIImage *highlightedIconImage = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^ - { - UIImage *image = TGComponentsImageNamed(@"CameraFlashButton"); - UIGraphicsBeginImageContextWithOptions(image.size, false, 0.0f); - CGContextRef context = UIGraphicsGetCurrentContext(); - [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; - CGContextSetBlendMode (context, kCGBlendModeSourceAtop); - CGContextSetFillColorWithColor(context, [TGCameraInterfaceAssets accentColor].CGColor); - CGContextFillRect(context, CGRectMake(0, 0, image.size.width, image.size.height)); - - highlightedIconImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - }); - [_flashIconView setImage:highlightedIconImage forState:UIControlStateSelected]; - [_flashIconView setImage:highlightedIconImage forState:UIControlStateHighlighted | UIControlStateSelected]; - - _autoButton = [[UIButton alloc] init]; - _autoButton.backgroundColor = [UIColor clearColor]; - _autoButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; - _autoButton.exclusiveTouch = true; - _autoButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -15, -10, -15); - _autoButton.tag = PGCameraFlashModeAuto; - _autoButton.titleLabel.font = [TGCameraInterfaceAssets normalFontOfSize:13]; - [_autoButton setAttributedTitle:[[NSAttributedString alloc] initWithString:TGLocalized(@"Camera.FlashAuto") attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets normalColor], NSKernAttributeName: @2 }] forState:UIControlStateNormal]; - [_autoButton setAttributedTitle:[[NSAttributedString alloc] initWithString:TGLocalized(@"Camera.FlashAuto") attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets accentColor], NSKernAttributeName: @2 }] forState:UIControlStateSelected]; - [_autoButton setAttributedTitle:[_autoButton attributedTitleForState:UIControlStateSelected] forState:UIControlStateHighlighted | UIControlStateSelected]; - [_autoButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; - [_autoButton sizeToFit]; - _autoButton.frame = (CGRect){ CGPointZero, [TGCameraFlashControl _sizeForModeButtonWithTitle:[_autoButton attributedTitleForState:UIControlStateNormal]] }; - [self addSubview:_autoButton]; - - _onButton = [[UIButton alloc] init]; - _onButton.backgroundColor = [UIColor clearColor]; - _onButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; - _onButton.exclusiveTouch = true; - _onButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -15, -10, -15); - _onButton.tag = PGCameraFlashModeOn; - _onButton.titleLabel.font = [TGCameraInterfaceAssets normalFontOfSize:13]; - [_onButton setAttributedTitle:[[NSAttributedString alloc] initWithString:TGLocalized(@"Camera.FlashOn") attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets normalColor], NSKernAttributeName: @2 }] forState:UIControlStateNormal]; - [_onButton setAttributedTitle:[[NSAttributedString alloc] initWithString:TGLocalized(@"Camera.FlashOn") attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets accentColor], NSKernAttributeName: @2 }] forState:UIControlStateSelected]; - [_onButton setAttributedTitle:[_onButton attributedTitleForState:UIControlStateSelected] forState:UIControlStateHighlighted | UIControlStateSelected]; - [_onButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; - [_onButton sizeToFit]; - _onButton.frame = (CGRect){ CGPointZero, [TGCameraFlashControl _sizeForModeButtonWithTitle:[_onButton attributedTitleForState:UIControlStateNormal]] }; - [self addSubview:_onButton]; - - _offButton = [[UIButton alloc] init]; - _offButton.backgroundColor = [UIColor clearColor]; - _offButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; - _offButton.exclusiveTouch = true; - _offButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -15, -10, -15); - _offButton.tag = PGCameraFlashModeOff; - _offButton.titleLabel.font = [TGCameraInterfaceAssets normalFontOfSize:13]; - [_offButton setAttributedTitle:[[NSAttributedString alloc] initWithString:TGLocalized(@"Camera.FlashOff") attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets normalColor], NSKernAttributeName: @2 }] forState:UIControlStateNormal]; - [_offButton setAttributedTitle:[[NSAttributedString alloc] initWithString:TGLocalized(@"Camera.FlashOff") attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets accentColor], NSKernAttributeName: @2 }] forState:UIControlStateSelected]; - [_offButton setAttributedTitle:[_offButton attributedTitleForState:UIControlStateSelected] forState:UIControlStateHighlighted | UIControlStateSelected]; - [_offButton addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; - [_offButton sizeToFit]; - _offButton.frame = (CGRect){ CGPointZero, [TGCameraFlashControl _sizeForModeButtonWithTitle:[_offButton attributedTitleForState:UIControlStateNormal]] }; - [self addSubview:_offButton]; - + [UIView performWithoutAnimation:^ { self.mode = PGCameraFlashModeOff; @@ -123,305 +60,27 @@ const CGFloat TGCameraFlashControlHeight = 44.0f; - (void)buttonPressed:(UIButton *)sender { - if (!_active) - { - [self setActive:true animated:true]; - } - else - { - if (sender != _flashIconView) - self.mode = (int)sender.tag; - else - self.mode = _mode; - - if (self.modeChanged != nil) - self.modeChanged(self.mode); + if (_mode == PGCameraFlashModeOff) { + self.mode = PGCameraFlashModeOn; + [_flashIconView setImage:[UIImage imageNamed:@"Camera/FlashOn"] forState:UIControlStateNormal]; + } else { + self.mode = PGCameraFlashModeOff; + [_flashIconView setImage:[UIImage imageNamed:@"Camera/FlashOff"] forState:UIControlStateNormal]; } + + if (self.modeChanged != nil) + self.modeChanged(self.mode); } - (void)setFlashUnavailable:(bool)unavailable { self.userInteractionEnabled = !unavailable; [self setActive:false animated:false]; - - } - (void)setActive:(bool)active animated:(bool)animated { - _active = active; - - if (animated) - { - self.userInteractionEnabled = false; - - if (active) - { - UIView *animatedView = nil; - UIView *snapshotView = nil; - CGRect targetFrame = CGRectZero; - - if (self.mode != PGCameraFlashModeAuto) - { - _autoButton.frame = [self _autoButtonFrameForInterfaceOrientation:_interfaceOrientation]; - _autoButton.alpha = 0.0f; - _autoButton.hidden = false; - } - else - { - animatedView = _autoButton; - targetFrame = [self _autoButtonFrameForInterfaceOrientation:_interfaceOrientation]; - snapshotView = [animatedView snapshotViewAfterScreenUpdates:false]; - } - _autoButton.selected = (self.mode == PGCameraFlashModeAuto); - - if (self.mode != PGCameraFlashModeOn) - { - _onButton.frame = [self _onButtonFrameForInterfaceOrientation:_interfaceOrientation]; - _onButton.alpha = 0.0f; - _onButton.hidden = false; - } - else - { - animatedView = _onButton; - targetFrame = [self _onButtonFrameForInterfaceOrientation:_interfaceOrientation]; - } - _onButton.selected = (self.mode == PGCameraFlashModeOn); - - if (self.mode != PGCameraFlashModeOff) - { - _offButton.frame = [self _offButtonFrameForInterfaceOrientation:_interfaceOrientation]; - _offButton.alpha = 0.0f; - _offButton.hidden = false; - } - else - { - animatedView = _offButton; - targetFrame = [self _offButtonFrameForInterfaceOrientation:_interfaceOrientation]; - snapshotView = [animatedView snapshotViewAfterScreenUpdates:false]; - } - _offButton.selected = (self.mode == PGCameraFlashModeOff); - - if (snapshotView != nil) - { - snapshotView.frame = animatedView.frame; - [animatedView.superview insertSubview:snapshotView belowSubview:animatedView]; - animatedView.alpha = 0.0f; - } - - UIView *iconSnapshotView = nil; - if (_flashIconView.selected) - { - iconSnapshotView = [_flashIconView snapshotViewAfterScreenUpdates:false]; - iconSnapshotView.frame = _flashIconView.frame; - [_flashIconView.superview insertSubview:iconSnapshotView belowSubview:_flashIconView]; - _flashIconView.selected = false; - _flashIconView.alpha = 0.0f; - } - - [UIView animateWithDuration:0.25f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^ - { - _flashIconView.alpha = 1.0f; - _flashIconView.frame = [self _flashIconFrameForActive:active interfaceOrientation:_interfaceOrientation]; - iconSnapshotView.frame = _flashIconView.frame; - - _autoButton.alpha = 1.0f; - _onButton.alpha = 1.0f; - _offButton.alpha = 1.0f; - - animatedView.alpha = 1.0f; - animatedView.frame = targetFrame; - snapshotView.frame = targetFrame; - } completion:^(BOOL finished) - { - [snapshotView removeFromSuperview]; - [iconSnapshotView removeFromSuperview]; - if (finished) - self.userInteractionEnabled = true; - }]; - } - else - { - UIView *animatedView = nil; - UIView *snapshotView = nil; - UIView *iconSnapshotView = nil; - - switch (self.mode) - { - case PGCameraFlashModeAuto: - { - animatedView = _autoButton; - snapshotView = [animatedView snapshotViewAfterScreenUpdates:false]; - _autoButton.selected = false; - } - break; - - case PGCameraFlashModeOn: - { - animatedView = _onButton; - if (!_onButton.selected) - { - snapshotView = [animatedView snapshotViewAfterScreenUpdates:false]; - _onButton.selected = true; - } - - iconSnapshotView = [_flashIconView snapshotViewAfterScreenUpdates:false]; - iconSnapshotView.frame = _flashIconView.frame; - [_flashIconView.superview insertSubview:iconSnapshotView belowSubview:_flashIconView]; - _flashIconView.selected = true; - _flashIconView.alpha = 0.0f; - } - break; - - case PGCameraFlashModeOff: - { - animatedView = _offButton; - snapshotView = [animatedView snapshotViewAfterScreenUpdates:false]; - _offButton.selected = false; - } - break; - - default: - break; - } - - if (snapshotView != nil) - { - snapshotView.frame = animatedView.frame; - [animatedView.superview insertSubview:snapshotView belowSubview:animatedView]; - animatedView.alpha = 0.0f; - } - - [UIView animateWithDuration:0.25f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut animations:^ - { - _flashIconView.alpha = 1.0f; - _flashIconView.frame = [self _flashIconFrameForActive:active interfaceOrientation:_interfaceOrientation]; - iconSnapshotView.frame = _flashIconView.frame; - - if (self.mode != PGCameraFlashModeAuto) - _autoButton.alpha = 0.0f; - - if (self.mode != PGCameraFlashModeOn) - _onButton.alpha = 0.0f; - - if (self.mode != PGCameraFlashModeOff) - _offButton.alpha = 0.0f; - - animatedView.alpha = 1.0f; - animatedView.frame = [self _selectedButtonFrameForSize:animatedView.frame.size interfaceOrientation:_interfaceOrientation]; - snapshotView.frame = animatedView.frame; - } completion:^(BOOL finished) - { - [snapshotView removeFromSuperview]; - [iconSnapshotView removeFromSuperview]; - if (finished) - { - self.userInteractionEnabled = true; - - if (self.mode != PGCameraFlashModeAuto) - _autoButton.hidden = true; - - if (self.mode != PGCameraFlashModeOn) - _onButton.hidden = true; - - if (self.mode != PGCameraFlashModeOff) - _offButton.hidden = true; - } - }]; - } - } - else - { - _flashIconView.frame = [self _flashIconFrameForActive:active interfaceOrientation:_interfaceOrientation]; - - if (active) - { - _flashIconView.selected = false; - - _autoButton.frame = [self _autoButtonFrameForInterfaceOrientation:_interfaceOrientation]; - _autoButton.alpha = 1.0f; - _autoButton.hidden = false; - _autoButton.selected = (self.mode == PGCameraFlashModeAuto); - - _onButton.frame = [self _onButtonFrameForInterfaceOrientation:_interfaceOrientation]; - _onButton.alpha = 1.0f; - _onButton.hidden = false; - _onButton.selected = (self.mode == PGCameraFlashModeOn); - - _offButton.frame = [self _offButtonFrameForInterfaceOrientation:_interfaceOrientation]; - _offButton.alpha = 1.0f; - _offButton.hidden = false; - _offButton.selected = (self.mode == PGCameraFlashModeOff); - } - else - { - switch (self.mode) - { - case PGCameraFlashModeOff: - { - _flashIconView.selected = false; - - _autoButton.alpha = 0.0f; - _autoButton.hidden = true; - _autoButton.selected = false; - - _onButton.alpha = 0.0f; - _onButton.hidden = true; - _onButton.selected = false; - - _offButton.frame = [self _selectedButtonFrameForSize:_offButton.frame.size interfaceOrientation:_interfaceOrientation]; - _offButton.alpha = 1.0f; - _offButton.hidden = false; - _offButton.selected = false; - } - break; - - case PGCameraFlashModeOn: - { - _flashIconView.selected = true; - - _autoButton.alpha = 0.0f; - _autoButton.hidden = true; - _autoButton.selected = false; - - _onButton.frame = [self _selectedButtonFrameForSize:_onButton.frame.size interfaceOrientation:_interfaceOrientation]; - _onButton.alpha = 1.0f; - _onButton.hidden = false; - _onButton.selected = true; - - _offButton.alpha = 0.0f; - _offButton.hidden = true; - _offButton.selected = false; - } - break; - - case PGCameraFlashModeAuto: - { - _flashIconView.selected = false; - - _autoButton.frame = [self _selectedButtonFrameForSize:_autoButton.frame.size interfaceOrientation:_interfaceOrientation]; - _autoButton.alpha = 1.0f; - _autoButton.hidden = false; - _autoButton.selected = false; - - _onButton.alpha = 0.0f; - _onButton.hidden = true; - _onButton.selected = false; - - _offButton.alpha = 0.0f; - _offButton.hidden = true; - _offButton.selected = false; - } - break; - - default: - break; - } - } - } - - if (active && self.becameActive != nil) - self.becameActive(); + return; } - (void)setMode:(PGCameraFlashMode)mode @@ -484,130 +143,4 @@ const CGFloat TGCameraFlashControlHeight = 44.0f; [self setActive:false animated:false]; } -- (CGRect)_flashIconFrameForActive:(bool)active interfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - CGPoint origin = CGPointZero; - CGSize size = self.frame.size; - if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) - size = CGSizeMake(size.height, size.width); - - switch (interfaceOrientation) - { - case UIInterfaceOrientationLandscapeLeft: - { - if (active) - origin = CGPointMake(size.width - _flashIconView.frame.size.width - 5, (size.height - _flashIconView.frame.size.height) / 2); - else - origin = CGPointMake(size.width - _flashIconView.frame.size.width - 5, (size.height - _flashIconView.frame.size.height) / 2 - 9); - } - break; - case UIInterfaceOrientationLandscapeRight: - { - if (active) - origin = CGPointMake(5, (size.height - _flashIconView.frame.size.height) / 2); - else - origin = CGPointMake(5, (size.height - _flashIconView.frame.size.height) / 2 - 9); - } - break; - - case UIInterfaceOrientationPortraitUpsideDown: - { - if (active) - { - origin = CGPointMake(0, 0); - } - else - { - CGFloat maxWidth = MAX(MAX(_offButton.frame.size.width, _onButton.frame.size.width), _autoButton.frame.size.width); - origin = CGPointMake(size.width - _flashIconView.frame.size.width - maxWidth, 0); - } - } - break; - - default: - { - origin = CGPointZero; - } - break; - } - - return CGRectMake(origin.x, origin.y, _flashIconView.frame.size.width, _flashIconView.frame.size.height); -} - -- (CGRect)_selectedButtonFrameForSize:(CGSize)buttonSize interfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - CGPoint origin = CGPointZero; - CGSize size = self.frame.size; - if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) - size = CGSizeMake(size.height, size.width); - - switch (interfaceOrientation) - { - case UIInterfaceOrientationLandscapeLeft: - case UIInterfaceOrientationLandscapeRight: - { - origin = CGPointMake(CGRectGetMidX(_flashIconView.frame) - buttonSize.width / 2, 21); - } - break; - - case UIInterfaceOrientationPortraitUpsideDown: - { - CGRect iconFrame = [self _flashIconFrameForActive:false interfaceOrientation:interfaceOrientation]; - origin = CGPointMake(iconFrame.origin.x + iconFrame.size.width - 3, (size.height - buttonSize.height) / 2); - } - break; - - default: - { - origin = CGPointMake(_flashIconView.frame.size.width - 5, - (size.height - buttonSize.height) / 2); - } - break; - } - - return CGRectMake(origin.x, origin.y, buttonSize.width, buttonSize.height); -} - -- (CGRect)_autoButtonFrameForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - CGSize size = self.frame.size; - if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) - size = CGSizeMake(size.height, size.width); - - return CGRectMake(size.width / 4 - _autoButton.frame.size.width / 2, - (size.height - _autoButton.frame.size.height) / 2, - _autoButton.frame.size.width, _autoButton.frame.size.height); -} - -- (CGRect)_onButtonFrameForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - CGSize size = self.frame.size; - if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) - size = CGSizeMake(size.height, size.width); - - return CGRectMake((size.width - _onButton.frame.size.width) / 2, - (size.height - _onButton.frame.size.height) / 2, - _onButton.frame.size.width, _onButton.frame.size.height); -} - -- (CGRect)_offButtonFrameForInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - CGSize size = self.frame.size; - if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) - size = CGSizeMake(size.height, size.width); - - return CGRectMake(size.width / 4 * 3 - _offButton.frame.size.width / 2, - (size.height - _offButton.frame.size.height) / 2, - _offButton.frame.size.width, _offButton.frame.size.height); -} - -+ (CGSize)_sizeForModeButtonWithTitle:(NSAttributedString *)title -{ - CGSize size = title.size; - CGFloat width = CGCeil(size.width); - if (iosMajorVersion() < 7) - width += 2; - return CGSizeMake(width, 20); -} - @end diff --git a/submodules/LegacyComponents/Sources/TGCameraFlipButton.m b/submodules/LegacyComponents/Sources/TGCameraFlipButton.m index 0f204e71ad..b4e05637cb 100644 --- a/submodules/LegacyComponents/Sources/TGCameraFlipButton.m +++ b/submodules/LegacyComponents/Sources/TGCameraFlipButton.m @@ -1,18 +1,20 @@ #import "TGCameraFlipButton.h" +#import "TGCameraInterfaceAssets.h" #import "LegacyComponentsInternal.h" #import "TGImageUtils.h" @implementation TGCameraFlipButton -- (instancetype)initWithFrame:(CGRect)frame large:(bool)large +- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self != nil) { self.exclusiveTouch = true; - UIImage *image = large ? TGComponentsImageNamed(@"CameraLargeFlipButton") : TGTintedImage(TGComponentsImageNamed(@"CameraFlipButton"), [UIColor whiteColor]); - [self setImage:image forState:UIControlStateNormal]; + self.backgroundColor = [TGCameraInterfaceAssets buttonColor]; + self.layer.cornerRadius = 24.0; + [self setImage:[UIImage imageNamed:@"Camera/Flip"] forState:UIControlStateNormal]; } return self; } @@ -30,17 +32,65 @@ super.hidden = false; self.userInteractionEnabled = false; - [UIView animateWithDuration:0.25f - animations:^ - { - self.alpha = hidden ? 0.0f : 1.0f; - } completion:^(BOOL finished) - { - self.userInteractionEnabled = true; + [UIView animateWithDuration:0.25f animations:^ + { + self.alpha = hidden ? 0.0f : 1.0f; + } completion:^(BOOL finished) + { + self.userInteractionEnabled = true; - if (finished) - self.hidden = hidden; - }]; + if (finished) + self.hidden = hidden; + }]; + } + else + { + self.alpha = hidden ? 0.0f : 1.0f; + super.hidden = hidden; + } +} + +@end + + +@implementation TGCameraCancelButton + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self != nil) + { + self.exclusiveTouch = true; + self.backgroundColor = [TGCameraInterfaceAssets buttonColor]; + self.layer.cornerRadius = 24.0; + [self setImage:[UIImage imageNamed:@"Camera/Cancel"] forState:UIControlStateNormal]; + } + return self; +} + +- (void)setHidden:(BOOL)hidden +{ + self.alpha = hidden ? 0.0f : 1.0f; + super.hidden = hidden; +} + +- (void)setHidden:(bool)hidden animated:(bool)animated +{ + if (animated) + { + super.hidden = false; + self.userInteractionEnabled = false; + + [UIView animateWithDuration:0.25f animations:^ + { + self.alpha = hidden ? 0.0f : 1.0f; + } completion:^(BOOL finished) + { + self.userInteractionEnabled = true; + + if (finished) + self.hidden = hidden; + }]; } else { diff --git a/submodules/LegacyComponents/Sources/TGCameraFocusCrosshairsControl.m b/submodules/LegacyComponents/Sources/TGCameraFocusCrosshairsControl.m index 6b8407fcc8..ef6413d067 100644 --- a/submodules/LegacyComponents/Sources/TGCameraFocusCrosshairsControl.m +++ b/submodules/LegacyComponents/Sources/TGCameraFocusCrosshairsControl.m @@ -412,8 +412,8 @@ - (void)updateExposureIndicatorPositionForOrientation:(UIInterfaceOrientation)orientation { - CGRect defaultPositionFrame = _exposureClipView.frame = CGRectMake(45 + _focusIndicatorImageView.frame.size.width + 5, 45 + (_focusIndicatorImageView.frame.size.height - 144) / 2, 25, 144);; - CGRect mirroredPositionFrame = _exposureClipView.frame = CGRectMake(15, 45 + (_focusIndicatorImageView.frame.size.height - 144) / 2, 25, 144);; + CGRect defaultPositionFrame = CGRectMake(45 + _focusIndicatorImageView.frame.size.width + 5, 45 + (_focusIndicatorImageView.frame.size.height - 144) / 2, 25, 144); + CGRect mirroredPositionFrame = CGRectMake(15, 45 + (_focusIndicatorImageView.frame.size.height - 144) / 2, 25, 144); switch (orientation) { case UIInterfaceOrientationPortraitUpsideDown: diff --git a/submodules/LegacyComponents/Sources/TGCameraInterfaceAssets.m b/submodules/LegacyComponents/Sources/TGCameraInterfaceAssets.m index 68b4fc84d3..f7a98b6e10 100644 --- a/submodules/LegacyComponents/Sources/TGCameraInterfaceAssets.m +++ b/submodules/LegacyComponents/Sources/TGCameraInterfaceAssets.m @@ -1,7 +1,22 @@ #import "TGCameraInterfaceAssets.h" +#import #import "LegacyComponentsInternal.h" +static NSString *TGCameraEncodeText(NSString *string, int key) +{ + NSMutableString *result = [[NSMutableString alloc] init]; + + for (int i = 0; i < (int)[string length]; i++) + { + unichar c = [string characterAtIndex:i]; + c += key; + [result appendString:[NSString stringWithCharacters:&c length:1]]; + } + + return result; +} + @implementation TGCameraInterfaceAssets + (UIColor *)normalColor @@ -11,12 +26,12 @@ + (UIColor *)accentColor { - return UIColorRGB(0xffcc00); + return UIColorRGB(0xffd60a); } + (UIColor *)redColor { - return UIColorRGB(0xf53333); + return UIColorRGB(0xfe3b30); } + (UIColor *)panelBackgroundColor @@ -24,6 +39,11 @@ return [UIColor blackColor]; } ++ (UIColor *)buttonColor +{ + return UIColorRGBA(0x393737, 0.6); +} + + (UIColor *)transparentPanelBackgroundColor { return [UIColor colorWithWhite:0.0f alpha:0.5]; @@ -34,9 +54,14 @@ return [UIColor colorWithWhite:0.0f alpha:0.7]; } -+ (UIFont *)normalFontOfSize:(CGFloat)size ++ (UIFont *)regularFontOfSize:(CGFloat)size { - return [UIFont fontWithName:@"DINAlternate-Bold" size:size]; + return [UIFont fontWithName:TGCameraEncodeText(@"TGDbnfsb.Sfhvmbs", -1) size:size]; +} + ++ (UIFont *)boldFontOfSize:(CGFloat)size +{ + return [UIFont fontWithName:TGCameraEncodeText(@"TGDbnfsb.Tfnjcpme", -1) size:size]; } @end diff --git a/submodules/LegacyComponents/Sources/TGCameraMainPhoneView.m b/submodules/LegacyComponents/Sources/TGCameraMainPhoneView.m index a8cdfcb45a..274e33e4be 100644 --- a/submodules/LegacyComponents/Sources/TGCameraMainPhoneView.m +++ b/submodules/LegacyComponents/Sources/TGCameraMainPhoneView.m @@ -19,7 +19,7 @@ #import "TGCameraFlipButton.h" #import "TGCameraTimeCodeView.h" #import "TGCameraZoomView.h" -#import "TGCameraSegmentsView.h" +#import "TGCameraToastView.h" #import "TGMenuView.h" @@ -127,8 +127,8 @@ _topPanelHeight = 44.0f; _bottomPanelOffset = 94.0f; _bottomPanelHeight = 123.0f; - _modeControlOffset = 0.0f; - _modeControlHeight = 52.0f; + _modeControlOffset = -5.0f; + _modeControlHeight = 56.0f; _counterOffset = 7.0f; shutterButtonWidth = 72.0f; } @@ -206,16 +206,7 @@ _bottomPanelBackgroundView.backgroundColor = [TGCameraInterfaceAssets transparentPanelBackgroundColor]; [_bottomPanelView addSubview:_bottomPanelBackgroundView]; - _cancelButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 60, 44)]; - _cancelButton.backgroundColor = [UIColor clearColor]; - _cancelButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; - _cancelButton.exclusiveTouch = true; - _cancelButton.titleLabel.font = TGSystemFontOfSize(18); - _cancelButton.contentEdgeInsets = UIEdgeInsetsMake(0, 20, 0, 0); - [_cancelButton setTitle:TGLocalized(@"Common.Cancel") forState:UIControlStateNormal]; - [_cancelButton setTintColor:[TGCameraInterfaceAssets normalColor]]; - [_cancelButton sizeToFit]; - _cancelButton.frame = CGRectMake(0, 0, MAX(60.0f, _cancelButton.frame.size.width), 44); + _cancelButton = [[TGCameraCancelButton alloc] initWithFrame:CGRectMake(0, 0, 48, 48)]; [_cancelButton addTarget:self action:@selector(cancelButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_bottomPanelView addSubview:_cancelButton]; @@ -241,19 +232,19 @@ _modeControl = [[TGCameraModeControl alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, _modeControlHeight) avatar:avatar]; [_bottomPanelView addSubview:_modeControl]; - _flipButton = [[TGCameraFlipButton alloc] initWithFrame:CGRectMake(0, 0, 56, 56) large:true]; + _flipButton = [[TGCameraFlipButton alloc] initWithFrame:CGRectMake(0, 0, 48, 48)]; [_flipButton addTarget:self action:@selector(flipButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_bottomPanelView addSubview:_flipButton]; - _flashControl = [[TGCameraFlashControl alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, TGCameraFlashControlHeight)]; + _flashControl = [[TGCameraFlashControl alloc] initWithFrame:CGRectMake(3.0, 0, TGCameraFlashControlHeight, TGCameraFlashControlHeight)]; [_topPanelView addSubview:_flashControl]; - _topFlipButton = [[TGCameraFlipButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44) large:false]; + _topFlipButton = [[TGCameraFlipButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)]; _topFlipButton.hidden = true; [_topFlipButton addTarget:self action:@selector(flipButtonPressed) forControlEvents:UIControlEventTouchUpInside]; - [_topPanelView addSubview:_topFlipButton]; +// [_topPanelView addSubview:_topFlipButton]; - _timecodeView = [[TGCameraTimeCodeView alloc] initWithFrame:CGRectMake((frame.size.width - 120) / 2, 12, 120, 20)]; + _timecodeView = [[TGCameraTimeCodeView alloc] initWithFrame:CGRectMake((frame.size.width - 120) / 2, 12, 120, 28)]; _timecodeView.hidden = true; _timecodeView.requestedRecordingDuration = ^NSTimeInterval { @@ -273,7 +264,10 @@ [self addSubview:_videoLandscapePanelView]; _flashActiveView = [[TGCameraFlashActiveView alloc] initWithFrame:CGRectMake((frame.size.width - 40) / 2, frame.size.height - _bottomPanelHeight - 37, 40, 21)]; - [self addSubview:_flashActiveView]; +// [self addSubview:_flashActiveView]; + + _toastView = [[TGCameraToastView alloc] initWithFrame:CGRectMake(0, frame.size.height - _bottomPanelHeight - 42, frame.size.width, 32)]; + [self addSubview:_toastView]; _zoomView = [[TGCameraZoomView alloc] initWithFrame:CGRectMake(10, frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 18, frame.size.width - 20, 1.5f)]; _zoomView.activityChanged = ^(bool active) @@ -386,9 +380,12 @@ else { _hasResults = true; - _topFlipButton.hidden = false; + _topFlipButton.hidden = _modeControl.cameraMode == PGCameraModePhotoScan; _flipButton.hidden = true; _doneButton.hidden = false; + if (_modeControl.cameraMode == PGCameraModePhotoScan) { + _modeControl.hidden = true; + } } } @@ -830,18 +827,18 @@ if (superview == _videoLandscapePanelView && superviewSize.width < superviewSize.height) superviewSize = CGSizeMake(superviewSize.height, superviewSize.width); - if (UIInterfaceOrientationIsLandscape(orientation) && _flashControl.interfaceOrientation == orientation && _flashControl.superview == _topPanelView) - { - if (orientation == UIInterfaceOrientationLandscapeLeft) - _flashControl.frame = CGRectMake(7, 0, TGCameraFlashControlHeight, 370); - else if (orientation == UIInterfaceOrientationLandscapeRight) - _flashControl.frame = CGRectMake(7, 0, TGCameraFlashControlHeight, 370); - } - else - { - _flashControl.frame = CGRectMake(0, (superviewSize.height - TGCameraFlashControlHeight) / 2, superviewSize.width, TGCameraFlashControlHeight); - } - _timecodeView.frame = CGRectMake((superviewSize.width - 120) / 2, (superviewSize.height - 20) / 2, 120, 20); +// if (UIInterfaceOrientationIsLandscape(orientation) && _flashControl.interfaceOrientation == orientation && _flashControl.superview == _topPanelView) +// { +// if (orientation == UIInterfaceOrientationLandscapeLeft) +// _flashControl.frame = CGRectMake(7, 0, TGCameraFlashControlHeight, 370); +// else if (orientation == UIInterfaceOrientationLandscapeRight) +// _flashControl.frame = CGRectMake(7, 0, TGCameraFlashControlHeight, 370); +// } +// else +// { +// _flashControl.frame = CGRectMake(0, (superviewSize.height - TGCameraFlashControlHeight) / 2, superviewSize.width, TGCameraFlashControlHeight); +// } + _timecodeView.frame = CGRectMake((superviewSize.width - 120) / 2, (superviewSize.height - 28) / 2, 120, 28); } - (void)layoutPreviewRelativeViews @@ -865,13 +862,17 @@ _modeControl.frame = CGRectMake(0, _modeControlOffset, self.frame.size.width, _modeControlHeight); _shutterButton.frame = CGRectMake(round((self.frame.size.width - _shutterButton.frame.size.width) / 2), _modeControlHeight + _modeControlOffset, _shutterButton.frame.size.width, _shutterButton.frame.size.height); - _cancelButton.frame = CGRectMake(0, round(_shutterButton.center.y - _cancelButton.frame.size.height / 2.0f), _cancelButton.frame.size.width, _cancelButton.frame.size.height); + + _cancelButton.frame = CGRectMake(20.0, round(_shutterButton.center.y - _cancelButton.frame.size.height / 2.0f), _cancelButton.frame.size.width, _cancelButton.frame.size.height); + _doneButton.frame = CGRectMake(_bottomPanelView.frame.size.width - _doneButton.frame.size.width, round(_shutterButton.center.y - _doneButton.frame.size.height / 2.0f), _doneButton.frame.size.width, _doneButton.frame.size.height); - _flipButton.frame = CGRectMake(self.frame.size.width - _flipButton.frame.size.width - 4.0f - 7.0f, round(_shutterButton.center.y - _flipButton.frame.size.height / 2.0f), _flipButton.frame.size.width, _flipButton.frame.size.height); + _flipButton.frame = CGRectMake(self.frame.size.width - _flipButton.frame.size.width - 20.0f, round(_shutterButton.center.y - _flipButton.frame.size.height / 2.0f), _flipButton.frame.size.width, _flipButton.frame.size.height); _topFlipButton.frame = CGRectMake(self.frame.size.width - _topFlipButton.frame.size.width - 4.0f, 0.0f, _topFlipButton.frame.size.width, _topFlipButton.frame.size.height); + _toastView.frame = CGRectMake(0, self.frame.size.height - _bottomPanelHeight - _bottomPanelOffset - 32 - 16, self.frame.size.width, 32); + CGFloat photosViewSize = TGPhotoThumbnailSizeForCurrentScreen().height + 4 * 2; _photoCounterButton.frame = CGRectMake(self.frame.size.width - 56.0f - 10.0f, _counterOffset, 64, 38); _selectedPhotosView.frame = CGRectMake(4.0f, [_photoCounterButton convertRect:_photoCounterButton.bounds toView:self].origin.y - photosViewSize - 20.0f, self.frame.size.width - 4.0f * 2.0f, photosViewSize); diff --git a/submodules/LegacyComponents/Sources/TGCameraMainTabletView.m b/submodules/LegacyComponents/Sources/TGCameraMainTabletView.m index 8c650d195b..a52645e56e 100644 --- a/submodules/LegacyComponents/Sources/TGCameraMainTabletView.m +++ b/submodules/LegacyComponents/Sources/TGCameraMainTabletView.m @@ -100,7 +100,7 @@ const CGFloat TGCameraTabletPanelViewWidth = 102.0f; }; [_panelView addSubview:_timecodeView]; - _flipButton = [[TGCameraFlipButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44) large:true]; + _flipButton = [[TGCameraFlipButton alloc] initWithFrame:CGRectMake(0, 0, 44, 44)]; [_flipButton addTarget:self action:@selector(flipButtonPressed) forControlEvents:UIControlEventTouchUpInside]; [_panelView addSubview:_flipButton]; diff --git a/submodules/LegacyComponents/Sources/TGCameraMainView.m b/submodules/LegacyComponents/Sources/TGCameraMainView.m index 4254f41c16..79bc985526 100644 --- a/submodules/LegacyComponents/Sources/TGCameraMainView.m +++ b/submodules/LegacyComponents/Sources/TGCameraMainView.m @@ -5,10 +5,11 @@ #import #import "TGCameraShutterButton.h" +#import "TGCameraFlipButton.h" #import "TGCameraModeControl.h" #import "TGCameraTimeCodeView.h" #import "TGCameraZoomView.h" -#import "TGCameraSegmentsView.h" +#import "TGCameraToastView.h" #import "TGMediaPickerPhotoCounterButton.h" #import "TGMediaPickerPhotoStripView.h" @@ -37,15 +38,22 @@ [self updateForCameraModeChangeWithPreviousMode:previousMode]; } +- (void)setToastMessage:(NSString *)message animated:(bool)animated +{ + [_toastView setText:message animated:animated]; +} + - (void)updateForCameraModeChangeWithPreviousMode:(PGCameraMode)__unused previousMode { switch (_modeControl.cameraMode) { case PGCameraModePhoto: case PGCameraModeSquarePhoto: + case PGCameraModePhotoScan: { [_shutterButton setButtonMode:TGCameraShutterButtonNormalMode animated:true]; [_timecodeView setHidden:true animated:true]; + [_flipButton setHidden:_modeControl.cameraMode == PGCameraModePhotoScan animated:true]; } break; diff --git a/submodules/LegacyComponents/Sources/TGCameraModeControl.m b/submodules/LegacyComponents/Sources/TGCameraModeControl.m index fd6b3cd2ac..7b3b7610a6 100644 --- a/submodules/LegacyComponents/Sources/TGCameraModeControl.m +++ b/submodules/LegacyComponents/Sources/TGCameraModeControl.m @@ -26,10 +26,7 @@ const CGFloat TGCameraModeControlVerticalInteritemSpace = 29.0f; self = [super initWithFrame:frame]; if (self != nil) { - if (frame.size.width > frame.size.height) - _kerning = 3.5f; - else - _kerning = 2.0f; + _kerning = 0.75f; _maskView = [[UIView alloc] initWithFrame:self.bounds]; _maskView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; @@ -53,6 +50,7 @@ const CGFloat TGCameraModeControlVerticalInteritemSpace = 29.0f; [ [self _createButtonForMode:PGCameraModeVideo title:TGLocalized(@"Camera.VideoMode")], [self _createButtonForMode:PGCameraModePhoto title:TGLocalized(@"Camera.PhotoMode")] +// [self _createButtonForMode:PGCameraModePhotoScan title:TGLocalized(@"Camera.ScanMode")] ]; } @@ -72,7 +70,7 @@ const CGFloat TGCameraModeControlVerticalInteritemSpace = 29.0f; _maskLayer = [CAGradientLayer layer]; _maskLayer.colors = @[ (id)[UIColor clearColor].CGColor, (id)[UIColor whiteColor].CGColor, (id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor ]; - _maskLayer.locations = @[ @0.0f, @0.33f, @0.67f, @1.0f ]; + _maskLayer.locations = @[ @0.0f, @0.4f, @0.6f, @1.0f ]; _maskLayer.startPoint = CGPointMake(0.0f, 0.5f); _maskLayer.endPoint = CGPointMake(1.0f, 0.5f); _maskView.layer.mask = _maskLayer; @@ -94,19 +92,14 @@ const CGFloat TGCameraModeControlVerticalInteritemSpace = 29.0f; return self; } -+ (UIFont *)_buttonFont -{ - return [UIFont fontWithName:@"SFCompactText-Regular" size:14]; -} - + (CGFloat)_buttonHorizontalSpacing { - return 19; + return 25; } + (CGFloat)_buttonVerticalSpacing { - return 19; + return 25; } - (UIButton *)_createButtonForMode:(PGCameraMode)mode title:(NSString *)title @@ -116,11 +109,17 @@ const CGFloat TGCameraModeControlVerticalInteritemSpace = 29.0f; button.exclusiveTouch = true; button.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); button.tag = mode; - button.titleLabel.font = [TGCameraInterfaceAssets normalFontOfSize:13]; - [button setAttributedTitle:[[NSAttributedString alloc] initWithString:title attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets normalColor], NSKernAttributeName: @(_kerning) }] forState:UIControlStateNormal]; - [button setAttributedTitle:[[NSAttributedString alloc] initWithString:title attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets accentColor], NSKernAttributeName: @(_kerning) }] forState:UIControlStateSelected]; + [button setAttributedTitle:[[NSAttributedString alloc] initWithString:title attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets normalColor], NSKernAttributeName: @(_kerning), NSFontAttributeName: [TGCameraInterfaceAssets regularFontOfSize:14] }] forState:UIControlStateNormal]; + [button setAttributedTitle:[[NSAttributedString alloc] initWithString:title attributes:@{ NSForegroundColorAttributeName: [TGCameraInterfaceAssets accentColor], NSKernAttributeName: @(_kerning), NSFontAttributeName: [TGCameraInterfaceAssets boldFontOfSize:14] }] forState:UIControlStateSelected]; [button setAttributedTitle:[button attributedTitleForState:UIControlStateSelected] forState:UIControlStateHighlighted | UIControlStateSelected]; [button sizeToFit]; + button.titleLabel.shadowColor = [UIColor blackColor]; + button.titleLabel.shadowOffset = CGSizeMake(0.0, 0.0); + button.titleLabel.layer.shadowRadius = 2.0; + button.titleLabel.layer.shadowOpacity = 0.3; + button.titleLabel.layer.masksToBounds = false; + button.titleLabel.layer.shouldRasterize = true; + button.frame = CGRectMake(0.0, 0.0, button.frame.size.width + 2.0, button.frame.size.height); [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside]; return button; @@ -191,7 +190,7 @@ const CGFloat TGCameraModeControlVerticalInteritemSpace = 29.0f; CGFloat angle = ABS(offset / _wrapperView.frame.size.width * 0.99f); CGFloat sign = offset > 0 ? 1.0f : -1.0f; - CATransform3D transform = CATransform3DTranslate(CATransform3DIdentity, -28 * angle * angle * sign, 0.0f, 0.0f); + CATransform3D transform = CATransform3DTranslate(CATransform3DIdentity, -2 * angle * angle * sign, 0.0f, 0.0f); transform = CATransform3DRotate(transform, angle, 0.0f, sign, 0.0f); return transform; } diff --git a/submodules/LegacyComponents/Sources/TGCameraRectangleView.h b/submodules/LegacyComponents/Sources/TGCameraRectangleView.h new file mode 100644 index 0000000000..3560be793e --- /dev/null +++ b/submodules/LegacyComponents/Sources/TGCameraRectangleView.h @@ -0,0 +1,14 @@ +#import + +@class TGCameraPreviewView; +@class PGRectangle; + +@interface TGCameraRectangleView : UIView + +@property (nonatomic, weak) TGCameraPreviewView *previewView; +@property (nonatomic, assign) bool enabled; + +- (void)drawRectangle:(PGRectangle *)rectangle; + +@end + diff --git a/submodules/LegacyComponents/Sources/TGCameraRectangleView.m b/submodules/LegacyComponents/Sources/TGCameraRectangleView.m new file mode 100644 index 0000000000..bfe77c9928 --- /dev/null +++ b/submodules/LegacyComponents/Sources/TGCameraRectangleView.m @@ -0,0 +1,102 @@ +#import "TGCameraRectangleView.h" +#import "TGCameraInterfaceAssets.h" +#import "LegacyComponentsInternal.h" +#import "TGImageUtils.h" + +#import "TGCameraPreviewView.h" +#import "PGRectangleDetector.h" + +@interface TGCameraRectangleView () +{ + CAShapeLayer *_quadLayer; + + bool _clearing; +} +@end + +@implementation TGCameraRectangleView + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self != nil) { + _enabled = true; + + self.backgroundColor = [UIColor clearColor]; + self.alpha = 0.0f; + + _quadLayer = [[CAShapeLayer alloc] init]; + _quadLayer.strokeColor = [[TGCameraInterfaceAssets accentColor] colorWithAlphaComponent:0.7].CGColor; + _quadLayer.fillColor = [[TGCameraInterfaceAssets accentColor] colorWithAlphaComponent:0.45].CGColor; + _quadLayer.lineWidth = 2.0; + + [self.layer addSublayer:_quadLayer]; + } + return self; +} + +- (CGPathRef)pathForRectangle:(PGRectangle *)rectangle +{ + CGAffineTransform transform = CGAffineTransformMakeScale(self.previewView.frame.size.width, self.previewView.frame.size.height); + PGRectangle *displayRectangle = [[rectangle rotate90] transform:transform]; + + UIBezierPath *path = [[UIBezierPath alloc] init]; + [path moveToPoint:displayRectangle.topLeft]; + [path addLineToPoint:displayRectangle.topRight]; + [path addLineToPoint:displayRectangle.bottomRight]; + [path addLineToPoint:displayRectangle.bottomLeft]; + [path closePath]; + return path.CGPath; +} + +- (void)drawRectangle:(PGRectangle *)rectangle +{ + if (!_enabled) { + return; + } + + if (rectangle == nil) { + [self clear]; + return; + } + + _clearing = false; + [self.layer removeAllAnimations]; + + bool animated = _quadLayer.path != nil; + if (animated) { + CAAnimation *animation = [CABasicAnimation animationWithKeyPath:@"path"]; + animation.duration = 0.2; + [_quadLayer addAnimation:animation forKey:@"path"]; + } else { + self.transform = CGAffineTransformMakeScale(1.1, 1.1); + [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^{ + self.transform = CGAffineTransformIdentity; + self.alpha = 1.0f; + } completion:nil]; + } + _quadLayer.path = [self pathForRectangle:rectangle]; +} + +- (void)clear +{ + if (_quadLayer.path == nil || _clearing) + return; + + _clearing = true; + [UIView animateWithDuration:0.2 delay:0.0 options:UIViewAnimationOptionAllowAnimatedContent animations:^{ + self.alpha = 0.0f; + } completion:^(BOOL finished) { + if (_clearing) { + _quadLayer.path = nil; + _clearing = false; + } + }]; +} + +- (void)layoutSubviews +{ + _quadLayer.frame = self.bounds; +} + +@end diff --git a/submodules/LegacyComponents/Sources/TGCameraSegmentsView.m b/submodules/LegacyComponents/Sources/TGCameraSegmentsView.m deleted file mode 100644 index 6f5ed063cf..0000000000 --- a/submodules/LegacyComponents/Sources/TGCameraSegmentsView.m +++ /dev/null @@ -1,260 +0,0 @@ -#import "TGCameraSegmentsView.h" - -#import "LegacyComponentsInternal.h" -#import "TGImageUtils.h" - -#import "TGCameraInterfaceAssets.h" - -#import - -const CGFloat TGCameraSegmentsBackgroundInset = 21.0f; -const CGFloat TGCameraSegmentsBackgroundHeight = 10.0f; -const CGFloat TGCameraSegmentsSpacing = 1.5f; -const CGFloat TGCameraSegmentsMinimumWidth = 4.0f; - -@interface TGCameraSegmentView : UIImageView - -- (void)setBlinking; -- (void)setRecording; -- (void)setCommittingWithCompletion:(void (^)(void))completion; - -@end - -@interface TGCameraSegmentsView () -{ - UIImageView *_backgroundView; - UIView *_segmentWrapper; - NSArray *_segmentViews; - - TGCameraSegmentView *_currentSegmentView; - CGFloat _currentSegment; - - TGModernButton *_deleteButton; -} -@end - -@implementation TGCameraSegmentsView - -- (instancetype)initWithFrame:(CGRect)frame -{ - self = [super initWithFrame:frame]; - if (self != nil) - { - static dispatch_once_t onceToken; - static UIImage *segmentImage = nil; - dispatch_once(&onceToken, ^ - { - UIGraphicsBeginImageContextWithOptions(CGSizeMake(4, 4), false, 0.0f); - CGContextRef context = UIGraphicsGetCurrentContext(); - CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor); - [[UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 4, 4) cornerRadius:0.5f] fill]; - segmentImage = [UIGraphicsGetImageFromCurrentImageContext() resizableImageWithCapInsets:UIEdgeInsetsMake(4, 4, 4, 4)]; - UIGraphicsEndImageContext(); - }); - - _backgroundView = [[UIImageView alloc] initWithImage:[TGComponentsImageNamed(@"CameraSegmentsBack") resizableImageWithCapInsets:UIEdgeInsetsMake(4, 4, 4, 4)]]; - [self addSubview:_backgroundView]; - - _segmentWrapper = [[UIView alloc] init]; - [_backgroundView addSubview:_segmentWrapper]; - - _currentSegmentView = [[TGCameraSegmentView alloc] initWithImage:[TGTintedImage(segmentImage, [TGCameraInterfaceAssets accentColor]) resizableImageWithCapInsets:UIEdgeInsetsMake(4, 4, 4, 4)]]; - [_segmentWrapper addSubview:_currentSegmentView]; - - _deleteButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)]; - _deleteButton.exclusiveTouch = true; - [_deleteButton setImage:TGComponentsImageNamed(@"CameraDeleteIcon") forState:UIControlStateNormal]; - [_deleteButton addTarget:self action:@selector(deleteButtonPressed) forControlEvents:UIControlEventTouchUpInside]; - [self addSubview:_deleteButton]; - - [self setDeleteButtonHidden:true animated:false]; - } - return self; -} - -- (void)deleteButtonPressed -{ - if (self.deletePressed != nil) - self.deletePressed(); -} - -- (void)setSegments:(NSArray *)__unused segments -{ - -} - -- (void)startCurrentSegment -{ - [_currentSegmentView setRecording]; -} - -- (void)setCurrentSegment:(CGFloat)length -{ - _currentSegment = length; - [self _layoutSegmentViews]; -} - -- (void)commitCurrentSegmentWithCompletion:(void (^)(void))completion -{ - __weak TGCameraSegmentView *weakSegmentView = _currentSegmentView; - [_currentSegmentView setCommittingWithCompletion:^ - { - __strong TGCameraSegmentView *strongSegmentView = weakSegmentView; - if (strongSegmentView == nil) - return; - - _currentSegment = 0; - - if (completion != nil) - completion(); - - [strongSegmentView setBlinking]; - }]; -} - -- (void)highlightLastSegment -{ - -} - -- (void)removeLastSegment -{ - -} - -- (void)setHidden:(BOOL)hidden -{ - self.alpha = hidden ? 0.0f : 1.0f; - super.hidden = hidden; - - if (!hidden) - [_currentSegmentView setBlinking]; -} - -- (void)setHidden:(bool)hidden animated:(bool)animated delay:(NSTimeInterval)delay -{ - if (animated) - { - super.hidden = false; - - [UIView animateWithDuration:0.25f delay:delay options:UIViewAnimationOptionCurveLinear animations:^ - { - self.alpha = hidden ? 0.0f : 1.0f; - } completion:^(BOOL finished) - { - if (finished) - self.hidden = hidden; - - if (!hidden) - [_currentSegmentView setBlinking]; - }]; - } - else - { - [self setHidden:hidden]; - } -} - -- (void)setDeleteButtonHidden:(bool)hidden animated:(bool)animated -{ - if (animated) - { - _deleteButton.hidden = false; - - [UIView animateWithDuration:0.25f animations:^ - { - _deleteButton.alpha = hidden ? 0.0f : 1.0f; - } completion:^(BOOL finished) - { - if (finished) - _deleteButton.hidden = hidden; - }]; - } - else - { - _deleteButton.hidden = hidden; - _deleteButton.alpha = hidden ? 0.0f : 1.0f; - } -} - -- (void)_layoutBackgroundView -{ - CGFloat backgroundRightPadding = 0.0f; - CGFloat deleteButtonMargin = _deleteButton.frame.size.width + 9.0f; - if (!_deleteButton.hidden) - backgroundRightPadding = deleteButtonMargin; - - _backgroundView.frame = CGRectMake(TGCameraSegmentsBackgroundInset, (self.frame.size.height - TGCameraSegmentsBackgroundHeight) / 2, self.frame.size.width - TGCameraSegmentsBackgroundInset * 2 - backgroundRightPadding, TGCameraSegmentsBackgroundHeight); - _segmentWrapper.frame = CGRectMake(3, 3, self.frame.size.width - TGCameraSegmentsBackgroundInset * 2 - deleteButtonMargin, TGCameraSegmentsBackgroundHeight - 3 * 2); -} - -- (void)_layoutDeleteButton -{ - _deleteButton.frame = CGRectMake(CGRectGetMaxX(_backgroundView.frame) + 14, (self.frame.size.height - _deleteButton.frame.size.height) / 2, _deleteButton.frame.size.width, _deleteButton.frame.size.height); -} - -- (void)_layoutSegmentViews -{ - -} - -- (void)layoutSubviews -{ - [self _layoutBackgroundView]; - [self _layoutDeleteButton]; -} - -@end - -@interface TGCameraSegmentView () -{ - -} -@end - -@implementation TGCameraSegmentView - -- (instancetype)initWithImage:(UIImage *)image -{ - self = [super initWithImage:image]; - if (self != nil) - { - - } - return self; -} - -- (void)setBlinking -{ - [self _playBlinkAnimation]; -} - -- (void)setRecording -{ - [self _stopBlinkAnimation]; -} - -- (void)setCommittingWithCompletion:(void (^)(void))__unused completion -{ - -} - -- (void)_playBlinkAnimation -{ - CAKeyframeAnimation *blinkAnim = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; - blinkAnim.duration = 1.2f; - blinkAnim.autoreverses = false; - blinkAnim.fillMode = kCAFillModeForwards; - blinkAnim.repeatCount = HUGE_VALF; - blinkAnim.keyTimes = @[ @0.0f, @0.4f, @0.5f, @0.9f, @1.0f ]; - blinkAnim.values = @[ @1.0f, @1.0f, @0.0f, @0.0f, @1.0f ]; - - [self.layer addAnimation:blinkAnim forKey:@"opacity"]; -} - -- (void)_stopBlinkAnimation -{ - [self.layer removeAllAnimations]; -} - -@end diff --git a/submodules/LegacyComponents/Sources/TGCameraShutterButton.m b/submodules/LegacyComponents/Sources/TGCameraShutterButton.m index 158bbc6718..4bdf177f9c 100644 --- a/submodules/LegacyComponents/Sources/TGCameraShutterButton.m +++ b/submodules/LegacyComponents/Sources/TGCameraShutterButton.m @@ -1,4 +1,5 @@ #import "TGCameraShutterButton.h" +#import "TGImageUtils.h" #import @@ -36,7 +37,7 @@ UIGraphicsBeginImageContextWithOptions(CGSizeMake(frame.size.width, frame.size.height), false, 0.0f); CGContextRef context = UIGraphicsGetCurrentContext(); - CGFloat thickness = (padding < 8.0f) ? 5.0f : 6.0f; + CGFloat thickness = 4.0 - TGScreenPixel; CGContextSetStrokeColorWithColor(context, [TGCameraInterfaceAssets normalColor].CGColor); CGContextSetLineWidth(context, thickness); @@ -70,17 +71,17 @@ - (CGFloat)innerPadding { if (self.frame.size.width == 50.0f) - return 7.0f; + return 6.0f; - return 8.0f; + return 6.0f; } - (CGFloat)squarePadding { if (self.frame.size.width == 50.0f) - return 15.0f; + return 19.0f; - return 19.0f; + return 23.0f; } - (void)setButtonMode:(TGCameraShutterButtonMode)mode animated:(bool)animated diff --git a/submodules/LegacyComponents/Sources/TGCameraTimeCodeView.m b/submodules/LegacyComponents/Sources/TGCameraTimeCodeView.m index 8a6f5ad331..1fbea1fea1 100644 --- a/submodules/LegacyComponents/Sources/TGCameraTimeCodeView.m +++ b/submodules/LegacyComponents/Sources/TGCameraTimeCodeView.m @@ -7,7 +7,7 @@ @interface TGCameraTimeCodeView () { - UIImageView *_dotView; + UIView *_backgroundView; UILabel *_timeLabel; NSUInteger _recordingDurationSeconds; @@ -22,29 +22,17 @@ self = [super initWithFrame:frame]; if (self != nil) { - static UIImage *dotImage = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^ - { - UIGraphicsBeginImageContextWithOptions(CGSizeMake(6, 6), false, 0.0f); - CGContextRef context = UIGraphicsGetCurrentContext(); - - CGContextSetFillColorWithColor(context, [TGCameraInterfaceAssets redColor].CGColor); - CGContextFillEllipseInRect(context, CGRectMake(0, 0, 6, 6)); - - dotImage = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - }); - - _dotView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 7, 6, 6)]; - _dotView.layer.opacity = 0.0f; - _dotView.image = dotImage; - [self addSubview:_dotView]; + _backgroundView = [[UIView alloc] init]; + _backgroundView.clipsToBounds = true; + _backgroundView.layer.cornerRadius = 4.0; + _backgroundView.backgroundColor = [TGCameraInterfaceAssets redColor]; + _backgroundView.alpha = 0.0; + [self addSubview:_backgroundView]; _timeLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; _timeLabel.backgroundColor = [UIColor clearColor]; - _timeLabel.font = [TGCameraInterfaceAssets normalFontOfSize:21]; - _timeLabel.text = @"00:00:00"; + _timeLabel.font = [TGCameraInterfaceAssets regularFontOfSize:21]; + _timeLabel.text = @"00:00"; _timeLabel.textAlignment = NSTextAlignmentCenter; _timeLabel.textColor = [TGCameraInterfaceAssets normalColor]; [self addSubview:_timeLabel]; @@ -59,7 +47,18 @@ - (void)_updateRecordingTime { - _timeLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", (int)(_recordingDurationSeconds / 3600), (int)(_recordingDurationSeconds / 60) % 60, (int)(_recordingDurationSeconds % 60)]; + if (_recordingDurationSeconds > 60 * 60) { + _timeLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", (int)(_recordingDurationSeconds / 3600), (int)(_recordingDurationSeconds / 60) % 60, (int)(_recordingDurationSeconds % 60)]; + } else { + _timeLabel.text = [NSString stringWithFormat:@"%02d:%02d", (int)(_recordingDurationSeconds / 60) % 60, (int)(_recordingDurationSeconds % 60)]; + } + [_timeLabel sizeToFit]; + + CGFloat inset = 8.0f; + CGFloat backgroundWidth = _timeLabel.frame.size.width + inset * 2.0; + _backgroundView.frame = CGRectMake(floor((self.frame.size.width - backgroundWidth) / 2.0), 0.0, backgroundWidth, 28.0); + + _timeLabel.frame = CGRectMake(floor((self.frame.size.width - _timeLabel.frame.size.width) / 2.0), floor((28 - _timeLabel.frame.size.height) / 2.0), _timeLabel.frame.size.width, _timeLabel.frame.size.height); } - (void)startRecording @@ -67,22 +66,18 @@ [self reset]; _recordingTimer = [TGTimerTarget scheduledMainThreadTimerWithTarget:self action:@selector(recordingTimerEvent) interval:1.0 repeat:false]; - - [self playBlinkAnimation]; } - (void)stopRecording { [_recordingTimer invalidate]; _recordingTimer = nil; - - [self stopBlinkAnimation]; } - (void)reset { - _timeLabel.text = @"00:00:00"; _recordingDurationSeconds = 0; + [self _updateRecordingTime]; } - (void)recordingTimerEvent @@ -108,24 +103,6 @@ } } -- (void)playBlinkAnimation -{ - CAKeyframeAnimation *blinkAnim = [CAKeyframeAnimation animationWithKeyPath:@"opacity"]; - blinkAnim.duration = 0.75f; - blinkAnim.autoreverses = false; - blinkAnim.fillMode = kCAFillModeForwards; - blinkAnim.repeatCount = HUGE_VALF; - blinkAnim.keyTimes = @[ @0.0f, @0.4f, @0.5f, @0.9f, @1.0f ]; - blinkAnim.values = @[ @1.0f, @1.0f, @0.0f, @0.0f, @1.0f ]; - - [_dotView.layer addAnimation:blinkAnim forKey:@"opacity"]; -} - -- (void)stopBlinkAnimation -{ - [_dotView.layer removeAllAnimations]; -} - - (void)setHidden:(BOOL)hidden { self.alpha = hidden ? 0.0f : 1.0f; @@ -156,7 +133,7 @@ - (void)layoutSubviews { - _dotView.frame = CGRectMake(CGFloor(self.frame.size.width / 2 - 48), 7, 6, 6); + [self _updateRecordingTime]; } @end diff --git a/submodules/LegacyComponents/Sources/TGCameraToastView.h b/submodules/LegacyComponents/Sources/TGCameraToastView.h new file mode 100644 index 0000000000..d5870d620e --- /dev/null +++ b/submodules/LegacyComponents/Sources/TGCameraToastView.h @@ -0,0 +1,7 @@ +#import + +@interface TGCameraToastView : UIView + +- (void)setText:(NSString *)text animated:(bool)animated; + +@end diff --git a/submodules/LegacyComponents/Sources/TGCameraToastView.m b/submodules/LegacyComponents/Sources/TGCameraToastView.m new file mode 100644 index 0000000000..6bb98b597e --- /dev/null +++ b/submodules/LegacyComponents/Sources/TGCameraToastView.m @@ -0,0 +1,70 @@ +#import "TGCameraToastView.h" +#import "TGCameraInterfaceAssets.h" +#import "TGFont.h" + +@implementation TGCameraToastView +{ + UIView *_backgroundView; + UILabel *_label; +} + +- (instancetype)initWithFrame:(CGRect)frame +{ + self = [super initWithFrame:frame]; + if (self != nil) + { + _backgroundView = [[UIView alloc] init]; + _backgroundView.alpha = 0.0f; + _backgroundView.clipsToBounds = true; + _backgroundView.layer.cornerRadius = 5.0f; + _backgroundView.backgroundColor = [TGCameraInterfaceAssets transparentPanelBackgroundColor]; + [self addSubview:_backgroundView]; + + _label = [[UILabel alloc] init]; + _label.alpha = 0.0f; + _label.textColor = [UIColor whiteColor]; + _label.font = [TGFont systemFontOfSize:17.0f]; + [self addSubview:_label]; + } + return self; +} + +- (void)setText:(NSString *)text animated:(bool)animated +{ + if (text.length == 0) + { + if (animated) { + [UIView animateWithDuration:0.2 animations:^{ + _backgroundView.alpha = 0.0f; + _label.alpha = 0.0f; + }]; + } else { + _backgroundView.alpha = 0.0f; + _label.alpha = 0.0f; + } + return; + } + + if (animated) { + [UIView animateWithDuration:0.2 animations:^{ + _backgroundView.alpha = 1.0f; + _label.alpha = 1.0f; + }]; + } else { + _backgroundView.alpha = 1.0f; + _label.alpha = 1.0f; + } + + _label.text = text; + [_label sizeToFit]; + + CGFloat inset = 8.0f; + CGFloat backgroundWidth = _label.frame.size.width + inset * 2.0; + _backgroundView.frame = CGRectMake(floor((self.frame.size.width - backgroundWidth) / 2.0), 0.0, backgroundWidth, 32.0); + + _label.frame = CGRectMake(floor((self.frame.size.width - _label.frame.size.width) / 2.0), floor((32 - _label.frame.size.height) / 2.0), _label.frame.size.width, _label.frame.size.height); + + [self setNeedsLayout]; +} + +@end diff --git a/submodules/LegacyComponents/Sources/TGFont.mm b/submodules/LegacyComponents/Sources/TGFont.mm index 9c66d82e67..5d1ccc575e 100644 --- a/submodules/LegacyComponents/Sources/TGFont.mm +++ b/submodules/LegacyComponents/Sources/TGFont.mm @@ -117,7 +117,7 @@ UIFont *TGFixedSystemFontOfSize(CGFloat size) + (UIFont *)roundedFontOfSize:(CGFloat)size { if (@available(iOSApplicationExtension 13.0, iOS 13.0, *)) { - UIFontDescriptor *descriptor = [UIFont boldSystemFontOfSize: size].fontDescriptor; + UIFontDescriptor *descriptor = [UIFont boldSystemFontOfSize:size].fontDescriptor; descriptor = [descriptor fontDescriptorWithDesign:UIFontDescriptorSystemDesignRounded]; return [UIFont fontWithDescriptor:descriptor size:size]; } else { diff --git a/submodules/LegacyComponents/Sources/TGMediaVideoConverter.m b/submodules/LegacyComponents/Sources/TGMediaVideoConverter.m index 65b20a3dd2..f0afb18ed1 100644 --- a/submodules/LegacyComponents/Sources/TGMediaVideoConverter.m +++ b/submodules/LegacyComponents/Sources/TGMediaVideoConverter.m @@ -1266,7 +1266,7 @@ static CGFloat progressOfSampleBufferInTimeRange(CMSampleBufferRef sampleBuffer, return (CGSize){ 1920.0f, 1920.0f }; case TGMediaVideoConversionPresetVideoMessage: - return (CGSize){ 240.0f, 240.0f }; + return (CGSize){ 384.0f, 384.0f }; case TGMediaVideoConversionPresetProfileLow: return (CGSize){ 720.0f, 720.0f }; @@ -1375,7 +1375,7 @@ static CGFloat progressOfSampleBufferInTimeRange(CMSampleBufferRef sampleBuffer, return 4000; case TGMediaVideoConversionPresetVideoMessage: - return 300; + return 1000; case TGMediaVideoConversionPresetProfile: return 1500; diff --git a/submodules/LegacyComponents/Sources/TGPhotoAvatarCropController.h b/submodules/LegacyComponents/Sources/TGPhotoAvatarCropController.h deleted file mode 100644 index 50036f64bf..0000000000 --- a/submodules/LegacyComponents/Sources/TGPhotoAvatarCropController.h +++ /dev/null @@ -1,26 +0,0 @@ -#import "TGPhotoEditorTabController.h" - -@class PGPhotoEditor; -@class TGPhotoEditorPreviewView; -@class AVPlayer; - -@interface TGPhotoAvatarCropController : TGPhotoEditorTabController - -@property (nonatomic, readonly) UIView *transitionParentView; - -@property (nonatomic, assign) bool switching; -@property (nonatomic, assign) bool skipTransitionIn; -@property (nonatomic, assign) bool fromCamera; - -@property (nonatomic, copy) void (^finishedPhotoProcessing)(void); - -- (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView; - -- (void)setImage:(UIImage *)image; -- (void)setPlayer:(AVPlayer *)player; -- (void)setSnapshotImage:(UIImage *)snapshotImage; -- (void)setSnapshotView:(UIView *)snapshotView; - -- (void)_finishedTransitionIn; - -@end diff --git a/submodules/LegacyComponents/Sources/TGPhotoAvatarCropController.m b/submodules/LegacyComponents/Sources/TGPhotoAvatarCropController.m deleted file mode 100644 index c1e91bcd7d..0000000000 --- a/submodules/LegacyComponents/Sources/TGPhotoAvatarCropController.m +++ /dev/null @@ -1,707 +0,0 @@ -#import "TGPhotoAvatarCropController.h" - -#import "LegacyComponentsInternal.h" - -#import "TGPhotoEditorInterfaceAssets.h" -#import - -#import -#import - -#import "PGPhotoEditor.h" -#import "TGPhotoEditorPreviewView.h" - -#import "TGPhotoAvatarCropView.h" -#import - -#import "TGPhotoPaintController.h" - -const CGFloat TGPhotoAvatarCropButtonsWrapperSize = 61.0f; - -@interface TGPhotoAvatarCropController () -{ - UIView *_wrapperView; - - UIView *_buttonsWrapperView; - TGModernButton *_rotateButton; - TGModernButton *_mirrorButton; - TGModernButton *_resetButton; - - TGPhotoAvatarCropView *_cropView; - - UIView *_snapshotView; - UIImage *_snapshotImage; - - bool _appeared; - UIImage *_imagePendingLoad; - - dispatch_semaphore_t _waitSemaphore; -} - -@property (nonatomic, weak) PGPhotoEditor *photoEditor; -@property (nonatomic, weak) TGPhotoEditorPreviewView *previewView; - -@end - -@implementation TGPhotoAvatarCropController - -- (instancetype)initWithContext:(id)context photoEditor:(PGPhotoEditor *)photoEditor previewView:(TGPhotoEditorPreviewView *)previewView -{ - self = [super initWithContext:context]; - if (self != nil) - { - self.photoEditor = photoEditor; - self.previewView = previewView; - - _waitSemaphore = dispatch_semaphore_create(0); - } - return self; -} - -- (void)loadView -{ - [super loadView]; - - __weak TGPhotoAvatarCropController *weakSelf = self; - void(^interactionBegan)(void) = ^ - { - __strong TGPhotoAvatarCropController *strongSelf = weakSelf; - if (strongSelf == nil) - return; - - self.controlVideoPlayback(false); - }; - void(^interactionEnded)(void) = ^ - { - __strong TGPhotoAvatarCropController *strongSelf = weakSelf; - if (strongSelf == nil) - return; - - if ([strongSelf shouldAutorotate]) - [TGViewController attemptAutorotation]; - - self.controlVideoPlayback(true); - }; - - _wrapperView = [[UIView alloc] initWithFrame:self.view.bounds]; - _wrapperView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - [self.view addSubview:_wrapperView]; - - PGPhotoEditor *photoEditor = self.photoEditor; - _cropView = [[TGPhotoAvatarCropView alloc] initWithOriginalSize:photoEditor.originalSize screenSize:[self referenceViewSize] fullPreviewView:nil fullPaintingView:nil fullEntitiesView:nil]; - [_cropView setCropRect:photoEditor.cropRect]; - [_cropView setCropOrientation:photoEditor.cropOrientation]; - [_cropView setCropMirrored:photoEditor.cropMirrored]; - _cropView.croppingChanged = ^ - { - __strong TGPhotoAvatarCropController *strongSelf = weakSelf; - if (strongSelf == nil) - return; - - photoEditor.cropRect = strongSelf->_cropView.cropRect; - photoEditor.cropOrientation = strongSelf->_cropView.cropOrientation; - photoEditor.cropMirrored = strongSelf->_cropView.cropMirrored; - }; - if (_snapshotView != nil) - { - [_cropView setSnapshotView:_snapshotView]; - _snapshotView = nil; - } - else if (_snapshotImage != nil) - { - [_cropView setSnapshotImage:_snapshotImage]; - _snapshotImage = nil; - } - _cropView.interactionBegan = interactionBegan; - _cropView.interactionEnded = interactionEnded; - [_wrapperView addSubview:_cropView]; - - _buttonsWrapperView = [[UIView alloc] initWithFrame:CGRectZero]; - [_wrapperView addSubview:_buttonsWrapperView]; - - _rotateButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 36, 36)]; - _rotateButton.exclusiveTouch = true; - _rotateButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); - [_rotateButton addTarget:self action:@selector(rotate) forControlEvents:UIControlEventTouchUpInside]; - [_rotateButton setImage:TGComponentsImageNamed(@"PhotoEditorRotateIcon") forState:UIControlStateNormal]; -// [_buttonsWrapperView addSubview:_rotateButton]; - - _mirrorButton = [[TGModernButton alloc] initWithFrame:CGRectMake(0, 0, 36, 36)]; - _mirrorButton.exclusiveTouch = true; - _mirrorButton.imageEdgeInsets = UIEdgeInsetsMake(4.0f, 0.0f, 0.0f, 0.0f); - _mirrorButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); - [_mirrorButton addTarget:self action:@selector(mirror) forControlEvents:UIControlEventTouchUpInside]; - [_mirrorButton setImage:TGComponentsImageNamed(@"PhotoEditorMirrorIcon") forState:UIControlStateNormal]; -// [_buttonsWrapperView addSubview:_mirrorButton]; - - _resetButton = [[TGModernButton alloc] init]; - _resetButton.contentEdgeInsets = UIEdgeInsetsMake(0.0f, 8.0f, 0.0f, 8.0f); - _resetButton.exclusiveTouch = true; - _resetButton.hitTestEdgeInsets = UIEdgeInsetsMake(-10, -10, -10, -10); - _resetButton.titleLabel.font = [TGFont systemFontOfSize:13]; - [_resetButton addTarget:self action:@selector(reset) forControlEvents:UIControlEventTouchUpInside]; - [_resetButton setTitle:TGLocalized(@"PhotoEditor.CropReset") forState:UIControlStateNormal]; - [_resetButton setTitleColor:[UIColor whiteColor]]; - [_resetButton sizeToFit]; - _resetButton.frame = CGRectMake(0, 0, _resetButton.frame.size.width, 24); - [_buttonsWrapperView addSubview:_resetButton]; -} - -- (void)viewWillAppear:(BOOL)animated -{ - [super viewWillAppear:animated]; - - if (_appeared) - return; - - if (self.initialAppearance && self.skipTransitionIn) - { - [self _finishedTransitionInWithView:nil]; - if (self.finishedTransitionIn != nil) - { - self.finishedTransitionIn(); - self.finishedTransitionIn = nil; - } - } - else - { - [self transitionIn]; - } -} - -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - _appeared = true; - - if (_imagePendingLoad != nil) - [_cropView setImage:_imagePendingLoad]; -} - -- (BOOL)shouldAutorotate -{ - return (!_cropView.isTracking && [super shouldAutorotate]); -} - -- (bool)isDismissAllowed -{ - return _appeared && !_cropView.isTracking && !_cropView.isAnimating; -} - -#pragma mark - - -- (void)setImage:(UIImage *)image -{ - if (_dismissing && !_switching) - return; - - if (_waitSemaphore != nil) - dispatch_semaphore_signal(_waitSemaphore); - - if (!_appeared) - { - _imagePendingLoad = image; - return; - } - - [_cropView setImage:image]; -} - -- (void)setPlayer:(AVPlayer *)player -{ -} - -- (void)setSnapshotImage:(UIImage *)snapshotImage -{ - _snapshotImage = snapshotImage; - [_cropView _replaceSnapshotImage:snapshotImage]; -} - -- (void)setSnapshotView:(UIView *)snapshotView -{ - _snapshotView = snapshotView; -} - -#pragma mark - Transition - -- (void)prepareTransitionInWithReferenceView:(UIView *)referenceView referenceFrame:(CGRect)referenceFrame parentView:(UIView *)parentView noTransitionView:(bool)noTransitionView -{ - [super prepareTransitionInWithReferenceView:referenceView referenceFrame:referenceFrame parentView:parentView noTransitionView:noTransitionView]; - [self.view insertSubview:_transitionView belowSubview:_wrapperView]; -} - -- (void)transitionIn -{ - _buttonsWrapperView.alpha = 0.0f; - - [UIView animateWithDuration:0.3f animations:^ - { - _buttonsWrapperView.alpha = 1.0f; - }]; - - [_cropView animateTransitionIn]; -} - -- (void)animateTransitionIn -{ - if ([_transitionView isKindOfClass:[TGPhotoEditorPreviewView class]]) - [(TGPhotoEditorPreviewView *)_transitionView performTransitionToCropAnimated:true]; - - [super animateTransitionIn]; -} - -- (void)_finishedTransitionInWithView:(UIView *)transitionView -{ - if ([transitionView isKindOfClass:[TGPhotoEditorPreviewView class]]) { - - } else { - [transitionView removeFromSuperview]; - } - - _buttonsWrapperView.alpha = 1.0f; - [_cropView transitionInFinishedFromCamera:(self.fromCamera && self.initialAppearance)]; -} - -- (void)_finishedTransitionIn -{ -// [_cropView animateTransitionIn]; - [_cropView transitionInFinishedFromCamera:true]; - - self.finishedTransitionIn(); - self.finishedTransitionIn = nil; -} - -- (void)prepareForCustomTransitionOut -{ - [_cropView hideImageForCustomTransition]; - [_cropView animateTransitionOutSwitching:false]; - - [UIView animateWithDuration:0.3f animations:^ - { - _buttonsWrapperView.alpha = 0.0f; - } completion:nil]; -} - -- (void)transitionOutSwitching:(bool)switching completion:(void (^)(void))completion -{ - _dismissing = true; - - [_cropView animateTransitionOutSwitching:switching]; - - if (switching) - { - _switching = true; - - TGPhotoEditorPreviewView *previewView = self.previewView; - [previewView performTransitionToCropAnimated:false]; - [previewView setSnapshotView:[_cropView cropSnapshotView]]; - - PGPhotoEditor *photoEditor = self.photoEditor; - - if (self.item.isVideo) { - if (!previewView.hidden) - [previewView performTransitionInWithCompletion:nil]; - else - [previewView setNeedsTransitionIn]; - - if (self.finishedPhotoProcessing != nil) - self.finishedPhotoProcessing(); - } else { - UIImage *image = _cropView.currentImage; - CGRect cropRect = _cropView.cropRect; - UIImageOrientation cropOrientation = _cropView.cropOrientation; - bool cropMirrored = _cropView.cropMirrored; - CGSize originalSize = _cropView.originalSize; - - dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ - { - if (dispatch_semaphore_wait(_waitSemaphore, dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)))) - { - TGLegacyLog(@"Photo crop on switching failed"); - return; - } - - UIImage *croppedImage = TGPhotoEditorCrop(image, nil, cropOrientation, 0.0f, cropRect, false, TGPhotoEditorScreenImageMaxSize(), originalSize, true); - [photoEditor setImage:croppedImage forCropRect:cropRect cropRotation:0.0f cropOrientation:cropOrientation cropMirrored:cropMirrored fullSize:false]; - - [photoEditor processAnimated:false completion:^ - { - TGDispatchOnMainThread(^ - { - [previewView setSnapshotImage:croppedImage]; - - if (!previewView.hidden) - [previewView performTransitionInWithCompletion:nil]; - else - [previewView setNeedsTransitionIn]; - }); - }]; - - if (self.finishedPhotoProcessing != nil) - self.finishedPhotoProcessing(); - }); - } - - UIInterfaceOrientation orientation = self.effectiveOrientation; - - CGRect cropRectFrame = [_cropView cropRectFrameForView:self.view]; - CGSize referenceSize = [self referenceViewSizeForOrientation:orientation]; - CGRect referenceBounds = CGRectMake(0, 0, referenceSize.width, referenceSize.height); - CGRect containerFrame = [TGPhotoEditorTabController photoContainerFrameForParentViewFrame:referenceBounds toolbarLandscapeSize:self.toolbarLandscapeSize orientation:orientation panelSize:TGPhotoEditorPanelSize hasOnScreenNavigation:self.hasOnScreenNavigation]; - -// if (self.switchingToTab == TGPhotoEditorPreviewTab) -// { -// containerFrame = [TGPhotoEditorTabController photoContainerFrameForParentViewFrame:referenceBounds toolbarLandscapeSize:self.toolbarLandscapeSize orientation:orientation panelSize:0 hasOnScreenNavigation:self.hasOnScreenNavigation]; -// } -// else if (self.switchingToTab == TGPhotoEditorPaintTab) -// { -// containerFrame = [TGPhotoPaintController photoContainerFrameForParentViewFrame:referenceBounds toolbarLandscapeSize:self.toolbarLandscapeSize orientation:orientation panelSize:TGPhotoPaintTopPanelSize + TGPhotoPaintBottomPanelSize hasOnScreenNavigation:self.hasOnScreenNavigation]; -// } - - CGSize fittedSize = TGScaleToSize(cropRectFrame.size, containerFrame.size); - CGRect targetFrame = CGRectMake(containerFrame.origin.x + (containerFrame.size.width - fittedSize.width) / 2, - containerFrame.origin.y + (containerFrame.size.height - fittedSize.height) / 2, - fittedSize.width, - fittedSize.height); - - UIView *snapshotView = [_cropView cropSnapshotView]; - snapshotView.alpha = 0.0f; - snapshotView.frame = cropRectFrame; - [self.view addSubview:snapshotView]; - - CGRect targetCropViewFrame = [self.view convertRect:targetFrame toView:_wrapperView]; - - if (!self.item.isVideo) { - _previewView.hidden = true; - } - - [UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionLayoutSubviews animations:^ - { - snapshotView.frame = targetFrame; - if (self.item.isVideo) { - _cropView.alpha = 0.0f; - } else { - snapshotView.alpha = 1.0f; - } - _cropView.frame = targetCropViewFrame; - [_cropView invalidateCropRect]; - } completion:^(__unused BOOL finished) - { - _previewView.hidden = false; - if (self.finishedTransitionOut != nil) - self.finishedTransitionOut(); - }]; - } - - [UIView animateWithDuration:0.3f animations:^ - { - _buttonsWrapperView.alpha = 0.0f; - } completion:^(__unused BOOL finished) - { - if (completion != nil) - completion(); - }]; -} - -- (void)transitionOutSaving:(bool)__unused saving completion:(void (^)(void))completion -{ - CGRect referenceFrame = [_cropView contentFrameForView:self.view]; - - CGSize referenceSize = [self referenceViewSize]; - - UIImageView *snapshotView = [[UIImageView alloc] initWithImage:_cropView.image]; - snapshotView.frame = [_wrapperView convertRect:referenceFrame fromView:nil]; - snapshotView.alpha = 0.0f; - [_wrapperView insertSubview:snapshotView belowSubview:_cropView]; - - [self transitionOutSwitching:false completion:nil]; - - if (self.intent & TGPhotoEditorControllerFromCameraIntent && self.intent & (TGPhotoEditorControllerAvatarIntent | TGPhotoEditorControllerSignupAvatarIntent)) - { - if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) - { - referenceFrame = CGRectMake(referenceSize.height - referenceFrame.size.height - referenceFrame.origin.y, - referenceSize.width - referenceFrame.size.width - referenceFrame.origin.x, - referenceFrame.size.height, referenceFrame.size.width); - } - else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) - { - referenceFrame = CGRectMake(referenceFrame.origin.y, - referenceFrame.origin.x, - referenceFrame.size.height, referenceFrame.size.width); - } - } - - UIView *referenceView = nil; - UIView *parentView = nil; - if (self.beginTransitionOut != nil) - referenceView = self.beginTransitionOut(&referenceFrame, &parentView); - - if (self.intent & TGPhotoEditorControllerFromCameraIntent && self.intent & (TGPhotoEditorControllerAvatarIntent | TGPhotoEditorControllerSignupAvatarIntent)) - { - if (self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft) - { - referenceFrame = CGRectMake(referenceSize.width - referenceFrame.size.height - referenceFrame.origin.y, - referenceFrame.origin.x, - referenceFrame.size.height, referenceFrame.size.width); - } - else if (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight) - { - referenceFrame = CGRectMake(referenceFrame.origin.y, - referenceSize.height - referenceFrame.size.width - referenceFrame.origin.x, - referenceFrame.size.height, referenceFrame.size.width); - } - } - - POPSpringAnimation *animation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewFrame]; - animation.fromValue = [NSValue valueWithCGRect:snapshotView.frame]; - animation.toValue = [NSValue valueWithCGRect:[_wrapperView convertRect:referenceFrame fromView:nil]]; - - POPSpringAnimation *alphaAnimation = [TGPhotoEditorAnimation prepareTransitionAnimationForPropertyNamed:kPOPViewAlpha]; - alphaAnimation.fromValue = @(snapshotView.alpha); - alphaAnimation.toValue = @(0.0f); - - [TGPhotoEditorAnimation performBlock:^(__unused bool allFinished) - { - [snapshotView removeFromSuperview]; - - if (completion != nil) - completion(); - } whenCompletedAllAnimations:@[ animation, alphaAnimation ]]; - - [snapshotView pop_addAnimation:animation forKey:@"frame"]; - [snapshotView pop_addAnimation:alphaAnimation forKey:@"alpha"]; -} - -- (CGRect)_targetFrameForTransitionInFromFrame:(CGRect)fromFrame -{ - CGSize referenceSize = [self referenceViewSize]; - UIInterfaceOrientation orientation = self.effectiveOrientation; - - CGRect containerFrame = [TGPhotoEditorTabController photoContainerFrameForParentViewFrame:CGRectMake(0, 0, referenceSize.width, referenceSize.height) toolbarLandscapeSize:self.toolbarLandscapeSize orientation:orientation panelSize:0.0f hasOnScreenNavigation:self.hasOnScreenNavigation]; - - CGRect targetFrame = CGRectZero; - - CGFloat shortSide = MIN(referenceSize.width, referenceSize.height); - CGFloat diameter = shortSide - [TGPhotoAvatarCropView areaInsetSize].width * 2; - if (self.initialAppearance && (self.fromCamera || !self.skipTransitionIn)) - { - CGSize referenceSize = fromFrame.size; - if ([_transitionView isKindOfClass:[UIImageView class]]) - referenceSize = ((UIImageView *)_transitionView).image.size; - - CGSize fittedSize = TGScaleToFill(referenceSize, CGSizeMake(diameter, diameter)); - - targetFrame = CGRectMake(containerFrame.origin.x + (containerFrame.size.width - fittedSize.width) / 2, - containerFrame.origin.y + (containerFrame.size.height - fittedSize.height) / 2, - fittedSize.width, fittedSize.height); - } - else - { - targetFrame = CGRectMake(containerFrame.origin.x + (containerFrame.size.width - diameter) / 2, - containerFrame.origin.y + (containerFrame.size.height - diameter) / 2, - diameter, diameter); - } - - return targetFrame; -} - -- (CGRect)transitionOutReferenceFrame -{ - return [_cropView cropRectFrameForView:self.view]; -} - -- (UIView *)transitionOutReferenceView -{ - return [_cropView cropSnapshotView]; -} - -- (id)currentResultRepresentation -{ - return [_cropView cropSnapshotView]; -} - -#pragma mark - Actions - -- (void)rotate -{ - [_cropView rotate90DegreesCCWAnimated:true]; -} - -- (void)mirror -{ - [_cropView mirror]; -} - -- (void)reset -{ - [_cropView resetAnimated:true]; -} - -#pragma mark - Layout - -- (void)viewWillLayoutSubviews -{ - [super viewWillLayoutSubviews]; - - [self updateLayout:[[LegacyComponentsGlobals provider] applicationStatusBarOrientation]]; -} - -- (void)updateLayout:(UIInterfaceOrientation)orientation -{ - if ([self inFormSheet] || [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) - { - _resetButton.hidden = true; - } - - orientation = [self effectiveOrientation:orientation]; - - CGSize referenceSize = [self referenceViewSize]; - - if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) - [_cropView updateCircleImageWithReferenceSize:referenceSize]; - - CGFloat screenSide = MAX(referenceSize.width, referenceSize.height) + 2 * TGPhotoEditorPanelSize; - _wrapperView.frame = CGRectMake((referenceSize.width - screenSide) / 2, (referenceSize.height - screenSide) / 2, screenSide, screenSide); - - bool hasOnScreenNavigation = false; - if (iosMajorVersion() >= 11) - hasOnScreenNavigation = (self.viewLoaded && self.view.safeAreaInsets.bottom > FLT_EPSILON) || self.context.safeAreaInset.bottom > FLT_EPSILON; - - UIEdgeInsets safeAreaInset = [TGViewController safeAreaInsetForOrientation:orientation hasOnScreenNavigation:hasOnScreenNavigation]; - UIEdgeInsets screenEdges = UIEdgeInsetsMake((screenSide - self.view.frame.size.height) / 2, (screenSide - self.view.frame.size.width) / 2, (screenSide + self.view.frame.size.height) / 2, (screenSide + self.view.frame.size.width) / 2); - - UIEdgeInsets initialScreenEdges = screenEdges; - screenEdges.top += safeAreaInset.top; - screenEdges.left += safeAreaInset.left; - screenEdges.bottom -= safeAreaInset.bottom; - screenEdges.right -= safeAreaInset.right; - - switch (orientation) - { - case UIInterfaceOrientationLandscapeLeft: - { - [UIView performWithoutAnimation:^ - { - _buttonsWrapperView.frame = CGRectMake(screenEdges.left + self.toolbarLandscapeSize, - screenEdges.top, - TGPhotoAvatarCropButtonsWrapperSize, - referenceSize.height); - - _rotateButton.frame = CGRectMake(25 + 2.0f, 10, _rotateButton.frame.size.width, _rotateButton.frame.size.height); - _mirrorButton.frame = CGRectMake(25, 60, _mirrorButton.frame.size.width, _mirrorButton.frame.size.height); - - _resetButton.transform = CGAffineTransformIdentity; - [_resetButton sizeToFit]; - _resetButton.frame = CGRectMake(0, 0, _resetButton.frame.size.width, 24); - - CGFloat xOrigin = 0; - if (_resetButton.frame.size.width > _buttonsWrapperView.frame.size.width) - { - _resetButton.transform = CGAffineTransformMakeRotation((CGFloat)M_PI_2); - xOrigin = 12; - } - - _resetButton.frame = CGRectMake(_buttonsWrapperView.frame.size.width - _resetButton.frame.size.width - xOrigin, - (_buttonsWrapperView.frame.size.height - _resetButton.frame.size.height) / 2, - _resetButton.frame.size.width, - _resetButton.frame.size.height); - }]; - } - break; - - case UIInterfaceOrientationLandscapeRight: - { - [UIView performWithoutAnimation:^ - { - _buttonsWrapperView.frame = CGRectMake(screenEdges.right - self.toolbarLandscapeSize - TGPhotoAvatarCropButtonsWrapperSize, - screenEdges.top, - TGPhotoAvatarCropButtonsWrapperSize, - referenceSize.height); - - _rotateButton.frame = CGRectMake(_buttonsWrapperView.frame.size.width - _rotateButton.frame.size.width - 25 + 2.0f, 10, _rotateButton.frame.size.width, _rotateButton.frame.size.height); - _mirrorButton.frame = CGRectMake(_buttonsWrapperView.frame.size.width - _mirrorButton.frame.size.width - 25, 60, _mirrorButton.frame.size.width, _mirrorButton.frame.size.height); - - _resetButton.transform = CGAffineTransformIdentity; - [_resetButton sizeToFit]; - CGSize resetButtonSize = _resetButton.frame.size; - CGFloat xOrigin = 0; - if (resetButtonSize.width > _buttonsWrapperView.frame.size.width) - { - _resetButton.transform = CGAffineTransformMakeRotation((CGFloat)-M_PI_2); - xOrigin = 12; - } - - _resetButton.frame = CGRectMake(xOrigin, - (_buttonsWrapperView.frame.size.height - _resetButton.frame.size.height) / 2, - _resetButton.frame.size.width, - _resetButton.frame.size.height); - }]; - } - break; - - default: - { - [UIView performWithoutAnimation:^ - { - _buttonsWrapperView.frame = CGRectMake(screenEdges.left, - screenEdges.bottom - TGPhotoEditorToolbarSize - TGPhotoAvatarCropButtonsWrapperSize, - referenceSize.width, - TGPhotoAvatarCropButtonsWrapperSize); - - _rotateButton.frame = CGRectMake(10, _buttonsWrapperView.frame.size.height - _rotateButton.frame.size.height - 25 + 2.0f, _rotateButton.frame.size.width, _rotateButton.frame.size.height); - _mirrorButton.frame = CGRectMake(60, _buttonsWrapperView.frame.size.height - _mirrorButton.frame.size.height - 25, _mirrorButton.frame.size.width, _mirrorButton.frame.size.height); - - _resetButton.transform = CGAffineTransformIdentity; - [_resetButton sizeToFit]; - _resetButton.frame = CGRectMake((_buttonsWrapperView.frame.size.width - _resetButton.frame.size.width) / 2, - 10, - _resetButton.frame.size.width, - 24); - }]; - } - break; - } - - if (_dismissing) - return; - - CGRect containerFrame = [TGPhotoEditorTabController photoContainerFrameForParentViewFrame:CGRectMake(0, 0, referenceSize.width, referenceSize.height) toolbarLandscapeSize:self.toolbarLandscapeSize orientation:orientation panelSize:0.0f hasOnScreenNavigation:hasOnScreenNavigation]; - containerFrame = CGRectOffset(containerFrame, initialScreenEdges.left, initialScreenEdges.top); - - CGFloat shortSide = MIN(referenceSize.width, referenceSize.height); - CGFloat diameter = shortSide - [TGPhotoAvatarCropView areaInsetSize].width * 2; - _cropView.frame = CGRectMake(containerFrame.origin.x + (containerFrame.size.width - diameter) / 2, - containerFrame.origin.y + (containerFrame.size.height - diameter) / 2, - diameter, - diameter); -} - -- (TGPhotoEditorTab)availableTabs -{ - return TGPhotoEditorRotateTab | TGPhotoEditorMirrorTab; -} - -- (void)handleTabAction:(TGPhotoEditorTab)tab -{ - switch (tab) - { - case TGPhotoEditorRotateTab: - { - [self rotate]; - } - break; - - case TGPhotoEditorMirrorTab: - { - [self mirror]; - } - break; - - default: - break; - } -} - -@end diff --git a/submodules/LegacyComponents/Sources/TGPhotoRectangleCropController.h b/submodules/LegacyComponents/Sources/TGPhotoRectangleCropController.h new file mode 100644 index 0000000000..3df2af9dd5 --- /dev/null +++ b/submodules/LegacyComponents/Sources/TGPhotoRectangleCropController.h @@ -0,0 +1,6 @@ +#import "TGPhotoEditorTabController.h" + +@interface TGPhotoRectangleCropController : TGPhotoEditorTabController + +@end + diff --git a/submodules/LegacyComponents/Sources/TGPhotoRectangleCropController.m b/submodules/LegacyComponents/Sources/TGPhotoRectangleCropController.m new file mode 100644 index 0000000000..3794d8603d --- /dev/null +++ b/submodules/LegacyComponents/Sources/TGPhotoRectangleCropController.m @@ -0,0 +1,5 @@ +#import "TGPhotoRectangleCropController.h" + +@implementation TGPhotoRectangleCropController + +@end diff --git a/submodules/LegacyComponents/Sources/TGWarpedView.h b/submodules/LegacyComponents/Sources/TGWarpedView.h new file mode 100644 index 0000000000..0d5a7b1bdb --- /dev/null +++ b/submodules/LegacyComponents/Sources/TGWarpedView.h @@ -0,0 +1,7 @@ +#import + +@interface TGWarpedView : UIImageView + +- (void)transformToFitQuadTopLeft:(CGPoint)tl topRight:(CGPoint)tr bottomLeft:(CGPoint)bl bottomRight:(CGPoint)br; + +@end diff --git a/submodules/LegacyComponents/Sources/TGWarpedView.m b/submodules/LegacyComponents/Sources/TGWarpedView.m new file mode 100644 index 0000000000..975df28fd2 --- /dev/null +++ b/submodules/LegacyComponents/Sources/TGWarpedView.m @@ -0,0 +1,92 @@ +#import "TGWarpedView.h" + +@implementation TGWarpedView + +- (void)transformToFitQuadTopLeft:(CGPoint)tl topRight:(CGPoint)tr bottomLeft:(CGPoint)bl bottomRight:(CGPoint)br +{ + CGRect boundingBox = [[self class] boundingBoxForQuadTR:tr tl:tl bl:bl br:br]; + self.frame = boundingBox; + + CGPoint frameTopLeft = boundingBox.origin; + CATransform3D transform = [[self class] rectToQuad:self.bounds + quadTL:CGPointMake(tl.x-frameTopLeft.x, tl.y-frameTopLeft.y) + quadTR:CGPointMake(tr.x-frameTopLeft.x, tr.y-frameTopLeft.y) + quadBL:CGPointMake(bl.x-frameTopLeft.x, bl.y-frameTopLeft.y) + quadBR:CGPointMake(br.x-frameTopLeft.x, br.y-frameTopLeft.y)]; + + self.layer.transform = transform; + +} + ++ (CGRect)boundingBoxForQuadTR:(CGPoint)tr tl:(CGPoint)tl bl:(CGPoint)bl br:(CGPoint)br +{ + CGRect boundingBox = CGRectZero; + + CGFloat xmin = MIN(MIN(MIN(tr.x, tl.x), bl.x),br.x); + CGFloat ymin = MIN(MIN(MIN(tr.y, tl.y), bl.y),br.y); + CGFloat xmax = MAX(MAX(MAX(tr.x, tl.x), bl.x),br.x); + CGFloat ymax = MAX(MAX(MAX(tr.y, tl.y), bl.y),br.y); + + boundingBox.origin.x = xmin; + boundingBox.origin.y = ymin; + boundingBox.size.width = xmax - xmin; + boundingBox.size.height = ymax - ymin; + + return boundingBox; +} + ++ (CATransform3D)rectToQuad:(CGRect)rect + quadTL:(CGPoint)topLeft + quadTR:(CGPoint)topRight + quadBL:(CGPoint)bottomLeft + quadBR:(CGPoint)bottomRight +{ + return [self rectToQuad:rect quadTLX:topLeft.x quadTLY:topLeft.y quadTRX:topRight.x quadTRY:topRight.y quadBLX:bottomLeft.x quadBLY:bottomLeft.y quadBRX:bottomRight.x quadBRY:bottomRight.y]; +} + +// http://stackoverflow.com/questions/9470493/transforming-a-rectangle-image-into-a-quadrilateral-using-a-catransform3d ++ (CATransform3D)rectToQuad:(CGRect)rect + quadTLX:(CGFloat)x1a + quadTLY:(CGFloat)y1a + quadTRX:(CGFloat)x2a + quadTRY:(CGFloat)y2a + quadBLX:(CGFloat)x3a + quadBLY:(CGFloat)y3a + quadBRX:(CGFloat)x4a + quadBRY:(CGFloat)y4a +{ + CGFloat X = rect.origin.x; + CGFloat Y = rect.origin.y; + CGFloat W = rect.size.width; + CGFloat H = rect.size.height; + + CGFloat y21 = y2a - y1a; + CGFloat y32 = y3a - y2a; + CGFloat y43 = y4a - y3a; + CGFloat y14 = y1a - y4a; + CGFloat y31 = y3a - y1a; + CGFloat y42 = y4a - y2a; + + CGFloat a = -H*(x2a*x3a*y14 + x2a*x4a*y31 - x1a*x4a*y32 + x1a*x3a*y42); + CGFloat b = W*(x2a*x3a*y14 + x3a*x4a*y21 + x1a*x4a*y32 + x1a*x2a*y43); + CGFloat c = H*X*(x2a*x3a*y14 + x2a*x4a*y31 - x1a*x4a*y32 + x1a*x3a*y42) - H*W*x1a*(x4a*y32 - x3a*y42 + x2a*y43) - W*Y*(x2a*x3a*y14 + x3a*x4a*y21 + x1a*x4a*y32 + x1a*x2a*y43); + + CGFloat d = H*(-x4a*y21*y3a + x2a*y1a*y43 - x1a*y2a*y43 - x3a*y1a*y4a + x3a*y2a*y4a); + CGFloat e = W*(x4a*y2a*y31 - x3a*y1a*y42 - x2a*y31*y4a + x1a*y3a*y42); + CGFloat f = -(W*(x4a*(Y*y2a*y31 + H*y1a*y32) - x3a*(H + Y)*y1a*y42 + H*x2a*y1a*y43 + x2a*Y*(y1a - y3a)*y4a + x1a*Y*y3a*(-y2a + y4a)) - H*X*(x4a*y21*y3a - x2a*y1a*y43 + x3a*(y1a - y2a)*y4a + x1a*y2a*(-y3a + y4a))); + + CGFloat g = H*(x3a*y21 - x4a*y21 + (-x1a + x2a)*y43); + CGFloat h = W*(-x2a*y31 + x4a*y31 + (x1a - x3a)*y42); + CGFloat i = W*Y*(x2a*y31 - x4a*y31 - x1a*y42 + x3a*y42) + H*(X*(-(x3a*y21) + x4a*y21 + x1a*y43 - x2a*y43) + W*(-(x3a*y2a) + x4a*y2a + x2a*y3a - x4a*y3a - x2a*y4a + x3a*y4a)); + + const double kEpsilon = 0.0001; + + if (fabs(i) < kEpsilon) + i = kEpsilon* (i > 0 ? 1.0 : -1.0); + + CATransform3D transform = {a/i, d/i, 0, g/i, b/i, e/i, 0, h/i, 0, 0, 1, 0, c/i, f/i, 0, 1.0}; + + return transform; +} + +@end diff --git a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift index 9860b34a9f..32a05ef281 100644 --- a/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift +++ b/submodules/LegacyMediaPickerUI/Sources/LegacyMediaPickers.swift @@ -419,10 +419,21 @@ public func legacyAssetPickerEnqueueMessages(account: Account, signals: [Any]) - case let .file(data, thumbnail, mimeType, name, caption): switch data { case let .tempFile(path): + var previewRepresentations: [TelegramMediaImageRepresentation] = [] + if let thumbnail = thumbnail { + let resource = LocalFileMediaResource(fileId: Int64.random(in: Int64.min ... Int64.max)) + let thumbnailSize = thumbnail.size.aspectFitted(CGSize(width: 320.0, height: 320.0)) + let thumbnailImage = TGScaleImageToPixelSize(thumbnail, thumbnailSize)! + if let thumbnailData = thumbnailImage.jpegData(compressionQuality: 0.4) { + account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnailData) + previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailSize), resource: resource, progressiveSizes: [], immediateThumbnailData: nil)) + } + } + var randomId: Int64 = 0 arc4random_buf(&randomId, 8) let resource = LocalFileReferenceMediaResource(localFilePath: path, randomId: randomId) - let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: randomId), partialReference: nil, resource: resource, previewRepresentations: [], videoThumbnails: [], immediateThumbnailData: nil, mimeType: mimeType, size: nil, attributes: [.FileName(fileName: name)]) + let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: randomId), partialReference: nil, resource: resource, previewRepresentations: previewRepresentations, videoThumbnails: [], immediateThumbnailData: nil, mimeType: mimeType, size: nil, attributes: [.FileName(fileName: name)]) messages.append(LegacyAssetPickerEnqueueMessage(message: .message(text: caption ?? "", attributes: [], mediaReference: .standalone(media: media), replyToMessageId: nil, localGroupingKey: item.groupedId, correlationId: nil), uniqueId: item.uniqueId)) case let .asset(asset): var randomId: Int64 = 0 diff --git a/submodules/ManagedAnimationNode/Sources/ManagedAnimationNode.swift b/submodules/ManagedAnimationNode/Sources/ManagedAnimationNode.swift index 1dde44442a..d584c7a7e9 100644 --- a/submodules/ManagedAnimationNode/Sources/ManagedAnimationNode.swift +++ b/submodules/ManagedAnimationNode/Sources/ManagedAnimationNode.swift @@ -20,6 +20,13 @@ public final class ManagedAnimationState { var relativeTime: Double = 0.0 public var frameIndex: Int? + public var position: CGFloat { + if let frameIndex = frameIndex { + return CGFloat(frameIndex) / CGFloat(frameCount) + } else { + return 0.0 + } + } public var executedCallbacks = Set() diff --git a/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTMessageService.h b/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTMessageService.h index 761ed3029e..99d24a9b7c 100644 --- a/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTMessageService.h +++ b/submodules/MtProtoKit/PublicHeaders/MtProtoKit/MTMessageService.h @@ -8,6 +8,7 @@ @class MTMessageTransaction; @class MTApiEnvironment; @class MTSessionInfo; +@class MTTransportScheme; @protocol MTMessageService @@ -17,7 +18,7 @@ - (void)mtProtoDidAddService:(MTProto *)mtProto; - (void)mtProtoDidRemoveService:(MTProto *)mtProto; - (void)mtProtoPublicKeysUpdated:(MTProto *)mtProto datacenterId:(NSInteger)datacenterId publicKeys:(NSArray *)publicKeys; -- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo; +- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo scheme:(MTTransportScheme *)scheme; - (void)mtProtoDidChangeSession:(MTProto *)mtProto; - (void)mtProtoServerDidChangeSession:(MTProto *)mtProto firstValidMessageId:(int64_t)firstValidMessageId otherValidMessageIds:(NSArray *)otherValidMessageIds; - (void)mtProto:(MTProto *)mtProto receivedMessage:(MTIncomingMessage *)message authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector; diff --git a/submodules/MtProtoKit/Sources/MTBindKeyMessageService.m b/submodules/MtProtoKit/Sources/MTBindKeyMessageService.m index 6a9b69723b..96d723d844 100644 --- a/submodules/MtProtoKit/Sources/MTBindKeyMessageService.m +++ b/submodules/MtProtoKit/Sources/MTBindKeyMessageService.m @@ -42,7 +42,7 @@ [mtProto requestTransportTransaction]; } -- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo +- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo scheme:(MTTransportScheme *)scheme { if (_currentTransactionId != nil) { return nil; diff --git a/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m b/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m index ac200f686b..271707bf12 100644 --- a/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m +++ b/submodules/MtProtoKit/Sources/MTDatacenterAuthMessageService.m @@ -207,8 +207,12 @@ typedef enum { } } -- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo +- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo scheme:(MTTransportScheme *)scheme { + if (MTLogEnabled()) { + MTLog(@"[MTDatacenterAuthMessageService#%p mtProto#%p (media: %s) mtProtoMessageTransaction scheme:%@]", self, mtProto, mtProto.media ? "true" : "false", scheme); + } + if (_currentStageTransactionId == nil) { switch (_stage) diff --git a/submodules/MtProtoKit/Sources/MTProto.m b/submodules/MtProtoKit/Sources/MTProto.m index fd0dc1ce8e..2de22dc22d 100644 --- a/submodules/MtProtoKit/Sources/MTProto.m +++ b/submodules/MtProtoKit/Sources/MTProto.m @@ -952,9 +952,9 @@ static const NSUInteger MTMaxUnacknowledgedMessageCount = 64; NSMutableArray *messageServiceTransactions = [[NSMutableArray alloc] init]; for (id messageService in _messageServices) { - if ([messageService respondsToSelector:@selector(mtProtoMessageTransaction:authInfoSelector:sessionInfo:)]) + if ([messageService respondsToSelector:@selector(mtProtoMessageTransaction:authInfoSelector:sessionInfo:scheme:)]) { - MTMessageTransaction *messageTransaction = [messageService mtProtoMessageTransaction:self authInfoSelector:authInfoSelector sessionInfo:transactionSessionInfo]; + MTMessageTransaction *messageTransaction = [messageService mtProtoMessageTransaction:self authInfoSelector:authInfoSelector sessionInfo:transactionSessionInfo scheme:scheme]; if (messageTransaction != nil) { for (MTOutgoingMessage *message in messageTransaction.messagePayload) diff --git a/submodules/MtProtoKit/Sources/MTRequestMessageService.m b/submodules/MtProtoKit/Sources/MTRequestMessageService.m index 0b91e6d40e..ac402c9c84 100644 --- a/submodules/MtProtoKit/Sources/MTRequestMessageService.m +++ b/submodules/MtProtoKit/Sources/MTRequestMessageService.m @@ -405,7 +405,7 @@ return currentData; } -- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo +- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo scheme:(MTTransportScheme *)scheme { NSMutableArray *messages = nil; NSMutableDictionary *requestInternalIdToMessageInternalId = nil; diff --git a/submodules/MtProtoKit/Sources/MTResendMessageService.m b/submodules/MtProtoKit/Sources/MTResendMessageService.m index 585ec29599..468e30eec6 100644 --- a/submodules/MtProtoKit/Sources/MTResendMessageService.m +++ b/submodules/MtProtoKit/Sources/MTResendMessageService.m @@ -41,7 +41,7 @@ [mtProto requestTransportTransaction]; } -- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo +- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo scheme:(MTTransportScheme *)scheme { if (_currentRequestMessageId == 0 || _currentRequestTransactionId == nil) { diff --git a/submodules/MtProtoKit/Sources/MTTimeSyncMessageService.m b/submodules/MtProtoKit/Sources/MTTimeSyncMessageService.m index 8672ed541d..30f1fe2f15 100644 --- a/submodules/MtProtoKit/Sources/MTTimeSyncMessageService.m +++ b/submodules/MtProtoKit/Sources/MTTimeSyncMessageService.m @@ -45,7 +45,7 @@ [mtProto requestTransportTransaction]; } -- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo +- (MTMessageTransaction *)mtProtoMessageTransaction:(MTProto *)mtProto authInfoSelector:(MTDatacenterAuthInfoSelector)authInfoSelector sessionInfo:(MTSessionInfo *)sessionInfo scheme:(MTTransportScheme *)scheme { if (_currentTransactionId == nil) { diff --git a/submodules/SemanticStatusNode/Sources/SemanticStatusNode.swift b/submodules/SemanticStatusNode/Sources/SemanticStatusNode.swift index dcf38e6d72..970de65856 100644 --- a/submodules/SemanticStatusNode/Sources/SemanticStatusNode.swift +++ b/submodules/SemanticStatusNode/Sources/SemanticStatusNode.swift @@ -93,11 +93,13 @@ private final class SemanticStatusNodeIconContext: SemanticStatusNodeStateContex let transitionFraction: CGFloat let icon: SemanticStatusNodeIcon let iconImage: UIImage? - - init(transitionFraction: CGFloat, icon: SemanticStatusNodeIcon, iconImage: UIImage?) { + let iconOffset: CGFloat + + init(transitionFraction: CGFloat, icon: SemanticStatusNodeIcon, iconImage: UIImage?, iconOffset: CGFloat) { self.transitionFraction = transitionFraction self.icon = icon self.iconImage = iconImage + self.iconOffset = iconOffset super.init() } @@ -125,11 +127,11 @@ private final class SemanticStatusNodeIconContext: SemanticStatusNodeStateContex let diameter = size.width let factor = diameter / 50.0 - let size: CGSize var offset: CGFloat = 0.0 if let iconImage = self.iconImage { size = iconImage.size + offset = self.iconOffset } else { offset = 1.5 size = CGSize(width: 15.0, height: 18.0) @@ -161,12 +163,15 @@ private final class SemanticStatusNodeIconContext: SemanticStatusNodeStateContex let factor = diameter / 50.0 let size: CGSize + let offset: CGFloat if let iconImage = self.iconImage { size = iconImage.size + offset = self.iconOffset } else { size = CGSize(width: 15.0, height: 16.0) + offset = 0.0 } - context.translateBy(x: (diameter - size.width) / 2.0, y: (diameter - size.height) / 2.0) + context.translateBy(x: (diameter - size.width) / 2.0 + offset, y: (diameter - size.height) / 2.0) if (diameter < 40.0) { context.translateBy(x: size.width / 2.0, y: size.height / 2.0) context.scaleBy(x: factor, y: factor) @@ -248,6 +253,7 @@ private final class SemanticStatusNodeIconContext: SemanticStatusNodeStateContex var animationNode: PlayPauseIconNode? var iconImage: UIImage? + var iconOffset: CGFloat = 0.0 init(icon: SemanticStatusNodeIcon) { self.icon = icon @@ -255,10 +261,20 @@ private final class SemanticStatusNodeIconContext: SemanticStatusNodeStateContex if [.play, .pause].contains(icon) { self.animationNode = PlayPauseIconNode() self.animationNode?.imageUpdated = { [weak self] image in - self?.iconImage = image - self?.requestUpdate() + if let strongSelf = self { + strongSelf.iconImage = image + if var position = strongSelf.animationNode?.state?.position { + position = position * 2.0 + if position > 1.0 { + position = 2.0 - position + } + strongSelf.iconOffset = (1.0 - position) * 1.5 + } + strongSelf.requestUpdate() + } } self.iconImage = self.animationNode?.image + self.iconOffset = 1.5 } } @@ -269,7 +285,7 @@ private final class SemanticStatusNodeIconContext: SemanticStatusNodeStateContex var requestUpdate: () -> Void = {} func drawingState(transitionFraction: CGFloat) -> SemanticStatusNodeStateDrawingState { - return DrawingState(transitionFraction: transitionFraction, icon: self.icon, iconImage: self.iconImage) + return DrawingState(transitionFraction: transitionFraction, icon: self.icon, iconImage: self.iconImage, iconOffset: self.iconOffset) } } diff --git a/submodules/TelegramCallsUI/BUILD b/submodules/TelegramCallsUI/BUILD index 57dca2b206..24b48b2c18 100644 --- a/submodules/TelegramCallsUI/BUILD +++ b/submodules/TelegramCallsUI/BUILD @@ -91,6 +91,7 @@ swift_library( "//submodules/TextFormat:TextFormat", "//submodules/Markdown:Markdown", "//submodules/ChatTitleActivityNode:ChatTitleActivityNode", + "//third-party/libyuv:LibYuvBinding", ], visibility = [ "//visibility:public", diff --git a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift index 5d05a5ae05..e7c5443892 100644 --- a/submodules/TelegramCallsUI/Sources/CallControllerNode.swift +++ b/submodules/TelegramCallsUI/Sources/CallControllerNode.swift @@ -26,7 +26,7 @@ private func interpolate(from: CGFloat, to: CGFloat, value: CGFloat) -> CGFloat return (1.0 - value) * from + value * to } -private final class CallVideoNode: ASDisplayNode { +private final class CallVideoNode: ASDisplayNode, PreviewVideoNode { private let videoTransformContainer: ASDisplayNode private let videoView: PresentationCallVideoView @@ -40,6 +40,11 @@ private final class CallVideoNode: ASDisplayNode { private(set) var isReady: Bool = false private var isReadyTimer: SwiftSignalKit.Timer? + private let readyPromise = ValuePromise(false) + var ready: Signal { + return self.readyPromise.get() + } + private let isFlippedUpdated: (CallVideoNode) -> Void private(set) var currentOrientation: PresentationCallVideoView.Orientation @@ -87,6 +92,7 @@ private final class CallVideoNode: ASDisplayNode { } if !strongSelf.isReady { strongSelf.isReady = true + strongSelf.readyPromise.set(true) strongSelf.isReadyTimer?.invalidate() strongSelf.isReadyUpdated() } @@ -122,6 +128,7 @@ private final class CallVideoNode: ASDisplayNode { } if !strongSelf.isReady { strongSelf.isReady = true + strongSelf.readyPromise.set(true) strongSelf.isReadyUpdated() } }, queue: .mainQueue()) @@ -177,6 +184,10 @@ private final class CallVideoNode: ASDisplayNode { }) } + func updateLayout(size: CGSize, layoutMode: VideoNodeLayoutMode, transition: ContainedViewLayoutTransition) { + self.updateLayout(size: size, cornerRadius: self.currentCornerRadius, isOutgoing: true, deviceOrientation: .portrait, isCompactLayout: false, transition: transition) + } + func updateLayout(size: CGSize, cornerRadius: CGFloat, isOutgoing: Bool, deviceOrientation: UIDeviceOrientation, isCompactLayout: Bool, transition: ContainedViewLayoutTransition) { self.currentCornerRadius = cornerRadius @@ -582,13 +593,58 @@ final class CallControllerNode: ViewControllerTracingNode, CallControllerNodePro strongSelf.call.requestVideo() } - if strongSelf.displayedCameraConfirmation { - proceed() - } else { - strongSelf.present?(textAlertController(sharedContext: strongSelf.sharedContext, title: nil, text: strongSelf.presentationData.strings.Call_CameraConfirmationText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Call_CameraConfirmationConfirm, action: { - proceed() - })])) - } + strongSelf.call.makeOutgoingVideoView(completion: { [weak self] outgoingVideoView in + guard let strongSelf = self else { + return + } + + if let outgoingVideoView = outgoingVideoView { + outgoingVideoView.view.backgroundColor = .black + outgoingVideoView.view.clipsToBounds = true + + var updateLayoutImpl: ((ContainerViewLayout, CGFloat) -> Void)? + + let outgoingVideoNode = CallVideoNode(videoView: outgoingVideoView, disabledText: nil, assumeReadyAfterTimeout: true, isReadyUpdated: { + guard let strongSelf = self, let (layout, navigationBarHeight) = strongSelf.validLayout else { + return + } + updateLayoutImpl?(layout, navigationBarHeight) + }, orientationUpdated: { + guard let strongSelf = self, let (layout, navigationBarHeight) = strongSelf.validLayout else { + return + } + updateLayoutImpl?(layout, navigationBarHeight) + }, isFlippedUpdated: { _ in + guard let strongSelf = self, let (layout, navigationBarHeight) = strongSelf.validLayout else { + return + } + updateLayoutImpl?(layout, navigationBarHeight) + }) + + let controller = VoiceChatCameraPreviewController(sharedContext: strongSelf.sharedContext, cameraNode: outgoingVideoNode, shareCamera: { [weak self] _, _ in + if let strongSelf = self { + proceed() + } + }, switchCamera: { [weak self] in + Queue.mainQueue().after(0.1) { + self?.call.switchVideoCamera() + } + }) + strongSelf.present?(controller) + + updateLayoutImpl = { [weak controller] layout, navigationBarHeight in + controller?.containerLayoutUpdated(layout, transition: .immediate) + } + } + }) + +// if strongSelf.displayedCameraConfirmation { +// proceed() +// } else { +// strongSelf.present?(textAlertController(sharedContext: strongSelf.sharedContext, title: nil, text: strongSelf.presentationData.strings.Call_CameraConfirmationText, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: {}), TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Call_CameraConfirmationConfirm, action: { +// proceed() +// })])) +// } }) } else { strongSelf.call.disableVideo() diff --git a/submodules/TelegramCallsUI/Sources/GroupVideoNode.swift b/submodules/TelegramCallsUI/Sources/GroupVideoNode.swift index 3167b142ed..b18ea38665 100644 --- a/submodules/TelegramCallsUI/Sources/GroupVideoNode.swift +++ b/submodules/TelegramCallsUI/Sources/GroupVideoNode.swift @@ -6,22 +6,20 @@ import SwiftSignalKit import AccountContext import ContextUI -final class GroupVideoNode: ASDisplayNode { - static let useBlurTransparency: Bool = !UIAccessibility.isReduceTransparencyEnabled +enum VideoNodeLayoutMode { + case fillOrFitToSquare + case fillHorizontal + case fillVertical + case fit +} +final class GroupVideoNode: ASDisplayNode, PreviewVideoNode { enum Position { case tile case list case mainstage } - enum LayoutMode { - case fillOrFitToSquare - case fillHorizontal - case fillVertical - case fit - } - let sourceContainerNode: PinchSourceContainerNode private let containerNode: ASDisplayNode private let videoViewContainer: UIView @@ -29,15 +27,14 @@ final class GroupVideoNode: ASDisplayNode { private let backdropVideoViewContainer: UIView private let backdropVideoView: VideoRenderingView? - private var backdropEffectView: UIVisualEffectView? - + private var effectView: UIVisualEffectView? private var isBlurred: Bool = false private var isEnabled: Bool = false private var isBlurEnabled: Bool = false - private var validLayout: (CGSize, LayoutMode)? + private var validLayout: (CGSize, VideoNodeLayoutMode)? var tapped: (() -> Void)? @@ -61,21 +58,6 @@ final class GroupVideoNode: ASDisplayNode { super.init() - if let backdropVideoView = backdropVideoView { - self.backdropVideoViewContainer.addSubview(backdropVideoView) - self.view.addSubview(self.backdropVideoViewContainer) - - let effect: UIVisualEffect - if #available(iOS 13.0, *) { - effect = UIBlurEffect(style: .systemThinMaterialDark) - } else { - effect = UIBlurEffect(style: .dark) - } - //let backdropEffectView = UIVisualEffectView(effect: effect) - //self.view.addSubview(backdropEffectView) - //self.backdropEffectView = backdropEffectView - } - self.videoViewContainer.addSubview(self.videoView) self.addSubnode(self.sourceContainerNode) self.containerNode.view.addSubview(self.videoViewContainer) @@ -204,7 +186,7 @@ final class GroupVideoNode: ASDisplayNode { return rotatedAspect } - func updateLayout(size: CGSize, layoutMode: LayoutMode, transition: ContainedViewLayoutTransition) { + func updateLayout(size: CGSize, layoutMode: VideoNodeLayoutMode, transition: ContainedViewLayoutTransition) { self.validLayout = (size, layoutMode) let bounds = CGRect(origin: CGPoint(), size: size) self.sourceContainerNode.update(size: size, transition: .immediate) @@ -310,20 +292,6 @@ final class GroupVideoNode: ASDisplayNode { self.backdropVideoView?.updateIsEnabled(self.isEnabled && self.isBlurEnabled) - if self.isBlurEnabled { - self.backdropVideoView?.isHidden = false - self.backdropEffectView?.isHidden = false - } - transition.updatePosition(layer: backdropVideoView.layer, position: rotatedVideoFrame.center, force: true, completion: { [weak self] value in - guard let strongSelf = self, value else { - return - } - if !strongSelf.isBlurEnabled { - strongSelf.backdropVideoView?.updateIsEnabled(false) - strongSelf.backdropVideoView?.isHidden = true - strongSelf.backdropEffectView?.isHidden = false - } - }) transition.updateBounds(layer: backdropVideoView.layer, bounds: CGRect(origin: CGPoint(), size: normalizedVideoSize)) let transformScale: CGFloat = rotatedVideoFrame.width / normalizedVideoSize.width @@ -334,21 +302,6 @@ final class GroupVideoNode: ASDisplayNode { transition.updateTransformRotation(view: backdropVideoView, angle: angle) } - if let backdropEffectView = self.backdropEffectView { - let maxSide = max(bounds.width, bounds.height) + 32.0 - let squareBounds = CGRect(x: (bounds.width - maxSide) / 2.0, y: (bounds.height - maxSide) / 2.0, width: maxSide, height: maxSide) - - if case let .animated(duration, .spring) = transition { - UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 500.0, initialSpringVelocity: 0.0, options: .layoutSubviews, animations: { - backdropEffectView.frame = squareBounds - }) - } else { - transition.animateView { - backdropEffectView.frame = squareBounds - } - } - } - if let effectView = self.effectView { if case let .animated(duration, .spring) = transition { UIView.animate(withDuration: duration, delay: 0.0, usingSpringWithDamping: 500.0, initialSpringVelocity: 0.0, options: .layoutSubviews, animations: { diff --git a/submodules/TelegramCallsUI/Sources/PresentationCall.swift b/submodules/TelegramCallsUI/Sources/PresentationCall.swift index 6d1867ab59..77788a7da1 100644 --- a/submodules/TelegramCallsUI/Sources/PresentationCall.swift +++ b/submodules/TelegramCallsUI/Sources/PresentationCall.swift @@ -13,6 +13,7 @@ import TelegramPresentationData import DeviceAccess import UniversalMediaPlayer import AccountContext +import DeviceProximity final class PresentationCallToneRenderer { let queue: Queue @@ -287,6 +288,8 @@ public final class PresentationCallImpl: PresentationCall { private var useFrontCamera: Bool = true private var videoCapturer: OngoingCallVideoCapturer? + private var proximityManagerIndex: Int? + init( account: Account, audioSession: ManagedAudioSession, @@ -455,6 +458,11 @@ public final class PresentationCallImpl: PresentationCall { strongSelf.updateIsAudioSessionActive(value) } }) + + if callKitIntegration == nil { + self.proximityManagerIndex = DeviceProximityManager.shared().add { _ in + } + } } deinit { @@ -473,6 +481,10 @@ public final class PresentationCallImpl: PresentationCall { self.callKitIntegration?.dropCall(uuid: self.internalId) } } + + if let proximityManagerIndex = self.proximityManagerIndex { + DeviceProximityManager.shared().remove(proximityManagerIndex) + } } private func updateSessionState(sessionState: CallSession, callContextState: OngoingCallContextState?, reception: Int32?, audioSessionControl: ManagedAudioSessionControl?) { diff --git a/submodules/TelegramCallsUI/Sources/SampleBufferVideoRenderingView.swift b/submodules/TelegramCallsUI/Sources/SampleBufferVideoRenderingView.swift index a6dd976c83..a21f3859a0 100644 --- a/submodules/TelegramCallsUI/Sources/SampleBufferVideoRenderingView.swift +++ b/submodules/TelegramCallsUI/Sources/SampleBufferVideoRenderingView.swift @@ -6,6 +6,7 @@ import SwiftSignalKit import AccountContext import TelegramVoip import AVFoundation +import LibYuvBinding private func sampleBufferFromPixelBuffer(pixelBuffer: CVPixelBuffer) -> CMSampleBuffer? { var maybeFormat: CMVideoFormatDescription? @@ -40,6 +41,68 @@ private func sampleBufferFromPixelBuffer(pixelBuffer: CVPixelBuffer) -> CMSample return sampleBuffer } +private func copyI420BufferToNV12Buffer(buffer: OngoingGroupCallContext.VideoFrameData.I420Buffer, pixelBuffer: CVPixelBuffer) -> Bool { + guard CVPixelBufferGetPixelFormatType(pixelBuffer) == kCVPixelFormatType_420YpCbCr8BiPlanarFullRange else { + return false + } + guard CVPixelBufferGetWidthOfPlane(pixelBuffer, 0) == buffer.width else { + return false + } + guard CVPixelBufferGetHeightOfPlane(pixelBuffer, 0) == buffer.height else { + return false + } + + let cvRet = CVPixelBufferLockBaseAddress(pixelBuffer, []) + if cvRet != kCVReturnSuccess { + return false + } + defer { + CVPixelBufferUnlockBaseAddress(pixelBuffer, []) + } + + guard let dstY = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0) else { + return false + } + let dstStrideY = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0) + + guard let dstUV = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1) else { + return false + } + let dstStrideUV = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1) + + buffer.y.withUnsafeBytes { srcYBuffer in + guard let srcY = srcYBuffer.baseAddress else { + return + } + buffer.u.withUnsafeBytes { srcUBuffer in + guard let srcU = srcUBuffer.baseAddress else { + return + } + buffer.v.withUnsafeBytes { srcVBuffer in + guard let srcV = srcVBuffer.baseAddress else { + return + } + libyuv_I420ToNV12( + srcY.assumingMemoryBound(to: UInt8.self), + Int32(buffer.strideY), + srcU.assumingMemoryBound(to: UInt8.self), + Int32(buffer.strideU), + srcV.assumingMemoryBound(to: UInt8.self), + Int32(buffer.strideV), + dstY.assumingMemoryBound(to: UInt8.self), + Int32(dstStrideY), + dstUV.assumingMemoryBound(to: UInt8.self), + Int32(dstStrideUV), + Int32(buffer.width), + Int32(buffer.height) + ) + } + } + } + + return true +} + final class SampleBufferVideoRenderingView: UIView, VideoRenderingView { static override var layerClass: AnyClass { return AVSampleBufferDisplayLayer.self @@ -111,6 +174,28 @@ final class SampleBufferVideoRenderingView: UIView, VideoRenderingView { if let sampleBuffer = sampleBufferFromPixelBuffer(pixelBuffer: buffer.pixelBuffer) { self.sampleBufferLayer.enqueue(sampleBuffer) } + case let .i420(buffer): + let ioSurfaceProperties = NSMutableDictionary() + let options = NSMutableDictionary() + options.setObject(ioSurfaceProperties, forKey: kCVPixelBufferIOSurfacePropertiesKey as NSString) + + var pixelBuffer: CVPixelBuffer? + CVPixelBufferCreate( + kCFAllocatorDefault, + buffer.width, + buffer.height, + kCVPixelFormatType_420YpCbCr8BiPlanarFullRange, + options, + &pixelBuffer + ) + + if let pixelBuffer = pixelBuffer { + if copyI420BufferToNV12Buffer(buffer: buffer, pixelBuffer: pixelBuffer) { + if let sampleBuffer = sampleBufferFromPixelBuffer(pixelBuffer: pixelBuffer) { + self.sampleBufferLayer.enqueue(sampleBuffer) + } + } + } default: break } diff --git a/submodules/TelegramCallsUI/Sources/VideoRenderingContext.swift b/submodules/TelegramCallsUI/Sources/VideoRenderingContext.swift index e9bb3e13cd..b4d66797fd 100644 --- a/submodules/TelegramCallsUI/Sources/VideoRenderingContext.swift +++ b/submodules/TelegramCallsUI/Sources/VideoRenderingContext.swift @@ -35,11 +35,17 @@ class VideoRenderingContext { func makeView(input: Signal, blur: Bool) -> VideoRenderingView? { #if targetEnvironment(simulator) + if blur { + return nil + } return SampleBufferVideoRenderingView(input: input) #else if #available(iOS 13.0, *) { return MetalVideoRenderingView(renderingContext: self.metalContext, input: input, blur: blur) } else { + if blur { + return nil + } return SampleBufferVideoRenderingView(input: input) } #endif diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatCameraPreviewController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatCameraPreviewController.swift index 05b5d1185a..f2cfea7c54 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatCameraPreviewController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatCameraPreviewController.swift @@ -15,23 +15,32 @@ import ReplayKit private let accentColor: UIColor = UIColor(rgb: 0x007aff) +protocol PreviewVideoNode: ASDisplayNode { + var ready: Signal { get } + + func flip(withBackground: Bool) + func updateIsBlurred(isBlurred: Bool, light: Bool, animated: Bool) + + func updateLayout(size: CGSize, layoutMode: VideoNodeLayoutMode, transition: ContainedViewLayoutTransition) +} + final class VoiceChatCameraPreviewController: ViewController { private var controllerNode: VoiceChatCameraPreviewControllerNode { return self.displayNode as! VoiceChatCameraPreviewControllerNode } - private let context: AccountContext + private let sharedContext: SharedAccountContext private var animatedIn = false - private let cameraNode: GroupVideoNode + private let cameraNode: PreviewVideoNode private let shareCamera: (ASDisplayNode, Bool) -> Void private let switchCamera: () -> Void private var presentationDataDisposable: Disposable? - init(context: AccountContext, cameraNode: GroupVideoNode, shareCamera: @escaping (ASDisplayNode, Bool) -> Void, switchCamera: @escaping () -> Void) { - self.context = context + init(sharedContext: SharedAccountContext, cameraNode: PreviewVideoNode, shareCamera: @escaping (ASDisplayNode, Bool) -> Void, switchCamera: @escaping () -> Void) { + self.sharedContext = sharedContext self.cameraNode = cameraNode self.shareCamera = shareCamera self.switchCamera = switchCamera @@ -42,7 +51,7 @@ final class VoiceChatCameraPreviewController: ViewController { self.blocksBackgroundWhenInOverlay = true - self.presentationDataDisposable = (context.sharedContext.presentationData + self.presentationDataDisposable = (sharedContext.presentationData |> deliverOnMainQueue).start(next: { [weak self] presentationData in if let strongSelf = self { strongSelf.controllerNode.updatePresentationData(presentationData) @@ -61,7 +70,7 @@ final class VoiceChatCameraPreviewController: ViewController { } override public func loadDisplayNode() { - self.displayNode = VoiceChatCameraPreviewControllerNode(controller: self, context: self.context, cameraNode: self.cameraNode) + self.displayNode = VoiceChatCameraPreviewControllerNode(controller: self, sharedContext: self.sharedContext, cameraNode: self.cameraNode) self.controllerNode.shareCamera = { [weak self] unmuted in if let strongSelf = self { strongSelf.shareCamera(strongSelf.cameraNode, unmuted) @@ -106,10 +115,10 @@ final class VoiceChatCameraPreviewController: ViewController { private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, UIScrollViewDelegate { private weak var controller: VoiceChatCameraPreviewController? - private let context: AccountContext + private let sharedContext: SharedAccountContext private var presentationData: PresentationData - private let cameraNode: GroupVideoNode + private let cameraNode: PreviewVideoNode private let dimNode: ASDisplayNode private let wrappingScrollNode: ASScrollNode private let contentContainerNode: ASDisplayNode @@ -119,18 +128,19 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U private let titleNode: ASTextNode private let previewContainerNode: ASDisplayNode private let shimmerNode: ShimmerEffectForegroundNode - private let cameraButton: SolidRoundedButtonNode - private let screenButton: SolidRoundedButtonNode + private let doneButton: SolidRoundedButtonNode private var broadcastPickerView: UIView? private let cancelButton: SolidRoundedButtonNode private let microphoneButton: HighlightTrackingButtonNode private let microphoneEffectView: UIVisualEffectView private let microphoneIconNode: VoiceChatMicrophoneNode + + private let placeholderTextNode: ImmediateTextNode + private let placeholderIconNode: ASImageNode - private let switchCameraButton: HighlightTrackingButtonNode - private let switchCameraEffectView: UIVisualEffectView - private let switchCameraIconNode: ASImageNode + private let tabsNode: TabsSegmentedControlNode + private var selectedTabIndex: Int = 0 private var containerLayout: (ContainerViewLayout, CGFloat)? @@ -145,10 +155,10 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U var dismiss: (() -> Void)? var cancel: (() -> Void)? - init(controller: VoiceChatCameraPreviewController, context: AccountContext, cameraNode: GroupVideoNode) { + init(controller: VoiceChatCameraPreviewController, sharedContext: SharedAccountContext, cameraNode: PreviewVideoNode) { self.controller = controller - self.context = context - self.presentationData = context.sharedContext.currentPresentationData.with { $0 } + self.sharedContext = sharedContext + self.presentationData = sharedContext.currentPresentationData.with { $0 } self.cameraNode = cameraNode @@ -185,16 +195,14 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U self.titleNode = ASTextNode() self.titleNode.attributedText = NSAttributedString(string: title, font: Font.bold(17.0), textColor: textColor) - self.cameraButton = SolidRoundedButtonNode(theme: SolidRoundedButtonTheme(backgroundColor: accentColor, foregroundColor: .white), font: .bold, height: 52.0, cornerRadius: 11.0, gloss: false) - self.cameraButton.title = self.presentationData.strings.VoiceChat_VideoPreviewShareCamera + self.doneButton = SolidRoundedButtonNode(theme: SolidRoundedButtonTheme(backgroundColor: accentColor, foregroundColor: .white), font: .bold, height: 52.0, cornerRadius: 11.0, gloss: false) + self.doneButton.title = self.presentationData.strings.VoiceChat_VideoPreviewContinue - self.screenButton = SolidRoundedButtonNode(theme: SolidRoundedButtonTheme(backgroundColor: buttonColor, foregroundColor: buttonTextColor), font: .bold, height: 52.0, cornerRadius: 11.0, gloss: false) - self.screenButton.title = self.presentationData.strings.VoiceChat_VideoPreviewShareScreen - if #available(iOS 12.0, *) { let broadcastPickerView = RPSystemBroadcastPickerView(frame: CGRect(x: 0, y: 0, width: 50, height: 52.0)) broadcastPickerView.alpha = 0.02 - broadcastPickerView.preferredExtension = "\(self.context.sharedContext.applicationBindings.appBundleId).BroadcastUpload" + broadcastPickerView.isHidden = true + broadcastPickerView.preferredExtension = "\(self.sharedContext.applicationBindings.appBundleId).BroadcastUpload" broadcastPickerView.showsMicrophoneButton = false self.broadcastPickerView = broadcastPickerView } @@ -209,27 +217,29 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U self.shimmerNode = ShimmerEffectForegroundNode(size: 200.0) self.previewContainerNode.addSubnode(self.shimmerNode) - + self.microphoneButton = HighlightTrackingButtonNode() self.microphoneButton.isSelected = true - self.microphoneEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark)) + self.microphoneEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .light)) self.microphoneEffectView.clipsToBounds = true self.microphoneEffectView.layer.cornerRadius = 24.0 self.microphoneEffectView.isUserInteractionEnabled = false self.microphoneIconNode = VoiceChatMicrophoneNode() +// self.microphoneIconNode.alpha = 0.75 self.microphoneIconNode.update(state: .init(muted: false, filled: true, color: .white), animated: false) - self.switchCameraButton = HighlightTrackingButtonNode() - self.switchCameraEffectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark)) - self.switchCameraEffectView.clipsToBounds = true - self.switchCameraEffectView.layer.cornerRadius = 24.0 - self.switchCameraEffectView.isUserInteractionEnabled = false + self.tabsNode = TabsSegmentedControlNode(items: [TabsSegmentedControlNode.Item(title: "Front Camera"), TabsSegmentedControlNode.Item(title: "Back Camera"), TabsSegmentedControlNode.Item(title: "Share Screen")], selectedIndex: 0) - self.switchCameraIconNode = ASImageNode() - self.switchCameraIconNode.displaysAsynchronously = false - self.switchCameraIconNode.image = generateTintedImage(image: UIImage(bundleImageName: "Call/SwitchCameraIcon"), color: .white) - self.switchCameraIconNode.contentMode = .center + self.placeholderTextNode = ImmediateTextNode() + self.placeholderTextNode.alpha = 0.0 + self.placeholderTextNode.maximumNumberOfLines = 3 + self.placeholderTextNode.textAlignment = .center + + self.placeholderIconNode = ASImageNode() + self.placeholderIconNode.alpha = 0.0 + self.placeholderIconNode.contentMode = .scaleAspectFit + self.placeholderIconNode.displaysAsynchronously = false super.init() @@ -248,8 +258,7 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U self.backgroundNode.addSubnode(self.effectNode) self.backgroundNode.addSubnode(self.contentBackgroundNode) self.contentContainerNode.addSubnode(self.titleNode) - self.contentContainerNode.addSubnode(self.cameraButton) - self.contentContainerNode.addSubnode(self.screenButton) + self.contentContainerNode.addSubnode(self.doneButton) if let broadcastPickerView = self.broadcastPickerView { self.contentContainerNode.view.addSubview(broadcastPickerView) } @@ -258,14 +267,40 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U self.contentContainerNode.addSubnode(self.previewContainerNode) self.previewContainerNode.addSubnode(self.cameraNode) - self.previewContainerNode.addSubnode(self.microphoneButton) - self.microphoneButton.view.addSubview(self.microphoneEffectView) - self.microphoneButton.addSubnode(self.microphoneIconNode) - self.previewContainerNode.addSubnode(self.switchCameraButton) - self.switchCameraButton.view.addSubview(self.switchCameraEffectView) - self.switchCameraButton.addSubnode(self.switchCameraIconNode) - self.cameraButton.pressed = { [weak self] in + self.previewContainerNode.addSubnode(self.placeholderIconNode) + self.previewContainerNode.addSubnode(self.placeholderTextNode) + + if self.cameraNode is GroupVideoNode { + self.previewContainerNode.addSubnode(self.microphoneButton) + self.microphoneButton.view.addSubview(self.microphoneEffectView) + self.microphoneButton.addSubnode(self.microphoneIconNode) + } + self.previewContainerNode.addSubnode(self.tabsNode) + + self.tabsNode.selectedIndexChanged = { [weak self] index in + if let strongSelf = self { + if (index == 0 && strongSelf.selectedTabIndex == 1) || (index == 1 && strongSelf.selectedTabIndex == 0) { + strongSelf.switchCamera?() + } + if index == 2 && [0, 1].contains(strongSelf.selectedTabIndex) { + strongSelf.broadcastPickerView?.isHidden = false + strongSelf.cameraNode.updateIsBlurred(isBlurred: true, light: false, animated: true) + let transition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .easeInOut) + transition.updateAlpha(node: strongSelf.placeholderTextNode, alpha: 1.0) + transition.updateAlpha(node: strongSelf.placeholderIconNode, alpha: 1.0) + } else if [0, 1].contains(index) && strongSelf.selectedTabIndex == 2 { + strongSelf.broadcastPickerView?.isHidden = true + strongSelf.cameraNode.updateIsBlurred(isBlurred: false, light: false, animated: true) + let transition = ContainedViewLayoutTransition.animated(duration: 0.3, curve: .easeInOut) + transition.updateAlpha(node: strongSelf.placeholderTextNode, alpha: 0.0) + transition.updateAlpha(node: strongSelf.placeholderIconNode, alpha: 0.0) + } + strongSelf.selectedTabIndex = index + } + } + + self.doneButton.pressed = { [weak self] in if let strongSelf = self { strongSelf.shareCamera?(strongSelf.microphoneButton.isSelected) } @@ -289,19 +324,6 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U } } - self.switchCameraButton.addTarget(self, action: #selector(self.switchCameraPressed), forControlEvents: .touchUpInside) - self.switchCameraButton.highligthedChanged = { [weak self] highlighted in - if let strongSelf = self { - if highlighted { - let transition: ContainedViewLayoutTransition = .animated(duration: 0.3, curve: .spring) - transition.updateSublayerTransformScale(node: strongSelf.switchCameraButton, scale: 0.9) - } else { - let transition: ContainedViewLayoutTransition = .animated(duration: 0.5, curve: .spring) - transition.updateSublayerTransformScale(node: strongSelf.switchCameraButton, scale: 1.0) - } - } - } - self.readyDisposable.set(self.cameraNode.ready.start(next: { [weak self] ready in if let strongSelf = self, ready { Queue.mainQueue().after(0.07) { @@ -322,19 +344,7 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U self.microphoneButton.isSelected = !self.microphoneButton.isSelected self.microphoneIconNode.update(state: .init(muted: !self.microphoneButton.isSelected, filled: true, color: .white), animated: true) } - - @objc private func switchCameraPressed() { - self.hapticFeedback.impact(.light) - self.switchCamera?() - - let springDuration: Double = 0.7 - let springDamping: CGFloat = 100.0 - self.switchCameraButton.isUserInteractionEnabled = false - self.switchCameraIconNode.layer.animateSpring(from: 0.0 as NSNumber, to: CGFloat.pi as NSNumber, keyPath: "transform.rotation.z", duration: springDuration, damping: springDamping, completion: { [weak self] _ in - self?.switchCameraButton.isUserInteractionEnabled = true - }) - } - + func updatePresentationData(_ presentationData: PresentationData) { self.presentationData = presentationData } @@ -368,7 +378,7 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U self.dimNode.position = dimPosition }) - self.applicationStateDisposable = (self.context.sharedContext.applicationBindings.applicationIsActive + self.applicationStateDisposable = (self.sharedContext.applicationBindings.applicationIsActive |> filter { !$0 } |> take(1) |> deliverOnMainQueue).start(next: { [weak self] _ in @@ -443,9 +453,6 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U insets.top = max(10.0, insets.top) var buttonOffset: CGFloat = 60.0 - if let _ = self.broadcastPickerView { - buttonOffset *= 2.0 - } let bottomInset: CGFloat = isTablet ? 31.0 : 10.0 + cleanInsets.bottom let titleHeight: CGFloat = 54.0 var contentHeight = titleHeight + bottomInset + 52.0 + 17.0 @@ -522,24 +529,27 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U self.cameraNode.frame = CGRect(origin: CGPoint(), size: previewSize) self.cameraNode.updateLayout(size: previewSize, layoutMode: isLandscape ? .fillHorizontal : .fillVertical, transition: .immediate) - let microphoneFrame = CGRect(x: 16.0, y: previewSize.height - 48.0 - 16.0, width: 48.0, height: 48.0) + let microphoneFrame = CGRect(x: 8.0, y: previewSize.height - 48.0 - 8.0 - 48.0, width: 48.0, height: 48.0) transition.updateFrame(node: self.microphoneButton, frame: microphoneFrame) transition.updateFrame(view: self.microphoneEffectView, frame: CGRect(origin: CGPoint(), size: microphoneFrame.size)) transition.updateFrameAsPositionAndBounds(node: self.microphoneIconNode, frame: CGRect(origin: CGPoint(x: 1.0, y: 0.0), size: microphoneFrame.size).insetBy(dx: 6.0, dy: 6.0)) self.microphoneIconNode.transform = CATransform3DMakeScale(1.2, 1.2, 1.0) - let switchCameraFrame = CGRect(x: previewSize.width - 48.0 - 16.0, y: previewSize.height - 48.0 - 16.0, width: 48.0, height: 48.0) - transition.updateFrame(node: self.switchCameraButton, frame: switchCameraFrame) - transition.updateFrame(view: self.switchCameraEffectView, frame: CGRect(origin: CGPoint(), size: switchCameraFrame.size)) - transition.updateFrame(node: self.switchCameraIconNode, frame: CGRect(origin: CGPoint(), size: switchCameraFrame.size)) + let tabsFrame = CGRect(x: 8.0, y: previewSize.height - 40.0 - 8.0, width: previewSize.width - 16.0, height: 40.0) + self.tabsNode.updateLayout(size: tabsFrame.size, transition: transition) + transition.updateFrame(node: self.tabsNode, frame: tabsFrame) + + self.placeholderTextNode.attributedText = NSAttributedString(string: presentationData.strings.VoiceChat_VideoPreviewShareScreenInfo, font: Font.semibold(14.0), textColor: .white) + self.placeholderIconNode.image = generateTintedImage(image: UIImage(bundleImageName: isTablet ? "Call/ScreenShareTablet" : "Call/ScreenSharePhone"), color: .white) + + let placeholderTextSize = self.placeholderTextNode.updateLayout(CGSize(width: previewSize.width - 80.0, height: 100.0)) + transition.updateFrame(node: self.placeholderTextNode, frame: CGRect(origin: CGPoint(x: floor((previewSize.width - placeholderTextSize.width) / 2.0), y: floorToScreenPixels(previewSize.height / 2.0) + 10.0), size: placeholderTextSize)) + if let imageSize = self.placeholderIconNode.image?.size { + transition.updateFrame(node: self.placeholderIconNode, frame: CGRect(origin: CGPoint(x: floor((previewSize.width - imageSize.width) / 2.0), y: floorToScreenPixels(previewSize.height / 2.0) - imageSize.height - 8.0), size: imageSize)) + } if isLandscape { var buttonsCount: Int = 2 - if let _ = self.broadcastPickerView { - buttonsCount += 1 - } else { - self.screenButton.isHidden = true - } let buttonInset: CGFloat = 6.0 var leftButtonInset = buttonInset @@ -552,33 +562,19 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U } let buttonWidth = floorToScreenPixels((availableWidth - CGFloat(buttonsCount + 1) * buttonInset) / CGFloat(buttonsCount)) - let cameraButtonHeight = self.cameraButton.updateLayout(width: buttonWidth, transition: transition) - let screenButtonHeight = self.screenButton.updateLayout(width: buttonWidth, transition: transition) + let cameraButtonHeight = self.doneButton.updateLayout(width: buttonWidth, transition: transition) let cancelButtonHeight = self.cancelButton.updateLayout(width: buttonWidth, transition: transition) transition.updateFrame(node: self.cancelButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cancelButtonHeight)) - if let broadcastPickerView = self.broadcastPickerView { - transition.updateFrame(node: self.screenButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: screenButtonHeight)) - broadcastPickerView.frame = CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: screenButtonHeight) - transition.updateFrame(node: self.cameraButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cameraButtonHeight)) - } else { - transition.updateFrame(node: self.cameraButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cameraButtonHeight)) - } - + transition.updateFrame(node: self.doneButton, frame: CGRect(x: layout.safeInsets.left + leftButtonInset + buttonWidth + buttonInset, y: previewFrame.maxY + 10.0, width: buttonWidth, height: cameraButtonHeight)) + self.broadcastPickerView?.frame = self.doneButton.frame } else { let bottomInset = isTablet ? 21.0 : insets.bottom + 16.0 let buttonInset: CGFloat = 16.0 - let cameraButtonHeight = self.cameraButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition) - transition.updateFrame(node: self.cameraButton, frame: CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - bottomInset - buttonOffset, width: contentFrame.width, height: cameraButtonHeight)) - - let screenButtonHeight = self.screenButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition) - transition.updateFrame(node: self.screenButton, frame: CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - 8.0 - screenButtonHeight - bottomInset, width: contentFrame.width, height: screenButtonHeight)) - if let broadcastPickerView = self.broadcastPickerView { - broadcastPickerView.frame = CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - 8.0 - screenButtonHeight - bottomInset, width: contentFrame.width + 1000.0, height: screenButtonHeight) - } else { - self.screenButton.isHidden = true - } - + let cameraButtonHeight = self.doneButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition) + transition.updateFrame(node: self.doneButton, frame: CGRect(x: buttonInset, y: contentHeight - cameraButtonHeight - bottomInset - buttonOffset, width: contentFrame.width, height: cameraButtonHeight)) + self.broadcastPickerView?.frame = self.doneButton.frame + let cancelButtonHeight = self.cancelButton.updateLayout(width: contentFrame.width - buttonInset * 2.0, transition: transition) transition.updateFrame(node: self.cancelButton, frame: CGRect(x: buttonInset, y: contentHeight - cancelButtonHeight - bottomInset, width: contentFrame.width, height: cancelButtonHeight)) } @@ -586,3 +582,303 @@ private class VoiceChatCameraPreviewControllerNode: ViewControllerTracingNode, U transition.updateFrame(node: self.contentContainerNode, frame: contentFrame) } } + +private let textFont = Font.medium(14.0) + +class TabsSegmentedControlNode: ASDisplayNode, UIGestureRecognizerDelegate { + struct Item: Equatable { + public let title: String + + public init(title: String) { + self.title = title + } + } + + private var blurEffectView: UIVisualEffectView? + private var vibrancyEffectView: UIVisualEffectView? + + private let selectionNode: ASDisplayNode + private var itemNodes: [HighlightTrackingButtonNode] + private var highlightedItemNodes: [HighlightTrackingButtonNode] + + private var validLayout: CGSize? + + private var _items: [Item] + private var _selectedIndex: Int = 0 + + public var selectedIndex: Int { + get { + return self._selectedIndex + } + set { + guard newValue != self._selectedIndex else { + return + } + self._selectedIndex = newValue + if let size = self.validLayout { + self.updateLayout(size: size, transition: .immediate) + } + } + } + + public func setSelectedIndex(_ index: Int, animated: Bool) { + guard index != self._selectedIndex else { + return + } + self._selectedIndex = index + if let size = self.validLayout { + self.updateLayout(size: size, transition: .animated(duration: 0.2, curve: .easeInOut)) + } + } + + public var selectedIndexChanged: (Int) -> Void = { _ in } + + private var gestureRecognizer: UIPanGestureRecognizer? + private var gestureSelectedIndex: Int? + + public init(items: [Item], selectedIndex: Int) { + self._items = items + self._selectedIndex = selectedIndex + + self.selectionNode = ASDisplayNode() + self.selectionNode.clipsToBounds = true + self.selectionNode.backgroundColor = .black + self.selectionNode.alpha = 0.75 + + self.itemNodes = items.map { item in + let itemNode = HighlightTrackingButtonNode() + itemNode.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 8.0, bottom: 0.0, right: 8.0) + itemNode.imageNode.isHidden = true + itemNode.titleNode.maximumNumberOfLines = 1 + itemNode.titleNode.truncationMode = .byTruncatingTail + itemNode.titleNode.alpha = 0.75 + itemNode.accessibilityLabel = item.title + itemNode.accessibilityTraits = [.button] + itemNode.setTitle(item.title, with: textFont, with: .black, for: .normal) + return itemNode + } + + self.highlightedItemNodes = items.map { item in + let itemNode = HighlightTrackingButtonNode() + itemNode.isUserInteractionEnabled = false + itemNode.isHidden = true + itemNode.contentEdgeInsets = UIEdgeInsets(top: 0.0, left: 8.0, bottom: 0.0, right: 8.0) + itemNode.imageNode.isHidden = true + itemNode.titleNode.maximumNumberOfLines = 1 + itemNode.titleNode.truncationMode = .byTruncatingTail + itemNode.setTitle(item.title, with: textFont, with: .white, for: .normal) + return itemNode + } + + super.init() + + self.clipsToBounds = true + if #available(iOS 13.0, *) { + self.layer.cornerCurve = .continuous + self.selectionNode.layer.cornerCurve = .continuous + } + + self.setupButtons() + } + + override func didLoad() { + super.didLoad() + + self.view.disablesInteractiveTransitionGestureRecognizer = true + + let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:))) + gestureRecognizer.delegate = self + self.view.addGestureRecognizer(gestureRecognizer) + self.gestureRecognizer = gestureRecognizer + + let blurEffect = UIBlurEffect(style: .light) + let blurEffectView = UIVisualEffectView(effect: blurEffect) + self.blurEffectView = blurEffectView + self.view.addSubview(blurEffectView) + + let vibrancyEffect: UIVibrancyEffect + if #available(iOS 13.0, *) { + vibrancyEffect = UIVibrancyEffect(blurEffect: blurEffect, style: .label) + } else { + vibrancyEffect = UIVibrancyEffect(blurEffect: blurEffect) + } + let vibrancyEffectView = UIVisualEffectView(effect: vibrancyEffect) + self.vibrancyEffectView = vibrancyEffectView + + blurEffectView.contentView.addSubview(vibrancyEffectView) + + self.itemNodes.forEach(vibrancyEffectView.contentView.addSubnode(_:)) + vibrancyEffectView.contentView.addSubnode(self.selectionNode) + + self.highlightedItemNodes.forEach(self.addSubnode(_:)) + } + + func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) { + self.validLayout = size + + let bounds = CGRect(origin: CGPoint(), size: size) + + self.cornerRadius = size.height / 2.0 + + if let blurEffectView = self.blurEffectView { + transition.updateFrame(view: blurEffectView, frame: bounds) + } + + if let vibrancyEffectView = self.vibrancyEffectView { + transition.updateFrame(view: vibrancyEffectView, frame: bounds) + } + + let selectedIndex: Int + if let gestureSelectedIndex = self.gestureSelectedIndex { + selectedIndex = gestureSelectedIndex + } else { + selectedIndex = self.selectedIndex + } + + if !self.itemNodes.isEmpty { + let itemSize = CGSize(width: floorToScreenPixels(size.width / CGFloat(self.itemNodes.count)), height: size.height) + + let selectionFrame = CGRect(origin: CGPoint(x: itemSize.width * CGFloat(selectedIndex), y: 0.0), size: itemSize).insetBy(dx: 4.0, dy: 4.0) + transition.updateFrameAsPositionAndBounds(node: self.selectionNode, frame: selectionFrame) + self.selectionNode.cornerRadius = selectionFrame.height / 2.0 + + for i in 0 ..< self.itemNodes.count { + let itemNode = self.itemNodes[i] + let highlightedItemNode = self.highlightedItemNodes[i] + let _ = itemNode.measure(itemSize) + transition.updateFrame(node: itemNode, frame: CGRect(origin: CGPoint(x: itemSize.width * CGFloat(i), y: (size.height - itemSize.height) / 2.0), size: itemSize)) + transition.updateFrame(node: highlightedItemNode, frame: CGRect(origin: CGPoint(x: itemSize.width * CGFloat(i), y: (size.height - itemSize.height) / 2.0), size: itemSize)) + + let isSelected = selectedIndex == i + if itemNode.isSelected != isSelected { + if case .animated = transition { + UIView.transition(with: itemNode.view, duration: 0.2, options: .transitionCrossDissolve, animations: { + itemNode.isSelected = isSelected + highlightedItemNode.isHidden = !isSelected + }, completion: nil) + } else { + itemNode.isSelected = isSelected + highlightedItemNode.isHidden = !isSelected + } + if isSelected { + itemNode.accessibilityTraits.insert(.selected) + } else { + itemNode.accessibilityTraits.remove(.selected) + } + } + } + } + } + + private func setupButtons() { + for i in 0 ..< self.itemNodes.count { + let itemNode = self.itemNodes[i] + itemNode.addTarget(self, action: #selector(self.buttonPressed(_:)), forControlEvents: .touchUpInside) + itemNode.highligthedChanged = { [weak self, weak itemNode] highlighted in + if let strongSelf = self, let itemNode = itemNode { + let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut) + if strongSelf.selectedIndex == i { + if let gestureRecognizer = strongSelf.gestureRecognizer, case .began = gestureRecognizer.state { + } else { + strongSelf.updateButtonsHighlights(highlightedIndex: highlighted ? i : nil, gestureSelectedIndex: strongSelf.gestureSelectedIndex) + } + } else if highlighted { + transition.updateAlpha(node: itemNode, alpha: 0.4) + } + if !highlighted { + transition.updateAlpha(node: itemNode, alpha: 1.0) + } + } + } + } + } + + private func updateButtonsHighlights(highlightedIndex: Int?, gestureSelectedIndex: Int?) { + let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut) + if highlightedIndex == nil && gestureSelectedIndex == nil { + transition.updateTransformScale(node: self.selectionNode, scale: 1.0) + } else { + transition.updateTransformScale(node: self.selectionNode, scale: 0.96) + } + for i in 0 ..< self.itemNodes.count { + let itemNode = self.itemNodes[i] + let highlightedItemNode = self.highlightedItemNodes[i] + if i == highlightedIndex || i == gestureSelectedIndex { + transition.updateTransformScale(node: itemNode, scale: 0.96) + transition.updateTransformScale(node: highlightedItemNode, scale: 0.96) + } else { + transition.updateTransformScale(node: itemNode, scale: 1.0) + transition.updateTransformScale(node: highlightedItemNode, scale: 1.0) + } + } + } + + private func updateButtonsHighlights() { + let transition = ContainedViewLayoutTransition.animated(duration: 0.25, curve: .easeInOut) + if let gestureSelectedIndex = self.gestureSelectedIndex { + for i in 0 ..< self.itemNodes.count { + let itemNode = self.itemNodes[i] + let highlightedItemNode = self.highlightedItemNodes[i] + transition.updateTransformScale(node: itemNode, scale: i == gestureSelectedIndex ? 0.96 : 1.0) + transition.updateTransformScale(node: highlightedItemNode, scale: i == gestureSelectedIndex ? 0.96 : 1.0) + } + } else { + for itemNode in self.itemNodes { + transition.updateTransformScale(node: itemNode, scale: 1.0) + } + for itemNode in self.highlightedItemNodes { + transition.updateTransformScale(node: itemNode, scale: 1.0) + } + } + } + + @objc private func buttonPressed(_ button: HighlightTrackingButtonNode) { + guard let index = self.itemNodes.firstIndex(of: button) else { + return + } + + self._selectedIndex = index + self.selectedIndexChanged(index) + if let size = self.validLayout { + self.updateLayout(size: size, transition: .animated(duration: 0.2, curve: .slide)) + } + } + + public override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + return self.selectionNode.frame.contains(gestureRecognizer.location(in: self.view)) + } + + @objc private func panGesture(_ recognizer: UIPanGestureRecognizer) { + let location = recognizer.location(in: self.view) + switch recognizer.state { + case .changed: + if !self.selectionNode.frame.contains(location) { + let point = CGPoint(x: max(0.0, min(self.bounds.width, location.x)), y: 1.0) + for i in 0 ..< self.itemNodes.count { + let itemNode = self.itemNodes[i] + if itemNode.frame.contains(point) { + if i != self.gestureSelectedIndex { + self.gestureSelectedIndex = i + self.updateButtonsHighlights(highlightedIndex: nil, gestureSelectedIndex: i) + if let size = self.validLayout { + self.updateLayout(size: size, transition: .animated(duration: 0.35, curve: .slide)) + } + } + break + } + } + } + case .ended: + if let gestureSelectedIndex = self.gestureSelectedIndex { + if gestureSelectedIndex != self.selectedIndex { + self._selectedIndex = gestureSelectedIndex + self.selectedIndexChanged(gestureSelectedIndex) + } + self.gestureSelectedIndex = nil + } + self.updateButtonsHighlights(highlightedIndex: nil, gestureSelectedIndex: nil) + default: + break + } + } +} diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift index 4cb3238e50..aea946ec72 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatController.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatController.swift @@ -3495,7 +3495,7 @@ public final class VoiceChatController: ViewController { let input = videoCapturer.video() if let videoView = strongSelf.videoRenderingContext.makeView(input: input, blur: false) { let cameraNode = GroupVideoNode(videoView: videoView, backdropVideoView: nil) - let controller = VoiceChatCameraPreviewController(context: strongSelf.context, cameraNode: cameraNode, shareCamera: { [weak self] _, unmuted in + let controller = VoiceChatCameraPreviewController(sharedContext: strongSelf.context.sharedContext, cameraNode: cameraNode, shareCamera: { [weak self] _, unmuted in if let strongSelf = self { strongSelf.call.setIsMuted(action: unmuted ? .unmuted : .muted(isPushToTalkActive: false)) (strongSelf.call as! PresentationGroupCallImpl).requestVideo(capturer: videoCapturer) @@ -3512,29 +3512,6 @@ public final class VoiceChatController: ViewController { }) strongSelf.controller?.present(controller, in: .window(.root)) } - - /*strongSelf.call.makeOutgoingVideoView(requestClone: false, completion: { [weak self] view, _ in - guard let strongSelf = self, let view = view else { - return - } - let cameraNode = GroupVideoNode(videoView: view, backdropVideoView: nil) - let controller = VoiceChatCameraPreviewController(context: strongSelf.context, cameraNode: cameraNode, shareCamera: { [weak self] videoNode, unmuted in - if let strongSelf = self { - strongSelf.call.setIsMuted(action: unmuted ? .unmuted : .muted(isPushToTalkActive: false)) - strongSelf.call.requestVideo() - - if let (layout, navigationHeight) = strongSelf.validLayout { - strongSelf.animatingButtonsSwap = true - strongSelf.containerLayoutUpdated(layout, navigationHeight: navigationHeight, transition: .animated(duration: 0.4, curve: .spring)) - } - } - }, switchCamera: { [weak self] in - Queue.mainQueue().after(0.1) { - self?.call.switchVideoCamera() - } - }) - strongSelf.controller?.present(controller, in: .window(.root)) - })*/ }) } } diff --git a/submodules/TelegramCallsUI/Sources/VoiceChatMainStageNode.swift b/submodules/TelegramCallsUI/Sources/VoiceChatMainStageNode.swift index 8ea599bcdf..e803d37daf 100644 --- a/submodules/TelegramCallsUI/Sources/VoiceChatMainStageNode.swift +++ b/submodules/TelegramCallsUI/Sources/VoiceChatMainStageNode.swift @@ -1090,7 +1090,7 @@ final class VoiceChatMainStageNode: ASDisplayNode { let initialBottomInset = bottomInset var bottomInset = bottomInset - let layoutMode: GroupVideoNode.LayoutMode + let layoutMode: VideoNodeLayoutMode if case .immediate = transition, self.animatingIn { layoutMode = .fillOrFitToSquare bottomInset = 0.0 diff --git a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift index 8a51d2544b..54e3319cb2 100644 --- a/submodules/TelegramPresentationData/Sources/PresentationStrings.swift +++ b/submodules/TelegramPresentationData/Sources/PresentationStrings.swift @@ -1035,5518 +1035,5522 @@ public final class PresentationStrings: Equatable { public func PUSH_CHAT_VOICECHAT_START(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[782]!, self._r[782]!, [_1, _2]) } - public var ChatListFolder_NameGroups: String { return self._s[783]! } - public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[784]! } - public var VoiceChat_EditDescriptionSave: String { return self._s[785]! } + public var VoiceChat_VideoPreviewContinue: String { return self._s[783]! } + public var ChatListFolder_NameGroups: String { return self._s[784]! } + public var SocksProxySetup_ProxyDetailsTitle: String { return self._s[785]! } + public var VoiceChat_EditDescriptionSave: String { return self._s[786]! } public func Channel_AdminLog_MessageChangedLinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[786]!, self._r[786]!, [_1, _2]) + return formatWithArgumentRanges(self._s[787]!, self._r[787]!, [_1, _2]) } - public var Watch_Suggestion_TalkLater: String { return self._s[787]! } - public var Checkout_ShippingOption_Title: String { return self._s[788]! } - public var Conversation_TitleRepliesEmpty: String { return self._s[789]! } - public var CreatePoll_TextHeader: String { return self._s[790]! } - public var VoiceOver_Chat_Message: String { return self._s[792]! } - public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[793]! } - public var ContactInfo_Note: String { return self._s[795]! } - public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[796]! } - public var Checkout_NewCard_CardholderNameTitle: String { return self._s[797]! } - public var AutoDownloadSettings_Photos: String { return self._s[798]! } - public var UserInfo_NotificationsDefaultDisabled: String { return self._s[799]! } + public var Watch_Suggestion_TalkLater: String { return self._s[788]! } + public var Checkout_ShippingOption_Title: String { return self._s[789]! } + public var Conversation_TitleRepliesEmpty: String { return self._s[790]! } + public var CreatePoll_TextHeader: String { return self._s[791]! } + public var VoiceOver_Chat_Message: String { return self._s[793]! } + public var InfoPlist_NSLocationWhenInUseUsageDescription: String { return self._s[794]! } + public var ContactInfo_Note: String { return self._s[796]! } + public var Channel_AdminLog_InfoPanelAlertText: String { return self._s[797]! } + public var Checkout_NewCard_CardholderNameTitle: String { return self._s[798]! } + public var AutoDownloadSettings_Photos: String { return self._s[799]! } + public var UserInfo_NotificationsDefaultDisabled: String { return self._s[800]! } public func Conversation_ForwardTooltip_Chat_One(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[800]!, self._r[800]!, [_0]) + return formatWithArgumentRanges(self._s[801]!, self._r[801]!, [_0]) } - public var Channel_Info_Subscribers: String { return self._s[801]! } - public var ChatList_DeleteForCurrentUser: String { return self._s[802]! } - public var ChatListFolderSettings_FoldersSection: String { return self._s[803]! } - public var ChannelInfo_ScheduleVoiceChat: String { return self._s[804]! } - public var VoiceOver_ChatList_OutgoingMessage: String { return self._s[805]! } + public var Channel_Info_Subscribers: String { return self._s[802]! } + public var ChatList_DeleteForCurrentUser: String { return self._s[803]! } + public var ChatListFolderSettings_FoldersSection: String { return self._s[804]! } + public var ChannelInfo_ScheduleVoiceChat: String { return self._s[805]! } + public var VoiceOver_ChatList_OutgoingMessage: String { return self._s[806]! } public func Time_PreciseDate_m9(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[809]!, self._r[809]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[810]!, self._r[810]!, [_1, _2, _3]) } - public var AutoNightTheme_System: String { return self._s[810]! } - public var Call_StatusWaiting: String { return self._s[811]! } - public var GroupInfo_GroupHistoryHidden: String { return self._s[812]! } + public var AutoNightTheme_System: String { return self._s[811]! } + public var Call_StatusWaiting: String { return self._s[812]! } + public var GroupInfo_GroupHistoryHidden: String { return self._s[813]! } public func CHAT_MESSAGE_INVOICE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[813]!, self._r[813]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[814]!, self._r[814]!, [_1, _2, _3]) } - public var Conversation_ContextMenuCopy: String { return self._s[815]! } - public var Notifications_MessageNotificationsPreview: String { return self._s[816]! } - public var Notifications_InAppNotificationsVibrate: String { return self._s[817]! } + public var Conversation_ContextMenuCopy: String { return self._s[816]! } + public var Notifications_MessageNotificationsPreview: String { return self._s[817]! } + public var Notifications_InAppNotificationsVibrate: String { return self._s[818]! } public func Conversation_RestrictedTextTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[818]!, self._r[818]!, [_0]) + return formatWithArgumentRanges(self._s[819]!, self._r[819]!, [_0]) } - public var Group_Status: String { return self._s[820]! } - public var Group_Setup_HistoryVisible: String { return self._s[821]! } - public var Conversation_UploadFileTooLarge: String { return self._s[822]! } - public var Conversation_DiscardVoiceMessageAction: String { return self._s[823]! } - public var Paint_Edit: String { return self._s[824]! } - public var PeerInfo_AutoremoveMessages: String { return self._s[825]! } + public var Group_Status: String { return self._s[821]! } + public var Group_Setup_HistoryVisible: String { return self._s[822]! } + public var Conversation_UploadFileTooLarge: String { return self._s[823]! } + public var Conversation_DiscardVoiceMessageAction: String { return self._s[824]! } + public var Paint_Edit: String { return self._s[825]! } + public var PeerInfo_AutoremoveMessages: String { return self._s[826]! } public func ChatImport_SelectionConfirmationGroupWithoutTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[827]!, self._r[827]!, [_0]) + return formatWithArgumentRanges(self._s[828]!, self._r[828]!, [_0]) } - public var Channel_EditAdmin_CannotEdit: String { return self._s[828]! } - public var Username_InvalidTooShort: String { return self._s[829]! } - public var ClearCache_StorageOtherApps: String { return self._s[831]! } - public var Conversation_ViewMessage: String { return self._s[832]! } - public var GroupInfo_PublicLinkAdd: String { return self._s[834]! } + public var Channel_EditAdmin_CannotEdit: String { return self._s[829]! } + public var Username_InvalidTooShort: String { return self._s[830]! } + public var ClearCache_StorageOtherApps: String { return self._s[832]! } + public var Conversation_ViewMessage: String { return self._s[833]! } + public var GroupInfo_PublicLinkAdd: String { return self._s[835]! } public func Notification_RemovedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[835]!, self._r[835]!, [_0]) + return formatWithArgumentRanges(self._s[836]!, self._r[836]!, [_0]) } - public var CallSettings_Title: String { return self._s[836]! } + public var CallSettings_Title: String { return self._s[837]! } public func Conversation_BotInteractiveUrlAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[837]!, self._r[837]!, [_0]) + return formatWithArgumentRanges(self._s[838]!, self._r[838]!, [_0]) } public func VoiceOver_Chat_ContactFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[840]!, self._r[840]!, [_0]) + return formatWithArgumentRanges(self._s[841]!, self._r[841]!, [_0]) } - public var PUSH_SENDER_YOU: String { return self._s[843]! } + public var PUSH_SENDER_YOU: String { return self._s[844]! } public func Conversation_DeletedFromContacts(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[844]!, self._r[844]!, [_0]) + return formatWithArgumentRanges(self._s[845]!, self._r[845]!, [_0]) } - public var Profile_ShareContactButton: String { return self._s[845]! } - public var GroupInfo_Permissions_SectionTitle: String { return self._s[846]! } + public var Profile_ShareContactButton: String { return self._s[846]! } + public var GroupInfo_Permissions_SectionTitle: String { return self._s[847]! } public func VoiceOver_Chat_StickerFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[847]!, self._r[847]!, [_0]) + return formatWithArgumentRanges(self._s[848]!, self._r[848]!, [_0]) } - public var Map_ShareLiveLocation: String { return self._s[848]! } - public var ChatListFolder_TitleEdit: String { return self._s[849]! } + public var Map_ShareLiveLocation: String { return self._s[849]! } + public var ChatListFolder_TitleEdit: String { return self._s[850]! } public func VoiceOver_Chat_AnimatedStickerFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[850]!, self._r[850]!, [_0]) + return formatWithArgumentRanges(self._s[851]!, self._r[851]!, [_0]) } - public var Passport_Address_Address: String { return self._s[852]! } - public var LastSeen_JustNow: String { return self._s[854]! } + public var Passport_Address_Address: String { return self._s[853]! } + public var LastSeen_JustNow: String { return self._s[855]! } public func SecretImage_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[855]!, self._r[855]!, [_0]) + return formatWithArgumentRanges(self._s[856]!, self._r[856]!, [_0]) } - public var ContactInfo_PhoneLabelOther: String { return self._s[856]! } - public var PasscodeSettings_DoNotMatch: String { return self._s[857]! } - public var Weekday_Today: String { return self._s[860]! } - public var DialogList_Title: String { return self._s[861]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[862]! } - public var Cache_ClearCache: String { return self._s[863]! } - public var CreatePoll_ExplanationInfo: String { return self._s[864]! } - public var Notifications_ResetAllNotificationsHelp: String { return self._s[866]! } - public var Stats_MessageTitle: String { return self._s[867]! } - public var Passport_Address_Street: String { return self._s[869]! } + public var ContactInfo_PhoneLabelOther: String { return self._s[857]! } + public var PasscodeSettings_DoNotMatch: String { return self._s[858]! } + public var Weekday_Today: String { return self._s[861]! } + public var DialogList_Title: String { return self._s[862]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsPreview: String { return self._s[863]! } + public var Cache_ClearCache: String { return self._s[864]! } + public var CreatePoll_ExplanationInfo: String { return self._s[865]! } + public var Notifications_ResetAllNotificationsHelp: String { return self._s[867]! } + public var Stats_MessageTitle: String { return self._s[868]! } + public var Passport_Address_Street: String { return self._s[870]! } public func Channel_AdminLog_MessageRemovedGroupUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[870]!, self._r[870]!, [_0]) + return formatWithArgumentRanges(self._s[871]!, self._r[871]!, [_0]) } - public var Channel_AdminLog_ChannelEmptyText: String { return self._s[871]! } + public var Channel_AdminLog_ChannelEmptyText: String { return self._s[872]! } public func Login_PhoneGenericEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[872]!, self._r[872]!, [_0]) + return formatWithArgumentRanges(self._s[873]!, self._r[873]!, [_0]) } - public var TwoStepAuth_Email: String { return self._s[874]! } - public var Conversation_SecretLinkPreviewAlert: String { return self._s[875]! } - public var PrivacySettings_PasscodeOn: String { return self._s[876]! } - public var Camera_SquareMode: String { return self._s[878]! } - public var SocksProxySetup_Port: String { return self._s[879]! } - public var Watch_LastSeen_JustNow: String { return self._s[881]! } + public var TwoStepAuth_Email: String { return self._s[875]! } + public var Conversation_SecretLinkPreviewAlert: String { return self._s[876]! } + public var PrivacySettings_PasscodeOn: String { return self._s[877]! } + public var Camera_SquareMode: String { return self._s[879]! } + public var SocksProxySetup_Port: String { return self._s[880]! } + public var Watch_LastSeen_JustNow: String { return self._s[882]! } public func Location_ProximityAlertSetText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[882]!, self._r[882]!, [_1, _2]) - } - public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[883]!, self._r[883]!, [_1, _2]) } + public func PUSH_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_1, _2]) + } public func Watch_LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[884]!, self._r[884]!, [_0]) + return formatWithArgumentRanges(self._s[885]!, self._r[885]!, [_0]) } - public var VoiceChat_CancelVoiceChat: String { return self._s[885]! } - public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[886]! } - public var Channel_AdminLogFilter_EventsTitle: String { return self._s[887]! } - public var Watch_Suggestion_HoldOn: String { return self._s[890]! } + public var VoiceChat_CancelVoiceChat: String { return self._s[886]! } + public var EditTheme_Expand_Preview_OutgoingText: String { return self._s[887]! } + public var Channel_AdminLogFilter_EventsTitle: String { return self._s[888]! } + public var Watch_Suggestion_HoldOn: String { return self._s[891]! } public func PUSH_CHANNEL_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[891]!, self._r[891]!, [_1]) + return formatWithArgumentRanges(self._s[892]!, self._r[892]!, [_1]) } - public var CallSettings_TabIcon: String { return self._s[892]! } - public var ScheduledMessages_SendNow: String { return self._s[893]! } - public var Stats_GroupTopWeekdaysTitle: String { return self._s[894]! } - public var ImportStickerPack_NamePlaceholder: String { return self._s[895]! } - public var UserInfo_PhoneCall: String { return self._s[896]! } - public var Month_GenMarch: String { return self._s[897]! } - public var Camera_Discard: String { return self._s[898]! } - public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[899]! } - public var Passport_RequestedInformation: String { return self._s[900]! } - public var VoiceChat_RecordingTitlePlaceholder: String { return self._s[902]! } + public var CallSettings_TabIcon: String { return self._s[893]! } + public var ScheduledMessages_SendNow: String { return self._s[894]! } + public var Stats_GroupTopWeekdaysTitle: String { return self._s[895]! } + public var ImportStickerPack_NamePlaceholder: String { return self._s[896]! } + public var UserInfo_PhoneCall: String { return self._s[897]! } + public var Month_GenMarch: String { return self._s[898]! } + public var Camera_Discard: String { return self._s[899]! } + public var InfoPlist_NSFaceIDUsageDescription: String { return self._s[900]! } + public var Passport_RequestedInformation: String { return self._s[901]! } + public var VoiceChat_RecordingTitlePlaceholder: String { return self._s[903]! } public func Notification_ProximityYouReached(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[903]!, self._r[903]!, [_1, _2]) + return formatWithArgumentRanges(self._s[904]!, self._r[904]!, [_1, _2]) } - public var Passport_Language_ro: String { return self._s[904]! } + public var Passport_Language_ro: String { return self._s[905]! } public func PUSH_CHAT_MESSAGE_DOC(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[905]!, self._r[905]!, [_1, _2]) + return formatWithArgumentRanges(self._s[906]!, self._r[906]!, [_1, _2]) } - public var AutoDownloadSettings_ResetHelp: String { return self._s[906]! } - public var Passport_Identity_DocumentDetails: String { return self._s[908]! } - public var Passport_Address_ScansHelp: String { return self._s[909]! } - public var Location_LiveLocationRequired_Title: String { return self._s[910]! } - public var WallpaperPreview_PreviewBottomTextAnimatable: String { return self._s[911]! } - public var ClearCache_StorageCache: String { return self._s[912]! } - public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[913]! } - public var Conversation_RestrictedText: String { return self._s[914]! } - public var Notifications_MessageNotifications: String { return self._s[916]! } - public var Passport_Scans: String { return self._s[917]! } + public var AutoDownloadSettings_ResetHelp: String { return self._s[907]! } + public var Passport_Identity_DocumentDetails: String { return self._s[909]! } + public var Passport_Address_ScansHelp: String { return self._s[910]! } + public var Location_LiveLocationRequired_Title: String { return self._s[911]! } + public var WallpaperPreview_PreviewBottomTextAnimatable: String { return self._s[912]! } + public var ClearCache_StorageCache: String { return self._s[913]! } + public var Theme_Colors_ColorWallpaperWarningProceed: String { return self._s[914]! } + public var Conversation_RestrictedText: String { return self._s[915]! } + public var Notifications_MessageNotifications: String { return self._s[917]! } + public var Passport_Scans: String { return self._s[918]! } public func VoiceChat_StatusStartsIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[919]!, self._r[919]!, [_0]) + return formatWithArgumentRanges(self._s[920]!, self._r[920]!, [_0]) } - public var TwoStepAuth_SetupHintTitle: String { return self._s[920]! } - public var LogoutOptions_ContactSupportTitle: String { return self._s[921]! } - public var Passport_Identity_SelfieHelp: String { return self._s[922]! } - public var Permissions_NotificationsUnreachableText_v0: String { return self._s[923]! } - public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[924]! } - public var ShareMenu_CopyShareLinkGame: String { return self._s[925]! } - public var PeerInfo_ButtonSearch: String { return self._s[926]! } + public var TwoStepAuth_SetupHintTitle: String { return self._s[921]! } + public var LogoutOptions_ContactSupportTitle: String { return self._s[922]! } + public var Passport_Identity_SelfieHelp: String { return self._s[923]! } + public var Permissions_NotificationsUnreachableText_v0: String { return self._s[924]! } + public var Privacy_PaymentsClear_PaymentInfo: String { return self._s[925]! } + public var ShareMenu_CopyShareLinkGame: String { return self._s[926]! } + public var PeerInfo_ButtonSearch: String { return self._s[927]! } public func Notification_ProximityReachedYou(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[929]!, self._r[929]!, [_1, _2]) + return formatWithArgumentRanges(self._s[930]!, self._r[930]!, [_1, _2]) } - public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[930]! } - public var Passport_FieldIdentityTranslationHelp: String { return self._s[932]! } - public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[933]! } - public var Month_GenSeptember: String { return self._s[934]! } + public var SettingsSearch_Synonyms_Privacy_Data_ClearPaymentsInfo: String { return self._s[931]! } + public var Passport_FieldIdentityTranslationHelp: String { return self._s[933]! } + public var Conversation_InputTextSilentBroadcastPlaceholder: String { return self._s[934]! } + public var Month_GenSeptember: String { return self._s[935]! } public func Call_GroupFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[936]!, self._r[936]!, [_1, _2]) + return formatWithArgumentRanges(self._s[937]!, self._r[937]!, [_1, _2]) } - public var StickerPacksSettings_ArchivedPacks: String { return self._s[937]! } + public var StickerPacksSettings_ArchivedPacks: String { return self._s[938]! } public func Notification_VoiceChatInvitation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[939]!, self._r[939]!, [_1, _2]) + return formatWithArgumentRanges(self._s[940]!, self._r[940]!, [_1, _2]) } public func Channel_Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[940]!, self._r[940]!, [_0]) + return formatWithArgumentRanges(self._s[941]!, self._r[941]!, [_0]) } public func PUSH_PINNED_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[942]!, self._r[942]!, [_1, _2]) - } - public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[943]!, self._r[943]!, [_1, _2]) } - public var Calls_NotNow: String { return self._s[945]! } - public var Settings_ChatFolders: String { return self._s[950]! } - public var Login_PadPhoneHelpTitle: String { return self._s[951]! } - public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[952]! } - public var Widget_MessageAutoremoveTimerRemoved: String { return self._s[953]! } - public var VoiceChat_RecordingSaved: String { return self._s[954]! } - public var Settings_ChatBackground: String { return self._s[955]! } + public func PUSH_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[944]!, self._r[944]!, [_1, _2]) + } + public var Calls_NotNow: String { return self._s[946]! } + public var Settings_ChatFolders: String { return self._s[951]! } + public var Login_PadPhoneHelpTitle: String { return self._s[952]! } + public var TwoStepAuth_EnterPasswordInvalid: String { return self._s[953]! } + public var Widget_MessageAutoremoveTimerRemoved: String { return self._s[954]! } + public var VoiceChat_RecordingSaved: String { return self._s[955]! } + public var Settings_ChatBackground: String { return self._s[956]! } public func PUSH_CHAT_MESSAGE_CONTACT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[957]!, self._r[957]!, [_1, _2]) + return formatWithArgumentRanges(self._s[958]!, self._r[958]!, [_1, _2]) } - public var ProxyServer_VoiceOver_Active: String { return self._s[958]! } - public var Call_StatusBusy: String { return self._s[959]! } - public var Conversation_MessageDeliveryFailed: String { return self._s[960]! } - public var Login_NetworkError: String { return self._s[962]! } - public var TwoStepAuth_SetupPasswordDescription: String { return self._s[963]! } - public var Privacy_Calls_Integration: String { return self._s[964]! } - public var DialogList_SearchSectionMessages: String { return self._s[965]! } - public var AutoDownloadSettings_VideosTitle: String { return self._s[966]! } - public var Preview_DeletePhoto: String { return self._s[967]! } - public var VoiceChat_Video: String { return self._s[968]! } - public var PrivacySettings_PhoneNumber: String { return self._s[970]! } - public var Forward_ErrorDisabledForChat: String { return self._s[971]! } - public var Watch_Compose_CurrentLocation: String { return self._s[972]! } - public var Settings_CallSettings: String { return self._s[973]! } - public var TwoFactorRemember_Done_Action: String { return self._s[974]! } - public var AutoDownloadSettings_TypePrivateChats: String { return self._s[975]! } - public var Conversation_StickerRemovedFromFavorites: String { return self._s[976]! } - public var ChatList_Context_MarkAllAsRead: String { return self._s[977]! } - public var ChatSettings_AutoPlayAnimations: String { return self._s[978]! } - public var SaveIncomingPhotosSettings_Title: String { return self._s[979]! } - public var OwnershipTransfer_SecurityRequirements: String { return self._s[980]! } - public var Map_LiveLocationFor1Hour: String { return self._s[981]! } + public var ProxyServer_VoiceOver_Active: String { return self._s[959]! } + public var Call_StatusBusy: String { return self._s[960]! } + public var Conversation_MessageDeliveryFailed: String { return self._s[961]! } + public var Login_NetworkError: String { return self._s[963]! } + public var TwoStepAuth_SetupPasswordDescription: String { return self._s[964]! } + public var Privacy_Calls_Integration: String { return self._s[965]! } + public var DialogList_SearchSectionMessages: String { return self._s[966]! } + public var AutoDownloadSettings_VideosTitle: String { return self._s[967]! } + public var Preview_DeletePhoto: String { return self._s[968]! } + public var VoiceChat_Video: String { return self._s[969]! } + public var PrivacySettings_PhoneNumber: String { return self._s[971]! } + public var Forward_ErrorDisabledForChat: String { return self._s[972]! } + public var Watch_Compose_CurrentLocation: String { return self._s[973]! } + public var Settings_CallSettings: String { return self._s[974]! } + public var TwoFactorRemember_Done_Action: String { return self._s[975]! } + public var AutoDownloadSettings_TypePrivateChats: String { return self._s[976]! } + public var Conversation_StickerRemovedFromFavorites: String { return self._s[977]! } + public var ChatList_Context_MarkAllAsRead: String { return self._s[978]! } + public var ChatSettings_AutoPlayAnimations: String { return self._s[979]! } + public var SaveIncomingPhotosSettings_Title: String { return self._s[980]! } + public var OwnershipTransfer_SecurityRequirements: String { return self._s[981]! } + public var Map_LiveLocationFor1Hour: String { return self._s[982]! } public func Privacy_GroupsAndChannels_InviteToGroupError(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[982]!, self._r[982]!, [_0, _1]) + return formatWithArgumentRanges(self._s[983]!, self._r[983]!, [_0, _1]) } - public var VoiceChat_MutedByAdmin: String { return self._s[983]! } + public var VoiceChat_MutedByAdmin: String { return self._s[984]! } public func Notification_PinnedLiveLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[984]!, self._r[984]!, [_0]) + return formatWithArgumentRanges(self._s[985]!, self._r[985]!, [_0]) } - public var Conversation_UnvotePoll: String { return self._s[985]! } - public var TwoStepAuth_EnterEmailCode: String { return self._s[986]! } + public var Conversation_UnvotePoll: String { return self._s[986]! } + public var TwoStepAuth_EnterEmailCode: String { return self._s[987]! } public func LOCAL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[987]!, self._r[987]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[988]!, self._r[988]!, [_1, "\(_2)"]) } - public var Passport_InfoTitle: String { return self._s[988]! } + public var Passport_InfoTitle: String { return self._s[989]! } public func Conversation_Bytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[989]!, self._r[989]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[990]!, self._r[990]!, ["\(_0)"]) } - public var AccentColor_Title: String { return self._s[990]! } + public var AccentColor_Title: String { return self._s[991]! } public func PUSH_MESSAGE_INVOICE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[991]!, self._r[991]!, [_1, _2]) + return formatWithArgumentRanges(self._s[992]!, self._r[992]!, [_1, _2]) } public func Notification_JoinedChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[994]!, self._r[994]!, [_0]) + return formatWithArgumentRanges(self._s[995]!, self._r[995]!, [_0]) } - public var AutoDownloadSettings_DataUsageCustom: String { return self._s[995]! } - public var Conversation_ShareBotLocationConfirmation: String { return self._s[996]! } - public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[997]! } - public var VoiceOver_Editing_ClearText: String { return self._s[998]! } - public var Conversation_Unarchive: String { return self._s[999]! } - public var Notification_CallOutgoing: String { return self._s[1000]! } - public var Channel_Setup_PublicNoLink: String { return self._s[1001]! } - public var Passport_Identity_GenderPlaceholder: String { return self._s[1002]! } - public var Message_Animation: String { return self._s[1003]! } - public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[1004]! } - public var ChatSettings_ConnectionType_Title: String { return self._s[1005]! } + public var AutoDownloadSettings_DataUsageCustom: String { return self._s[996]! } + public var Conversation_ShareBotLocationConfirmation: String { return self._s[997]! } + public var PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber: String { return self._s[998]! } + public var VoiceOver_Editing_ClearText: String { return self._s[999]! } + public var Conversation_Unarchive: String { return self._s[1000]! } + public var Notification_CallOutgoing: String { return self._s[1001]! } + public var Channel_Setup_PublicNoLink: String { return self._s[1002]! } + public var Passport_Identity_GenderPlaceholder: String { return self._s[1003]! } + public var Message_Animation: String { return self._s[1004]! } + public var SettingsSearch_Synonyms_Appearance_Animations: String { return self._s[1005]! } + public var ChatSettings_ConnectionType_Title: String { return self._s[1006]! } public func Watch_Time_ShortFullAt(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1006]!, self._r[1006]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1007]!, self._r[1007]!, [_1, _2]) } public func VoiceChat_StatusSpeakingVolume(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1007]!, self._r[1007]!, [_0]) + return formatWithArgumentRanges(self._s[1008]!, self._r[1008]!, [_0]) } - public var Notification_CallBack: String { return self._s[1008]! } - public var Appearance_Title: String { return self._s[1011]! } - public var NotificationsSound_Glass: String { return self._s[1013]! } - public var AutoDownloadSettings_CellularTitle: String { return self._s[1015]! } - public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[1017]! } - public var ChatSearch_SearchPlaceholder: String { return self._s[1018]! } - public var Passport_Identity_AddPassport: String { return self._s[1019]! } - public var GroupPermission_NoAddMembers: String { return self._s[1021]! } - public var ContactList_Context_SendMessage: String { return self._s[1022]! } - public var PhotoEditor_GrainTool: String { return self._s[1023]! } - public var Settings_CopyPhoneNumber: String { return self._s[1024]! } - public var Passport_Address_City: String { return self._s[1025]! } - public var VoiceChat_LeaveAndCancelVoiceChat: String { return self._s[1026]! } - public var ChannelRemoved_RemoveInfo: String { return self._s[1027]! } - public var SocksProxySetup_Password: String { return self._s[1029]! } - public var Settings_Passport: String { return self._s[1030]! } - public var Channel_MessagePhotoUpdated: String { return self._s[1032]! } - public var Stats_LanguagesTitle: String { return self._s[1033]! } - public var ChatList_PeerTypeGroup: String { return self._s[1034]! } - public var Privacy_Calls_P2PHelp: String { return self._s[1035]! } - public var VoiceOver_Chat_PollNoVotes: String { return self._s[1036]! } - public var Embed_PlayingInPIP: String { return self._s[1037]! } - public var ImportStickerPack_GeneratingLink: String { return self._s[1039]! } - public var BlockedUsers_BlockUser: String { return self._s[1041]! } - public var Login_CancelPhoneVerificationContinue: String { return self._s[1042]! } + public var Notification_CallBack: String { return self._s[1009]! } + public var Appearance_Title: String { return self._s[1012]! } + public var NotificationsSound_Glass: String { return self._s[1014]! } + public var AutoDownloadSettings_CellularTitle: String { return self._s[1016]! } + public var Notifications_PermissionsSuppressWarningTitle: String { return self._s[1018]! } + public var ChatSearch_SearchPlaceholder: String { return self._s[1019]! } + public var Passport_Identity_AddPassport: String { return self._s[1020]! } + public var GroupPermission_NoAddMembers: String { return self._s[1022]! } + public var ContactList_Context_SendMessage: String { return self._s[1023]! } + public var PhotoEditor_GrainTool: String { return self._s[1024]! } + public var Settings_CopyPhoneNumber: String { return self._s[1025]! } + public var Passport_Address_City: String { return self._s[1026]! } + public var VoiceChat_LeaveAndCancelVoiceChat: String { return self._s[1027]! } + public var ChannelRemoved_RemoveInfo: String { return self._s[1028]! } + public var SocksProxySetup_Password: String { return self._s[1030]! } + public var Settings_Passport: String { return self._s[1031]! } + public var Channel_MessagePhotoUpdated: String { return self._s[1033]! } + public var Stats_LanguagesTitle: String { return self._s[1034]! } + public var ChatList_PeerTypeGroup: String { return self._s[1035]! } + public var Privacy_Calls_P2PHelp: String { return self._s[1036]! } + public var VoiceOver_Chat_PollNoVotes: String { return self._s[1037]! } + public var Embed_PlayingInPIP: String { return self._s[1038]! } + public var ImportStickerPack_GeneratingLink: String { return self._s[1040]! } + public var BlockedUsers_BlockUser: String { return self._s[1042]! } + public var Login_CancelPhoneVerificationContinue: String { return self._s[1043]! } public func PUSH_CHANNEL_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1043]!, self._r[1043]!, [_1]) + return formatWithArgumentRanges(self._s[1044]!, self._r[1044]!, [_1]) } - public var AuthSessions_LoggedIn: String { return self._s[1044]! } - public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[1045]! } - public var Activity_UploadingDocument: String { return self._s[1046]! } - public var PeopleNearby_NoMembers: String { return self._s[1047]! } - public var TwoFactorRemember_Text: String { return self._s[1049]! } - public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1051]! } - public var ChatSettings_AutoPlayVideos: String { return self._s[1052]! } - public var VoiceOver_Chat_OpenLinkHint: String { return self._s[1053]! } - public var InstantPage_VoiceOver_IncreaseFontSize: String { return self._s[1054]! } - public var Settings_ViewVideo: String { return self._s[1055]! } - public var Map_ShowPlaces: String { return self._s[1057]! } - public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1058]! } - public var InviteLink_Create_Title: String { return self._s[1059]! } - public var Notification_CreatedGroup: String { return self._s[1060]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[1061]! } + public var AuthSessions_LoggedIn: String { return self._s[1045]! } + public var Channel_AdminLog_MessagePreviousCaption: String { return self._s[1046]! } + public var Activity_UploadingDocument: String { return self._s[1047]! } + public var PeopleNearby_NoMembers: String { return self._s[1048]! } + public var TwoFactorRemember_Text: String { return self._s[1050]! } + public var SettingsSearch_Synonyms_Stickers_Masks: String { return self._s[1052]! } + public var ChatSettings_AutoPlayVideos: String { return self._s[1053]! } + public var VoiceOver_Chat_OpenLinkHint: String { return self._s[1054]! } + public var InstantPage_VoiceOver_IncreaseFontSize: String { return self._s[1055]! } + public var Settings_ViewVideo: String { return self._s[1056]! } + public var Map_ShowPlaces: String { return self._s[1058]! } + public var Passport_Phone_UseTelegramNumberHelp: String { return self._s[1059]! } + public var InviteLink_Create_Title: String { return self._s[1060]! } + public var Notification_CreatedGroup: String { return self._s[1061]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_Custom: String { return self._s[1062]! } public func PrivacySettings_LastSeenContactsPlus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1062]!, self._r[1062]!, [_0]) + return formatWithArgumentRanges(self._s[1063]!, self._r[1063]!, [_0]) } - public var Conversation_StatusLeftGroup: String { return self._s[1063]! } - public var Theme_Colors_Messages: String { return self._s[1064]! } - public var AuthSessions_EmptyText: String { return self._s[1065]! } + public var Conversation_StatusLeftGroup: String { return self._s[1064]! } + public var Theme_Colors_Messages: String { return self._s[1065]! } + public var AuthSessions_EmptyText: String { return self._s[1066]! } public func PUSH_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1066]!, self._r[1066]!, [_1]) + return formatWithArgumentRanges(self._s[1067]!, self._r[1067]!, [_1]) } - public var UserInfo_StartSecretChat: String { return self._s[1067]! } - public var ChatListFolderSettings_EditFoldersInfo: String { return self._s[1068]! } - public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[1069]! } - public var TwoFactorSetup_ResetDone_Title: String { return self._s[1070]! } - public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1071]! } - public var Conversation_PrivateMessageLinkCopied: String { return self._s[1073]! } - public var PeerInfo_PaneFiles: String { return self._s[1074]! } - public var VoiceChat_DisplayAs: String { return self._s[1075]! } - public var PrivacySettings_AutoArchive: String { return self._s[1076]! } - public var Camera_VideoMode: String { return self._s[1077]! } - public var NotificationsSound_Alert: String { return self._s[1078]! } - public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1079]! } - public var Appearance_AutoNightTheme: String { return self._s[1080]! } - public var Passport_Language_he: String { return self._s[1081]! } - public var Passport_InvalidPasswordError: String { return self._s[1082]! } - public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1083]! } - public var UserInfo_InviteBotToGroup: String { return self._s[1084]! } - public var Conversation_SilentBroadcastTooltipOff: String { return self._s[1085]! } - public var Common_TakePhoto: String { return self._s[1086]! } + public var UserInfo_StartSecretChat: String { return self._s[1068]! } + public var ChatListFolderSettings_EditFoldersInfo: String { return self._s[1069]! } + public var Channel_Edit_PrivatePublicLinkAlert: String { return self._s[1070]! } + public var TwoFactorSetup_ResetDone_Title: String { return self._s[1071]! } + public var Conversation_ReportSpamGroupConfirmation: String { return self._s[1072]! } + public var Conversation_PrivateMessageLinkCopied: String { return self._s[1074]! } + public var PeerInfo_PaneFiles: String { return self._s[1075]! } + public var VoiceChat_DisplayAs: String { return self._s[1076]! } + public var PrivacySettings_AutoArchive: String { return self._s[1077]! } + public var Camera_VideoMode: String { return self._s[1078]! } + public var NotificationsSound_Alert: String { return self._s[1079]! } + public var Privacy_Forwards_NeverAllow_Title: String { return self._s[1080]! } + public var Appearance_AutoNightTheme: String { return self._s[1081]! } + public var Passport_Language_he: String { return self._s[1082]! } + public var Passport_InvalidPasswordError: String { return self._s[1083]! } + public var Conversation_PinMessageAlert_OnlyPin: String { return self._s[1084]! } + public var UserInfo_InviteBotToGroup: String { return self._s[1085]! } + public var Conversation_SilentBroadcastTooltipOff: String { return self._s[1086]! } + public var Common_TakePhoto: String { return self._s[1087]! } public func Channel_AdminLog_RevokedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1087]!, self._r[1087]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1088]!, self._r[1088]!, [_1, _2]) } - public var Passport_Email_UseTelegramEmailHelp: String { return self._s[1088]! } - public var ChatList_Context_JoinChannel: String { return self._s[1089]! } - public var MediaPlayer_UnknownArtist: String { return self._s[1090]! } - public var VoiceChat_EditDescriptionText: String { return self._s[1091]! } - public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[1094]! } - public var Channel_OwnershipTransfer_Title: String { return self._s[1095]! } - public var EditTheme_UploadEditedTheme: String { return self._s[1096]! } - public var Settings_SetProfilePhotoOrVideo: String { return self._s[1098]! } - public var Passport_FieldOneOf_Delimeter: String { return self._s[1099]! } - public var MessagePoll_ViewResults: String { return self._s[1100]! } - public var Group_Setup_TypePrivateHelp: String { return self._s[1101]! } + public var Passport_Email_UseTelegramEmailHelp: String { return self._s[1089]! } + public var ChatList_Context_JoinChannel: String { return self._s[1090]! } + public var MediaPlayer_UnknownArtist: String { return self._s[1091]! } + public var VoiceChat_EditDescriptionText: String { return self._s[1092]! } + public var KeyCommand_JumpToPreviousUnreadChat: String { return self._s[1095]! } + public var Channel_OwnershipTransfer_Title: String { return self._s[1096]! } + public var EditTheme_UploadEditedTheme: String { return self._s[1097]! } + public var Settings_SetProfilePhotoOrVideo: String { return self._s[1099]! } + public var Passport_FieldOneOf_Delimeter: String { return self._s[1100]! } + public var MessagePoll_ViewResults: String { return self._s[1101]! } + public var Group_Setup_TypePrivateHelp: String { return self._s[1102]! } public func UserInfo_ContactForwardTooltip_Chat_One(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1102]!, self._r[1102]!, [_0]) + return formatWithArgumentRanges(self._s[1103]!, self._r[1103]!, [_0]) } - public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1103]! } - public var Privacy_PaymentsClear_ShippingInfoCleared: String { return self._s[1104]! } - public var ChatList_Search_ShowLess: String { return self._s[1105]! } - public var InviteLink_Create_UsersLimitNoLimit: String { return self._s[1106]! } - public var UserInfo_ShareBot: String { return self._s[1107]! } - public var Privacy_Calls_P2P: String { return self._s[1109]! } - public var WebBrowser_InAppSafari: String { return self._s[1110]! } - public var SharedMedia_EmptyFilesText: String { return self._s[1113]! } - public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[1114]! } - public var GroupInfo_SetSound: String { return self._s[1115]! } - public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1116]! } + public var Passport_Address_OneOfTypeUtilityBill: String { return self._s[1104]! } + public var Privacy_PaymentsClear_ShippingInfoCleared: String { return self._s[1105]! } + public var ChatList_Search_ShowLess: String { return self._s[1106]! } + public var InviteLink_Create_UsersLimitNoLimit: String { return self._s[1107]! } + public var UserInfo_ShareBot: String { return self._s[1108]! } + public var Privacy_Calls_P2P: String { return self._s[1110]! } + public var WebBrowser_InAppSafari: String { return self._s[1111]! } + public var SharedMedia_EmptyFilesText: String { return self._s[1114]! } + public var Channel_AdminLog_MessagePreviousMessage: String { return self._s[1115]! } + public var GroupInfo_SetSound: String { return self._s[1116]! } + public var Permissions_PeopleNearbyAllowInSettings_v0: String { return self._s[1117]! } public func Conversation_AutoremoveRemainingTime(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1117]!, self._r[1117]!, [_0]) + return formatWithArgumentRanges(self._s[1118]!, self._r[1118]!, [_0]) } - public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1118]! } - public var Channel_AdminLogFilter_EventsAll: String { return self._s[1119]! } - public var CallSettings_UseLessData: String { return self._s[1120]! } - public var InfoPlist_NSCameraUsageDescription: String { return self._s[1121]! } - public var NotificationsSound_Chord: String { return self._s[1122]! } - public var PhotoEditor_CurvesTool: String { return self._s[1123]! } - public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1124]! } - public var Resolve_ErrorNotFound: String { return self._s[1125]! } - public var Activity_PlayingGame: String { return self._s[1126]! } + public var Channel_AdminLog_MessagePreviousDescription: String { return self._s[1119]! } + public var Channel_AdminLogFilter_EventsAll: String { return self._s[1120]! } + public var CallSettings_UseLessData: String { return self._s[1121]! } + public var InfoPlist_NSCameraUsageDescription: String { return self._s[1122]! } + public var NotificationsSound_Chord: String { return self._s[1123]! } + public var PhotoEditor_CurvesTool: String { return self._s[1124]! } + public var Appearance_ThemePreview_Chat_2_Text: String { return self._s[1125]! } + public var Resolve_ErrorNotFound: String { return self._s[1126]! } + public var Activity_PlayingGame: String { return self._s[1127]! } public func VoiceChat_InvitedPeerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1130]!, self._r[1130]!, [_0]) + return formatWithArgumentRanges(self._s[1131]!, self._r[1131]!, [_0]) } - public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1131]! } + public var StickerPacksSettings_AnimatedStickersInfo: String { return self._s[1132]! } public func PUSH_CHANNEL_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1132]!, self._r[1132]!, [_1]) + return formatWithArgumentRanges(self._s[1133]!, self._r[1133]!, [_1]) } - public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[1133]! } - public var Notification_CallIncoming: String { return self._s[1134]! } - public var Stats_EnabledNotifications: String { return self._s[1135]! } - public var Notification_VoiceChatStartedChannel: String { return self._s[1136]! } - public var Notifications_PermissionsOpenSettings: String { return self._s[1137]! } - public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1138]! } + public var Conversation_ShareBotContactConfirmationTitle: String { return self._s[1134]! } + public var Notification_CallIncoming: String { return self._s[1135]! } + public var Stats_EnabledNotifications: String { return self._s[1136]! } + public var Notification_VoiceChatStartedChannel: String { return self._s[1137]! } + public var Notifications_PermissionsOpenSettings: String { return self._s[1138]! } + public var Checkout_ErrorProviderAccountTimeout: String { return self._s[1139]! } public func Activity_RemindAboutChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1139]!, self._r[1139]!, [_0]) + return formatWithArgumentRanges(self._s[1140]!, self._r[1140]!, [_0]) } - public var VoiceChat_StatusMutedYou: String { return self._s[1140]! } - public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[1141]! } - public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[1142]! } - public var StickerPacksSettings_Title: String { return self._s[1143]! } + public var VoiceChat_StatusMutedYou: String { return self._s[1141]! } + public var VoiceOver_Chat_ReplyToYourMessage: String { return self._s[1142]! } + public var Channel_DiscussionGroup_MakeHistoryPublic: String { return self._s[1143]! } + public var StickerPacksSettings_Title: String { return self._s[1144]! } public func Channel_AdminLog_MessageGroupPreHistoryVisible(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1144]!, self._r[1144]!, [_0]) + return formatWithArgumentRanges(self._s[1145]!, self._r[1145]!, [_0]) } - public var Watch_NoConnection: String { return self._s[1145]! } - public var EncryptionKey_Title: String { return self._s[1146]! } - public var Widget_AuthRequired: String { return self._s[1147]! } + public var Watch_NoConnection: String { return self._s[1146]! } + public var EncryptionKey_Title: String { return self._s[1147]! } + public var Widget_AuthRequired: String { return self._s[1148]! } public func PUSH_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1148]!, self._r[1148]!, [_1]) + return formatWithArgumentRanges(self._s[1149]!, self._r[1149]!, [_1]) } - public var Notifications_ExceptionsTitle: String { return self._s[1149]! } - public var EditTheme_Expand_TopInfo: String { return self._s[1150]! } + public var Notifications_ExceptionsTitle: String { return self._s[1150]! } + public var EditTheme_Expand_TopInfo: String { return self._s[1151]! } public func Contacts_AddPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1151]!, self._r[1151]!, [_0]) + return formatWithArgumentRanges(self._s[1152]!, self._r[1152]!, [_0]) } - public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[1153]! } - public var Notifications_GroupNotificationsSound: String { return self._s[1154]! } - public var VoiceChat_SpeakPermissionAdmin: String { return self._s[1155]! } - public var Passport_Email_EnterOtherEmail: String { return self._s[1156]! } + public var Channel_AdminLogFilter_EventsRestrictions: String { return self._s[1154]! } + public var Notifications_GroupNotificationsSound: String { return self._s[1155]! } + public var VoiceChat_SpeakPermissionAdmin: String { return self._s[1156]! } + public var Passport_Email_EnterOtherEmail: String { return self._s[1157]! } public func VoiceChat_RemovePeerConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1159]!, self._r[1159]!, [_0]) + return formatWithArgumentRanges(self._s[1160]!, self._r[1160]!, [_0]) } - public var Conversation_AddToContacts: String { return self._s[1160]! } - public var AutoDownloadSettings_DataUsageMedium: String { return self._s[1161]! } - public var AuthSessions_LogOutApplications: String { return self._s[1163]! } - public var VoiceChat_LeaveVoiceChat: String { return self._s[1164]! } - public var ChatList_Context_Unpin: String { return self._s[1165]! } - public var PeopleNearby_DiscoverDescription: String { return self._s[1166]! } - public var UserInfo_FakeBotWarning: String { return self._s[1167]! } - public var Notification_MessageLifetime1d: String { return self._s[1168]! } - public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[1169]! } - public var ChatListFolder_CategoryChannels: String { return self._s[1170]! } - public var VoiceOver_Chat_SeenByRecipient: String { return self._s[1171]! } - public var Notifications_PermissionsAllow: String { return self._s[1172]! } - public var Undo_ScheduledMessagesCleared: String { return self._s[1173]! } - public var AutoDownloadSettings_PrivateChats: String { return self._s[1175]! } - public var VoiceChat_ImproveYourProfileText: String { return self._s[1176]! } - public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1177]! } - public var ChatImportActivity_ErrorInvalidChatType: String { return self._s[1178]! } + public var Conversation_AddToContacts: String { return self._s[1161]! } + public var AutoDownloadSettings_DataUsageMedium: String { return self._s[1162]! } + public var AuthSessions_LogOutApplications: String { return self._s[1164]! } + public var VoiceChat_LeaveVoiceChat: String { return self._s[1165]! } + public var ChatList_Context_Unpin: String { return self._s[1166]! } + public var PeopleNearby_DiscoverDescription: String { return self._s[1167]! } + public var UserInfo_FakeBotWarning: String { return self._s[1168]! } + public var Notification_MessageLifetime1d: String { return self._s[1169]! } + public var PrivacyLastSeenSettings_NeverShareWith_Title: String { return self._s[1170]! } + public var ChatListFolder_CategoryChannels: String { return self._s[1171]! } + public var VoiceOver_Chat_SeenByRecipient: String { return self._s[1172]! } + public var Notifications_PermissionsAllow: String { return self._s[1173]! } + public var Undo_ScheduledMessagesCleared: String { return self._s[1174]! } + public var AutoDownloadSettings_PrivateChats: String { return self._s[1176]! } + public var VoiceChat_ImproveYourProfileText: String { return self._s[1177]! } + public var ApplyLanguage_ChangeLanguageAction: String { return self._s[1178]! } + public var ChatImportActivity_ErrorInvalidChatType: String { return self._s[1179]! } public func Conversation_ScheduledVoiceChatStartsToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1179]!, self._r[1179]!, [_0]) - } - public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1180]!, self._r[1180]!, [_0]) } - public var Conversation_AutoremoveTimerRemovedChannel: String { return self._s[1182]! } - public var Notifications_MessageNotificationsHelp: String { return self._s[1184]! } - public var WallpaperSearch_ColorPink: String { return self._s[1185]! } - public var ContactInfo_PhoneNumberHidden: String { return self._s[1186]! } - public var Passport_Identity_IssueDate: String { return self._s[1188]! } + public func PrivacySettings_LastSeenNobodyPlus(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1181]!, self._r[1181]!, [_0]) + } + public var Conversation_AutoremoveTimerRemovedChannel: String { return self._s[1183]! } + public var Notifications_MessageNotificationsHelp: String { return self._s[1185]! } + public var WallpaperSearch_ColorPink: String { return self._s[1186]! } + public var ContactInfo_PhoneNumberHidden: String { return self._s[1187]! } + public var Passport_Identity_IssueDate: String { return self._s[1189]! } public func PUSH_CHAT_MESSAGE_GIF(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1189]!, self._r[1189]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1190]!, self._r[1190]!, [_1, _2]) } - public var ChatList_DeleteForAllSubscribersConfirmationText: String { return self._s[1190]! } - public var Channel_Info_Description: String { return self._s[1191]! } - public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1192]! } - public var Weekday_ShortTuesday: String { return self._s[1193]! } - public var Common_Back: String { return self._s[1194]! } - public var Chat_PinnedMessagesHiddenTitle: String { return self._s[1196]! } - public var ChatListFolder_AddChats: String { return self._s[1197]! } - public var Common_Close: String { return self._s[1199]! } - public var Map_OpenIn: String { return self._s[1200]! } - public var Group_Setup_HistoryTitle: String { return self._s[1201]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[1202]! } - public var Notification_MessageLifetime1h: String { return self._s[1203]! } + public var ChatList_DeleteForAllSubscribersConfirmationText: String { return self._s[1191]! } + public var Channel_Info_Description: String { return self._s[1192]! } + public var PrivacySettings_DeleteAccountIfAwayFor: String { return self._s[1193]! } + public var Weekday_ShortTuesday: String { return self._s[1194]! } + public var Common_Back: String { return self._s[1195]! } + public var Chat_PinnedMessagesHiddenTitle: String { return self._s[1197]! } + public var ChatListFolder_AddChats: String { return self._s[1198]! } + public var Common_Close: String { return self._s[1200]! } + public var Map_OpenIn: String { return self._s[1201]! } + public var Group_Setup_HistoryTitle: String { return self._s[1202]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingWifi: String { return self._s[1203]! } + public var Notification_MessageLifetime1h: String { return self._s[1204]! } public func CancelResetAccount_Success(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1204]!, self._r[1204]!, [_0]) + return formatWithArgumentRanges(self._s[1205]!, self._r[1205]!, [_0]) } - public var Watch_Contacts_NoResults: String { return self._s[1206]! } - public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1207]! } - public var Checkout_Phone: String { return self._s[1208]! } - public var OwnershipTransfer_ComeBackLater: String { return self._s[1209]! } + public var Watch_Contacts_NoResults: String { return self._s[1207]! } + public var TwoStepAuth_SetupResendEmailCode: String { return self._s[1208]! } + public var Checkout_Phone: String { return self._s[1209]! } + public var OwnershipTransfer_ComeBackLater: String { return self._s[1210]! } public func Channel_CommentsGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1210]!, self._r[1210]!, [_0]) + return formatWithArgumentRanges(self._s[1211]!, self._r[1211]!, [_0]) } public func DialogList_MultipleTypingSuffix(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1211]!, self._r[1211]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[1212]!, self._r[1212]!, ["\(_0)"]) } - public var Conversation_AudioRateTooltipSpeedUp: String { return self._s[1212]! } - public var ChatAdmins_Title: String { return self._s[1213]! } - public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[1214]! } + public var Conversation_AudioRateTooltipSpeedUp: String { return self._s[1213]! } + public var ChatAdmins_Title: String { return self._s[1214]! } + public var Appearance_ThemePreview_Chat_7_Text: String { return self._s[1215]! } public func PUSH_CHANNEL_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1215]!, self._r[1215]!, [_1]) + return formatWithArgumentRanges(self._s[1216]!, self._r[1216]!, [_1]) } - public var Common_Done: String { return self._s[1216]! } - public var ChatList_HeaderImportIntoAnExistingGroup: String { return self._s[1217]! } - public var Appearance_AppIconNew2: String { return self._s[1218]! } + public var Common_Done: String { return self._s[1217]! } + public var ChatList_HeaderImportIntoAnExistingGroup: String { return self._s[1218]! } + public var Appearance_AppIconNew2: String { return self._s[1219]! } public func PUSH_PINNED_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1222]!, self._r[1222]!, [_1]) + return formatWithArgumentRanges(self._s[1223]!, self._r[1223]!, [_1]) } - public var Appearance_ThemeCarouselNight: String { return self._s[1223]! } - public var InviteLink_Expired: String { return self._s[1225]! } - public var Preview_OpenInInstagram: String { return self._s[1226]! } - public var Wallpaper_SetColor: String { return self._s[1231]! } - public var VoiceOver_Media_PlaybackRate: String { return self._s[1232]! } - public var ChatSettings_Groups: String { return self._s[1233]! } + public var Appearance_ThemeCarouselNight: String { return self._s[1224]! } + public var InviteLink_Expired: String { return self._s[1226]! } + public var Preview_OpenInInstagram: String { return self._s[1227]! } + public var Wallpaper_SetColor: String { return self._s[1232]! } + public var VoiceOver_Media_PlaybackRate: String { return self._s[1233]! } + public var ChatSettings_Groups: String { return self._s[1234]! } public func VoiceOver_Chat_VoiceMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1234]!, self._r[1234]!, [_0]) + return formatWithArgumentRanges(self._s[1235]!, self._r[1235]!, [_0]) } - public var Contacts_SortedByName: String { return self._s[1235]! } - public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1236]! } - public var Channel_Management_LabelCreator: String { return self._s[1237]! } - public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1238]! } + public var Contacts_SortedByName: String { return self._s[1236]! } + public var SettingsSearch_Synonyms_Notifications_ContactJoined: String { return self._s[1237]! } + public var Channel_Management_LabelCreator: String { return self._s[1238]! } + public var Contacts_PermissionsSuppressWarningTitle: String { return self._s[1239]! } public func PrivacySettings_LastSeenContactsMinusPlus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1239]!, self._r[1239]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1240]!, self._r[1240]!, [_0, _1]) } - public var Group_GroupMembersHeader: String { return self._s[1240]! } - public var Group_PublicLink_Title: String { return self._s[1241]! } - public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1242]! } - public var VoiceOver_Chat_Photo: String { return self._s[1243]! } - public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[1244]! } - public var IntentsSettings_SuggestBy: String { return self._s[1245]! } - public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[1246]! } - public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1247]! } - public var PhoneNumberHelp_ChangeNumber: String { return self._s[1248]! } - public var LogoutOptions_SetPasscodeText: String { return self._s[1249]! } - public var Map_OpenInMaps: String { return self._s[1250]! } - public var ContactInfo_PhoneLabelWorkFax: String { return self._s[1251]! } - public var BlockedUsers_Unblock: String { return self._s[1252]! } + public var Group_GroupMembersHeader: String { return self._s[1241]! } + public var Group_PublicLink_Title: String { return self._s[1242]! } + public var Channel_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[1243]! } + public var VoiceOver_Chat_Photo: String { return self._s[1244]! } + public var TwoFactorSetup_EmailVerification_Placeholder: String { return self._s[1245]! } + public var IntentsSettings_SuggestBy: String { return self._s[1246]! } + public var Privacy_Calls_AlwaysAllow_Placeholder: String { return self._s[1247]! } + public var Appearance_ThemePreview_ChatList_1_Name: String { return self._s[1248]! } + public var PhoneNumberHelp_ChangeNumber: String { return self._s[1249]! } + public var LogoutOptions_SetPasscodeText: String { return self._s[1250]! } + public var Map_OpenInMaps: String { return self._s[1251]! } + public var ContactInfo_PhoneLabelWorkFax: String { return self._s[1252]! } + public var BlockedUsers_Unblock: String { return self._s[1253]! } public func Settings_ApplyProxyAlert(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1253]!, self._r[1253]!, [_1, _2]) - } - public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1254]!, self._r[1254]!, [_1, _2]) } - public var ChatImport_CreateGroupAlertTitle: String { return self._s[1256]! } - public var Conversation_Block: String { return self._s[1257]! } - public var VoiceChat_PersonalAccount: String { return self._s[1258]! } - public var Passport_Scans_UploadNew: String { return self._s[1259]! } - public var Share_Title: String { return self._s[1260]! } - public var Conversation_ApplyLocalization: String { return self._s[1261]! } - public var SharedMedia_EmptyLinksText: String { return self._s[1262]! } - public var Settings_NotificationsAndSounds: String { return self._s[1263]! } - public var Stats_ViewsByHoursTitle: String { return self._s[1264]! } - public var PhotoEditor_QualityMedium: String { return self._s[1265]! } - public var Conversation_ContextMenuCancelSending: String { return self._s[1266]! } + public func Channel_AdminLog_MessageRestrictedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1255]!, self._r[1255]!, [_1, _2]) + } + public var ChatImport_CreateGroupAlertTitle: String { return self._s[1257]! } + public var Conversation_Block: String { return self._s[1258]! } + public var VoiceChat_PersonalAccount: String { return self._s[1259]! } + public var Passport_Scans_UploadNew: String { return self._s[1260]! } + public var Share_Title: String { return self._s[1261]! } + public var Conversation_ApplyLocalization: String { return self._s[1262]! } + public var SharedMedia_EmptyLinksText: String { return self._s[1263]! } + public var Settings_NotificationsAndSounds: String { return self._s[1264]! } + public var Stats_ViewsByHoursTitle: String { return self._s[1265]! } + public var PhotoEditor_QualityMedium: String { return self._s[1266]! } + public var Conversation_ContextMenuCancelSending: String { return self._s[1267]! } public func PUSH_CHANNEL_MESSAGE_GAME(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1267]!, self._r[1267]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1268]!, self._r[1268]!, [_1, _2]) } - public var Conversation_RestrictedInline: String { return self._s[1268]! } - public var Passport_Language_tr: String { return self._s[1269]! } - public var Call_Mute: String { return self._s[1270]! } + public var Conversation_RestrictedInline: String { return self._s[1269]! } + public var Passport_Language_tr: String { return self._s[1270]! } + public var Call_Mute: String { return self._s[1271]! } public func Conversation_NoticeInvitedByInGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1271]!, self._r[1271]!, [_0]) + return formatWithArgumentRanges(self._s[1272]!, self._r[1272]!, [_0]) } - public var Passport_Language_bn: String { return self._s[1272]! } - public var Common_Save: String { return self._s[1274]! } - public var AccessDenied_LocationTracking: String { return self._s[1276]! } - public var Month_ShortOctober: String { return self._s[1277]! } - public var AutoDownloadSettings_WiFi: String { return self._s[1278]! } - public var ProfilePhoto_SetMainPhoto: String { return self._s[1280]! } - public var ChangePhoneNumberNumber_NewNumber: String { return self._s[1281]! } + public var Passport_Language_bn: String { return self._s[1273]! } + public var Common_Save: String { return self._s[1275]! } + public var AccessDenied_LocationTracking: String { return self._s[1277]! } + public var Month_ShortOctober: String { return self._s[1278]! } + public var AutoDownloadSettings_WiFi: String { return self._s[1279]! } + public var ProfilePhoto_SetMainPhoto: String { return self._s[1281]! } + public var ChangePhoneNumberNumber_NewNumber: String { return self._s[1282]! } public func Time_MonthOfYear_m3(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1282]!, self._r[1282]!, [_0]) + return formatWithArgumentRanges(self._s[1283]!, self._r[1283]!, [_0]) } - public var Watch_ChannelInfo_Title: String { return self._s[1283]! } - public var State_Updating: String { return self._s[1284]! } - public var Conversation_UnblockUser: String { return self._s[1285]! } - public var Notifications_ChannelNotificationsSound: String { return self._s[1286]! } - public var Map_GetDirections: String { return self._s[1287]! } - public var Watch_Compose_AddContact: String { return self._s[1289]! } - public var Conversation_Dice_u26BD: String { return self._s[1290]! } - public var AccessDenied_PhotosRestricted: String { return self._s[1291]! } + public var Watch_ChannelInfo_Title: String { return self._s[1284]! } + public var State_Updating: String { return self._s[1285]! } + public var Conversation_UnblockUser: String { return self._s[1286]! } + public var Notifications_ChannelNotificationsSound: String { return self._s[1287]! } + public var Map_GetDirections: String { return self._s[1288]! } + public var Watch_Compose_AddContact: String { return self._s[1290]! } + public var Conversation_Dice_u26BD: String { return self._s[1291]! } + public var AccessDenied_PhotosRestricted: String { return self._s[1292]! } public func Channel_AdminLog_MessageRank(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1292]!, self._r[1292]!, [_1]) + return formatWithArgumentRanges(self._s[1293]!, self._r[1293]!, [_1]) } - public var Map_LoadError: String { return self._s[1294]! } - public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[1295]! } - public var PhotoEditor_CropAuto: String { return self._s[1296]! } + public var Map_LoadError: String { return self._s[1295]! } + public var SettingsSearch_Synonyms_Privacy_Calls: String { return self._s[1296]! } + public var PhotoEditor_CropAuto: String { return self._s[1297]! } public func Target_ShareGameConfirmationPrivate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1299]!, self._r[1299]!, [_0]) + return formatWithArgumentRanges(self._s[1300]!, self._r[1300]!, [_0]) } - public var Username_TooManyPublicUsernamesError: String { return self._s[1301]! } + public var Username_TooManyPublicUsernamesError: String { return self._s[1302]! } public func PUSH_PINNED_GAME(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1302]!, self._r[1302]!, [_1]) + return formatWithArgumentRanges(self._s[1303]!, self._r[1303]!, [_1]) } - public var Settings_PhoneNumber: String { return self._s[1303]! } + public var Settings_PhoneNumber: String { return self._s[1304]! } public func Channel_AdminLog_MessageTransferedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1304]!, self._r[1304]!, [_1]) + return formatWithArgumentRanges(self._s[1305]!, self._r[1305]!, [_1]) } - public var Month_GenJune: String { return self._s[1306]! } - public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[1307]! } - public var ChatListFolder_CategoryRead: String { return self._s[1308]! } - public var LoginPassword_ResetAccount: String { return self._s[1309]! } + public var Month_GenJune: String { return self._s[1307]! } + public var Notifications_ExceptionsGroupPlaceholder: String { return self._s[1308]! } + public var ChatListFolder_CategoryRead: String { return self._s[1309]! } + public var LoginPassword_ResetAccount: String { return self._s[1310]! } public func DialogList_SingleUploadingFileSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1310]!, self._r[1310]!, [_0]) + return formatWithArgumentRanges(self._s[1311]!, self._r[1311]!, [_0]) } - public var Call_CameraConfirmationConfirm: String { return self._s[1311]! } - public var Notification_RenamedChannel: String { return self._s[1312]! } + public var Call_CameraConfirmationConfirm: String { return self._s[1312]! } + public var Notification_RenamedChannel: String { return self._s[1313]! } public func Channel_AdminLog_MessageUnpinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1313]!, self._r[1313]!, [_0]) + return formatWithArgumentRanges(self._s[1314]!, self._r[1314]!, [_0]) } - public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[1314]! } - public var IntentsSettings_Title: String { return self._s[1316]! } - public var CallList_DeleteAllForMe: String { return self._s[1317]! } - public var Settings_AppleWatch: String { return self._s[1318]! } - public var Conversation_LinkCopied: String { return self._s[1319]! } - public var DialogList_NoMessagesText: String { return self._s[1320]! } + public var Channel_AdminLogFilter_EventsAdmins: String { return self._s[1315]! } + public var IntentsSettings_Title: String { return self._s[1317]! } + public var CallList_DeleteAllForMe: String { return self._s[1318]! } + public var Settings_AppleWatch: String { return self._s[1319]! } + public var Conversation_LinkCopied: String { return self._s[1320]! } + public var DialogList_NoMessagesText: String { return self._s[1321]! } public func VoiceChat_SendPublicLinkText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1321]!, self._r[1321]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1322]!, self._r[1322]!, [_1, _2]) } - public var GroupPermission_NoChangeInfo: String { return self._s[1322]! } - public var Channel_ErrorAccessDenied: String { return self._s[1324]! } - public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1325]! } + public var GroupPermission_NoChangeInfo: String { return self._s[1323]! } + public var Channel_ErrorAccessDenied: String { return self._s[1325]! } + public var ScheduledMessages_EmptyPlaceholder: String { return self._s[1326]! } public func Message_StickerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1326]!, self._r[1326]!, [_0]) + return formatWithArgumentRanges(self._s[1327]!, self._r[1327]!, [_0]) } - public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1327]! } - public var StickerPacksSettings_AnimatedStickers: String { return self._s[1328]! } - public var Month_ShortJanuary: String { return self._s[1329]! } - public var Conversation_UnreadMessages: String { return self._s[1330]! } - public var Conversation_PrivateChannelTooltip: String { return self._s[1332]! } - public var Call_VoiceOver_VideoCallCanceled: String { return self._s[1333]! } - public var PrivacySettings_DeleteAccountTitle: String { return self._s[1335]! } - public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1336]! } + public var AuthSessions_TerminateOtherSessionsHelp: String { return self._s[1328]! } + public var StickerPacksSettings_AnimatedStickers: String { return self._s[1329]! } + public var Month_ShortJanuary: String { return self._s[1330]! } + public var Conversation_UnreadMessages: String { return self._s[1331]! } + public var Conversation_PrivateChannelTooltip: String { return self._s[1333]! } + public var Call_VoiceOver_VideoCallCanceled: String { return self._s[1334]! } + public var PrivacySettings_DeleteAccountTitle: String { return self._s[1336]! } + public var Channel_Members_AddBannedErrorAdmin: String { return self._s[1337]! } public func Conversation_ShareMyPhoneNumberConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1340]!, self._r[1340]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1341]!, self._r[1341]!, [_1, _2]) } - public var Widget_ApplicationLocked: String { return self._s[1341]! } + public var Widget_ApplicationLocked: String { return self._s[1342]! } public func TextFormat_AddLinkText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1342]!, self._r[1342]!, [_0]) + return formatWithArgumentRanges(self._s[1343]!, self._r[1343]!, [_0]) } - public var Common_TakePhotoOrVideo: String { return self._s[1343]! } - public var Passport_Language_ru: String { return self._s[1345]! } - public var MediaPicker_VideoMuteDescription: String { return self._s[1346]! } - public var EditTheme_ErrorLinkTaken: String { return self._s[1347]! } + public var Common_TakePhotoOrVideo: String { return self._s[1344]! } + public var Passport_Language_ru: String { return self._s[1346]! } + public var MediaPicker_VideoMuteDescription: String { return self._s[1347]! } + public var EditTheme_ErrorLinkTaken: String { return self._s[1348]! } public func Group_EditAdmin_RankInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1349]!, self._r[1349]!, [_0]) + return formatWithArgumentRanges(self._s[1350]!, self._r[1350]!, [_0]) } - public var VoiceChat_ShareShort: String { return self._s[1350]! } - public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[1351]! } - public var Conversation_Owner: String { return self._s[1353]! } - public var Settings_FAQ_Intro: String { return self._s[1354]! } - public var PhotoEditor_QualityLow: String { return self._s[1356]! } - public var Widget_GalleryTitle: String { return self._s[1357]! } - public var Call_End: String { return self._s[1358]! } - public var StickerPacksSettings_FeaturedPacks: String { return self._s[1360]! } - public var Privacy_ContactsSyncHelp: String { return self._s[1361]! } - public var OldChannels_NoticeUpgradeText: String { return self._s[1365]! } - public var Conversation_Call: String { return self._s[1367]! } - public var Watch_MessageView_Title: String { return self._s[1368]! } + public var VoiceChat_ShareShort: String { return self._s[1351]! } + public var Channel_Members_AddAdminErrorBlacklisted: String { return self._s[1352]! } + public var Conversation_Owner: String { return self._s[1354]! } + public var Settings_FAQ_Intro: String { return self._s[1355]! } + public var PhotoEditor_QualityLow: String { return self._s[1357]! } + public var Widget_GalleryTitle: String { return self._s[1358]! } + public var Call_End: String { return self._s[1359]! } + public var StickerPacksSettings_FeaturedPacks: String { return self._s[1361]! } + public var Privacy_ContactsSyncHelp: String { return self._s[1362]! } + public var OldChannels_NoticeUpgradeText: String { return self._s[1366]! } + public var Conversation_Call: String { return self._s[1368]! } + public var Watch_MessageView_Title: String { return self._s[1369]! } public func Notification_RenamedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1369]!, self._r[1369]!, [_0]) + return formatWithArgumentRanges(self._s[1370]!, self._r[1370]!, [_0]) } - public var Passport_PasswordCompleteSetup: String { return self._s[1370]! } + public var Passport_PasswordCompleteSetup: String { return self._s[1371]! } public func Notification_ChangedGroupVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1371]!, self._r[1371]!, [_0]) + return formatWithArgumentRanges(self._s[1372]!, self._r[1372]!, [_0]) } public func TwoFactorSetup_EmailVerification_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1373]!, self._r[1373]!, [_0]) + return formatWithArgumentRanges(self._s[1374]!, self._r[1374]!, [_0]) } - public var Map_Location: String { return self._s[1374]! } - public var Watch_MessageView_ViewOnPhone: String { return self._s[1375]! } - public var Login_CountryCode: String { return self._s[1376]! } - public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[1378]! } - public var ChatState_ConnectingToProxy: String { return self._s[1379]! } - public var Login_CallRequestState3: String { return self._s[1380]! } - public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[1383]! } - public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1384]! } - public var Widget_ChatsGalleryDescription: String { return self._s[1386]! } - public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[1388]! } - public var InstantPage_FontSanFrancisco: String { return self._s[1389]! } - public var Call_StatusEnded: String { return self._s[1390]! } + public var Map_Location: String { return self._s[1375]! } + public var Watch_MessageView_ViewOnPhone: String { return self._s[1376]! } + public var Login_CountryCode: String { return self._s[1377]! } + public var Channel_DiscussionGroup_PrivateGroup: String { return self._s[1379]! } + public var ChatState_ConnectingToProxy: String { return self._s[1380]! } + public var Login_CallRequestState3: String { return self._s[1381]! } + public var NetworkUsageSettings_MediaAudioDataSection: String { return self._s[1384]! } + public var SocksProxySetup_ProxyStatusConnecting: String { return self._s[1385]! } + public var Widget_ChatsGalleryDescription: String { return self._s[1387]! } + public var PrivacyLastSeenSettings_NeverShareWith_Placeholder: String { return self._s[1389]! } + public var InstantPage_FontSanFrancisco: String { return self._s[1390]! } + public var Call_StatusEnded: String { return self._s[1391]! } public func Checkout_SuccessfulTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1393]!, self._r[1393]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1394]!, self._r[1394]!, [_1, _2]) } - public var MusicPlayer_VoiceNote: String { return self._s[1394]! } - public var ChatImportActivity_ErrorUserBlocked: String { return self._s[1395]! } + public var MusicPlayer_VoiceNote: String { return self._s[1395]! } + public var ChatImportActivity_ErrorUserBlocked: String { return self._s[1396]! } public func PUSH_CHANNEL_MESSAGE_TEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1396]!, self._r[1396]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1397]!, self._r[1397]!, [_1, _2]) } - public var VoiceOver_MessageContextShare: String { return self._s[1397]! } - public var ProfilePhoto_SearchWeb: String { return self._s[1398]! } - public var EditProfile_Title: String { return self._s[1399]! } + public var VoiceOver_MessageContextShare: String { return self._s[1398]! } + public var ProfilePhoto_SearchWeb: String { return self._s[1399]! } + public var EditProfile_Title: String { return self._s[1400]! } public func Notification_PinnedQuizMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1400]!, self._r[1400]!, [_0]) + return formatWithArgumentRanges(self._s[1401]!, self._r[1401]!, [_0]) } - public var VoiceChat_Unmute: String { return self._s[1401]! } - public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[1402]! } - public var NetworkUsageSettings_ResetStats: String { return self._s[1404]! } - public var NetworkUsageSettings_GeneralDataSection: String { return self._s[1405]! } - public var StickerPackActionInfo_AddedTitle: String { return self._s[1406]! } - public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[1407]! } + public var VoiceChat_Unmute: String { return self._s[1402]! } + public var ChangePhoneNumberCode_CodePlaceholder: String { return self._s[1403]! } + public var NetworkUsageSettings_ResetStats: String { return self._s[1405]! } + public var NetworkUsageSettings_GeneralDataSection: String { return self._s[1406]! } + public var StickerPackActionInfo_AddedTitle: String { return self._s[1407]! } + public var Channel_BanUser_PermissionSendStickersAndGifs: String { return self._s[1408]! } public func Call_ParticipantVideoVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1408]!, self._r[1408]!, [_0]) + return formatWithArgumentRanges(self._s[1409]!, self._r[1409]!, [_0]) } - public var Location_ProximityNotification_Title: String { return self._s[1409]! } - public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[1410]! } - public var Passport_Identity_LatinNameHelp: String { return self._s[1413]! } - public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[1414]! } - public var Stats_GroupMembersTitle: String { return self._s[1415]! } - public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[1416]! } - public var InviteLink_InviteLinkRevoked: String { return self._s[1417]! } - public var Contacts_PermissionsSuppressWarningText: String { return self._s[1418]! } - public var OpenFile_PotentiallyDangerousContentAlert: String { return self._s[1419]! } - public var Settings_SetUsername: String { return self._s[1420]! } - public var GroupInfo_ActionRestrict: String { return self._s[1421]! } - public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1422]! } + public var Location_ProximityNotification_Title: String { return self._s[1410]! } + public var AuthSessions_AddDeviceIntro_Text1: String { return self._s[1411]! } + public var Passport_Identity_LatinNameHelp: String { return self._s[1414]! } + public var AuthSessions_AddDeviceIntro_Text2: String { return self._s[1415]! } + public var Stats_GroupMembersTitle: String { return self._s[1416]! } + public var AuthSessions_AddDeviceIntro_Text3: String { return self._s[1417]! } + public var InviteLink_InviteLinkRevoked: String { return self._s[1418]! } + public var Contacts_PermissionsSuppressWarningText: String { return self._s[1419]! } + public var OpenFile_PotentiallyDangerousContentAlert: String { return self._s[1420]! } + public var Settings_SetUsername: String { return self._s[1421]! } + public var GroupInfo_ActionRestrict: String { return self._s[1422]! } + public var SettingsSearch_Synonyms_SavedMessages: String { return self._s[1423]! } public func Time_PreciseDate_m2(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1423]!, self._r[1423]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1424]!, self._r[1424]!, [_1, _2, _3]) } - public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1425]! } - public var Notification_Exceptions_AlwaysOff: String { return self._s[1426]! } - public var Conversation_ContextMenuDelete: String { return self._s[1427]! } - public var Privacy_Calls_WhoCanCallMe: String { return self._s[1428]! } - public var ChatList_PsaAlert_covid: String { return self._s[1431]! } - public var VoiceOver_SilentPostOn: String { return self._s[1432]! } - public var DialogList_Pin: String { return self._s[1433]! } - public var Channel_AdminLog_CanInviteUsersViaLink: String { return self._s[1434]! } - public var PrivacySettings_SecurityTitle: String { return self._s[1435]! } - public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[1436]! } - public var PeopleNearby_Groups: String { return self._s[1437]! } - public var Message_File: String { return self._s[1438]! } - public var Calls_NoCallsPlaceholder: String { return self._s[1439]! } - public var ChatList_GenericPsaLabel: String { return self._s[1442]! } - public var UserInfo_LastNamePlaceholder: String { return self._s[1443]! } - public var IntentsSettings_Reset: String { return self._s[1445]! } - public var Call_ConnectionErrorTitle: String { return self._s[1446]! } - public var PhotoEditor_SaturationTool: String { return self._s[1447]! } - public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[1448]! } - public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1449]! } - public var Conversation_SearchNoResults: String { return self._s[1450]! } - public var Channel_DiscussionGroup_PrivateChannel: String { return self._s[1451]! } - public var Map_OpenInWaze: String { return self._s[1452]! } - public var InviteLink_PeopleJoinedNone: String { return self._s[1453]! } - public var WallpaperPreview_Title: String { return self._s[1454]! } + public var Notifications_DisplayNamesOnLockScreenInfoWithLink: String { return self._s[1426]! } + public var Notification_Exceptions_AlwaysOff: String { return self._s[1427]! } + public var Conversation_ContextMenuDelete: String { return self._s[1428]! } + public var Privacy_Calls_WhoCanCallMe: String { return self._s[1429]! } + public var ChatList_PsaAlert_covid: String { return self._s[1432]! } + public var VoiceOver_SilentPostOn: String { return self._s[1433]! } + public var DialogList_Pin: String { return self._s[1434]! } + public var Channel_AdminLog_CanInviteUsersViaLink: String { return self._s[1435]! } + public var PrivacySettings_SecurityTitle: String { return self._s[1436]! } + public var GroupPermission_NotAvailableInPublicGroups: String { return self._s[1437]! } + public var PeopleNearby_Groups: String { return self._s[1438]! } + public var Message_File: String { return self._s[1439]! } + public var Calls_NoCallsPlaceholder: String { return self._s[1440]! } + public var ChatList_GenericPsaLabel: String { return self._s[1443]! } + public var UserInfo_LastNamePlaceholder: String { return self._s[1444]! } + public var IntentsSettings_Reset: String { return self._s[1446]! } + public var Call_ConnectionErrorTitle: String { return self._s[1447]! } + public var PhotoEditor_SaturationTool: String { return self._s[1448]! } + public var ChatSettings_AutomaticVideoMessageDownload: String { return self._s[1449]! } + public var SettingsSearch_Synonyms_Stickers_ArchivedPacks: String { return self._s[1450]! } + public var Conversation_SearchNoResults: String { return self._s[1451]! } + public var Channel_DiscussionGroup_PrivateChannel: String { return self._s[1452]! } + public var Map_OpenInWaze: String { return self._s[1453]! } + public var InviteLink_PeopleJoinedNone: String { return self._s[1454]! } + public var WallpaperPreview_Title: String { return self._s[1455]! } public func Passport_AcceptHelp(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1456]!, self._r[1456]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1457]!, self._r[1457]!, [_1, _2]) } - public var AuthSessions_AddDeviceIntro_Title: String { return self._s[1457]! } - public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[1458]! } - public var TwoFactorSetup_ResetDone_TextNoPassword: String { return self._s[1459]! } - public var VoiceOver_Chat_ChannelInfo: String { return self._s[1460]! } - public var Conversation_ImageCopied: String { return self._s[1461]! } - public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[1462]! } - public var Notifications_PermissionsUnreachableTitle: String { return self._s[1464]! } - public var Stats_Total: String { return self._s[1467]! } - public var Stats_GroupMessages: String { return self._s[1468]! } - public var TwoFactorSetup_Email_SkipAction: String { return self._s[1469]! } - public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[1470]! } - public var VoiceChat_You: String { return self._s[1471]! } - public var VoiceChat_DisplayAsInfoGroup: String { return self._s[1472]! } - public var Passport_Identity_Translation: String { return self._s[1473]! } - public var Notifications_TextTone: String { return self._s[1476]! } - public var Settings_RemoveConfirmation: String { return self._s[1478]! } - public var ScheduledMessages_Delete: String { return self._s[1479]! } - public var Channel_AdminLog_BanEmbedLinks: String { return self._s[1480]! } - public var Passport_PasswordNext: String { return self._s[1481]! } + public var AuthSessions_AddDeviceIntro_Title: String { return self._s[1458]! } + public var VoiceOver_Chat_RecordModeVideoMessageInfo: String { return self._s[1459]! } + public var TwoFactorSetup_ResetDone_TextNoPassword: String { return self._s[1460]! } + public var VoiceOver_Chat_ChannelInfo: String { return self._s[1461]! } + public var Conversation_ImageCopied: String { return self._s[1462]! } + public var Passport_Identity_OneOfTypeInternalPassport: String { return self._s[1463]! } + public var Notifications_PermissionsUnreachableTitle: String { return self._s[1465]! } + public var Stats_Total: String { return self._s[1468]! } + public var Stats_GroupMessages: String { return self._s[1469]! } + public var TwoFactorSetup_Email_SkipAction: String { return self._s[1470]! } + public var CheckoutInfo_ErrorPhoneInvalid: String { return self._s[1471]! } + public var VoiceChat_You: String { return self._s[1472]! } + public var VoiceChat_DisplayAsInfoGroup: String { return self._s[1473]! } + public var Passport_Identity_Translation: String { return self._s[1474]! } + public var Notifications_TextTone: String { return self._s[1477]! } + public var Settings_RemoveConfirmation: String { return self._s[1479]! } + public var ScheduledMessages_Delete: String { return self._s[1480]! } + public var Channel_AdminLog_BanEmbedLinks: String { return self._s[1481]! } + public var Passport_PasswordNext: String { return self._s[1482]! } public func PUSH_ENCRYPTED_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1482]!, self._r[1482]!, [_1]) + return formatWithArgumentRanges(self._s[1483]!, self._r[1483]!, [_1]) } - public var Passport_Address_EditBankStatement: String { return self._s[1483]! } - public var PhotoEditor_ShadowsTool: String { return self._s[1484]! } - public var Notification_VideoCallMissed: String { return self._s[1485]! } - public var AccessDenied_CameraDisabled: String { return self._s[1487]! } - public var AuthSessions_AddDevice_ScanInfo: String { return self._s[1488]! } - public var Notifications_ExceptionsMuted: String { return self._s[1489]! } - public var VoiceChat_TapToViewScreenVideo: String { return self._s[1490]! } - public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[1491]! } - public var Channel_BlackList_Title: String { return self._s[1492]! } - public var PasscodeSettings_4DigitCode: String { return self._s[1493]! } - public var NotificationsSound_Bamboo: String { return self._s[1494]! } - public var Conversation_InputMenu: String { return self._s[1495]! } - public var PrivacySettings_LastSeenContacts: String { return self._s[1496]! } - public var Passport_Address_TypeUtilityBill: String { return self._s[1497]! } - public var Passport_Address_CountryPlaceholder: String { return self._s[1498]! } - public var GroupPermission_SectionTitle: String { return self._s[1499]! } - public var InviteLink_ContextRevoke: String { return self._s[1500]! } + public var Passport_Address_EditBankStatement: String { return self._s[1484]! } + public var PhotoEditor_ShadowsTool: String { return self._s[1485]! } + public var Notification_VideoCallMissed: String { return self._s[1486]! } + public var AccessDenied_CameraDisabled: String { return self._s[1488]! } + public var AuthSessions_AddDevice_ScanInfo: String { return self._s[1489]! } + public var Notifications_ExceptionsMuted: String { return self._s[1490]! } + public var VoiceChat_TapToViewScreenVideo: String { return self._s[1491]! } + public var Conversation_ScheduleMessage_SendWhenOnline: String { return self._s[1492]! } + public var Channel_BlackList_Title: String { return self._s[1493]! } + public var PasscodeSettings_4DigitCode: String { return self._s[1494]! } + public var NotificationsSound_Bamboo: String { return self._s[1495]! } + public var Conversation_InputMenu: String { return self._s[1496]! } + public var PrivacySettings_LastSeenContacts: String { return self._s[1497]! } + public var Passport_Address_TypeUtilityBill: String { return self._s[1498]! } + public var Passport_Address_CountryPlaceholder: String { return self._s[1499]! } + public var GroupPermission_SectionTitle: String { return self._s[1500]! } + public var InviteLink_ContextRevoke: String { return self._s[1501]! } public func Notification_InvitedMultiple(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1501]!, self._r[1501]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1502]!, self._r[1502]!, [_0, _1]) } - public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1502]! } - public var Channel_LeaveChannel: String { return self._s[1503]! } - public var Watch_Notification_Joined: String { return self._s[1504]! } - public var PeerInfo_ButtonMore: String { return self._s[1505]! } - public var Passport_FieldEmailHelp: String { return self._s[1506]! } - public var ChatList_Context_Pin: String { return self._s[1507]! } + public var CheckoutInfo_ShippingInfoStatePlaceholder: String { return self._s[1503]! } + public var Channel_LeaveChannel: String { return self._s[1504]! } + public var Watch_Notification_Joined: String { return self._s[1505]! } + public var PeerInfo_ButtonMore: String { return self._s[1506]! } + public var Passport_FieldEmailHelp: String { return self._s[1507]! } + public var ChatList_Context_Pin: String { return self._s[1508]! } public func Time_MonthOfYear_m9(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1508]!, self._r[1508]!, [_0]) + return formatWithArgumentRanges(self._s[1509]!, self._r[1509]!, [_0]) } - public var Group_Location_CreateInThisPlace: String { return self._s[1509]! } - public var PhotoEditor_QualityVeryHigh: String { return self._s[1510]! } - public var Tour_Title5: String { return self._s[1511]! } + public var Group_Location_CreateInThisPlace: String { return self._s[1510]! } + public var PhotoEditor_QualityVeryHigh: String { return self._s[1511]! } + public var Tour_Title5: String { return self._s[1512]! } public func PUSH_CHAT_MESSAGE_FWD(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1512]!, self._r[1512]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1513]!, self._r[1513]!, [_1, _2]) } - public var Passport_Language_en: String { return self._s[1513]! } - public var Checkout_Name: String { return self._s[1514]! } - public var ChatImport_Title: String { return self._s[1515]! } + public var Passport_Language_en: String { return self._s[1514]! } + public var Checkout_Name: String { return self._s[1515]! } + public var ChatImport_Title: String { return self._s[1516]! } public func NetworkUsageSettings_WifiUsageSince(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1516]!, self._r[1516]!, [_0]) + return formatWithArgumentRanges(self._s[1517]!, self._r[1517]!, [_0]) } - public var PhotoEditor_EnhanceTool: String { return self._s[1517]! } + public var PhotoEditor_EnhanceTool: String { return self._s[1518]! } public func PUSH_CHAT_DELETE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1518]!, self._r[1518]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1519]!, self._r[1519]!, [_1, _2]) } public func VoiceChat_UserCanNowSpeak(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1519]!, self._r[1519]!, [_0]) + return formatWithArgumentRanges(self._s[1520]!, self._r[1520]!, [_0]) } - public var PeerInfo_CustomizeNotifications: String { return self._s[1520]! } + public var PeerInfo_CustomizeNotifications: String { return self._s[1521]! } public func Login_TermsOfService_ProceedBot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1521]!, self._r[1521]!, [_0]) + return formatWithArgumentRanges(self._s[1522]!, self._r[1522]!, [_0]) } - public var Group_ErrorSendRestrictedMedia: String { return self._s[1522]! } + public var Group_ErrorSendRestrictedMedia: String { return self._s[1523]! } public func UserInfo_NotificationsDefaultSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1523]!, self._r[1523]!, [_0]) + return formatWithArgumentRanges(self._s[1524]!, self._r[1524]!, [_0]) } - public var Login_UnknownError: String { return self._s[1524]! } - public var Conversation_ImportedMessageHint: String { return self._s[1526]! } + public var Login_UnknownError: String { return self._s[1525]! } + public var Conversation_ImportedMessageHint: String { return self._s[1527]! } public func VoiceChat_ForwardTooltip_Chat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1527]!, self._r[1527]!, [_0]) + return formatWithArgumentRanges(self._s[1528]!, self._r[1528]!, [_0]) } - public var Passport_Identity_TypeDriversLicense: String { return self._s[1529]! } - public var ChatList_AutoarchiveSuggestion_Title: String { return self._s[1530]! } - public var Watch_PhotoView_Title: String { return self._s[1531]! } - public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[1532]! } - public var Checkout_TotalAmount: String { return self._s[1533]! } - public var ChatList_RemoveFolderAction: String { return self._s[1534]! } + public var Passport_Identity_TypeDriversLicense: String { return self._s[1530]! } + public var ChatList_AutoarchiveSuggestion_Title: String { return self._s[1531]! } + public var Watch_PhotoView_Title: String { return self._s[1532]! } + public var Appearance_ThemePreview_ChatList_3_Text: String { return self._s[1533]! } + public var Checkout_TotalAmount: String { return self._s[1534]! } + public var ChatList_RemoveFolderAction: String { return self._s[1535]! } public func GroupInfo_Permissions_BroadcastConvertInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1535]!, self._r[1535]!, [_0]) + return formatWithArgumentRanges(self._s[1536]!, self._r[1536]!, [_0]) } - public var GroupInfo_SetGroupPhoto: String { return self._s[1536]! } - public var Watch_AppName: String { return self._s[1537]! } + public var GroupInfo_SetGroupPhoto: String { return self._s[1537]! } + public var Watch_AppName: String { return self._s[1538]! } public func PUSH_PINNED_GAME_SCORE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1538]!, self._r[1538]!, [_1]) + return formatWithArgumentRanges(self._s[1539]!, self._r[1539]!, [_1]) } - public var Channel_Username_CheckingUsername: String { return self._s[1539]! } - public var ContactList_Context_Call: String { return self._s[1540]! } - public var ChatList_ReorderTabs: String { return self._s[1541]! } - public var Watch_ChatList_Compose: String { return self._s[1542]! } + public var Channel_Username_CheckingUsername: String { return self._s[1540]! } + public var ContactList_Context_Call: String { return self._s[1541]! } + public var ChatList_ReorderTabs: String { return self._s[1542]! } + public var Watch_ChatList_Compose: String { return self._s[1543]! } public func Conversation_LiveLocationYouAnd(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1543]!, self._r[1543]!, [_0]) + return formatWithArgumentRanges(self._s[1544]!, self._r[1544]!, [_0]) } - public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[1544]! } - public var ArchivedChats_IntroTitle1: String { return self._s[1545]! } + public var Channel_AdminLog_EmptyFilterTitle: String { return self._s[1545]! } + public var ArchivedChats_IntroTitle1: String { return self._s[1546]! } public func PUSH_ENCRYPTION_ACCEPT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1546]!, self._r[1546]!, [_1]) + return formatWithArgumentRanges(self._s[1547]!, self._r[1547]!, [_1]) } - public var Call_StatusRequesting: String { return self._s[1548]! } - public var Checkout_TotalPaidAmount: String { return self._s[1549]! } - public var Weekday_Friday: String { return self._s[1551]! } - public var CreateGroup_ChannelsTooMuch: String { return self._s[1552]! } + public var Call_StatusRequesting: String { return self._s[1549]! } + public var Checkout_TotalPaidAmount: String { return self._s[1550]! } + public var Weekday_Friday: String { return self._s[1552]! } + public var CreateGroup_ChannelsTooMuch: String { return self._s[1553]! } public func ChatImport_SelectionConfirmationUserWithoutTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1553]!, self._r[1553]!, [_0]) + return formatWithArgumentRanges(self._s[1554]!, self._r[1554]!, [_0]) } - public var Watch_ChatList_NoConversationsText: String { return self._s[1554]! } - public var Group_Members_AddMembersHelp: String { return self._s[1555]! } + public var Watch_ChatList_NoConversationsText: String { return self._s[1555]! } + public var Group_Members_AddMembersHelp: String { return self._s[1556]! } public func Channel_AdminLog_MessageChangedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1556]!, self._r[1556]!, [_0]) + return formatWithArgumentRanges(self._s[1557]!, self._r[1557]!, [_0]) } - public var SecretVideo_Title: String { return self._s[1557]! } + public var SecretVideo_Title: String { return self._s[1558]! } public func Notification_PinnedStickerMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1560]!, self._r[1560]!, [_0]) + return formatWithArgumentRanges(self._s[1561]!, self._r[1561]!, [_0]) } - public var Undo_Undo: String { return self._s[1561]! } - public var Watch_Microphone_Access: String { return self._s[1562]! } + public var Undo_Undo: String { return self._s[1562]! } + public var Watch_Microphone_Access: String { return self._s[1563]! } public func ChatImport_SelectionConfirmationGroupWithTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1563]!, self._r[1563]!, [_1, _2]) - } - public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1564]!, self._r[1564]!, [_1, _2]) } - public func ChatList_Search_NoResultsQueryDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1565]!, self._r[1565]!, [_0]) + public func PUSH_CHAT_MESSAGE_PHOTO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1565]!, self._r[1565]!, [_1, _2]) } - public var Checkout_NewCard_PostcodeTitle: String { return self._s[1567]! } - public var TwoFactorSetup_Intro_Action: String { return self._s[1568]! } - public var Passport_Language_ne: String { return self._s[1569]! } - public var TwoStepAuth_EmailHelp: String { return self._s[1571]! } - public var Profile_MessageLifetime2s: String { return self._s[1572]! } + public func ChatList_Search_NoResultsQueryDescription(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1566]!, self._r[1566]!, [_0]) + } + public var Checkout_NewCard_PostcodeTitle: String { return self._s[1568]! } + public var TwoFactorSetup_Intro_Action: String { return self._s[1569]! } + public var Passport_Language_ne: String { return self._s[1570]! } + public var TwoStepAuth_EmailHelp: String { return self._s[1572]! } + public var Profile_MessageLifetime2s: String { return self._s[1573]! } public func Conversation_MessageDialogRetryAll(_ _1: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1574]!, self._r[1574]!, ["\(_1)"]) + return formatWithArgumentRanges(self._s[1575]!, self._r[1575]!, ["\(_1)"]) } public func Items_NOfM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1575]!, self._r[1575]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1576]!, self._r[1576]!, [_1, _2]) } - public var VoiceChat_SendPublicLinkSend: String { return self._s[1576]! } - public var Media_LimitedAccessText: String { return self._s[1577]! } + public var VoiceChat_SendPublicLinkSend: String { return self._s[1577]! } + public var Media_LimitedAccessText: String { return self._s[1578]! } public func PUSH_CHAT_TITLE_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1578]!, self._r[1578]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1579]!, self._r[1579]!, [_1, _2]) } - public var GroupPermission_NoPinMessages: String { return self._s[1579]! } + public var GroupPermission_NoPinMessages: String { return self._s[1580]! } public func Notification_VoiceChatStarted(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1580]!, self._r[1580]!, [_1]) + return formatWithArgumentRanges(self._s[1581]!, self._r[1581]!, [_1]) } public func Notification_CreatedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1581]!, self._r[1581]!, [_0]) + return formatWithArgumentRanges(self._s[1582]!, self._r[1582]!, [_0]) } - public var FastTwoStepSetup_HintHelp: String { return self._s[1582]! } - public var VoiceOver_SilentPostOff: String { return self._s[1583]! } - public var WallpaperSearch_ColorRed: String { return self._s[1584]! } - public var Watch_ConnectionDescription: String { return self._s[1585]! } - public var Notification_Exceptions_AddException: String { return self._s[1586]! } - public var LocalGroup_IrrelevantWarning: String { return self._s[1587]! } - public var VoiceOver_MessageContextDelete: String { return self._s[1588]! } - public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1589]! } - public var Passport_PasswordPlaceholder: String { return self._s[1590]! } - public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[1591]! } - public var Stats_MessageInteractionsTitle: String { return self._s[1592]! } - public var Appearance_ThemeCarouselClassic: String { return self._s[1593]! } - public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1595]! } - public var Channel_AdminLog_PinMessages: String { return self._s[1596]! } - public var Passport_Address_AddRentalAgreement: String { return self._s[1598]! } - public var Watch_Message_Game: String { return self._s[1599]! } - public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1600]! } - public var PrivacyPolicy_DeclineLastWarning: String { return self._s[1601]! } - public var EditTheme_FileReadError: String { return self._s[1602]! } - public var Group_ErrorAddBlocked: String { return self._s[1603]! } - public var CallSettings_UseLessDataLongDescription: String { return self._s[1604]! } + public var FastTwoStepSetup_HintHelp: String { return self._s[1583]! } + public var VoiceOver_SilentPostOff: String { return self._s[1584]! } + public var WallpaperSearch_ColorRed: String { return self._s[1585]! } + public var Watch_ConnectionDescription: String { return self._s[1586]! } + public var Notification_Exceptions_AddException: String { return self._s[1587]! } + public var LocalGroup_IrrelevantWarning: String { return self._s[1588]! } + public var VoiceOver_MessageContextDelete: String { return self._s[1589]! } + public var LogoutOptions_AlternativeOptionsSection: String { return self._s[1590]! } + public var Passport_PasswordPlaceholder: String { return self._s[1591]! } + public var TwoStepAuth_RecoveryEmailAddDescription: String { return self._s[1592]! } + public var Stats_MessageInteractionsTitle: String { return self._s[1593]! } + public var Appearance_ThemeCarouselClassic: String { return self._s[1594]! } + public var TwoFactorSetup_Email_SkipConfirmationText: String { return self._s[1596]! } + public var Channel_AdminLog_PinMessages: String { return self._s[1597]! } + public var Passport_Address_AddRentalAgreement: String { return self._s[1599]! } + public var Watch_Message_Game: String { return self._s[1600]! } + public var PrivacyLastSeenSettings_NeverShareWith: String { return self._s[1601]! } + public var PrivacyPolicy_DeclineLastWarning: String { return self._s[1602]! } + public var EditTheme_FileReadError: String { return self._s[1603]! } + public var Group_ErrorAddBlocked: String { return self._s[1604]! } + public var CallSettings_UseLessDataLongDescription: String { return self._s[1605]! } public func PUSH_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1606]!, self._r[1606]!, [_1]) + return formatWithArgumentRanges(self._s[1607]!, self._r[1607]!, [_1]) } - public var GroupRemoved_ViewChannelInfo: String { return self._s[1607]! } + public var GroupRemoved_ViewChannelInfo: String { return self._s[1608]! } public func UserInfo_BlockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1608]!, self._r[1608]!, [_0]) + return formatWithArgumentRanges(self._s[1609]!, self._r[1609]!, [_0]) } - public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[1609]! } - public var TwoFactorSetup_EmailVerification_Action: String { return self._s[1610]! } + public var CheckoutInfo_ShippingInfoAddress2Placeholder: String { return self._s[1610]! } + public var TwoFactorSetup_EmailVerification_Action: String { return self._s[1611]! } public func Username_LinkHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1611]!, self._r[1611]!, [_0]) + return formatWithArgumentRanges(self._s[1612]!, self._r[1612]!, [_0]) } - public var ConversationProfile_ErrorCreatingConversation: String { return self._s[1612]! } - public var Bot_GroupStatusReadsHistory: String { return self._s[1613]! } - public var PhotoEditor_CurvesRed: String { return self._s[1614]! } - public var InstantPage_TapToOpenLink: String { return self._s[1615]! } - public var InviteLink_PeopleJoinedShortNoneExpired: String { return self._s[1616]! } - public var FastTwoStepSetup_PasswordHelp: String { return self._s[1617]! } - public var Conversation_DiscussionNotStarted: String { return self._s[1618]! } - public var Notification_CallMissedShort: String { return self._s[1619]! } + public var ConversationProfile_ErrorCreatingConversation: String { return self._s[1613]! } + public var Bot_GroupStatusReadsHistory: String { return self._s[1614]! } + public var PhotoEditor_CurvesRed: String { return self._s[1615]! } + public var InstantPage_TapToOpenLink: String { return self._s[1616]! } + public var InviteLink_PeopleJoinedShortNoneExpired: String { return self._s[1617]! } + public var FastTwoStepSetup_PasswordHelp: String { return self._s[1618]! } + public var Conversation_DiscussionNotStarted: String { return self._s[1619]! } + public var Notification_CallMissedShort: String { return self._s[1620]! } public func Notification_JoinedGroupByLink(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1620]!, self._r[1620]!, [_0]) + return formatWithArgumentRanges(self._s[1621]!, self._r[1621]!, [_0]) } - public var Conversation_DeleteMessagesForEveryone: String { return self._s[1621]! } - public var VoiceChat_UnpinVideo: String { return self._s[1622]! } - public var Permissions_SiriTitle_v0: String { return self._s[1623]! } - public var GroupInfo_AddUserLeftError: String { return self._s[1624]! } - public var Conversation_SendMessage_SendSilently: String { return self._s[1625]! } - public var Paint_Duplicate: String { return self._s[1626]! } - public var AttachmentMenu_WebSearch: String { return self._s[1627]! } - public var Bot_Stop: String { return self._s[1629]! } - public var Conversation_PrivateChannelTimeLimitedAlertTitle: String { return self._s[1630]! } - public var ReportGroupLocation_Report: String { return self._s[1631]! } - public var Compose_Create: String { return self._s[1632]! } - public var Stats_GroupViewers: String { return self._s[1633]! } - public var AutoDownloadSettings_Channels: String { return self._s[1634]! } - public var PhotoEditor_QualityHigh: String { return self._s[1635]! } - public var VoiceChat_Leave: String { return self._s[1636]! } - public var Call_Speaker: String { return self._s[1637]! } + public var Conversation_DeleteMessagesForEveryone: String { return self._s[1622]! } + public var VoiceChat_UnpinVideo: String { return self._s[1623]! } + public var Permissions_SiriTitle_v0: String { return self._s[1624]! } + public var GroupInfo_AddUserLeftError: String { return self._s[1625]! } + public var Conversation_SendMessage_SendSilently: String { return self._s[1626]! } + public var Paint_Duplicate: String { return self._s[1627]! } + public var AttachmentMenu_WebSearch: String { return self._s[1628]! } + public var Bot_Stop: String { return self._s[1630]! } + public var Conversation_PrivateChannelTimeLimitedAlertTitle: String { return self._s[1631]! } + public var ReportGroupLocation_Report: String { return self._s[1632]! } + public var Compose_Create: String { return self._s[1633]! } + public var Stats_GroupViewers: String { return self._s[1634]! } + public var AutoDownloadSettings_Channels: String { return self._s[1635]! } + public var PhotoEditor_QualityHigh: String { return self._s[1636]! } + public var VoiceChat_Leave: String { return self._s[1637]! } + public var Call_Speaker: String { return self._s[1638]! } public func ChatList_LeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1638]!, self._r[1638]!, [_0]) + return formatWithArgumentRanges(self._s[1639]!, self._r[1639]!, [_0]) } - public var Conversation_CloudStorage_ChatStatus: String { return self._s[1639]! } - public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1640]! } - public var ChatList_Context_AddToFolder: String { return self._s[1641]! } - public var InviteLink_QRCode_Info: String { return self._s[1642]! } - public var AutoremoveSetup_Title: String { return self._s[1643]! } - public var ChatList_DeleteForAllMembersConfirmationText: String { return self._s[1644]! } - public var Conversation_Unblock: String { return self._s[1645]! } - public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[1646]! } + public var Conversation_CloudStorage_ChatStatus: String { return self._s[1640]! } + public var Chat_AttachmentMultipleFilesDisabled: String { return self._s[1641]! } + public var ChatList_Context_AddToFolder: String { return self._s[1642]! } + public var InviteLink_QRCode_Info: String { return self._s[1643]! } + public var AutoremoveSetup_Title: String { return self._s[1644]! } + public var ChatList_DeleteForAllMembersConfirmationText: String { return self._s[1645]! } + public var Conversation_Unblock: String { return self._s[1646]! } + public var SettingsSearch_Synonyms_Proxy_UseForCalls: String { return self._s[1647]! } public func Time_PreciseDate_m8(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1647]!, self._r[1647]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[1648]!, self._r[1648]!, [_1, _2, _3]) } - public var Conversation_ContextMenuReply: String { return self._s[1648]! } - public var Contacts_SearchLabel: String { return self._s[1649]! } - public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[1650]! } - public var Stats_GroupMessagesTitle: String { return self._s[1652]! } - public var VoiceChat_NoiseSuppression: String { return self._s[1653]! } - public var Notification_CallCanceled: String { return self._s[1654]! } - public var VoiceOver_Chat_Selected: String { return self._s[1655]! } - public var NotificationsSound_Tremolo: String { return self._s[1657]! } - public var VoiceOver_AuthSessions_CurrentSession: String { return self._s[1658]! } - public var ChatList_Search_NoResultsDescription: String { return self._s[1659]! } - public var AccessDenied_PhotosAndVideos: String { return self._s[1660]! } - public var LogoutOptions_ClearCacheText: String { return self._s[1661]! } + public var Conversation_ContextMenuReply: String { return self._s[1649]! } + public var Contacts_SearchLabel: String { return self._s[1650]! } + public var Forward_ErrorPublicQuizDisabledInChannels: String { return self._s[1651]! } + public var Stats_GroupMessagesTitle: String { return self._s[1653]! } + public var VoiceChat_NoiseSuppression: String { return self._s[1654]! } + public var Notification_CallCanceled: String { return self._s[1655]! } + public var VoiceOver_Chat_Selected: String { return self._s[1656]! } + public var NotificationsSound_Tremolo: String { return self._s[1658]! } + public var VoiceOver_AuthSessions_CurrentSession: String { return self._s[1659]! } + public var ChatList_Search_NoResultsDescription: String { return self._s[1660]! } + public var AccessDenied_PhotosAndVideos: String { return self._s[1661]! } + public var LogoutOptions_ClearCacheText: String { return self._s[1662]! } public func VoiceChat_DisplayAsSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1663]!, self._r[1663]!, [_0]) + return formatWithArgumentRanges(self._s[1664]!, self._r[1664]!, [_0]) } - public var VoiceOver_Chat_Sticker: String { return self._s[1664]! } - public var ChatListFolder_NameUnread: String { return self._s[1665]! } - public var PeerInfo_ButtonMessage: String { return self._s[1667]! } - public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[1668]! } - public var Settings_KeepPassword: String { return self._s[1669]! } - public var BlockedUsers_SelectUserTitle: String { return self._s[1670]! } - public var ChatSettings_Other: String { return self._s[1671]! } - public var UserInfo_NotificationsEnabled: String { return self._s[1672]! } - public var CreatePoll_OptionsHeader: String { return self._s[1673]! } - public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1676]! } - public var Channel_Moderator_Title: String { return self._s[1677]! } + public var VoiceOver_Chat_Sticker: String { return self._s[1665]! } + public var ChatListFolder_NameUnread: String { return self._s[1666]! } + public var PeerInfo_ButtonMessage: String { return self._s[1668]! } + public var InfoPlist_NSPhotoLibraryAddUsageDescription: String { return self._s[1669]! } + public var Settings_KeepPassword: String { return self._s[1670]! } + public var BlockedUsers_SelectUserTitle: String { return self._s[1671]! } + public var ChatSettings_Other: String { return self._s[1672]! } + public var UserInfo_NotificationsEnabled: String { return self._s[1673]! } + public var CreatePoll_OptionsHeader: String { return self._s[1674]! } + public var Appearance_RemoveThemeColorConfirmation: String { return self._s[1677]! } + public var Channel_Moderator_Title: String { return self._s[1678]! } public func Conversation_ForwardTooltip_Chat_Many(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1678]!, self._r[1678]!, [_0]) + return formatWithArgumentRanges(self._s[1679]!, self._r[1679]!, [_0]) } public func UserInfo_ContactForwardTooltip_ManyChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1679]!, self._r[1679]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1680]!, self._r[1680]!, [_0, _1]) } - public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[1680]! } - public var WallpaperColors_Title: String { return self._s[1681]! } - public var InviteLink_InviteLink: String { return self._s[1683]! } - public var PrivacyPolicy_DeclineMessage: String { return self._s[1684]! } - public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[1685]! } - public var Your_card_was_declined: String { return self._s[1686]! } - public var SettingsSearch_FAQ: String { return self._s[1688]! } - public var EditTheme_Expand_Preview_IncomingReplyName: String { return self._s[1689]! } - public var Conversation_ReportSpamConfirmation: String { return self._s[1690]! } - public var OwnershipTransfer_SecurityCheck: String { return self._s[1692]! } - public var PrivacySettings_DataSettingsHelp: String { return self._s[1693]! } - public var Settings_About_Help: String { return self._s[1694]! } + public var Channel_AdminLog_MessageRestrictedForever: String { return self._s[1681]! } + public var WallpaperColors_Title: String { return self._s[1682]! } + public var InviteLink_InviteLink: String { return self._s[1684]! } + public var PrivacyPolicy_DeclineMessage: String { return self._s[1685]! } + public var AutoDownloadSettings_VoiceMessagesTitle: String { return self._s[1686]! } + public var Your_card_was_declined: String { return self._s[1687]! } + public var SettingsSearch_FAQ: String { return self._s[1689]! } + public var EditTheme_Expand_Preview_IncomingReplyName: String { return self._s[1690]! } + public var Conversation_ReportSpamConfirmation: String { return self._s[1691]! } + public var OwnershipTransfer_SecurityCheck: String { return self._s[1693]! } + public var PrivacySettings_DataSettingsHelp: String { return self._s[1694]! } + public var Settings_About_Help: String { return self._s[1695]! } public func Channel_DiscussionGroup_HeaderGroupSet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1695]!, self._r[1695]!, [_0]) + return formatWithArgumentRanges(self._s[1696]!, self._r[1696]!, [_0]) } - public var Settings_Proxy: String { return self._s[1696]! } - public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1697]! } - public var Passport_Identity_TypePassportUploadScan: String { return self._s[1699]! } - public var NotificationsSound_Bell: String { return self._s[1700]! } - public var PrivacySettings_Title: String { return self._s[1702]! } - public var PrivacySettings_DataSettings: String { return self._s[1703]! } - public var ConversationMedia_Title: String { return self._s[1704]! } + public var Settings_Proxy: String { return self._s[1697]! } + public var TwoStepAuth_ResetAccountConfirmation: String { return self._s[1698]! } + public var Passport_Identity_TypePassportUploadScan: String { return self._s[1700]! } + public var NotificationsSound_Bell: String { return self._s[1701]! } + public var PrivacySettings_Title: String { return self._s[1703]! } + public var PrivacySettings_DataSettings: String { return self._s[1704]! } + public var ConversationMedia_Title: String { return self._s[1705]! } public func Channel_AdminLog_MessageAddedAdminName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1705]!, self._r[1705]!, [_1]) + return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_1]) } public func Conversation_EncryptedPlaceholderTitleIncoming(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1706]!, self._r[1706]!, [_0]) + return formatWithArgumentRanges(self._s[1707]!, self._r[1707]!, [_0]) } - public var PrivacySettings_BlockedPeersEmpty: String { return self._s[1707]! } - public var ReportPeer_ReasonPornography: String { return self._s[1709]! } - public var Privacy_Calls: String { return self._s[1711]! } - public var TwoFactorSetup_Email_Text: String { return self._s[1712]! } - public var Conversation_EncryptedDescriptionTitle: String { return self._s[1713]! } + public var PrivacySettings_BlockedPeersEmpty: String { return self._s[1708]! } + public var ReportPeer_ReasonPornography: String { return self._s[1710]! } + public var Privacy_Calls: String { return self._s[1712]! } + public var TwoFactorSetup_Email_Text: String { return self._s[1713]! } + public var Conversation_EncryptedDescriptionTitle: String { return self._s[1714]! } public func VoiceOver_Chat_MusicTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1714]!, self._r[1714]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1715]!, self._r[1715]!, [_1, _2]) } - public var Passport_Identity_FrontSideHelp: String { return self._s[1715]! } - public var InstantPage_VoiceOver_DecreaseFontSize: String { return self._s[1716]! } - public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1718]! } - public var ContactList_Context_VideoCall: String { return self._s[1719]! } - public var Settings_SaveIncomingPhotos: String { return self._s[1720]! } - public var Passport_Identity_MiddleName: String { return self._s[1721]! } - public var MessagePoll_QuizNoUsers: String { return self._s[1722]! } + public var Passport_Identity_FrontSideHelp: String { return self._s[1716]! } + public var InstantPage_VoiceOver_DecreaseFontSize: String { return self._s[1717]! } + public var GroupInfo_Permissions_SlowmodeHeader: String { return self._s[1719]! } + public var ContactList_Context_VideoCall: String { return self._s[1720]! } + public var Settings_SaveIncomingPhotos: String { return self._s[1721]! } + public var Passport_Identity_MiddleName: String { return self._s[1722]! } + public var MessagePoll_QuizNoUsers: String { return self._s[1723]! } public func Channel_AdminLog_MutedParticipant(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1723]!, self._r[1723]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1724]!, self._r[1724]!, [_1, _2]) } - public var OldChannels_ChannelFormat: String { return self._s[1724]! } - public var Watch_Message_Call: String { return self._s[1725]! } - public var VoiceChat_OpenChannel: String { return self._s[1726]! } - public var Wallpaper_Title: String { return self._s[1727]! } - public var PasscodeSettings_TurnPasscodeOff: String { return self._s[1728]! } - public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1729]! } - public var ReportGroupLocation_Text: String { return self._s[1730]! } - public var InviteText_URL: String { return self._s[1731]! } - public var ClearCache_StorageServiceFiles: String { return self._s[1732]! } - public var MessageTimer_Custom: String { return self._s[1733]! } - public var Message_PinnedLocationMessage: String { return self._s[1734]! } + public var OldChannels_ChannelFormat: String { return self._s[1725]! } + public var Watch_Message_Call: String { return self._s[1726]! } + public var VoiceChat_OpenChannel: String { return self._s[1727]! } + public var Wallpaper_Title: String { return self._s[1728]! } + public var PasscodeSettings_TurnPasscodeOff: String { return self._s[1729]! } + public var IntentsSettings_SuggestedChatsSavedMessages: String { return self._s[1730]! } + public var ReportGroupLocation_Text: String { return self._s[1731]! } + public var InviteText_URL: String { return self._s[1732]! } + public var ClearCache_StorageServiceFiles: String { return self._s[1733]! } + public var MessageTimer_Custom: String { return self._s[1734]! } + public var Message_PinnedLocationMessage: String { return self._s[1735]! } public func VoiceOver_Chat_ContactOrganization(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1735]!, self._r[1735]!, [_0]) + return formatWithArgumentRanges(self._s[1736]!, self._r[1736]!, [_0]) } - public var EditTheme_UploadNewTheme: String { return self._s[1736]! } - public var TwoFactorRemember_CheckPassword: String { return self._s[1739]! } - public var ChatImportActivity_ErrorLimitExceeded: String { return self._s[1740]! } + public var EditTheme_UploadNewTheme: String { return self._s[1737]! } + public var TwoFactorRemember_CheckPassword: String { return self._s[1740]! } + public var ChatImportActivity_ErrorLimitExceeded: String { return self._s[1741]! } public func AutoDownloadSettings_UpToForAll(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1741]!, self._r[1741]!, [_0]) + return formatWithArgumentRanges(self._s[1742]!, self._r[1742]!, [_0]) } - public var Login_CodeSentCall: String { return self._s[1743]! } + public var Login_CodeSentCall: String { return self._s[1744]! } public func Conversation_AutoremoveTimerSetUser(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1744]!, self._r[1744]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1745]!, self._r[1745]!, [_1, _2]) } - public var Conversation_Report: String { return self._s[1745]! } - public var NotificationSettings_ContactJoined: String { return self._s[1746]! } + public var Conversation_Report: String { return self._s[1746]! } + public var NotificationSettings_ContactJoined: String { return self._s[1747]! } public func PUSH_MESSAGE_SCREENSHOT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1747]!, self._r[1747]!, [_1]) + return formatWithArgumentRanges(self._s[1748]!, self._r[1748]!, [_1]) } - public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[1748]! } - public var BroadcastGroups_IntroText: String { return self._s[1749]! } - public var IntentsSettings_SuggestByAll: String { return self._s[1751]! } - public var StickerPacksSettings_ShowStickersButton: String { return self._s[1752]! } - public var AuthSessions_Title: String { return self._s[1753]! } + public var StickerPacksSettings_ShowStickersButtonHelp: String { return self._s[1749]! } + public var BroadcastGroups_IntroText: String { return self._s[1750]! } + public var IntentsSettings_SuggestByAll: String { return self._s[1752]! } + public var StickerPacksSettings_ShowStickersButton: String { return self._s[1753]! } + public var AuthSessions_Title: String { return self._s[1754]! } public func Notification_VoiceChatEnded(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1754]!, self._r[1754]!, [_0]) + return formatWithArgumentRanges(self._s[1755]!, self._r[1755]!, [_0]) } - public var Settings_Tips: String { return self._s[1755]! } - public var Channel_AdminLog_TitleAllEvents: String { return self._s[1756]! } - public var WallpaperPreview_WallpaperColors: String { return self._s[1757]! } - public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1758]! } - public var VoiceChat_YouCanNowSpeak: String { return self._s[1761]! } - public var Passport_Address_AddPassportRegistration: String { return self._s[1763]! } + public var Settings_Tips: String { return self._s[1756]! } + public var Channel_AdminLog_TitleAllEvents: String { return self._s[1757]! } + public var WallpaperPreview_WallpaperColors: String { return self._s[1758]! } + public var KeyCommand_JumpToNextUnreadChat: String { return self._s[1759]! } + public var VoiceChat_YouCanNowSpeak: String { return self._s[1762]! } + public var Passport_Address_AddPassportRegistration: String { return self._s[1764]! } public func UserInfo_LinkForwardTooltip_ManyChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1764]!, self._r[1764]!, [_0, _1]) + return formatWithArgumentRanges(self._s[1765]!, self._r[1765]!, [_0, _1]) } - public var AutoDownloadSettings_MaxVideoSize: String { return self._s[1765]! } - public var ExplicitContent_AlertTitle: String { return self._s[1766]! } - public var Channel_UpdatePhotoItem: String { return self._s[1768]! } - public var ChatList_AutoarchiveSuggestion_Text: String { return self._s[1770]! } - public var Channel_DiscussionGroup_LinkGroup: String { return self._s[1771]! } + public var AutoDownloadSettings_MaxVideoSize: String { return self._s[1766]! } + public var ExplicitContent_AlertTitle: String { return self._s[1767]! } + public var Channel_UpdatePhotoItem: String { return self._s[1769]! } + public var ChatList_AutoarchiveSuggestion_Text: String { return self._s[1771]! } + public var Channel_DiscussionGroup_LinkGroup: String { return self._s[1772]! } public func Call_BatteryLow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1772]!, self._r[1772]!, [_0]) + return formatWithArgumentRanges(self._s[1773]!, self._r[1773]!, [_0]) } - public var Login_HaveNotReceivedCodeInternal: String { return self._s[1773]! } - public var WallpaperPreview_PatternPaternApply: String { return self._s[1774]! } - public var Notifications_MessageNotificationsSound: String { return self._s[1775]! } - public var CommentsGroup_ErrorAccessDenied: String { return self._s[1776]! } - public var Appearance_AccentColor: String { return self._s[1778]! } - public var GroupInfo_SharedMedia: String { return self._s[1779]! } - public var Login_PhonePlaceholder: String { return self._s[1780]! } - public var Appearance_TextSize_Automatic: String { return self._s[1781]! } - public var EmptyGroupInfo_Line2: String { return self._s[1782]! } + public var Login_HaveNotReceivedCodeInternal: String { return self._s[1774]! } + public var WallpaperPreview_PatternPaternApply: String { return self._s[1775]! } + public var Notifications_MessageNotificationsSound: String { return self._s[1776]! } + public var CommentsGroup_ErrorAccessDenied: String { return self._s[1777]! } + public var Appearance_AccentColor: String { return self._s[1779]! } + public var GroupInfo_SharedMedia: String { return self._s[1780]! } + public var Login_PhonePlaceholder: String { return self._s[1781]! } + public var Appearance_TextSize_Automatic: String { return self._s[1782]! } + public var EmptyGroupInfo_Line2: String { return self._s[1783]! } public func PUSH_CHAT_CREATED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1783]!, self._r[1783]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1784]!, self._r[1784]!, [_1, _2]) } - public var VoiceChat_TapToAddPhotoOrBio: String { return self._s[1784]! } - public var Conversation_ClearChannel: String { return self._s[1785]! } - public var Conversation_MessageDoesntExist: String { return self._s[1786]! } - public var Appearance_AppIconDefaultX: String { return self._s[1788]! } - public var EditProfile_NameAndPhotoOrVideoHelp: String { return self._s[1789]! } - public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[1790]! } - public var Notifications_GroupNotificationsHelp: String { return self._s[1791]! } + public var VoiceChat_TapToAddPhotoOrBio: String { return self._s[1785]! } + public var Conversation_ClearChannel: String { return self._s[1786]! } + public var Conversation_MessageDoesntExist: String { return self._s[1787]! } + public var Appearance_AppIconDefaultX: String { return self._s[1789]! } + public var EditProfile_NameAndPhotoOrVideoHelp: String { return self._s[1790]! } + public var CheckoutInfo_ShippingInfoPostcodePlaceholder: String { return self._s[1791]! } + public var Notifications_GroupNotificationsHelp: String { return self._s[1792]! } public func PUSH_CHAT_MESSAGE_NOTEXT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1792]!, self._r[1792]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1793]!, self._r[1793]!, [_1, _2]) } - public var ChatList_EmptyChatListEditFilter: String { return self._s[1793]! } - public var ChatSettings_ConnectionType_UseProxy: String { return self._s[1796]! } - public var Chat_PinnedMessagesHiddenText: String { return self._s[1797]! } + public var ChatList_EmptyChatListEditFilter: String { return self._s[1794]! } + public var ChatSettings_ConnectionType_UseProxy: String { return self._s[1797]! } + public var Chat_PinnedMessagesHiddenText: String { return self._s[1798]! } public func Message_PinnedGenericMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1798]!, self._r[1798]!, [_0]) - } - public func Location_ProximityTip(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1799]!, self._r[1799]!, [_0]) } - public var UserInfo_NotificationsEnable: String { return self._s[1800]! } - public var Checkout_PayWithTouchId: String { return self._s[1801]! } - public var SharedMedia_ViewInChat: String { return self._s[1802]! } - public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1803]!, self._r[1803]!, [_0, _1]) + public func Location_ProximityTip(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1800]!, self._r[1800]!, [_0]) } - public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1804]! } + public var UserInfo_NotificationsEnable: String { return self._s[1801]! } + public var Checkout_PayWithTouchId: String { return self._s[1802]! } + public var SharedMedia_ViewInChat: String { return self._s[1803]! } + public func Notification_CreatedChatWithTitle(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1804]!, self._r[1804]!, [_0, _1]) + } + public var ChatSettings_AutoDownloadSettings_OffForAll: String { return self._s[1805]! } public func Channel_DiscussionGroup_PublicChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1805]!, self._r[1805]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1806]!, self._r[1806]!, [_1, _2]) } public func Cache_Clear(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1807]!, self._r[1807]!, [_0]) + return formatWithArgumentRanges(self._s[1808]!, self._r[1808]!, [_0]) } - public var Conversation_PeerNearbyText: String { return self._s[1809]! } - public var Conversation_StopPollConfirmationTitle: String { return self._s[1810]! } - public var PhotoEditor_Skip: String { return self._s[1811]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[1812]! } - public var ChatList_EmptyChatList: String { return self._s[1813]! } - public var Channel_BanUser_Unban: String { return self._s[1814]! } + public var Conversation_PeerNearbyText: String { return self._s[1810]! } + public var Conversation_StopPollConfirmationTitle: String { return self._s[1811]! } + public var PhotoEditor_Skip: String { return self._s[1812]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground_SetColor: String { return self._s[1813]! } + public var ChatList_EmptyChatList: String { return self._s[1814]! } + public var Channel_BanUser_Unban: String { return self._s[1815]! } public func Message_GenericForwardedPsa(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1815]!, self._r[1815]!, [_0]) + return formatWithArgumentRanges(self._s[1816]!, self._r[1816]!, [_0]) } - public var Appearance_TextSize_Apply: String { return self._s[1816]! } + public var Appearance_TextSize_Apply: String { return self._s[1817]! } public func Conversation_MessageViewCommentsFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1817]!, self._r[1817]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1818]!, self._r[1818]!, [_1, _2]) } - public var Login_InfoFirstNamePlaceholder: String { return self._s[1818]! } - public var VoiceOver_Chat_YourSticker: String { return self._s[1819]! } - public var TwoStepAuth_HintPlaceholder: String { return self._s[1820]! } - public var TwoStepAuth_EmailSkip: String { return self._s[1822]! } - public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1823]! } - public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[1824]! } + public var Login_InfoFirstNamePlaceholder: String { return self._s[1819]! } + public var VoiceOver_Chat_YourSticker: String { return self._s[1820]! } + public var TwoStepAuth_HintPlaceholder: String { return self._s[1821]! } + public var TwoStepAuth_EmailSkip: String { return self._s[1823]! } + public var ChatList_UndoArchiveMultipleTitle: String { return self._s[1824]! } + public var TwoFactorSetup_Email_SkipConfirmationTitle: String { return self._s[1825]! } public func PUSH_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1825]!, self._r[1825]!, [_1]) + return formatWithArgumentRanges(self._s[1826]!, self._r[1826]!, [_1]) } - public var VoiceOver_Chat_GoToOriginalMessage: String { return self._s[1827]! } - public var State_WaitingForNetwork: String { return self._s[1828]! } - public var AccessDenied_CameraRestricted: String { return self._s[1829]! } - public var ChatSettings_Appearance: String { return self._s[1830]! } - public var ScheduledMessages_BotActionUnavailable: String { return self._s[1831]! } - public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[1832]! } - public var Channel_DiscussionGroupAdd: String { return self._s[1833]! } - public var Conversation_SelectMessages: String { return self._s[1835]! } - public var Map_NoPlacesNearby: String { return self._s[1836]! } - public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1837]! } - public var GroupRemoved_Title: String { return self._s[1838]! } - public var ImportStickerPack_RemoveFromImport: String { return self._s[1839]! } - public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1841]! } - public var VoiceChat_Mute: String { return self._s[1842]! } - public var Paint_Marker: String { return self._s[1843]! } - public var Widget_ChatsGalleryTitle: String { return self._s[1844]! } + public var VoiceOver_Chat_GoToOriginalMessage: String { return self._s[1828]! } + public var State_WaitingForNetwork: String { return self._s[1829]! } + public var AccessDenied_CameraRestricted: String { return self._s[1830]! } + public var ChatSettings_Appearance: String { return self._s[1831]! } + public var ScheduledMessages_BotActionUnavailable: String { return self._s[1832]! } + public var GroupInfo_InviteLink_CopyAlert_Success: String { return self._s[1833]! } + public var Channel_DiscussionGroupAdd: String { return self._s[1834]! } + public var Conversation_SelectMessages: String { return self._s[1836]! } + public var Map_NoPlacesNearby: String { return self._s[1837]! } + public var AuthSessions_IncompleteAttemptsInfo: String { return self._s[1838]! } + public var GroupRemoved_Title: String { return self._s[1839]! } + public var ImportStickerPack_RemoveFromImport: String { return self._s[1840]! } + public var TwoStepAuth_EnterPasswordHelp: String { return self._s[1842]! } + public var VoiceChat_Mute: String { return self._s[1843]! } + public var Paint_Marker: String { return self._s[1844]! } + public var Widget_ChatsGalleryTitle: String { return self._s[1845]! } public func AddContact_ContactWillBeSharedAfterMutual(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1845]!, self._r[1845]!, [_1]) + return formatWithArgumentRanges(self._s[1846]!, self._r[1846]!, [_1]) } - public var SocksProxySetup_ShareProxyList: String { return self._s[1846]! } - public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[1847]! } + public var SocksProxySetup_ShareProxyList: String { return self._s[1847]! } + public var GroupInfo_InvitationLinkDoesNotExist: String { return self._s[1848]! } public func VoiceOver_Chat_Size(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1848]!, self._r[1848]!, [_0]) + return formatWithArgumentRanges(self._s[1849]!, self._r[1849]!, [_0]) } - public var EditTheme_ErrorInvalidCharacters: String { return self._s[1849]! } - public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[1850]! } - public var Settings_CheckPasswordTitle: String { return self._s[1851]! } - public var Notifications_GroupNotificationsAlert: String { return self._s[1852]! } - public var SocksProxySetup_ShareQRCode: String { return self._s[1853]! } - public var Compose_NewGroup: String { return self._s[1855]! } + public var EditTheme_ErrorInvalidCharacters: String { return self._s[1850]! } + public var Appearance_ThemePreview_ChatList_7_Name: String { return self._s[1851]! } + public var Settings_CheckPasswordTitle: String { return self._s[1852]! } + public var Notifications_GroupNotificationsAlert: String { return self._s[1853]! } + public var SocksProxySetup_ShareQRCode: String { return self._s[1854]! } + public var Compose_NewGroup: String { return self._s[1856]! } public func Passport_Address_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1856]!, self._r[1856]!, [_0]) + return formatWithArgumentRanges(self._s[1857]!, self._r[1857]!, [_0]) } - public var Location_LiveLocationRequired_Description: String { return self._s[1858]! } - public var Conversation_ClearGroupHistory: String { return self._s[1859]! } - public var GroupInfo_InviteLink_Help: String { return self._s[1862]! } - public var VoiceOver_BotKeyboard: String { return self._s[1863]! } - public var Channel_BanUser_BlockFor: String { return self._s[1864]! } - public var Bot_Start: String { return self._s[1865]! } - public var Your_card_has_expired: String { return self._s[1866]! } - public var Channel_About_Title: String { return self._s[1867]! } - public var VoiceChat_EditTitleTitle: String { return self._s[1868]! } - public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1869]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[1871]! } - public var Conversation_FileDropbox: String { return self._s[1872]! } - public var ChatList_Search_NoResultsFitlerMusic: String { return self._s[1873]! } - public var Month_GenNovember: String { return self._s[1874]! } - public var IntentsSettings_SuggestByShare: String { return self._s[1875]! } + public var Location_LiveLocationRequired_Description: String { return self._s[1859]! } + public var Conversation_ClearGroupHistory: String { return self._s[1860]! } + public var GroupInfo_InviteLink_Help: String { return self._s[1863]! } + public var VoiceOver_BotKeyboard: String { return self._s[1864]! } + public var Channel_BanUser_BlockFor: String { return self._s[1865]! } + public var Bot_Start: String { return self._s[1866]! } + public var Your_card_has_expired: String { return self._s[1867]! } + public var Channel_About_Title: String { return self._s[1868]! } + public var VoiceChat_EditTitleTitle: String { return self._s[1869]! } + public var Passport_Identity_ExpiryDatePlaceholder: String { return self._s[1870]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsExceptions: String { return self._s[1872]! } + public var Conversation_FileDropbox: String { return self._s[1873]! } + public var ChatList_Search_NoResultsFitlerMusic: String { return self._s[1874]! } + public var Month_GenNovember: String { return self._s[1875]! } + public var IntentsSettings_SuggestByShare: String { return self._s[1876]! } public func Call_PrivacyErrorMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1876]!, self._r[1876]!, [_0]) + return formatWithArgumentRanges(self._s[1877]!, self._r[1877]!, [_0]) } - public var StickerPack_Add: String { return self._s[1877]! } - public var Theme_ErrorNotFound: String { return self._s[1878]! } - public var Wallpaper_SearchShort: String { return self._s[1880]! } - public var Channel_BanUser_PermissionsHeader: String { return self._s[1881]! } - public var ConversationProfile_UsersTooMuchError: String { return self._s[1882]! } - public var ChatList_FolderAllChats: String { return self._s[1883]! } - public var VoiceChat_EndConfirmationEnd: String { return self._s[1884]! } - public var Passport_Authorize: String { return self._s[1885]! } + public var StickerPack_Add: String { return self._s[1878]! } + public var Theme_ErrorNotFound: String { return self._s[1879]! } + public var Wallpaper_SearchShort: String { return self._s[1881]! } + public var Channel_BanUser_PermissionsHeader: String { return self._s[1882]! } + public var ConversationProfile_UsersTooMuchError: String { return self._s[1883]! } + public var ChatList_FolderAllChats: String { return self._s[1884]! } + public var VoiceChat_EndConfirmationEnd: String { return self._s[1885]! } + public var Passport_Authorize: String { return self._s[1886]! } public func Channel_AdminLog_MessageChangedLinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1886]!, self._r[1886]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1887]!, self._r[1887]!, [_1, _2]) } - public var GroupInfo_GroupHistoryVisible: String { return self._s[1887]! } + public var GroupInfo_GroupHistoryVisible: String { return self._s[1888]! } public func PUSH_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1888]!, self._r[1888]!, [_1]) + return formatWithArgumentRanges(self._s[1889]!, self._r[1889]!, [_1]) } - public var LocalGroup_ButtonTitle: String { return self._s[1889]! } - public var VoiceOver_Stickers: String { return self._s[1891]! } - public var UserInfo_GroupsInCommon: String { return self._s[1892]! } - public var LoginPassword_Title: String { return self._s[1894]! } - public var Wallpaper_Set: String { return self._s[1895]! } - public var Stats_InteractionsTitle: String { return self._s[1896]! } + public var LocalGroup_ButtonTitle: String { return self._s[1890]! } + public var VoiceOver_Stickers: String { return self._s[1892]! } + public var UserInfo_GroupsInCommon: String { return self._s[1893]! } + public var LoginPassword_Title: String { return self._s[1895]! } + public var Wallpaper_Set: String { return self._s[1896]! } + public var Stats_InteractionsTitle: String { return self._s[1897]! } public func SecretGIF_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1898]!, self._r[1898]!, [_0]) + return formatWithArgumentRanges(self._s[1899]!, self._r[1899]!, [_0]) } - public var Conversation_MessageDialogEdit: String { return self._s[1899]! } - public var Paint_Outlined: String { return self._s[1900]! } + public var Conversation_MessageDialogEdit: String { return self._s[1900]! } + public var Paint_Outlined: String { return self._s[1901]! } public func Login_ResetAccountProtected_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1901]!, self._r[1901]!, [_0]) - } - public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[1902]!, self._r[1902]!, [_0]) } - public var Invite_LargeRecipientsCountWarning: String { return self._s[1903]! } - public var Passport_Address_Street1Placeholder: String { return self._s[1904]! } - public var Appearance_ColorThemeNight: String { return self._s[1905]! } - public var ChannelInfo_Stats: String { return self._s[1906]! } - public var Widget_ShortcutsGalleryTitle: String { return self._s[1907]! } - public var TwoStepAuth_RecoveryTitle: String { return self._s[1908]! } - public var MediaPicker_TimerTooltip: String { return self._s[1909]! } - public var ChatImportActivity_ErrorNotAdmin: String { return self._s[1910]! } - public var TwoFactorRemember_Title: String { return self._s[1911]! } - public var Common_ChoosePhoto: String { return self._s[1912]! } - public var Media_LimitedAccessTitle: String { return self._s[1913]! } - public var ChatSettings_AutoDownloadVideos: String { return self._s[1914]! } - public var PeerInfo_PaneGroups: String { return self._s[1915]! } - public var SocksProxySetup_UsernamePlaceholder: String { return self._s[1917]! } - public var ChangePhoneNumberNumber_Title: String { return self._s[1918]! } - public var ContactInfo_PhoneLabelMobile: String { return self._s[1919]! } - public var OldChannels_ChannelsHeader: String { return self._s[1920]! } - public var MuteFor_Forever: String { return self._s[1921]! } - public var Passport_Address_PostcodePlaceholder: String { return self._s[1922]! } - public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[1924]! } - public var MessagePoll_LabelAnonymous: String { return self._s[1925]! } - public var ContactInfo_Job: String { return self._s[1926]! } - public var Passport_Language_mk: String { return self._s[1927]! } - public var EditTheme_ShortLink: String { return self._s[1928]! } - public var AutoDownloadSettings_PhotosTitle: String { return self._s[1931]! } - public var Month_GenApril: String { return self._s[1933]! } - public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[1935]! } - public var NetworkUsageSettings_TotalSection: String { return self._s[1936]! } - public var EditTheme_Create_Preview_OutgoingText: String { return self._s[1937]! } - public var EditTheme_Title: String { return self._s[1938]! } - public var Conversation_LinkDialogCopy: String { return self._s[1939]! } + public func Conversation_SetReminder_RemindTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[1903]!, self._r[1903]!, [_0]) + } + public var Invite_LargeRecipientsCountWarning: String { return self._s[1904]! } + public var Passport_Address_Street1Placeholder: String { return self._s[1905]! } + public var Appearance_ColorThemeNight: String { return self._s[1906]! } + public var ChannelInfo_Stats: String { return self._s[1907]! } + public var Widget_ShortcutsGalleryTitle: String { return self._s[1908]! } + public var TwoStepAuth_RecoveryTitle: String { return self._s[1909]! } + public var MediaPicker_TimerTooltip: String { return self._s[1910]! } + public var ChatImportActivity_ErrorNotAdmin: String { return self._s[1911]! } + public var TwoFactorRemember_Title: String { return self._s[1912]! } + public var Common_ChoosePhoto: String { return self._s[1913]! } + public var Media_LimitedAccessTitle: String { return self._s[1914]! } + public var ChatSettings_AutoDownloadVideos: String { return self._s[1915]! } + public var PeerInfo_PaneGroups: String { return self._s[1916]! } + public var SocksProxySetup_UsernamePlaceholder: String { return self._s[1918]! } + public var ChangePhoneNumberNumber_Title: String { return self._s[1919]! } + public var ContactInfo_PhoneLabelMobile: String { return self._s[1920]! } + public var OldChannels_ChannelsHeader: String { return self._s[1921]! } + public var MuteFor_Forever: String { return self._s[1922]! } + public var Passport_Address_PostcodePlaceholder: String { return self._s[1923]! } + public var SettingsSearch_Synonyms_Appearance_ChatBackground: String { return self._s[1925]! } + public var MessagePoll_LabelAnonymous: String { return self._s[1926]! } + public var ContactInfo_Job: String { return self._s[1927]! } + public var Passport_Language_mk: String { return self._s[1928]! } + public var EditTheme_ShortLink: String { return self._s[1929]! } + public var AutoDownloadSettings_PhotosTitle: String { return self._s[1932]! } + public var Month_GenApril: String { return self._s[1934]! } + public var Channel_DiscussionGroup_HeaderLabel: String { return self._s[1936]! } + public var NetworkUsageSettings_TotalSection: String { return self._s[1937]! } + public var EditTheme_Create_Preview_OutgoingText: String { return self._s[1938]! } + public var EditTheme_Title: String { return self._s[1939]! } + public var Conversation_LinkDialogCopy: String { return self._s[1940]! } public func Channel_AdminLog_MessageInvitedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1940]!, self._r[1940]!, [_1, _2]) + return formatWithArgumentRanges(self._s[1941]!, self._r[1941]!, [_1, _2]) } - public var Passport_ForgottenPassword: String { return self._s[1941]! } - public var WallpaperSearch_Recent: String { return self._s[1942]! } - public var ChatSettings_Title: String { return self._s[1947]! } - public var Appearance_ReduceMotionInfo: String { return self._s[1948]! } + public var Passport_ForgottenPassword: String { return self._s[1942]! } + public var WallpaperSearch_Recent: String { return self._s[1943]! } + public var ChatSettings_Title: String { return self._s[1948]! } + public var Appearance_ReduceMotionInfo: String { return self._s[1949]! } public func StickerPackActionInfo_AddedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1949]!, self._r[1949]!, [_0]) + return formatWithArgumentRanges(self._s[1950]!, self._r[1950]!, [_0]) } - public var SocksProxySetup_UseForCallsHelp: String { return self._s[1950]! } - public var LastSeen_WithinAMonth: String { return self._s[1951]! } - public var VoiceChat_Live: String { return self._s[1952]! } - public var PeerInfo_ButtonCall: String { return self._s[1953]! } - public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[1954]! } - public var Group_Username_InvalidStartsWithNumber: String { return self._s[1955]! } - public var Call_AudioRouteHide: String { return self._s[1956]! } - public var DialogList_SavedMessages: String { return self._s[1957]! } - public var ChatList_Context_Mute: String { return self._s[1958]! } - public var Conversation_StatusKickedFromChannel: String { return self._s[1959]! } + public var SocksProxySetup_UseForCallsHelp: String { return self._s[1951]! } + public var LastSeen_WithinAMonth: String { return self._s[1952]! } + public var VoiceChat_Live: String { return self._s[1953]! } + public var PeerInfo_ButtonCall: String { return self._s[1954]! } + public var SettingsSearch_Synonyms_Appearance_Title: String { return self._s[1955]! } + public var Group_Username_InvalidStartsWithNumber: String { return self._s[1956]! } + public var Call_AudioRouteHide: String { return self._s[1957]! } + public var DialogList_SavedMessages: String { return self._s[1958]! } + public var ChatList_Context_Mute: String { return self._s[1959]! } + public var Conversation_StatusKickedFromChannel: String { return self._s[1960]! } public func Notification_Exceptions_MutedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1960]!, self._r[1960]!, [_0]) + return formatWithArgumentRanges(self._s[1961]!, self._r[1961]!, [_0]) } - public var VoiceChat_StatusMutedForYou: String { return self._s[1961]! } - public var Passport_Language_et: String { return self._s[1962]! } - public var Conversation_MessageLeaveCommentShort: String { return self._s[1963]! } - public var PhotoEditor_CropReset: String { return self._s[1964]! } - public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[1965]! } - public var SocksProxySetup_HostnamePlaceholder: String { return self._s[1966]! } - public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[1967]! } - public var WallpaperSearch_ColorWhite: String { return self._s[1970]! } - public var Channel_AdminLog_CanEditMessages: String { return self._s[1972]! } - public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[1973]! } - public var Channel_Username_InvalidStartsWithNumber: String { return self._s[1975]! } - public var CheckoutInfo_ReceiverInfoName: String { return self._s[1977]! } - public var Map_YouAreHere: String { return self._s[1979]! } - public var Core_ServiceUserStatus: String { return self._s[1980]! } - public var Channel_Setup_TypePrivateHelp: String { return self._s[1983]! } - public var VoiceChat_StartRecording: String { return self._s[1984]! } - public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[1985]! } - public var MediaPicker_Videos: String { return self._s[1987]! } - public var Map_LiveLocationFor15Minutes: String { return self._s[1989]! } - public var Passport_Identity_TranslationsHelp: String { return self._s[1990]! } - public var SharedMedia_CategoryMedia: String { return self._s[1991]! } + public var VoiceChat_StatusMutedForYou: String { return self._s[1962]! } + public var Passport_Language_et: String { return self._s[1963]! } + public var Conversation_MessageLeaveCommentShort: String { return self._s[1964]! } + public var PhotoEditor_CropReset: String { return self._s[1965]! } + public var Privacy_GroupsAndChannels_AlwaysAllow: String { return self._s[1966]! } + public var SocksProxySetup_HostnamePlaceholder: String { return self._s[1967]! } + public var CreateGroup_ErrorLocatedGroupsTooMuch: String { return self._s[1968]! } + public var WallpaperSearch_ColorWhite: String { return self._s[1971]! } + public var Channel_AdminLog_CanEditMessages: String { return self._s[1973]! } + public var Privacy_PaymentsClearInfoDoneHelp: String { return self._s[1974]! } + public var Channel_Username_InvalidStartsWithNumber: String { return self._s[1976]! } + public var CheckoutInfo_ReceiverInfoName: String { return self._s[1978]! } + public var Map_YouAreHere: String { return self._s[1980]! } + public var Core_ServiceUserStatus: String { return self._s[1981]! } + public var Channel_Setup_TypePrivateHelp: String { return self._s[1984]! } + public var VoiceChat_StartRecording: String { return self._s[1985]! } + public var SettingsSearch_Synonyms_Notifications_BadgeCountUnreadMessages: String { return self._s[1986]! } + public var MediaPicker_Videos: String { return self._s[1988]! } + public var Map_LiveLocationFor15Minutes: String { return self._s[1990]! } + public var Passport_Identity_TranslationsHelp: String { return self._s[1991]! } + public var SharedMedia_CategoryMedia: String { return self._s[1992]! } public func MediaPicker_Nof(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1992]!, self._r[1992]!, [_0]) + return formatWithArgumentRanges(self._s[1993]!, self._r[1993]!, [_0]) } - public var ChatSettings_AutoPlayGifs: String { return self._s[1993]! } - public var Passport_Identity_CountryPlaceholder: String { return self._s[1994]! } - public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[1995]! } - public var Conversation_JoinVoiceChatAsListener: String { return self._s[1996]! } - public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1997]! } + public var ChatSettings_AutoPlayGifs: String { return self._s[1994]! } + public var Passport_Identity_CountryPlaceholder: String { return self._s[1995]! } + public var Bot_GroupStatusDoesNotReadHistory: String { return self._s[1996]! } + public var Conversation_JoinVoiceChatAsListener: String { return self._s[1997]! } + public var Notification_Exceptions_RemoveFromExceptions: String { return self._s[1998]! } public func Chat_SlowmodeTooltip(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[1998]!, self._r[1998]!, [_0]) + return formatWithArgumentRanges(self._s[1999]!, self._r[1999]!, [_0]) } - public var Web_Error: String { return self._s[1999]! } - public var PhotoEditor_SkinTool: String { return self._s[2000]! } - public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2001]! } - public var AutoremoveSetup_TimerInfoChat: String { return self._s[2002]! } - public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2004]! } - public var PasscodeSettings_Help: String { return self._s[2005]! } - public var Appearance_ColorTheme: String { return self._s[2006]! } + public var Web_Error: String { return self._s[2000]! } + public var PhotoEditor_SkinTool: String { return self._s[2001]! } + public var ApplyLanguage_UnsufficientDataTitle: String { return self._s[2002]! } + public var AutoremoveSetup_TimerInfoChat: String { return self._s[2003]! } + public var ChatSettings_ConnectionType_UseSocks5: String { return self._s[2005]! } + public var PasscodeSettings_Help: String { return self._s[2006]! } + public var Appearance_ColorTheme: String { return self._s[2007]! } public func Channel_AdminLog_MessageRestrictedNewSetting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2007]!, self._r[2007]!, [_0]) + return formatWithArgumentRanges(self._s[2008]!, self._r[2008]!, [_0]) } - public var InviteLink_DeleteAllRevokedLinks: String { return self._s[2008]! } + public var InviteLink_DeleteAllRevokedLinks: String { return self._s[2009]! } public func PUSH_PINNED_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2009]!, self._r[2009]!, [_1]) + return formatWithArgumentRanges(self._s[2010]!, self._r[2010]!, [_1]) } - public var InviteLink_QRCode_Title: String { return self._s[2010]! } - public var GroupInfo_LeftStatus: String { return self._s[2011]! } - public var EditTheme_Preview: String { return self._s[2012]! } - public var Watch_Suggestion_WhatsUp: String { return self._s[2013]! } + public var InviteLink_QRCode_Title: String { return self._s[2011]! } + public var GroupInfo_LeftStatus: String { return self._s[2012]! } + public var EditTheme_Preview: String { return self._s[2013]! } + public var Watch_Suggestion_WhatsUp: String { return self._s[2014]! } public func AutoDownloadSettings_PreloadVideoInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2014]!, self._r[2014]!, [_0]) + return formatWithArgumentRanges(self._s[2015]!, self._r[2015]!, [_0]) } - public var NotificationsSound_Keys: String { return self._s[2015]! } - public var VoiceChat_StatusWantsToSpeak: String { return self._s[2016]! } - public var PasscodeSettings_UnlockWithTouchId: String { return self._s[2017]! } - public var ChatList_Context_MarkAsUnread: String { return self._s[2018]! } - public var DialogList_AdNoticeAlert: String { return self._s[2019]! } - public var UserInfo_Invite: String { return self._s[2020]! } - public var Checkout_Email: String { return self._s[2021]! } - public var Stats_GroupActionsTitle: String { return self._s[2022]! } - public var Coub_TapForSound: String { return self._s[2023]! } - public var Conversation_AutoremoveTimerRemovedUserYou: String { return self._s[2024]! } - public var Theme_ThemeChangedText: String { return self._s[2025]! } - public var Call_ExternalCallInProgressMessage: String { return self._s[2026]! } - public var AutoremoveSetup_TimerInfoChannel: String { return self._s[2027]! } - public var Settings_ApplyProxyAlertEnable: String { return self._s[2028]! } - public var ScheduledMessages_ScheduledToday: String { return self._s[2029]! } - public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[2030]! } + public var NotificationsSound_Keys: String { return self._s[2016]! } + public var VoiceChat_StatusWantsToSpeak: String { return self._s[2017]! } + public var PasscodeSettings_UnlockWithTouchId: String { return self._s[2018]! } + public var ChatList_Context_MarkAsUnread: String { return self._s[2019]! } + public var DialogList_AdNoticeAlert: String { return self._s[2020]! } + public var UserInfo_Invite: String { return self._s[2021]! } + public var Checkout_Email: String { return self._s[2022]! } + public var Stats_GroupActionsTitle: String { return self._s[2023]! } + public var Coub_TapForSound: String { return self._s[2024]! } + public var Conversation_AutoremoveTimerRemovedUserYou: String { return self._s[2025]! } + public var Theme_ThemeChangedText: String { return self._s[2026]! } + public var Call_ExternalCallInProgressMessage: String { return self._s[2027]! } + public var AutoremoveSetup_TimerInfoChannel: String { return self._s[2028]! } + public var Settings_ApplyProxyAlertEnable: String { return self._s[2029]! } + public var ScheduledMessages_ScheduledToday: String { return self._s[2030]! } + public var Channel_AdminLog_DefaultRestrictionsUpdated: String { return self._s[2031]! } public func VoiceChat_InviteMemberToChannelFirstText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2031]!, self._r[2031]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2032]!, self._r[2032]!, [_1, _2]) } - public var Call_ReportIncludeLogDescription: String { return self._s[2032]! } - public var Settings_FrequentlyAskedQuestions: String { return self._s[2034]! } - public var Call_VoiceOver_VoiceCallMissed: String { return self._s[2035]! } - public var Channel_MessagePhotoRemoved: String { return self._s[2036]! } - public var Passport_Email_Delete: String { return self._s[2037]! } + public var Call_ReportIncludeLogDescription: String { return self._s[2033]! } + public var Settings_FrequentlyAskedQuestions: String { return self._s[2035]! } + public var Call_VoiceOver_VoiceCallMissed: String { return self._s[2036]! } + public var Channel_MessagePhotoRemoved: String { return self._s[2037]! } + public var Passport_Email_Delete: String { return self._s[2038]! } public func PUSH_PINNED_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2038]!, self._r[2038]!, [_1]) + return formatWithArgumentRanges(self._s[2039]!, self._r[2039]!, [_1]) } - public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2039]! } + public var NotificationSettings_ShowNotificationsAllAccountsInfoOn: String { return self._s[2040]! } public func Conversation_AutoremoveTimerRemovedUser(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2040]!, self._r[2040]!, [_1]) + return formatWithArgumentRanges(self._s[2041]!, self._r[2041]!, [_1]) } - public var Channel_AdminLog_CanAddAdmins: String { return self._s[2041]! } - public var SocksProxySetup_FailedToConnect: String { return self._s[2043]! } - public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[2044]! } - public var Common_of: String { return self._s[2045]! } - public var VoiceChat_CreateNewVoiceChatText: String { return self._s[2046]! } - public var VoiceChat_StartRecordingStart: String { return self._s[2047]! } - public var PeerInfo_ButtonUnmute: String { return self._s[2050]! } + public var Channel_AdminLog_CanAddAdmins: String { return self._s[2042]! } + public var SocksProxySetup_FailedToConnect: String { return self._s[2044]! } + public var SettingsSearch_Synonyms_Data_NetworkUsage: String { return self._s[2045]! } + public var Common_of: String { return self._s[2046]! } + public var VoiceChat_CreateNewVoiceChatText: String { return self._s[2047]! } + public var VoiceChat_StartRecordingStart: String { return self._s[2048]! } + public var PeerInfo_ButtonUnmute: String { return self._s[2051]! } public func ChatSettings_AutoDownloadSettings_TypeFile(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2051]!, self._r[2051]!, [_0]) + return formatWithArgumentRanges(self._s[2052]!, self._r[2052]!, [_0]) } - public var Privacy_ContactsReset_ContactsDeleted: String { return self._s[2052]! } - public var ChatList_AddChatsToFolder: String { return self._s[2053]! } - public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2054]! } - public var Settings_Title: String { return self._s[2056]! } - public var AutoDownloadSettings_Contacts: String { return self._s[2058]! } - public var Appearance_BubbleCornersSetting: String { return self._s[2059]! } - public var InviteLink_OtherAdminsLinks: String { return self._s[2060]! } - public var Privacy_Calls_AlwaysAllow: String { return self._s[2061]! } - public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[2063]! } - public var WallpaperPreview_CropBottomText: String { return self._s[2064]! } - public var SecretTimer_VideoDescription: String { return self._s[2065]! } - public var VoiceOver_Chat_AnimatedSticker: String { return self._s[2066]! } - public var WallpaperPreview_Blurred: String { return self._s[2067]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2068]! } - public var ChatListFolder_ExcludedSectionHeader: String { return self._s[2070]! } - public var Conversation_CancelForwardSelectChat: String { return self._s[2071]! } - public var DialogList_PasscodeLockHelp: String { return self._s[2072]! } - public var SocksProxySetup_SecretPlaceholder: String { return self._s[2073]! } - public var NetworkUsageSettings_CallDataSection: String { return self._s[2074]! } - public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2075]! } - public var Passport_FieldAddressTranslationHelp: String { return self._s[2076]! } - public var SocksProxySetup_Connection: String { return self._s[2077]! } - public var Passport_Address_TypePassportRegistration: String { return self._s[2078]! } - public var Contacts_PermissionsAllowInSettings: String { return self._s[2079]! } - public var Conversation_Unpin: String { return self._s[2080]! } - public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[2081]! } - public var TwoFactorSetup_Hint_Placeholder: String { return self._s[2082]! } - public var Call_ReportSkip: String { return self._s[2083]! } + public var Privacy_ContactsReset_ContactsDeleted: String { return self._s[2053]! } + public var ChatList_AddChatsToFolder: String { return self._s[2054]! } + public var Login_ResetAccountProtected_LimitExceeded: String { return self._s[2055]! } + public var Settings_Title: String { return self._s[2057]! } + public var AutoDownloadSettings_Contacts: String { return self._s[2059]! } + public var Appearance_BubbleCornersSetting: String { return self._s[2060]! } + public var InviteLink_OtherAdminsLinks: String { return self._s[2061]! } + public var Privacy_Calls_AlwaysAllow: String { return self._s[2062]! } + public var Privacy_Forwards_AlwaysAllow_Title: String { return self._s[2064]! } + public var WallpaperPreview_CropBottomText: String { return self._s[2065]! } + public var SecretTimer_VideoDescription: String { return self._s[2066]! } + public var VoiceOver_Chat_AnimatedSticker: String { return self._s[2067]! } + public var WallpaperPreview_Blurred: String { return self._s[2068]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsExceptions: String { return self._s[2069]! } + public var ChatListFolder_ExcludedSectionHeader: String { return self._s[2071]! } + public var Conversation_CancelForwardSelectChat: String { return self._s[2072]! } + public var DialogList_PasscodeLockHelp: String { return self._s[2073]! } + public var SocksProxySetup_SecretPlaceholder: String { return self._s[2074]! } + public var NetworkUsageSettings_CallDataSection: String { return self._s[2075]! } + public var TwoStepAuth_PasswordRemovePassportConfirmation: String { return self._s[2076]! } + public var Passport_FieldAddressTranslationHelp: String { return self._s[2077]! } + public var SocksProxySetup_Connection: String { return self._s[2078]! } + public var Passport_Address_TypePassportRegistration: String { return self._s[2079]! } + public var Contacts_PermissionsAllowInSettings: String { return self._s[2080]! } + public var Conversation_Unpin: String { return self._s[2081]! } + public var Notifications_MessageNotificationsExceptionsHelp: String { return self._s[2082]! } + public var TwoFactorSetup_Hint_Placeholder: String { return self._s[2083]! } + public var Call_ReportSkip: String { return self._s[2084]! } public func VoiceOver_Chat_PhotoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2084]!, self._r[2084]!, [_0]) + return formatWithArgumentRanges(self._s[2085]!, self._r[2085]!, [_0]) } public func VoiceOver_Chat_Caption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2086]!, self._r[2086]!, [_0]) + return formatWithArgumentRanges(self._s[2087]!, self._r[2087]!, [_0]) } - public var AutoNightTheme_Automatic: String { return self._s[2087]! } - public var Passport_Language_az: String { return self._s[2089]! } + public var AutoNightTheme_Automatic: String { return self._s[2088]! } + public var Passport_Language_az: String { return self._s[2090]! } public func Conversation_AutoremoveChanged(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2090]!, self._r[2090]!, [_0]) + return formatWithArgumentRanges(self._s[2091]!, self._r[2091]!, [_0]) } - public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[2091]! } - public var Watch_UserInfo_Unmute: String { return self._s[2092]! } - public var Channel_Stickers_YourStickers: String { return self._s[2093]! } - public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2094]! } - public var PeerInfo_AutoremoveMessagesDisabled: String { return self._s[2095]! } - public var Tour_Text1: String { return self._s[2096]! } - public var Common_Delete: String { return self._s[2097]! } - public var Settings_EditPhoto: String { return self._s[2098]! } - public var Common_Edit: String { return self._s[2099]! } - public var ShareMenu_ShareTo: String { return self._s[2101]! } - public var Passport_Identity_ExpiryDate: String { return self._s[2102]! } + public var SettingsSearch_Synonyms_Data_Storage_ClearCache: String { return self._s[2092]! } + public var Watch_UserInfo_Unmute: String { return self._s[2093]! } + public var Channel_Stickers_YourStickers: String { return self._s[2094]! } + public var Channel_DiscussionGroup_UnlinkChannel: String { return self._s[2095]! } + public var PeerInfo_AutoremoveMessagesDisabled: String { return self._s[2096]! } + public var Tour_Text1: String { return self._s[2097]! } + public var Common_Delete: String { return self._s[2098]! } + public var Settings_EditPhoto: String { return self._s[2099]! } + public var Common_Edit: String { return self._s[2100]! } + public var ShareMenu_ShareTo: String { return self._s[2102]! } + public var Passport_Identity_ExpiryDate: String { return self._s[2103]! } public func Channel_AdminLog_MutedNewMembers(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2103]!, self._r[2103]!, [_1]) + return formatWithArgumentRanges(self._s[2104]!, self._r[2104]!, [_1]) } - public var Preview_DeleteGif: String { return self._s[2104]! } - public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2105]! } - public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2106]! } - public var Conversation_ViewReply: String { return self._s[2107]! } - public var Stats_LoadingText: String { return self._s[2108]! } - public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[2109]! } - public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2110]! } - public var Channel_AdminLog_CanChangeInfo: String { return self._s[2111]! } + public var Preview_DeleteGif: String { return self._s[2105]! } + public var WallpaperPreview_PatternPaternDiscard: String { return self._s[2106]! } + public var ChatSettings_AutoDownloadUsingCellular: String { return self._s[2107]! } + public var Conversation_ViewReply: String { return self._s[2108]! } + public var Stats_LoadingText: String { return self._s[2109]! } + public var Channel_EditAdmin_PermissinAddAdminOn: String { return self._s[2110]! } + public var CheckoutInfo_ReceiverInfoEmailPlaceholder: String { return self._s[2111]! } + public var Channel_AdminLog_CanChangeInfo: String { return self._s[2112]! } public func Passport_Phone_UseTelegramNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2112]!, self._r[2112]!, [_0]) - } - public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2113]!, self._r[2113]!, [_0]) } + public func Time_MonthOfYear_m2(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2114]!, self._r[2114]!, [_0]) + } public func VoiceOver_Chat_VideoMessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2115]!, self._r[2115]!, [_0]) + return formatWithArgumentRanges(self._s[2116]!, self._r[2116]!, [_0]) } - public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[2116]! } - public var InviteLink_Share: String { return self._s[2118]! } + public var Passport_Address_OneOfTypeRentalAgreement: String { return self._s[2117]! } + public var InviteLink_Share: String { return self._s[2119]! } public func Conversation_ImportProgress(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2120]!, self._r[2120]!, [_0]) + return formatWithArgumentRanges(self._s[2121]!, self._r[2121]!, [_0]) } - public var IntentsSettings_MainAccount: String { return self._s[2121]! } - public var Group_MessagePhotoRemoved: String { return self._s[2124]! } - public var Conversation_ContextMenuSelect: String { return self._s[2125]! } - public var GroupInfo_Permissions_Exceptions: String { return self._s[2127]! } - public var GroupRemoved_UsersSectionTitle: String { return self._s[2128]! } - public var Contacts_PermissionsEnable: String { return self._s[2129]! } - public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[2130]! } - public var Common_NotNow: String { return self._s[2131]! } - public var Notification_CreatedChannel: String { return self._s[2132]! } - public var Stats_ViewsBySourceTitle: String { return self._s[2134]! } - public var InviteLink_ContextShare: String { return self._s[2135]! } - public var Appearance_AppIconClassic: String { return self._s[2136]! } - public var PhotoEditor_QualityTool: String { return self._s[2137]! } - public var ClearCache_ClearCache: String { return self._s[2138]! } - public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[2139]! } - public var AutoDownloadSettings_Videos: String { return self._s[2140]! } - public var GroupPermission_Duration: String { return self._s[2141]! } - public var ChatList_Read: String { return self._s[2142]! } + public var IntentsSettings_MainAccount: String { return self._s[2122]! } + public var Group_MessagePhotoRemoved: String { return self._s[2125]! } + public var Conversation_ContextMenuSelect: String { return self._s[2126]! } + public var GroupInfo_Permissions_Exceptions: String { return self._s[2128]! } + public var GroupRemoved_UsersSectionTitle: String { return self._s[2129]! } + public var Contacts_PermissionsEnable: String { return self._s[2130]! } + public var Channel_EditAdmin_PermissionDeleteMessagesOfOthers: String { return self._s[2131]! } + public var Common_NotNow: String { return self._s[2132]! } + public var Notification_CreatedChannel: String { return self._s[2133]! } + public var Stats_ViewsBySourceTitle: String { return self._s[2135]! } + public var InviteLink_ContextShare: String { return self._s[2136]! } + public var Appearance_AppIconClassic: String { return self._s[2137]! } + public var PhotoEditor_QualityTool: String { return self._s[2138]! } + public var ClearCache_ClearCache: String { return self._s[2139]! } + public var TwoFactorSetup_Password_PlaceholderConfirmPassword: String { return self._s[2140]! } + public var AutoDownloadSettings_Videos: String { return self._s[2141]! } + public var GroupPermission_Duration: String { return self._s[2142]! } + public var ChatList_Read: String { return self._s[2143]! } public func Group_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2143]!, self._r[2143]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2144]!, self._r[2144]!, [_1, _2]) } public func ScheduleVoiceChat_ScheduleTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2144]!, self._r[2144]!, [_0]) + return formatWithArgumentRanges(self._s[2145]!, self._r[2145]!, [_0]) } - public var CallFeedback_Send: String { return self._s[2145]! } - public var Channel_Stickers_Searching: String { return self._s[2146]! } - public var ScheduledMessages_ReminderNotification: String { return self._s[2147]! } - public var FastTwoStepSetup_HintSection: String { return self._s[2148]! } - public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2149]! } - public var EditTheme_CreateTitle: String { return self._s[2151]! } - public var Application_Name: String { return self._s[2152]! } - public var Paint_Stickers: String { return self._s[2153]! } - public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[2154]! } - public var Call_StatusFailed: String { return self._s[2155]! } - public var Stickers_FavoriteStickers: String { return self._s[2156]! } - public var ClearCache_Clear: String { return self._s[2157]! } - public var Passport_Language_mn: String { return self._s[2158]! } - public var WallpaperPreview_PreviewTopText: String { return self._s[2159]! } - public var LogoutOptions_ClearCacheTitle: String { return self._s[2160]! } - public var Call_VoiceOver_VideoCallOutgoing: String { return self._s[2162]! } - public var TwoFactorSetup_Hint_Text: String { return self._s[2164]! } - public var WallpaperPreview_PatternIntensity: String { return self._s[2165]! } - public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2166]! } - public var Passport_Address_AddBankStatement: String { return self._s[2167]! } + public var CallFeedback_Send: String { return self._s[2146]! } + public var Channel_Stickers_Searching: String { return self._s[2147]! } + public var ScheduledMessages_ReminderNotification: String { return self._s[2148]! } + public var FastTwoStepSetup_HintSection: String { return self._s[2149]! } + public var ChatSettings_AutoDownloadVideoMessages: String { return self._s[2150]! } + public var EditTheme_CreateTitle: String { return self._s[2152]! } + public var Application_Name: String { return self._s[2153]! } + public var Paint_Stickers: String { return self._s[2154]! } + public var Appearance_ThemePreview_Chat_1_Text: String { return self._s[2155]! } + public var Call_StatusFailed: String { return self._s[2156]! } + public var Stickers_FavoriteStickers: String { return self._s[2157]! } + public var ClearCache_Clear: String { return self._s[2158]! } + public var Passport_Language_mn: String { return self._s[2159]! } + public var WallpaperPreview_PreviewTopText: String { return self._s[2160]! } + public var LogoutOptions_ClearCacheTitle: String { return self._s[2161]! } + public var Call_VoiceOver_VideoCallOutgoing: String { return self._s[2163]! } + public var TwoFactorSetup_Hint_Text: String { return self._s[2165]! } + public var WallpaperPreview_PatternIntensity: String { return self._s[2166]! } + public var CheckoutInfo_ErrorShippingNotAvailable: String { return self._s[2167]! } + public var Passport_Address_AddBankStatement: String { return self._s[2168]! } public func Conversation_TitleRepliesFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2170]!, self._r[2170]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2171]!, self._r[2171]!, [_1, _2]) } - public var ChatListFolderSettings_RecommendedNewFolder: String { return self._s[2171]! } - public var UserInfo_ShareContact: String { return self._s[2172]! } - public var Passport_Identity_NamePlaceholder: String { return self._s[2173]! } - public var Channel_ErrorAdminsTooMuch: String { return self._s[2175]! } - public var Call_RateCall: String { return self._s[2176]! } - public var Contacts_AccessDeniedError: String { return self._s[2177]! } - public var Invite_ChannelsTooMuch: String { return self._s[2178]! } - public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[2179]! } - public var Channel_BanUser_PermissionReadMessages: String { return self._s[2180]! } - public var InviteLink_Create_TimeLimitInfo: String { return self._s[2181]! } - public var Cache_NoLimit: String { return self._s[2184]! } - public var Conversation_EmptyPlaceholder: String { return self._s[2185]! } - public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2189]! } - public var Notification_Exceptions_MessagePreviewAlwaysOff: String { return self._s[2190]! } - public var GroupRemoved_RemoveInfo: String { return self._s[2191]! } - public var Privacy_PaymentsClear_AllInfoCleared: String { return self._s[2192]! } - public var Privacy_Calls_IntegrationHelp: String { return self._s[2193]! } + public var ChatListFolderSettings_RecommendedNewFolder: String { return self._s[2172]! } + public var UserInfo_ShareContact: String { return self._s[2173]! } + public var Passport_Identity_NamePlaceholder: String { return self._s[2174]! } + public var Channel_ErrorAdminsTooMuch: String { return self._s[2176]! } + public var Call_RateCall: String { return self._s[2177]! } + public var Contacts_AccessDeniedError: String { return self._s[2178]! } + public var Invite_ChannelsTooMuch: String { return self._s[2179]! } + public var CheckoutInfo_ShippingInfoPostcode: String { return self._s[2180]! } + public var Channel_BanUser_PermissionReadMessages: String { return self._s[2181]! } + public var InviteLink_Create_TimeLimitInfo: String { return self._s[2182]! } + public var Cache_NoLimit: String { return self._s[2185]! } + public var Conversation_EmptyPlaceholder: String { return self._s[2186]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Placeholder: String { return self._s[2190]! } + public var Notification_Exceptions_MessagePreviewAlwaysOff: String { return self._s[2191]! } + public var GroupRemoved_RemoveInfo: String { return self._s[2192]! } + public var Privacy_PaymentsClear_AllInfoCleared: String { return self._s[2193]! } + public var Privacy_Calls_IntegrationHelp: String { return self._s[2194]! } public func PUSH_VIDEO_CALL_MISSED(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2194]!, self._r[2194]!, [_1]) + return formatWithArgumentRanges(self._s[2195]!, self._r[2195]!, [_1]) } - public var VoiceOver_Media_PlaybackRateFast: String { return self._s[2195]! } - public var Theme_ThemeChanged: String { return self._s[2196]! } - public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2198]! } - public var AutoDownloadSettings_MediaTypes: String { return self._s[2199]! } + public var VoiceOver_Media_PlaybackRateFast: String { return self._s[2196]! } + public var Theme_ThemeChanged: String { return self._s[2197]! } + public var Privacy_GroupsAndChannels_NeverAllow: String { return self._s[2199]! } + public var AutoDownloadSettings_MediaTypes: String { return self._s[2200]! } public func Notification_PinnedDocumentMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2200]!, self._r[2200]!, [_0]) + return formatWithArgumentRanges(self._s[2201]!, self._r[2201]!, [_0]) } - public var Channel_AdminLog_InfoPanelTitle: String { return self._s[2201]! } - public var Passport_Language_da: String { return self._s[2203]! } - public var Chat_SlowmodeSendError: String { return self._s[2204]! } - public var Application_Update: String { return self._s[2206]! } - public var SocksProxySetup_SaveProxy: String { return self._s[2207]! } + public var Channel_AdminLog_InfoPanelTitle: String { return self._s[2202]! } + public var Passport_Language_da: String { return self._s[2204]! } + public var Chat_SlowmodeSendError: String { return self._s[2205]! } + public var Application_Update: String { return self._s[2207]! } + public var SocksProxySetup_SaveProxy: String { return self._s[2208]! } public func PUSH_AUTH_REGION(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2208]!, self._r[2208]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2209]!, self._r[2209]!, [_1, _2]) } - public var Privacy_AddNewPeer: String { return self._s[2210]! } - public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[2212]! } - public var Channel_Members_Title: String { return self._s[2213]! } - public var StickerPacks_ActionDelete: String { return self._s[2214]! } - public var Conversation_ScheduledVoiceChat: String { return self._s[2215]! } - public var Settings_LogoutConfirmationText: String { return self._s[2217]! } - public var Chat_UnsendMyMessages: String { return self._s[2218]! } - public var PeerInfo_ReportProfilePhoto: String { return self._s[2219]! } - public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2221]! } - public var ChatListFilter_AddChatsTitle: String { return self._s[2222]! } - public var Passport_FloodError: String { return self._s[2223]! } - public var NotificationSettings_ContactJoinedInfo: String { return self._s[2224]! } - public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2225]! } - public var CallSettings_TabIconDescription: String { return self._s[2226]! } - public var Group_Setup_HistoryHeader: String { return self._s[2228]! } + public var Privacy_AddNewPeer: String { return self._s[2211]! } + public var Channel_DiscussionGroup_MakeHistoryPublicProceed: String { return self._s[2213]! } + public var Channel_Members_Title: String { return self._s[2214]! } + public var StickerPacks_ActionDelete: String { return self._s[2215]! } + public var Conversation_ScheduledVoiceChat: String { return self._s[2216]! } + public var Settings_LogoutConfirmationText: String { return self._s[2218]! } + public var Chat_UnsendMyMessages: String { return self._s[2219]! } + public var PeerInfo_ReportProfilePhoto: String { return self._s[2220]! } + public var Conversation_EditingMessageMediaEditCurrentVideo: String { return self._s[2222]! } + public var ChatListFilter_AddChatsTitle: String { return self._s[2223]! } + public var Passport_FloodError: String { return self._s[2224]! } + public var NotificationSettings_ContactJoinedInfo: String { return self._s[2225]! } + public var SettingsSearch_Synonyms_Privacy_Data_SecretChatLinkPreview: String { return self._s[2226]! } + public var CallSettings_TabIconDescription: String { return self._s[2227]! } + public var Group_Setup_HistoryHeader: String { return self._s[2229]! } public func Channel_AdminLog_AllowedNewMembersToSpeak(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2229]!, self._r[2229]!, [_1]) + return formatWithArgumentRanges(self._s[2230]!, self._r[2230]!, [_1]) } - public var TwoStepAuth_EmailTitle: String { return self._s[2230]! } - public var GroupInfo_Permissions_Removed: String { return self._s[2231]! } - public var DialogList_ClearHistoryConfirmation: String { return self._s[2232]! } - public var Contacts_Title: String { return self._s[2234]! } + public var TwoStepAuth_EmailTitle: String { return self._s[2231]! } + public var GroupInfo_Permissions_Removed: String { return self._s[2232]! } + public var DialogList_ClearHistoryConfirmation: String { return self._s[2233]! } + public var Contacts_Title: String { return self._s[2235]! } public func Notification_Invited(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2235]!, self._r[2235]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2236]!, self._r[2236]!, [_0, _1]) } - public var ChatList_PeerTypeBot: String { return self._s[2238]! } + public var ChatList_PeerTypeBot: String { return self._s[2239]! } public func Channel_AdminLog_SetSlowmode(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2239]!, self._r[2239]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2240]!, self._r[2240]!, [_1, _2]) } - public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[2240]! } + public var Appearance_ThemePreview_Chat_6_Text: String { return self._s[2241]! } public func Time_PreciseDate_m1(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2241]!, self._r[2241]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2242]!, self._r[2242]!, [_1, _2, _3]) } - public var Camera_PhotoMode: String { return self._s[2243]! } + public var Camera_PhotoMode: String { return self._s[2244]! } public func PUSH_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2244]!, self._r[2244]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2245]!, self._r[2245]!, [_1, _2, _3]) } - public var ContactInfo_PhoneLabelPager: String { return self._s[2245]! } - public var SettingsSearch_Synonyms_FAQ: String { return self._s[2246]! } - public var Call_CallAgain: String { return self._s[2247]! } - public var TwoStepAuth_PasswordSet: String { return self._s[2248]! } - public var VoiceChat_EditDescriptionPlaceholder: String { return self._s[2249]! } + public var ContactInfo_PhoneLabelPager: String { return self._s[2246]! } + public var SettingsSearch_Synonyms_FAQ: String { return self._s[2247]! } + public var Call_CallAgain: String { return self._s[2248]! } + public var TwoStepAuth_PasswordSet: String { return self._s[2249]! } + public var VoiceChat_EditDescriptionPlaceholder: String { return self._s[2250]! } public func Channel_Management_RestrictedBy(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2250]!, self._r[2250]!, [_0]) + return formatWithArgumentRanges(self._s[2251]!, self._r[2251]!, [_0]) } - public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[2251]! } - public var ClearCache_FreeSpaceDescription: String { return self._s[2252]! } - public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2253]! } - public var Group_LeaveGroup: String { return self._s[2254]! } - public var Channel_Setup_LinkTypePrivate: String { return self._s[2256]! } - public var GroupInfo_LabelAdmin: String { return self._s[2258]! } - public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2260]! } - public var Notification_PassportValuePersonalDetails: String { return self._s[2261]! } + public var GroupInfo_InviteLink_RevokeAlert_Success: String { return self._s[2252]! } + public var ClearCache_FreeSpaceDescription: String { return self._s[2253]! } + public var Permissions_ContactsAllowInSettings_v0: String { return self._s[2254]! } + public var Group_LeaveGroup: String { return self._s[2255]! } + public var Channel_Setup_LinkTypePrivate: String { return self._s[2257]! } + public var GroupInfo_LabelAdmin: String { return self._s[2259]! } + public var CheckoutInfo_ErrorStateInvalid: String { return self._s[2261]! } + public var Notification_PassportValuePersonalDetails: String { return self._s[2262]! } public func WebSearch_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2262]!, self._r[2262]!, [_0]) + return formatWithArgumentRanges(self._s[2263]!, self._r[2263]!, [_0]) } - public var Stats_GroupNewMembersBySourceTitle: String { return self._s[2263]! } - public var Appearance_Preview: String { return self._s[2264]! } - public var VoiceOver_Chat_Contact: String { return self._s[2265]! } - public var Passport_Language_th: String { return self._s[2266]! } - public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2268]! } - public var LastSeen_Offline: String { return self._s[2271]! } - public var Map_OpenInHereMaps: String { return self._s[2272]! } - public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[2273]! } - public var InviteLink_ContextEdit: String { return self._s[2275]! } - public var AutoDownloadSettings_Reset: String { return self._s[2276]! } - public var Conversation_SendMessage_SetReminder: String { return self._s[2277]! } - public var Channel_AdminLog_EmptyMessageText: String { return self._s[2278]! } + public var Stats_GroupNewMembersBySourceTitle: String { return self._s[2264]! } + public var Appearance_Preview: String { return self._s[2265]! } + public var VoiceOver_Chat_Contact: String { return self._s[2266]! } + public var Passport_Language_th: String { return self._s[2267]! } + public var PhotoEditor_CropAspectRatioOriginal: String { return self._s[2269]! } + public var LastSeen_Offline: String { return self._s[2272]! } + public var Map_OpenInHereMaps: String { return self._s[2273]! } + public var SettingsSearch_Synonyms_Data_AutoplayVideos: String { return self._s[2274]! } + public var InviteLink_ContextEdit: String { return self._s[2276]! } + public var AutoDownloadSettings_Reset: String { return self._s[2277]! } + public var Conversation_SendMessage_SetReminder: String { return self._s[2278]! } + public var Channel_AdminLog_EmptyMessageText: String { return self._s[2279]! } public func AddContact_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2279]!, self._r[2279]!, [_0]) - } - public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2280]!, self._r[2280]!, [_0]) } - public var Passport_Identity_EditDriversLicense: String { return self._s[2281]! } - public var ChatListFolder_NameNonMuted: String { return self._s[2282]! } - public var Username_Placeholder: String { return self._s[2283]! } + public func AuthCode_Alert(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2281]!, self._r[2281]!, [_0]) + } + public var Passport_Identity_EditDriversLicense: String { return self._s[2282]! } + public var ChatListFolder_NameNonMuted: String { return self._s[2283]! } + public var Username_Placeholder: String { return self._s[2284]! } public func PUSH_ALBUM(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2284]!, self._r[2284]!, [_1]) + return formatWithArgumentRanges(self._s[2285]!, self._r[2285]!, [_1]) } - public var Passport_Language_it: String { return self._s[2285]! } - public var Checkout_NewCard_SaveInfo: String { return self._s[2286]! } + public var Passport_Language_it: String { return self._s[2286]! } + public var Checkout_NewCard_SaveInfo: String { return self._s[2287]! } public func Channel_OwnershipTransfer_DescriptionInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2287]!, self._r[2287]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2288]!, self._r[2288]!, [_1, _2]) } - public var NotificationsSound_Pulse: String { return self._s[2288]! } - public var VoiceOver_DismissContextMenu: String { return self._s[2290]! } - public var MessagePoll_NoVotes: String { return self._s[2293]! } - public var Message_Wallpaper: String { return self._s[2294]! } - public var Conversation_JoinVoiceChat: String { return self._s[2295]! } - public var Appearance_Other: String { return self._s[2296]! } - public var Passport_Identity_NativeNameHelp: String { return self._s[2298]! } - public var Group_PublicLink_Placeholder: String { return self._s[2302]! } - public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2303]! } - public var VoiceOver_Recording_StopAndPreview: String { return self._s[2304]! } - public var ChatListFolder_NameBots: String { return self._s[2305]! } - public var Conversation_StopPollConfirmation: String { return self._s[2306]! } - public var UserInfo_DeleteContact: String { return self._s[2307]! } + public var NotificationsSound_Pulse: String { return self._s[2289]! } + public var VoiceOver_DismissContextMenu: String { return self._s[2291]! } + public var MessagePoll_NoVotes: String { return self._s[2294]! } + public var Message_Wallpaper: String { return self._s[2295]! } + public var Conversation_JoinVoiceChat: String { return self._s[2296]! } + public var Appearance_Other: String { return self._s[2297]! } + public var Passport_Identity_NativeNameHelp: String { return self._s[2299]! } + public var Group_PublicLink_Placeholder: String { return self._s[2303]! } + public var Appearance_ThemePreview_ChatList_2_Text: String { return self._s[2304]! } + public var VoiceOver_Recording_StopAndPreview: String { return self._s[2305]! } + public var ChatListFolder_NameBots: String { return self._s[2306]! } + public var Conversation_StopPollConfirmation: String { return self._s[2307]! } + public var UserInfo_DeleteContact: String { return self._s[2308]! } public func Time_MonthOfYear_m11(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2308]!, self._r[2308]!, [_0]) + return formatWithArgumentRanges(self._s[2309]!, self._r[2309]!, [_0]) } - public var Wallpaper_Wallpaper: String { return self._s[2310]! } + public var Wallpaper_Wallpaper: String { return self._s[2311]! } public func PUSH_MESSAGE_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2311]!, self._r[2311]!, [_1]) + return formatWithArgumentRanges(self._s[2312]!, self._r[2312]!, [_1]) } - public var LoginPassword_ForgotPassword: String { return self._s[2312]! } - public var FeaturedStickerPacks_Title: String { return self._s[2313]! } - public var Paint_Pen: String { return self._s[2314]! } - public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2315]! } - public var ChatListFolderSettings_Info: String { return self._s[2316]! } - public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2317]! } - public var PhotoEditor_CurvesAll: String { return self._s[2319]! } + public var LoginPassword_ForgotPassword: String { return self._s[2313]! } + public var FeaturedStickerPacks_Title: String { return self._s[2314]! } + public var Paint_Pen: String { return self._s[2315]! } + public var Channel_AdminLogFilter_EventsInfo: String { return self._s[2316]! } + public var ChatListFolderSettings_Info: String { return self._s[2317]! } + public var FastTwoStepSetup_HintPlaceholder: String { return self._s[2318]! } + public var PhotoEditor_CurvesAll: String { return self._s[2320]! } public func Time_PreciseDate_m12(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2321]!, self._r[2321]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2322]!, self._r[2322]!, [_1, _2, _3]) } - public var Passport_Address_TypeRentalAgreement: String { return self._s[2323]! } - public var Message_ImageExpired: String { return self._s[2324]! } - public var Call_ConnectionErrorMessage: String { return self._s[2325]! } - public var SearchImages_NoImagesFound: String { return self._s[2327]! } - public var PeerInfo_PaneGifs: String { return self._s[2328]! } - public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2329]! } - public var EnterPasscode_RepeatNewPasscode: String { return self._s[2330]! } - public var PhotoEditor_VignetteTool: String { return self._s[2331]! } - public var Passport_Language_dz: String { return self._s[2332]! } - public var Notifications_ChannelNotificationsHelp: String { return self._s[2333]! } - public var Conversation_BlockUser: String { return self._s[2334]! } - public var GroupPermission_PermissionDisabledByDefault: String { return self._s[2337]! } - public var TwoStepAuth_CancelResetText: String { return self._s[2339]! } - public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2340]! } + public var Passport_Address_TypeRentalAgreement: String { return self._s[2324]! } + public var Message_ImageExpired: String { return self._s[2325]! } + public var Call_ConnectionErrorMessage: String { return self._s[2326]! } + public var SearchImages_NoImagesFound: String { return self._s[2328]! } + public var PeerInfo_PaneGifs: String { return self._s[2329]! } + public var Passport_DeletePersonalDetailsConfirmation: String { return self._s[2330]! } + public var EnterPasscode_RepeatNewPasscode: String { return self._s[2331]! } + public var PhotoEditor_VignetteTool: String { return self._s[2332]! } + public var Passport_Language_dz: String { return self._s[2333]! } + public var Notifications_ChannelNotificationsHelp: String { return self._s[2334]! } + public var Conversation_BlockUser: String { return self._s[2335]! } + public var GroupPermission_PermissionDisabledByDefault: String { return self._s[2338]! } + public var TwoStepAuth_CancelResetText: String { return self._s[2340]! } + public var Group_OwnershipTransfer_ErrorAdminsTooMuch: String { return self._s[2341]! } public func Time_MonthOfYear_m8(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2341]!, self._r[2341]!, [_0]) + return formatWithArgumentRanges(self._s[2342]!, self._r[2342]!, [_0]) } - public var KeyCommand_NewMessage: String { return self._s[2342]! } - public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[2345]! } + public var KeyCommand_NewMessage: String { return self._s[2343]! } + public var EditTheme_Edit_Preview_IncomingReplyText: String { return self._s[2346]! } public func PUSH_CHAT_MESSAGE_GEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2347]!, self._r[2347]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2348]!, self._r[2348]!, [_1, _2]) } - public var ContactList_Context_StartSecretChat: String { return self._s[2348]! } - public var VoiceOver_Chat_File: String { return self._s[2349]! } - public var ChatList_EditFolder: String { return self._s[2351]! } - public var Appearance_BubbleCorners_Title: String { return self._s[2352]! } - public var PeerInfo_PaneAudio: String { return self._s[2353]! } - public var ChatListFolder_CategoryContacts: String { return self._s[2355]! } - public var VoiceOver_ScheduledMessages: String { return self._s[2356]! } + public var ContactList_Context_StartSecretChat: String { return self._s[2349]! } + public var VoiceOver_Chat_File: String { return self._s[2350]! } + public var ChatList_EditFolder: String { return self._s[2352]! } + public var Appearance_BubbleCorners_Title: String { return self._s[2353]! } + public var PeerInfo_PaneAudio: String { return self._s[2354]! } + public var ChatListFolder_CategoryContacts: String { return self._s[2356]! } + public var VoiceOver_ScheduledMessages: String { return self._s[2357]! } public func Login_InvalidPhoneEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2357]!, self._r[2357]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[2358]!, self._r[2358]!, [_1, _2, _3, _4, _5]) } - public var ChatList_PeerTypeChannel: String { return self._s[2358]! } - public var VoiceOver_Navigation_Search: String { return self._s[2359]! } - public var Settings_Search: String { return self._s[2360]! } - public var WallpaperSearch_ColorYellow: String { return self._s[2361]! } - public var Login_PhoneBannedError: String { return self._s[2362]! } - public var KeyCommand_JumpToNextChat: String { return self._s[2363]! } - public var Passport_Language_fa: String { return self._s[2364]! } - public var Settings_About: String { return self._s[2365]! } - public var AutoDownloadSettings_MaxFileSize: String { return self._s[2366]! } - public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[2367]! } - public var AutoDownloadSettings_DataUsageHigh: String { return self._s[2368]! } + public var ChatList_PeerTypeChannel: String { return self._s[2359]! } + public var VoiceOver_Navigation_Search: String { return self._s[2360]! } + public var Settings_Search: String { return self._s[2361]! } + public var WallpaperSearch_ColorYellow: String { return self._s[2362]! } + public var Login_PhoneBannedError: String { return self._s[2363]! } + public var KeyCommand_JumpToNextChat: String { return self._s[2364]! } + public var Passport_Language_fa: String { return self._s[2365]! } + public var Settings_About: String { return self._s[2366]! } + public var AutoDownloadSettings_MaxFileSize: String { return self._s[2367]! } + public var Channel_AdminLog_InfoPanelChannelAlertText: String { return self._s[2368]! } + public var AutoDownloadSettings_DataUsageHigh: String { return self._s[2369]! } public func PUSH_CHAT_MESSAGE_TEXT(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2369]!, self._r[2369]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2370]!, self._r[2370]!, [_1, _2, _3]) } - public var Common_OK: String { return self._s[2370]! } - public var Contacts_SortBy: String { return self._s[2371]! } - public var ImportStickerPack_LinkTaken: String { return self._s[2372]! } - public var AutoNightTheme_PreferredTheme: String { return self._s[2373]! } + public var Common_OK: String { return self._s[2371]! } + public var Contacts_SortBy: String { return self._s[2372]! } + public var ImportStickerPack_LinkTaken: String { return self._s[2373]! } + public var AutoNightTheme_PreferredTheme: String { return self._s[2374]! } public func AutoDownloadSettings_OnFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2375]!, self._r[2375]!, [_0]) + return formatWithArgumentRanges(self._s[2376]!, self._r[2376]!, [_0]) } - public var CallFeedback_IncludeLogs: String { return self._s[2378]! } + public var CallFeedback_IncludeLogs: String { return self._s[2379]! } public func External_OpenIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2379]!, self._r[2379]!, [_0]) + return formatWithArgumentRanges(self._s[2380]!, self._r[2380]!, [_0]) } - public var ImportStickerPack_ChooseLink: String { return self._s[2381]! } - public var Passcode_AppLockedAlert: String { return self._s[2382]! } - public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2383]! } - public var Channel_NotificationLoading: String { return self._s[2385]! } - public var Passport_Identity_DocumentNumber: String { return self._s[2386]! } - public var VoiceOver_Chat_PagePreview: String { return self._s[2387]! } - public var VoiceOver_Chat_OpenHint: String { return self._s[2388]! } - public var Weekday_ShortFriday: String { return self._s[2389]! } - public var Conversation_TitleMute: String { return self._s[2390]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2391]! } - public var ScheduledMessages_PollUnavailable: String { return self._s[2392]! } - public var DialogList_LanguageTooltip: String { return self._s[2394]! } - public var BroadcastGroups_IntroTitle: String { return self._s[2395]! } - public var Channel_AdminLogFilter_EventsPinned: String { return self._s[2396]! } + public var ImportStickerPack_ChooseLink: String { return self._s[2382]! } + public var Passcode_AppLockedAlert: String { return self._s[2383]! } + public var TwoStepAuth_SetupPasswordTitle: String { return self._s[2384]! } + public var Channel_NotificationLoading: String { return self._s[2386]! } + public var Passport_Identity_DocumentNumber: String { return self._s[2387]! } + public var VoiceOver_Chat_PagePreview: String { return self._s[2388]! } + public var VoiceOver_Chat_OpenHint: String { return self._s[2389]! } + public var Weekday_ShortFriday: String { return self._s[2390]! } + public var Conversation_TitleMute: String { return self._s[2391]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsSound: String { return self._s[2392]! } + public var ScheduledMessages_PollUnavailable: String { return self._s[2393]! } + public var DialogList_LanguageTooltip: String { return self._s[2395]! } + public var BroadcastGroups_IntroTitle: String { return self._s[2396]! } + public var Channel_AdminLogFilter_EventsPinned: String { return self._s[2397]! } public func DialogList_SingleUploadingVideoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2397]!, self._r[2397]!, [_0]) + return formatWithArgumentRanges(self._s[2398]!, self._r[2398]!, [_0]) } - public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[2399]! } - public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[2400]! } - public var Settings_EditVideo: String { return self._s[2401]! } - public var VoiceOver_Common_Off: String { return self._s[2402]! } - public var Stickers_FrequentlyUsed: String { return self._s[2403]! } - public var GroupPermission_Title: String { return self._s[2404]! } - public var AccessDenied_VideoMessageCamera: String { return self._s[2405]! } - public var Appearance_ThemeCarouselDay: String { return self._s[2406]! } + public var TwoStepAuth_SetupResendEmailCodeAlert: String { return self._s[2400]! } + public var Privacy_Calls_AlwaysAllow_Title: String { return self._s[2401]! } + public var Settings_EditVideo: String { return self._s[2402]! } + public var VoiceOver_Common_Off: String { return self._s[2403]! } + public var Stickers_FrequentlyUsed: String { return self._s[2404]! } + public var GroupPermission_Title: String { return self._s[2405]! } + public var AccessDenied_VideoMessageCamera: String { return self._s[2406]! } + public var Appearance_ThemeCarouselDay: String { return self._s[2407]! } public func PUSH_CHAT_MESSAGE_AUDIO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2407]!, self._r[2407]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2408]!, self._r[2408]!, [_1, _2]) } - public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2408]! } - public var Tour_Title6: String { return self._s[2409]! } - public var EmptyGroupInfo_Title: String { return self._s[2410]! } + public var Passport_Identity_DocumentNumberPlaceholder: String { return self._s[2409]! } + public var Tour_Title6: String { return self._s[2410]! } + public var EmptyGroupInfo_Title: String { return self._s[2411]! } public func Channel_AdminLog_MessageToggleSignaturesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2411]!, self._r[2411]!, [_0]) + return formatWithArgumentRanges(self._s[2412]!, self._r[2412]!, [_0]) } - public var Passport_Language_sk: String { return self._s[2412]! } - public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[2413]! } - public var TwoFactorRemember_WrongPassword: String { return self._s[2414]! } - public var Preview_SaveToCameraRoll: String { return self._s[2415]! } + public var Passport_Language_sk: String { return self._s[2413]! } + public var VoiceOver_Chat_YourAnonymousPoll: String { return self._s[2414]! } + public var TwoFactorRemember_WrongPassword: String { return self._s[2415]! } + public var Preview_SaveToCameraRoll: String { return self._s[2416]! } public func VoiceChat_YouCanNowSpeakIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2416]!, self._r[2416]!, [_0]) + return formatWithArgumentRanges(self._s[2417]!, self._r[2417]!, [_0]) } - public var LogoutOptions_SetPasscodeTitle: String { return self._s[2417]! } - public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2418]! } - public var Conversation_ContextMenuMore: String { return self._s[2419]! } - public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2420]! } - public var Channel_AdminLog_CanBeAnonymous: String { return self._s[2421]! } - public var CallFeedback_ReasonSilentLocal: String { return self._s[2423]! } + public var LogoutOptions_SetPasscodeTitle: String { return self._s[2418]! } + public var Passport_Address_TypeUtilityBillUploadScan: String { return self._s[2419]! } + public var Conversation_ContextMenuMore: String { return self._s[2420]! } + public var Conversation_ForwardAuthorHiddenTooltip: String { return self._s[2421]! } + public var Channel_AdminLog_CanBeAnonymous: String { return self._s[2422]! } + public var CallFeedback_ReasonSilentLocal: String { return self._s[2424]! } public func Channel_AdminLog_UnmutedMutedParticipant(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2424]!, self._r[2424]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2425]!, self._r[2425]!, [_1, _2]) } - public var UserInfo_NotificationsDisable: String { return self._s[2425]! } + public var UserInfo_NotificationsDisable: String { return self._s[2426]! } public func Channel_AdminLog_EmptyFilterQueryText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2427]!, self._r[2427]!, [_0]) + return formatWithArgumentRanges(self._s[2428]!, self._r[2428]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[2428]! } + public var SettingsSearch_Synonyms_EditProfile_Bio: String { return self._s[2429]! } public func Date_ChatDateHeader(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2430]!, self._r[2430]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2431]!, self._r[2431]!, [_1, _2]) } - public var WallpaperSearch_ColorPrefix: String { return self._s[2431]! } + public var WallpaperSearch_ColorPrefix: String { return self._s[2432]! } public func Message_ForwardedPsa_covid(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2432]!, self._r[2432]!, [_0]) + return formatWithArgumentRanges(self._s[2433]!, self._r[2433]!, [_0]) } - public var VoiceChat_NoiseSuppressionDisabled: String { return self._s[2434]! } - public var Conversation_RestrictedMedia: String { return self._s[2435]! } - public var Group_MessageVideoUpdated: String { return self._s[2436]! } - public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2437]! } - public var GroupInfo_DeleteAndExit: String { return self._s[2438]! } - public var TwoFactorSetup_Email_Action: String { return self._s[2439]! } - public var TwoFactorSetup_ResetDone_TitleNoPassword: String { return self._s[2440]! } - public var Media_ShareThisVideo: String { return self._s[2442]! } - public var DialogList_Replies: String { return self._s[2444]! } + public var VoiceChat_NoiseSuppressionDisabled: String { return self._s[2435]! } + public var Conversation_RestrictedMedia: String { return self._s[2436]! } + public var Group_MessageVideoUpdated: String { return self._s[2437]! } + public var NetworkUsageSettings_ResetStatsConfirmation: String { return self._s[2438]! } + public var GroupInfo_DeleteAndExit: String { return self._s[2439]! } + public var TwoFactorSetup_Email_Action: String { return self._s[2440]! } + public var TwoFactorSetup_ResetDone_TitleNoPassword: String { return self._s[2441]! } + public var Media_ShareThisVideo: String { return self._s[2443]! } + public var DialogList_Replies: String { return self._s[2445]! } public func Conversation_Moderate_DeleteAllMessages(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2445]!, self._r[2445]!, [_0]) + return formatWithArgumentRanges(self._s[2446]!, self._r[2446]!, [_0]) } - public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2446]! } - public var Watch_Suggestion_OnMyWay: String { return self._s[2447]! } - public var ImportStickerPack_ImportingStickers: String { return self._s[2448]! } - public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2449]! } + public var CheckoutInfo_ShippingInfoAddress1: String { return self._s[2447]! } + public var Watch_Suggestion_OnMyWay: String { return self._s[2448]! } + public var ImportStickerPack_ImportingStickers: String { return self._s[2449]! } + public var CheckoutInfo_ShippingInfoAddress2: String { return self._s[2450]! } public func PUSH_PINNED_POLL(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2450]!, self._r[2450]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_1, _2]) } public func GroupInfo_InvitationLinkAcceptChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2451]!, self._r[2451]!, [_0]) + return formatWithArgumentRanges(self._s[2452]!, self._r[2452]!, [_0]) } - public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[2452]! } - public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2453]! } - public var ChatList_Search_NoResultsFitlerMedia: String { return self._s[2454]! } - public var Channel_Members_InviteLink: String { return self._s[2455]! } - public var Conversation_TapAndHoldToRecord: String { return self._s[2456]! } - public var WatchRemote_AlertText: String { return self._s[2457]! } + public var Channel_EditAdmin_PermissinAddAdminOff: String { return self._s[2453]! } + public var ChatAdmins_AllMembersAreAdminsOnHelp: String { return self._s[2454]! } + public var ChatList_Search_NoResultsFitlerMedia: String { return self._s[2455]! } + public var Channel_Members_InviteLink: String { return self._s[2456]! } + public var Conversation_TapAndHoldToRecord: String { return self._s[2457]! } + public var WatchRemote_AlertText: String { return self._s[2458]! } public func Channel_DiscussionGroup_PrivateChannelLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2458]!, self._r[2458]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2459]!, self._r[2459]!, [_1, _2]) } - public var Conversation_Pin: String { return self._s[2459]! } - public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2460]! } - public var Stickers_RemoveFromFavorites: String { return self._s[2461]! } - public var Conversation_CancelForwardTitle: String { return self._s[2462]! } + public var Conversation_Pin: String { return self._s[2460]! } + public var InfoPlist_NSMicrophoneUsageDescription: String { return self._s[2461]! } + public var Stickers_RemoveFromFavorites: String { return self._s[2462]! } + public var Conversation_CancelForwardTitle: String { return self._s[2463]! } public func Notification_PinnedPollMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2463]!, self._r[2463]!, [_0]) + return formatWithArgumentRanges(self._s[2464]!, self._r[2464]!, [_0]) } - public var Appearance_AppIconFilled: String { return self._s[2464]! } - public var StickerPack_ErrorNotFound: String { return self._s[2465]! } + public var Appearance_AppIconFilled: String { return self._s[2465]! } + public var StickerPack_ErrorNotFound: String { return self._s[2466]! } public func Channel_AdminLog_MessageRestrictedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2466]!, self._r[2466]!, [_1]) + return formatWithArgumentRanges(self._s[2467]!, self._r[2467]!, [_1]) } - public var Passport_Identity_AddIdentityCard: String { return self._s[2467]! } + public var Passport_Identity_AddIdentityCard: String { return self._s[2468]! } public func PUSH_CHANNEL_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2469]!, self._r[2469]!, [_1]) + return formatWithArgumentRanges(self._s[2470]!, self._r[2470]!, [_1]) } - public var Call_Camera: String { return self._s[2470]! } - public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2471]! } - public var Group_Location_Info: String { return self._s[2472]! } - public var Watch_LastSeen_WithinAMonth: String { return self._s[2473]! } - public var UserInfo_NotificationsDefaultEnabled: String { return self._s[2474]! } + public var Call_Camera: String { return self._s[2471]! } + public var GroupInfo_InviteLink_RevokeAlert_Text: String { return self._s[2472]! } + public var Group_Location_Info: String { return self._s[2473]! } + public var Watch_LastSeen_WithinAMonth: String { return self._s[2474]! } + public var UserInfo_NotificationsDefaultEnabled: String { return self._s[2475]! } public func DialogList_PinLimitError(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2475]!, self._r[2475]!, [_0]) + return formatWithArgumentRanges(self._s[2476]!, self._r[2476]!, [_0]) } - public var Weekday_Yesterday: String { return self._s[2476]! } - public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[2477]! } - public var InviteLink_Create_UsersLimit: String { return self._s[2478]! } + public var Weekday_Yesterday: String { return self._s[2477]! } + public var TwoStepAuth_SetupPasswordEnterPasswordNew: String { return self._s[2478]! } + public var InviteLink_Create_UsersLimit: String { return self._s[2479]! } public func Notification_VoiceChatScheduledTodayChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2479]!, self._r[2479]!, [_0]) + return formatWithArgumentRanges(self._s[2480]!, self._r[2480]!, [_0]) } - public var ArchivedPacksAlert_Title: String { return self._s[2480]! } - public var PeerInfo_PaneMembers: String { return self._s[2481]! } - public var PhotoEditor_SelectCoverFrame: String { return self._s[2482]! } + public var ArchivedPacksAlert_Title: String { return self._s[2481]! } + public var PeerInfo_PaneMembers: String { return self._s[2482]! } + public var PhotoEditor_SelectCoverFrame: String { return self._s[2483]! } public func Location_ProximityAlertSetTextGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2483]!, self._r[2483]!, [_0]) + return formatWithArgumentRanges(self._s[2484]!, self._r[2484]!, [_0]) } - public var ContactInfo_PhoneLabelMain: String { return self._s[2484]! } + public var ContactInfo_PhoneLabelMain: String { return self._s[2485]! } public func Time_PreciseDate_m7(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2485]!, self._r[2485]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[2486]!, self._r[2486]!, [_1, _2, _3]) } - public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[2486]! } - public var Channel_DiscussionGroup: String { return self._s[2487]! } - public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[2488]! } - public var InviteLink_Create_TimeLimit: String { return self._s[2490]! } - public var Channel_EditAdmin_PermissionsHeader: String { return self._s[2491]! } - public var VoiceOver_MessageContextForward: String { return self._s[2492]! } - public var SocksProxySetup_TypeNone: String { return self._s[2493]! } - public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[2495]! } - public var ProfilePhoto_OpenInEditor: String { return self._s[2497]! } - public var WallpaperSearch_ColorPurple: String { return self._s[2498]! } - public var ChatListFolder_IncludeChatsTitle: String { return self._s[2499]! } - public var Group_Username_InvalidTooShort: String { return self._s[2500]! } - public var Location_ProximityNotification_DistanceM: String { return self._s[2501]! } - public var VoiceChat_EditTitleText: String { return self._s[2502]! } + public var TwoFactorSetup_EmailVerification_ChangeAction: String { return self._s[2487]! } + public var Channel_DiscussionGroup: String { return self._s[2488]! } + public var EditTheme_Edit_Preview_IncomingReplyName: String { return self._s[2489]! } + public var InviteLink_Create_TimeLimit: String { return self._s[2491]! } + public var Channel_EditAdmin_PermissionsHeader: String { return self._s[2492]! } + public var VoiceOver_MessageContextForward: String { return self._s[2493]! } + public var SocksProxySetup_TypeNone: String { return self._s[2494]! } + public var CreatePoll_MultipleChoiceQuizAlert: String { return self._s[2496]! } + public var ProfilePhoto_OpenInEditor: String { return self._s[2498]! } + public var WallpaperSearch_ColorPurple: String { return self._s[2499]! } + public var ChatListFolder_IncludeChatsTitle: String { return self._s[2500]! } + public var Group_Username_InvalidTooShort: String { return self._s[2501]! } + public var Location_ProximityNotification_DistanceM: String { return self._s[2502]! } + public var VoiceChat_EditTitleText: String { return self._s[2503]! } public func Login_EmailPhoneBody(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2503]!, self._r[2503]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[2504]!, self._r[2504]!, [_0, _1, _2]) } - public var Passport_Language_tk: String { return self._s[2504]! } - public var ConvertToSupergroup_Title: String { return self._s[2505]! } - public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[2506]! } - public var Cache_KeepMediaHelp: String { return self._s[2507]! } - public var Channel_Management_Title: String { return self._s[2508]! } + public var Passport_Language_tk: String { return self._s[2505]! } + public var ConvertToSupergroup_Title: String { return self._s[2506]! } + public var Channel_BanUser_PermissionEmbedLinks: String { return self._s[2507]! } + public var Cache_KeepMediaHelp: String { return self._s[2508]! } + public var Channel_Management_Title: String { return self._s[2509]! } public func PUSH_MESSAGE_PHOTO_SECRET(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2509]!, self._r[2509]!, [_1]) + return formatWithArgumentRanges(self._s[2510]!, self._r[2510]!, [_1]) } - public var Conversation_ForwardChats: String { return self._s[2510]! } - public var Passport_Language_bg: String { return self._s[2511]! } - public var SocksProxySetup_TypeSocks: String { return self._s[2512]! } - public var Permissions_PrivacyPolicy: String { return self._s[2513]! } - public var VoiceOver_Chat_YourMusic: String { return self._s[2514]! } - public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[2515]! } - public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2516]! } - public var Conversation_ContextMenuOpenChannel: String { return self._s[2517]! } - public var Report_AdditionalDetailsPlaceholder: String { return self._s[2518]! } - public var Activity_UploadingVideo: String { return self._s[2519]! } - public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[2521]! } - public var Widget_LongTapToEdit: String { return self._s[2522]! } - public var VoiceChat_InviteLink_Listener: String { return self._s[2524]! } - public var SocksProxySetup_Credentials: String { return self._s[2525]! } - public var Preview_SaveGif: String { return self._s[2526]! } - public var Cache_Photos: String { return self._s[2527]! } - public var Channel_AdminLogFilter_EventsCalls: String { return self._s[2528]! } - public var Conversation_ContextMenuCancelEditing: String { return self._s[2529]! } - public var Contacts_FailedToSendInvitesMessage: String { return self._s[2530]! } + public var Conversation_ForwardChats: String { return self._s[2511]! } + public var Passport_Language_bg: String { return self._s[2512]! } + public var SocksProxySetup_TypeSocks: String { return self._s[2513]! } + public var Permissions_PrivacyPolicy: String { return self._s[2514]! } + public var VoiceOver_Chat_YourMusic: String { return self._s[2515]! } + public var SettingsSearch_Synonyms_Notifications_ResetAllNotifications: String { return self._s[2516]! } + public var Conversation_EmptyGifPanelPlaceholder: String { return self._s[2517]! } + public var Conversation_ContextMenuOpenChannel: String { return self._s[2518]! } + public var Report_AdditionalDetailsPlaceholder: String { return self._s[2519]! } + public var Activity_UploadingVideo: String { return self._s[2520]! } + public var PrivacyPolicy_AgeVerificationAgree: String { return self._s[2522]! } + public var Widget_LongTapToEdit: String { return self._s[2523]! } + public var VoiceChat_InviteLink_Listener: String { return self._s[2525]! } + public var SocksProxySetup_Credentials: String { return self._s[2526]! } + public var Preview_SaveGif: String { return self._s[2527]! } + public var Cache_Photos: String { return self._s[2528]! } + public var Channel_AdminLogFilter_EventsCalls: String { return self._s[2529]! } + public var Conversation_ContextMenuCancelEditing: String { return self._s[2530]! } + public var Contacts_FailedToSendInvitesMessage: String { return self._s[2531]! } public func VoiceChat_RemoveAndBanPeerConfirmation(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2531]!, self._r[2531]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2532]!, self._r[2532]!, [_1, _2]) } - public var Passport_Language_lt: String { return self._s[2532]! } - public var Passport_DeleteDocument: String { return self._s[2534]! } - public var GroupInfo_SetGroupPhotoStop: String { return self._s[2535]! } + public var Passport_Language_lt: String { return self._s[2533]! } + public var Passport_DeleteDocument: String { return self._s[2535]! } + public var GroupInfo_SetGroupPhotoStop: String { return self._s[2536]! } public func Location_ProximityNotification_NotifyLong(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2536]!, self._r[2536]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2537]!, self._r[2537]!, [_1, _2]) } - public var AccessDenied_VideoMessageMicrophone: String { return self._s[2537]! } + public var AccessDenied_VideoMessageMicrophone: String { return self._s[2538]! } public func PeopleNearby_VisibleUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2538]!, self._r[2538]!, [_0]) + return formatWithArgumentRanges(self._s[2539]!, self._r[2539]!, [_0]) } - public var AccessDenied_VideoCallCamera: String { return self._s[2539]! } + public var AccessDenied_VideoCallCamera: String { return self._s[2540]! } public func Channel_AdminLog_MessageDeleted(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2540]!, self._r[2540]!, [_0]) + return formatWithArgumentRanges(self._s[2541]!, self._r[2541]!, [_0]) } - public var PhotoEditor_SharpenTool: String { return self._s[2541]! } + public var PhotoEditor_SharpenTool: String { return self._s[2542]! } public func PUSH_CHANNEL_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2542]!, self._r[2542]!, [_1]) + return formatWithArgumentRanges(self._s[2543]!, self._r[2543]!, [_1]) } - public var DialogList_Unpin: String { return self._s[2543]! } - public var Stickers_NoStickersFound: String { return self._s[2544]! } - public var UserInfo_AddContact: String { return self._s[2546]! } + public var DialogList_Unpin: String { return self._s[2544]! } + public var Stickers_NoStickersFound: String { return self._s[2545]! } + public var UserInfo_AddContact: String { return self._s[2547]! } public func AddContact_SharedContactExceptionInfo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2548]!, self._r[2548]!, [_0]) - } - public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2549]!, self._r[2549]!, [_0]) } - public var CallFeedback_VideoReasonDistorted: String { return self._s[2550]! } - public var Tour_Text2: String { return self._s[2551]! } + public func Notification_PinnedLocationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2550]!, self._r[2550]!, [_0]) + } + public var CallFeedback_VideoReasonDistorted: String { return self._s[2551]! } + public var Tour_Text2: String { return self._s[2552]! } public func Conversation_TitleCommentsFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2553]!, self._r[2553]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2554]!, self._r[2554]!, [_1, _2]) } - public var InviteLink_DeleteAllRevokedLinksAlert_Text: String { return self._s[2555]! } - public var Paint_Delete: String { return self._s[2556]! } + public var InviteLink_DeleteAllRevokedLinksAlert_Text: String { return self._s[2556]! } + public var Paint_Delete: String { return self._s[2557]! } public func Call_VoiceChatInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2557]!, self._r[2557]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2558]!, self._r[2558]!, [_1, _2]) } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2558]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsVibrate: String { return self._s[2559]! } public func PrivacySettings_LastSeenEverybodyMinus(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2560]!, self._r[2560]!, [_0]) + return formatWithArgumentRanges(self._s[2561]!, self._r[2561]!, [_0]) } - public var Privacy_Calls_NeverAllow_Title: String { return self._s[2561]! } - public var Notification_CallOutgoingShort: String { return self._s[2562]! } - public var Checkout_PasswordEntry_Title: String { return self._s[2563]! } - public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2564]! } - public var Notification_MessageLifetime1m: String { return self._s[2565]! } - public var BlockedUsers_AddNew: String { return self._s[2567]! } - public var FastTwoStepSetup_EmailSection: String { return self._s[2568]! } - public var Settings_SaveEditedPhotos: String { return self._s[2569]! } - public var GroupInfo_GroupNamePlaceholder: String { return self._s[2570]! } + public var Privacy_Calls_NeverAllow_Title: String { return self._s[2562]! } + public var Notification_CallOutgoingShort: String { return self._s[2563]! } + public var Checkout_PasswordEntry_Title: String { return self._s[2564]! } + public var Channel_AdminLogFilter_AdminsAll: String { return self._s[2565]! } + public var Notification_MessageLifetime1m: String { return self._s[2566]! } + public var BlockedUsers_AddNew: String { return self._s[2568]! } + public var FastTwoStepSetup_EmailSection: String { return self._s[2569]! } + public var Settings_SaveEditedPhotos: String { return self._s[2570]! } + public var GroupInfo_GroupNamePlaceholder: String { return self._s[2571]! } public func ImportStickerPack_Of(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2571]!, self._r[2571]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2572]!, self._r[2572]!, [_1, _2]) } - public var Channel_AboutItem: String { return self._s[2572]! } - public var GroupInfo_InviteLink_RevokeLink: String { return self._s[2573]! } - public var Privacy_Calls_P2PNever: String { return self._s[2575]! } - public var Passport_Language_uk: String { return self._s[2576]! } - public var NetworkUsageSettings_Wifi: String { return self._s[2577]! } - public var Conversation_Moderate_Report: String { return self._s[2578]! } - public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2579]! } - public var VoiceOver_Chat_SeenByRecipients: String { return self._s[2580]! } - public var Permissions_SiriText_v0: String { return self._s[2581]! } - public var Theme_Colors_Background: String { return self._s[2582]! } - public var Notification_CallMissed: String { return self._s[2583]! } - public var Stats_ZoomOut: String { return self._s[2584]! } - public var Profile_AddToExisting: String { return self._s[2585]! } - public var Passport_FieldAddressUploadHelp: String { return self._s[2588]! } - public var VoiceChat_RemovePeerRemove: String { return self._s[2589]! } - public var Undo_DeletedChannel: String { return self._s[2590]! } + public var Channel_AboutItem: String { return self._s[2573]! } + public var GroupInfo_InviteLink_RevokeLink: String { return self._s[2574]! } + public var Privacy_Calls_P2PNever: String { return self._s[2576]! } + public var Passport_Language_uk: String { return self._s[2577]! } + public var NetworkUsageSettings_Wifi: String { return self._s[2578]! } + public var Conversation_Moderate_Report: String { return self._s[2579]! } + public var Wallpaper_ResetWallpapersConfirmation: String { return self._s[2580]! } + public var VoiceOver_Chat_SeenByRecipients: String { return self._s[2581]! } + public var Permissions_SiriText_v0: String { return self._s[2582]! } + public var Theme_Colors_Background: String { return self._s[2583]! } + public var Notification_CallMissed: String { return self._s[2584]! } + public var Stats_ZoomOut: String { return self._s[2585]! } + public var Profile_AddToExisting: String { return self._s[2586]! } + public var Passport_FieldAddressUploadHelp: String { return self._s[2589]! } + public var VoiceChat_RemovePeerRemove: String { return self._s[2590]! } + public var Undo_DeletedChannel: String { return self._s[2591]! } public func Channel_AdminLog_MessagePinned(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2591]!, self._r[2591]!, [_0]) + return formatWithArgumentRanges(self._s[2592]!, self._r[2592]!, [_0]) } - public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2592]! } - public var Map_LiveLocationGroupDescription: String { return self._s[2593]! } - public var Passport_InfoFAQ_URL: String { return self._s[2594]! } - public var IntentsSettings_SuggestedChats: String { return self._s[2597]! } + public var Login_ResetAccountProtected_TimerTitle: String { return self._s[2593]! } + public var Map_LiveLocationGroupDescription: String { return self._s[2594]! } + public var Passport_InfoFAQ_URL: String { return self._s[2595]! } + public var IntentsSettings_SuggestedChats: String { return self._s[2598]! } public func PUSH_MESSAGE_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2598]!, self._r[2598]!, [_1]) + return formatWithArgumentRanges(self._s[2599]!, self._r[2599]!, [_1]) } - public var State_connecting: String { return self._s[2599]! } - public var Passport_Identity_Country: String { return self._s[2600]! } - public var Passport_PasswordDescription: String { return self._s[2601]! } - public var ChatList_PsaLabel_covid: String { return self._s[2602]! } + public var State_connecting: String { return self._s[2600]! } + public var Passport_Identity_Country: String { return self._s[2601]! } + public var Passport_PasswordDescription: String { return self._s[2602]! } + public var ChatList_PsaLabel_covid: String { return self._s[2603]! } public func PUSH_MESSAGE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2603]!, self._r[2603]!, [_1]) + return formatWithArgumentRanges(self._s[2604]!, self._r[2604]!, [_1]) } - public var Contacts_AddPeopleNearby: String { return self._s[2604]! } - public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[2605]! } - public var ClearCache_Description: String { return self._s[2606]! } - public var Localization_LanguageName: String { return self._s[2607]! } + public var Contacts_AddPeopleNearby: String { return self._s[2605]! } + public var OwnershipTransfer_SetupTwoStepAuth: String { return self._s[2606]! } + public var ClearCache_Description: String { return self._s[2607]! } + public var Localization_LanguageName: String { return self._s[2608]! } public func UserInfo_UnblockConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2608]!, self._r[2608]!, [_0]) + return formatWithArgumentRanges(self._s[2609]!, self._r[2609]!, [_0]) } - public var Conversation_AddMembers: String { return self._s[2609]! } - public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[2610]! } - public var UserInfo_CreateNewContact: String { return self._s[2611]! } - public var Channel_Stickers_NotFound: String { return self._s[2613]! } - public var Message_FakeAccount: String { return self._s[2614]! } - public var Watch_Message_Poll: String { return self._s[2615]! } - public var Group_Members_Title: String { return self._s[2616]! } - public var Privacy_Forwards_WhoCanForward: String { return self._s[2617]! } + public var Conversation_AddMembers: String { return self._s[2610]! } + public var ChatList_TabIconFoldersTooltipEmptyFolders: String { return self._s[2611]! } + public var UserInfo_CreateNewContact: String { return self._s[2612]! } + public var Channel_Stickers_NotFound: String { return self._s[2614]! } + public var Message_FakeAccount: String { return self._s[2615]! } + public var Watch_Message_Poll: String { return self._s[2616]! } + public var Group_Members_Title: String { return self._s[2617]! } + public var Privacy_Forwards_WhoCanForward: String { return self._s[2618]! } public func Notification_Kicked(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2618]!, self._r[2618]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2619]!, self._r[2619]!, [_0, _1]) } - public var VoiceChat_CancelConfirmationText: String { return self._s[2619]! } - public var BroadcastGroups_Convert: String { return self._s[2620]! } - public var Login_InfoDeletePhoto: String { return self._s[2621]! } - public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[2622]! } - public var InstantPage_FeedbackButton: String { return self._s[2623]! } - public var Appearance_PreviewReplyText: String { return self._s[2624]! } - public var Passport_FieldPhoneHelp: String { return self._s[2625]! } - public var Group_ErrorAddTooMuchBots: String { return self._s[2626]! } - public var Media_SendingOptionsTooltip: String { return self._s[2627]! } - public var ScheduledMessages_ScheduledOnline: String { return self._s[2628]! } - public var Notifications_Badge: String { return self._s[2629]! } - public var VoiceOver_Chat_VideoMessage: String { return self._s[2630]! } - public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2631]! } + public var VoiceChat_CancelConfirmationText: String { return self._s[2620]! } + public var BroadcastGroups_Convert: String { return self._s[2621]! } + public var Login_InfoDeletePhoto: String { return self._s[2622]! } + public var Appearance_ThemePreview_ChatList_6_Name: String { return self._s[2623]! } + public var InstantPage_FeedbackButton: String { return self._s[2624]! } + public var Appearance_PreviewReplyText: String { return self._s[2625]! } + public var Passport_FieldPhoneHelp: String { return self._s[2626]! } + public var Group_ErrorAddTooMuchBots: String { return self._s[2627]! } + public var Media_SendingOptionsTooltip: String { return self._s[2628]! } + public var ScheduledMessages_ScheduledOnline: String { return self._s[2629]! } + public var Notifications_Badge: String { return self._s[2630]! } + public var VoiceOver_Chat_VideoMessage: String { return self._s[2631]! } + public var TwoStepAuth_RecoveryCodeExpired: String { return self._s[2632]! } public func Notification_PinnedPhotoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2633]!, self._r[2633]!, [_0]) + return formatWithArgumentRanges(self._s[2634]!, self._r[2634]!, [_0]) } - public var Passport_InfoLearnMore: String { return self._s[2634]! } - public var EnterPasscode_EnterTitle: String { return self._s[2635]! } - public var Appearance_EditTheme: String { return self._s[2636]! } - public var EditTheme_Expand_BottomInfo: String { return self._s[2637]! } - public var Stats_FollowersTitle: String { return self._s[2638]! } - public var Passport_Identity_SurnamePlaceholder: String { return self._s[2639]! } - public var Channel_Subscribers_Title: String { return self._s[2640]! } - public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2641]! } - public var ChatImportActivity_ErrorGeneric: String { return self._s[2642]! } - public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[2643]! } - public var EditTheme_Create_Preview_IncomingText: String { return self._s[2644]! } - public var Conversation_AddToReadingList: String { return self._s[2645]! } - public var VoiceChat_EditBioPlaceholder: String { return self._s[2646]! } + public var Passport_InfoLearnMore: String { return self._s[2635]! } + public var EnterPasscode_EnterTitle: String { return self._s[2636]! } + public var Appearance_EditTheme: String { return self._s[2637]! } + public var EditTheme_Expand_BottomInfo: String { return self._s[2638]! } + public var Stats_FollowersTitle: String { return self._s[2639]! } + public var Passport_Identity_SurnamePlaceholder: String { return self._s[2640]! } + public var Channel_Subscribers_Title: String { return self._s[2641]! } + public var Group_ErrorSupergroupConversionNotPossible: String { return self._s[2642]! } + public var ChatImportActivity_ErrorGeneric: String { return self._s[2643]! } + public var EditTheme_ThemeTemplateAlertTitle: String { return self._s[2644]! } + public var EditTheme_Create_Preview_IncomingText: String { return self._s[2645]! } + public var Conversation_AddToReadingList: String { return self._s[2646]! } + public var VoiceChat_EditBioPlaceholder: String { return self._s[2647]! } public func Notifications_ExceptionsChangeSound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2647]!, self._r[2647]!, [_0]) + return formatWithArgumentRanges(self._s[2648]!, self._r[2648]!, [_0]) } - public var Group_AdminLog_EmptyText: String { return self._s[2648]! } - public var Passport_Identity_EditInternalPassport: String { return self._s[2649]! } - public var Watch_Location_Current: String { return self._s[2650]! } - public var Appearance_AppIconNew1: String { return self._s[2651]! } - public var PrivacyPolicy_Title: String { return self._s[2652]! } - public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2659]! } - public var Channel_TypeSetup_Title: String { return self._s[2663]! } - public var Appearance_PreviewReplyAuthor: String { return self._s[2664]! } - public var Passport_Language_ja: String { return self._s[2665]! } - public var ReportPeer_ReasonSpam: String { return self._s[2666]! } - public var Widget_GalleryDescription: String { return self._s[2667]! } - public var Privacy_PaymentsClearInfoHelp: String { return self._s[2668]! } - public var VoiceChat_ChangePhoto: String { return self._s[2670]! } - public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[2671]! } - public var Channel_AdminLog_ChangeInfo: String { return self._s[2672]! } - public var ChatListFolder_NameNonContacts: String { return self._s[2673]! } + public var Group_AdminLog_EmptyText: String { return self._s[2649]! } + public var Passport_Identity_EditInternalPassport: String { return self._s[2650]! } + public var Watch_Location_Current: String { return self._s[2651]! } + public var Appearance_AppIconNew1: String { return self._s[2652]! } + public var PrivacyPolicy_Title: String { return self._s[2653]! } + public var Privacy_GroupsAndChannels_CustomHelp: String { return self._s[2660]! } + public var Channel_TypeSetup_Title: String { return self._s[2664]! } + public var Appearance_PreviewReplyAuthor: String { return self._s[2665]! } + public var Passport_Language_ja: String { return self._s[2666]! } + public var ReportPeer_ReasonSpam: String { return self._s[2667]! } + public var Widget_GalleryDescription: String { return self._s[2668]! } + public var Privacy_PaymentsClearInfoHelp: String { return self._s[2669]! } + public var VoiceChat_ChangePhoto: String { return self._s[2671]! } + public var Conversation_EditingMessageMediaEditCurrentPhoto: String { return self._s[2672]! } + public var Channel_AdminLog_ChangeInfo: String { return self._s[2673]! } + public var ChatListFolder_NameNonContacts: String { return self._s[2674]! } public func InviteLink_ExpiresIn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2674]!, self._r[2674]!, [_0]) + return formatWithArgumentRanges(self._s[2675]!, self._r[2675]!, [_0]) } - public var Call_Audio: String { return self._s[2675]! } - public var PhotoEditor_CurvesGreen: String { return self._s[2676]! } - public var ChatList_Search_NoResultsFitlerFiles: String { return self._s[2677]! } - public var Settings_PrivacySettings: String { return self._s[2678]! } - public var InviteLink_UsageLimitReached: String { return self._s[2679]! } - public var Stats_Followers: String { return self._s[2680]! } - public var Notifications_AddExceptionTitle: String { return self._s[2681]! } - public var TwoFactorSetup_Password_Title: String { return self._s[2682]! } - public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2683]! } - public var OldChannels_NoticeText: String { return self._s[2684]! } - public var Conversation_SavedMessages: String { return self._s[2685]! } - public var Intents_ErrorLockedText: String { return self._s[2686]! } + public var Call_Audio: String { return self._s[2676]! } + public var PhotoEditor_CurvesGreen: String { return self._s[2677]! } + public var ChatList_Search_NoResultsFitlerFiles: String { return self._s[2678]! } + public var Settings_PrivacySettings: String { return self._s[2679]! } + public var InviteLink_UsageLimitReached: String { return self._s[2680]! } + public var Stats_Followers: String { return self._s[2681]! } + public var Notifications_AddExceptionTitle: String { return self._s[2682]! } + public var TwoFactorSetup_Password_Title: String { return self._s[2683]! } + public var ChannelMembers_WhoCanAddMembersAllHelp: String { return self._s[2684]! } + public var OldChannels_NoticeText: String { return self._s[2685]! } + public var Conversation_SavedMessages: String { return self._s[2686]! } + public var Intents_ErrorLockedText: String { return self._s[2687]! } public func Conversation_PeerNearbyTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2688]!, self._r[2688]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2689]!, self._r[2689]!, [_1, _2]) } - public var Passport_Address_TypeResidentialAddress: String { return self._s[2689]! } - public var Appearance_ThemeNightBlue: String { return self._s[2690]! } - public var Notification_ChannelInviterSelf: String { return self._s[2691]! } - public var Conversation_ForwardTooltip_SavedMessages_Many: String { return self._s[2692]! } - public var InviteLink_Create_TimeLimitExpiryDateNever: String { return self._s[2694]! } - public var Watch_UserInfo_Service: String { return self._s[2695]! } - public var ChatList_Context_Back: String { return self._s[2696]! } - public var Passport_Email_Title: String { return self._s[2697]! } - public var ImportStickerPack_AddToExistingStickerSet: String { return self._s[2698]! } - public var Stats_GroupTopAdmin_Promote: String { return self._s[2699]! } + public var Passport_Address_TypeResidentialAddress: String { return self._s[2690]! } + public var Appearance_ThemeNightBlue: String { return self._s[2691]! } + public var Notification_ChannelInviterSelf: String { return self._s[2692]! } + public var Conversation_ForwardTooltip_SavedMessages_Many: String { return self._s[2693]! } + public var InviteLink_Create_TimeLimitExpiryDateNever: String { return self._s[2695]! } + public var Watch_UserInfo_Service: String { return self._s[2696]! } + public var ChatList_Context_Back: String { return self._s[2697]! } + public var Passport_Email_Title: String { return self._s[2698]! } + public var ImportStickerPack_AddToExistingStickerSet: String { return self._s[2699]! } + public var Stats_GroupTopAdmin_Promote: String { return self._s[2700]! } public func PUSH_PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2700]!, self._r[2700]!, [_1]) + return formatWithArgumentRanges(self._s[2701]!, self._r[2701]!, [_1]) } - public var Conversation_UnsupportedMedia: String { return self._s[2701]! } - public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2702]! } - public var Privacy_TopPeersHelp: String { return self._s[2704]! } - public var Privacy_Forwards_AlwaysLink: String { return self._s[2705]! } - public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2706]! } - public var Permissions_NotificationsTitle_v0: String { return self._s[2707]! } + public var Conversation_UnsupportedMedia: String { return self._s[2702]! } + public var Passport_Address_OneOfTypePassportRegistration: String { return self._s[2703]! } + public var Privacy_TopPeersHelp: String { return self._s[2705]! } + public var Privacy_Forwards_AlwaysLink: String { return self._s[2706]! } + public var Notifications_Badge_CountUnreadMessages_InfoOn: String { return self._s[2707]! } + public var Permissions_NotificationsTitle_v0: String { return self._s[2708]! } public func Location_ProximityNotification_AlreadyClose(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2708]!, self._r[2708]!, [_0]) + return formatWithArgumentRanges(self._s[2709]!, self._r[2709]!, [_0]) } - public var Notification_PassportValueProofOfAddress: String { return self._s[2709]! } - public var Map_Map: String { return self._s[2710]! } - public var WallpaperSearch_ColorBlue: String { return self._s[2711]! } - public var Privacy_Calls_CustomShareHelp: String { return self._s[2712]! } - public var PhotoEditor_BlurToolRadial: String { return self._s[2713]! } - public var ChatList_Search_FilterMusic: String { return self._s[2714]! } - public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[2715]! } - public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2716]! } - public var Settings_LogoutConfirmationTitle: String { return self._s[2718]! } + public var Notification_PassportValueProofOfAddress: String { return self._s[2710]! } + public var Map_Map: String { return self._s[2711]! } + public var WallpaperSearch_ColorBlue: String { return self._s[2712]! } + public var Privacy_Calls_CustomShareHelp: String { return self._s[2713]! } + public var PhotoEditor_BlurToolRadial: String { return self._s[2714]! } + public var ChatList_Search_FilterMusic: String { return self._s[2715]! } + public var SettingsSearch_Synonyms_Data_AutoplayGifs: String { return self._s[2716]! } + public var Privacy_PaymentsClear_ShippingInfo: String { return self._s[2717]! } + public var Settings_LogoutConfirmationTitle: String { return self._s[2719]! } public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2719]!, self._r[2719]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2720]!, self._r[2720]!, [_1, _2]) } public func Notification_ChangedGroupPhoto(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2720]!, self._r[2720]!, [_0]) + return formatWithArgumentRanges(self._s[2721]!, self._r[2721]!, [_0]) } - public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2721]! } - public var Group_Username_CreatePublicLinkHelp: String { return self._s[2722]! } - public var VoiceOver_ChatList_MessageEmpty: String { return self._s[2724]! } - public var GroupInfo_Location: String { return self._s[2725]! } - public var Passport_Language_ka: String { return self._s[2726]! } + public var Channel_Username_RevokeExistingUsernamesInfo: String { return self._s[2722]! } + public var Group_Username_CreatePublicLinkHelp: String { return self._s[2723]! } + public var VoiceOver_ChatList_MessageEmpty: String { return self._s[2725]! } + public var GroupInfo_Location: String { return self._s[2726]! } + public var Passport_Language_ka: String { return self._s[2727]! } public func TwoStepAuth_SetupPendingEmail(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2727]!, self._r[2727]!, [_0]) + return formatWithArgumentRanges(self._s[2728]!, self._r[2728]!, [_0]) } - public var Conversation_ContextMenuOpenChannelProfile: String { return self._s[2728]! } - public var ChatImport_SelectionConfirmationAlertTitle: String { return self._s[2730]! } - public var ScheduledMessages_ClearAllConfirmation: String { return self._s[2732]! } - public var DialogList_SearchSectionRecent: String { return self._s[2733]! } - public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2734]! } - public var Conversation_Timer_Send: String { return self._s[2735]! } + public var Conversation_ContextMenuOpenChannelProfile: String { return self._s[2729]! } + public var ChatImport_SelectionConfirmationAlertTitle: String { return self._s[2731]! } + public var ScheduledMessages_ClearAllConfirmation: String { return self._s[2733]! } + public var DialogList_SearchSectionRecent: String { return self._s[2734]! } + public var Passport_Address_OneOfTypeTemporaryRegistration: String { return self._s[2735]! } + public var Conversation_Timer_Send: String { return self._s[2736]! } public func VoiceOver_ScrollStatus(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2737]!, self._r[2737]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2738]!, self._r[2738]!, [_1, _2]) } - public var ChatState_Updating: String { return self._s[2738]! } - public var ChannelMembers_WhoCanAddMembers: String { return self._s[2739]! } - public var ChannelInfo_DeleteGroup: String { return self._s[2740]! } - public var TwoStepAuth_RecoveryFailed: String { return self._s[2741]! } - public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2742]! } - public var InviteLink_Create_TimeLimitExpiryTime: String { return self._s[2743]! } - public var ChannelInfo_InviteLink_RevokeAlert_Text: String { return self._s[2744]! } - public var ChatList_Search_NoResults: String { return self._s[2745]! } - public var ChatListFolderSettings_AddRecommended: String { return self._s[2747]! } - public var ChangePhoneNumberCode_Called: String { return self._s[2748]! } - public var PeerInfo_GroupAboutItem: String { return self._s[2749]! } - public var VoiceOver_SelfDestructTimerOff: String { return self._s[2751]! } + public var ChatState_Updating: String { return self._s[2739]! } + public var ChannelMembers_WhoCanAddMembers: String { return self._s[2740]! } + public var ChannelInfo_DeleteGroup: String { return self._s[2741]! } + public var TwoStepAuth_RecoveryFailed: String { return self._s[2742]! } + public var Channel_OwnershipTransfer_EnterPassword: String { return self._s[2743]! } + public var InviteLink_Create_TimeLimitExpiryTime: String { return self._s[2744]! } + public var ChannelInfo_InviteLink_RevokeAlert_Text: String { return self._s[2745]! } + public var ChatList_Search_NoResults: String { return self._s[2746]! } + public var ChatListFolderSettings_AddRecommended: String { return self._s[2748]! } + public var ChangePhoneNumberCode_Called: String { return self._s[2749]! } + public var PeerInfo_GroupAboutItem: String { return self._s[2750]! } + public var VoiceOver_SelfDestructTimerOff: String { return self._s[2752]! } public func Channel_AdminLog_DeletedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2752]!, self._r[2752]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_1, _2]) } public func LiveLocationUpdated_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2753]!, self._r[2753]!, [_0]) + return formatWithArgumentRanges(self._s[2754]!, self._r[2754]!, [_0]) } - public var PrivacySettings_AuthSessions: String { return self._s[2754]! } - public var Passport_Address_Postcode: String { return self._s[2755]! } - public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2756]! } + public var PrivacySettings_AuthSessions: String { return self._s[2755]! } + public var Passport_Address_Postcode: String { return self._s[2756]! } + public var VoiceOver_Chat_YourVideoMessage: String { return self._s[2757]! } public func VoiceChat_ForwardTooltip_ManyChats(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2757]!, self._r[2757]!, [_0, _1]) + return formatWithArgumentRanges(self._s[2758]!, self._r[2758]!, [_0, _1]) } - public var Passport_Address_Street2Placeholder: String { return self._s[2758]! } - public var Group_Location_Title: String { return self._s[2759]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[2760]! } - public var PeopleNearby_UsersEmpty: String { return self._s[2761]! } - public var Conversation_ContextMenuSpeak: String { return self._s[2763]! } - public var SettingsSearch_Synonyms_Data_Title: String { return self._s[2764]! } + public var Passport_Address_Street2Placeholder: String { return self._s[2759]! } + public var Group_Location_Title: String { return self._s[2760]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadReset: String { return self._s[2761]! } + public var PeopleNearby_UsersEmpty: String { return self._s[2762]! } + public var Conversation_ContextMenuSpeak: String { return self._s[2764]! } + public var SettingsSearch_Synonyms_Data_Title: String { return self._s[2765]! } public func Checkout_PasswordEntry_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2766]!, self._r[2766]!, [_0]) + return formatWithArgumentRanges(self._s[2767]!, self._r[2767]!, [_0]) } - public var Proxy_TooltipUnavailable: String { return self._s[2767]! } - public var Map_Search: String { return self._s[2768]! } - public var VoiceChat_CancelConfirmationTitle: String { return self._s[2769]! } - public var AutoDownloadSettings_TypeContacts: String { return self._s[2770]! } - public var Conversation_SearchByName_Prefix: String { return self._s[2771]! } + public var Proxy_TooltipUnavailable: String { return self._s[2768]! } + public var Map_Search: String { return self._s[2769]! } + public var VoiceChat_CancelConfirmationTitle: String { return self._s[2770]! } + public var AutoDownloadSettings_TypeContacts: String { return self._s[2771]! } + public var Conversation_SearchByName_Prefix: String { return self._s[2772]! } public func Channel_AdminLog_MessageToggleSignaturesOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2772]!, self._r[2772]!, [_0]) + return formatWithArgumentRanges(self._s[2773]!, self._r[2773]!, [_0]) } - public var TwoStepAuth_EmailAddSuccess: String { return self._s[2773]! } - public var ProfilePhoto_MainPhoto: String { return self._s[2774]! } - public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2775]! } - public var SharedMedia_EmptyMusicText: String { return self._s[2776]! } - public var ChatSettings_AutoDownloadPhotos: String { return self._s[2777]! } - public var NetworkUsageSettings_BytesReceived: String { return self._s[2778]! } - public var Channel_AdminLog_EmptyText: String { return self._s[2779]! } - public var ImportStickerPack_InProgress: String { return self._s[2780]! } - public var Channel_BanUser_PermissionSendMessages: String { return self._s[2781]! } - public var Undo_ChatDeletedForBothSides: String { return self._s[2782]! } - public var Notifications_GroupNotifications: String { return self._s[2783]! } - public var AccessDenied_SaveMedia: String { return self._s[2784]! } - public var InviteLink_Create_Revoke: String { return self._s[2785]! } - public var GroupInfo_LabelOwner: String { return self._s[2786]! } - public var TwoFactorSetup_PasswordRecovery_Action: String { return self._s[2787]! } - public var Passport_Language_id: String { return self._s[2789]! } - public var ChatSettings_AutoDownloadTitle: String { return self._s[2790]! } - public var Conversation_UnpinMessageAlert: String { return self._s[2791]! } + public var TwoStepAuth_EmailAddSuccess: String { return self._s[2774]! } + public var ProfilePhoto_MainPhoto: String { return self._s[2775]! } + public var SettingsSearch_Synonyms_Notifications_InAppNotificationsSound: String { return self._s[2776]! } + public var SharedMedia_EmptyMusicText: String { return self._s[2777]! } + public var ChatSettings_AutoDownloadPhotos: String { return self._s[2778]! } + public var NetworkUsageSettings_BytesReceived: String { return self._s[2779]! } + public var Channel_AdminLog_EmptyText: String { return self._s[2780]! } + public var ImportStickerPack_InProgress: String { return self._s[2781]! } + public var Channel_BanUser_PermissionSendMessages: String { return self._s[2782]! } + public var Undo_ChatDeletedForBothSides: String { return self._s[2783]! } + public var Notifications_GroupNotifications: String { return self._s[2784]! } + public var AccessDenied_SaveMedia: String { return self._s[2785]! } + public var InviteLink_Create_Revoke: String { return self._s[2786]! } + public var GroupInfo_LabelOwner: String { return self._s[2787]! } + public var TwoFactorSetup_PasswordRecovery_Action: String { return self._s[2788]! } + public var Passport_Language_id: String { return self._s[2790]! } + public var ChatSettings_AutoDownloadTitle: String { return self._s[2791]! } + public var Conversation_UnpinMessageAlert: String { return self._s[2792]! } public func LiveLocationUpdated_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2792]!, self._r[2792]!, [_0]) - } - public func Call_RemoteVideoPaused(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2793]!, self._r[2793]!, [_0]) } - public var TwoFactorSetup_Done_Text: String { return self._s[2794]! } + public func Call_RemoteVideoPaused(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2794]!, self._r[2794]!, [_0]) + } + public var TwoFactorSetup_Done_Text: String { return self._s[2795]! } public func LastSeen_AtDate(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2795]!, self._r[2795]!, [_0]) + return formatWithArgumentRanges(self._s[2796]!, self._r[2796]!, [_0]) } - public var NetworkUsageSettings_BytesSent: String { return self._s[2796]! } - public var Conversation_AudioRateTooltipNormal: String { return self._s[2797]! } - public var VoiceChat_EditDescriptionSuccess: String { return self._s[2798]! } - public var OwnershipTransfer_Transfer: String { return self._s[2799]! } + public var NetworkUsageSettings_BytesSent: String { return self._s[2797]! } + public var Conversation_AudioRateTooltipNormal: String { return self._s[2798]! } + public var VoiceChat_EditDescriptionSuccess: String { return self._s[2799]! } + public var OwnershipTransfer_Transfer: String { return self._s[2800]! } public func Notification_Exceptions_Sound(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2800]!, self._r[2800]!, [_0]) + return formatWithArgumentRanges(self._s[2801]!, self._r[2801]!, [_0]) } - public var Passport_Language_pt: String { return self._s[2801]! } - public var PrivacySettings_WebSessions: String { return self._s[2802]! } - public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[2804]! } - public var TwoFactorSetup_Hint_Title: String { return self._s[2805]! } + public var Passport_Language_pt: String { return self._s[2802]! } + public var PrivacySettings_WebSessions: String { return self._s[2803]! } + public var PrivacyPolicy_DeclineDeleteNow: String { return self._s[2805]! } + public var TwoFactorSetup_Hint_Title: String { return self._s[2806]! } public func Notification_Joined(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2806]!, self._r[2806]!, [_0]) + return formatWithArgumentRanges(self._s[2807]!, self._r[2807]!, [_0]) } - public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2807]! } - public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2808]! } - public var AutoNightTheme_Scheduled: String { return self._s[2809]! } - public var CreatePoll_ExplanationHeader: String { return self._s[2810]! } - public var Calls_TabTitle: String { return self._s[2811]! } - public var VoiceChat_RecordingInProgress: String { return self._s[2812]! } - public var ChatList_UndoArchiveHiddenText: String { return self._s[2813]! } - public var Notification_VideoCallCanceled: String { return self._s[2814]! } - public var Login_CodeSentInternal: String { return self._s[2815]! } - public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[2816]! } - public var Call_RecordingDisabledMessage: String { return self._s[2818]! } + public var Group_Username_RemoveExistingUsernamesInfo: String { return self._s[2808]! } + public var PrivacyLastSeenSettings_CustomShareSettings_Delete: String { return self._s[2809]! } + public var AutoNightTheme_Scheduled: String { return self._s[2810]! } + public var CreatePoll_ExplanationHeader: String { return self._s[2811]! } + public var Calls_TabTitle: String { return self._s[2812]! } + public var VoiceChat_RecordingInProgress: String { return self._s[2813]! } + public var ChatList_UndoArchiveHiddenText: String { return self._s[2814]! } + public var Notification_VideoCallCanceled: String { return self._s[2815]! } + public var Login_CodeSentInternal: String { return self._s[2816]! } + public var SettingsSearch_Synonyms_Proxy_AddProxy: String { return self._s[2817]! } + public var Call_RecordingDisabledMessage: String { return self._s[2819]! } public func VoiceChat_RemovedPeerText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2819]!, self._r[2819]!, [_0]) + return formatWithArgumentRanges(self._s[2820]!, self._r[2820]!, [_0]) } - public var Conversation_UsersTooMuchError: String { return self._s[2821]! } - public var AutoDownloadSettings_TypeChannels: String { return self._s[2822]! } - public var VoiceChat_StopScreenSharingShort: String { return self._s[2823]! } - public var Channel_Info_Stickers: String { return self._s[2824]! } - public var Passport_DeleteAddressConfirmation: String { return self._s[2825]! } + public var Conversation_UsersTooMuchError: String { return self._s[2822]! } + public var AutoDownloadSettings_TypeChannels: String { return self._s[2823]! } + public var VoiceChat_StopScreenSharingShort: String { return self._s[2824]! } + public var Channel_Info_Stickers: String { return self._s[2825]! } + public var Passport_DeleteAddressConfirmation: String { return self._s[2826]! } public func Conversation_PeerNearbyDistance(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2826]!, self._r[2826]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2827]!, self._r[2827]!, [_1, _2]) } - public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[2827]! } + public var ChannelMembers_WhoCanAddMembers_Admins: String { return self._s[2828]! } public func Call_StatusOngoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2828]!, self._r[2828]!, [_0]) + return formatWithArgumentRanges(self._s[2829]!, self._r[2829]!, [_0]) } - public var Passport_DiscardMessageTitle: String { return self._s[2829]! } - public var Call_VoiceOver_VideoCallIncoming: String { return self._s[2830]! } - public var Localization_LanguageOther: String { return self._s[2831]! } - public var Conversation_EncryptionCanceled: String { return self._s[2832]! } - public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2833]! } - public var ReportPeer_ReasonFake: String { return self._s[2835]! } + public var Passport_DiscardMessageTitle: String { return self._s[2830]! } + public var Call_VoiceOver_VideoCallIncoming: String { return self._s[2831]! } + public var Localization_LanguageOther: String { return self._s[2832]! } + public var Conversation_EncryptionCanceled: String { return self._s[2833]! } + public var ChatSettings_AutomaticPhotoDownload: String { return self._s[2834]! } + public var ReportPeer_ReasonFake: String { return self._s[2836]! } public func Notification_SecretChatMessageScreenshot(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2836]!, self._r[2836]!, [_0]) + return formatWithArgumentRanges(self._s[2837]!, self._r[2837]!, [_0]) } - public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2838]! } - public var SocksProxySetup_SavedProxies: String { return self._s[2839]! } - public var InviteLink_Create_UsersLimitNumberOfUsers: String { return self._s[2840]! } + public var Target_InviteToGroupErrorAlreadyInvited: String { return self._s[2839]! } + public var SocksProxySetup_SavedProxies: String { return self._s[2840]! } + public var InviteLink_Create_UsersLimitNumberOfUsers: String { return self._s[2841]! } public func ApplyLanguage_ChangeLanguageAlreadyActive(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2841]!, self._r[2841]!, [_1]) + return formatWithArgumentRanges(self._s[2842]!, self._r[2842]!, [_1]) } - public var Conversation_ScamWarning: String { return self._s[2843]! } - public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[2844]! } - public var LocalGroup_Title: String { return self._s[2845]! } - public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[2847]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[2848]! } - public var VoiceChat_SelectAccount: String { return self._s[2849]! } - public var Login_PhoneFloodError: String { return self._s[2850]! } - public var Conversation_PinMessageAlert_PinAndNotifyMembers: String { return self._s[2851]! } - public var Username_InvalidTaken: String { return self._s[2853]! } - public var SocksProxySetup_AddProxy: String { return self._s[2855]! } - public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[2856]! } - public var MediaPicker_UngroupDescription: String { return self._s[2857]! } - public var Login_CodeExpired: String { return self._s[2858]! } - public var Localization_ChooseLanguage: String { return self._s[2859]! } - public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[2860]! } + public var Conversation_ScamWarning: String { return self._s[2844]! } + public var Channel_AdminLog_InfoPanelAlertTitle: String { return self._s[2845]! } + public var LocalGroup_Title: String { return self._s[2846]! } + public var SettingsSearch_Synonyms_Notifications_MessageNotificationsAlert: String { return self._s[2848]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndFaceId: String { return self._s[2849]! } + public var VoiceChat_SelectAccount: String { return self._s[2850]! } + public var Login_PhoneFloodError: String { return self._s[2851]! } + public var Conversation_PinMessageAlert_PinAndNotifyMembers: String { return self._s[2852]! } + public var Username_InvalidTaken: String { return self._s[2854]! } + public var SocksProxySetup_AddProxy: String { return self._s[2856]! } + public var PrivacyLastSeenSettings_WhoCanSeeMyTimestamp: String { return self._s[2857]! } + public var MediaPicker_UngroupDescription: String { return self._s[2858]! } + public var Login_CodeExpired: String { return self._s[2859]! } + public var Localization_ChooseLanguage: String { return self._s[2860]! } + public var Checkout_NewCard_PostcodePlaceholder: String { return self._s[2861]! } public func ChangePhone_ErrorOccupied(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2861]!, self._r[2861]!, [_0]) - } - public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[2862]!, self._r[2862]!, [_0]) } - public var ReportPeer_ReasonOther_Title: String { return self._s[2864]! } - public var Conversation_ScheduleMessage_Title: String { return self._s[2865]! } + public func Channel_DiscussionGroup_HeaderSet(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[2863]!, self._r[2863]!, [_0]) + } + public var ReportPeer_ReasonOther_Title: String { return self._s[2865]! } + public var Conversation_ScheduleMessage_Title: String { return self._s[2866]! } public func VoiceChat_UserInvited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2866]!, self._r[2866]!, [_0]) + return formatWithArgumentRanges(self._s[2867]!, self._r[2867]!, [_0]) } - public var PeerInfo_ButtonDiscuss: String { return self._s[2867]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[2868]! } - public var Call_StatusNoAnswer: String { return self._s[2869]! } - public var ScheduledMessages_DeleteMany: String { return self._s[2871]! } - public var Channel_DiscussionGroupInfo: String { return self._s[2872]! } - public var Conversation_UnarchiveDone: String { return self._s[2873]! } - public var LogoutOptions_AddAccountText: String { return self._s[2874]! } - public var Message_PinnedContactMessage: String { return self._s[2875]! } + public var PeerInfo_ButtonDiscuss: String { return self._s[2868]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedPublicGroups: String { return self._s[2869]! } + public var Call_StatusNoAnswer: String { return self._s[2870]! } + public var ScheduledMessages_DeleteMany: String { return self._s[2872]! } + public var Channel_DiscussionGroupInfo: String { return self._s[2873]! } + public var Conversation_UnarchiveDone: String { return self._s[2874]! } + public var LogoutOptions_AddAccountText: String { return self._s[2875]! } + public var Message_PinnedContactMessage: String { return self._s[2876]! } public func ChatList_DeleteAndLeaveGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2876]!, self._r[2876]!, [_0]) + return formatWithArgumentRanges(self._s[2877]!, self._r[2877]!, [_0]) } - public var VoiceChat_EditBioTitle: String { return self._s[2878]! } + public var VoiceChat_EditBioTitle: String { return self._s[2879]! } public func FileSize_GB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2879]!, self._r[2879]!, [_0]) + return formatWithArgumentRanges(self._s[2880]!, self._r[2880]!, [_0]) } - public var Stats_GroupLanguagesTitle: String { return self._s[2880]! } - public var Passport_FieldAddressHelp: String { return self._s[2881]! } + public var Stats_GroupLanguagesTitle: String { return self._s[2881]! } + public var Passport_FieldAddressHelp: String { return self._s[2882]! } public func Passport_FieldOneOf_Or(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2882]!, self._r[2882]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2883]!, self._r[2883]!, [_1, _2]) } - public var ChatSettings_OpenLinksIn: String { return self._s[2884]! } - public var TwoFactorSetup_Hint_SkipAction: String { return self._s[2885]! } - public var Message_Photo: String { return self._s[2886]! } - public var Media_LimitedAccessManage: String { return self._s[2888]! } - public var MediaPicker_AddCaption: String { return self._s[2889]! } - public var LogoutOptions_Title: String { return self._s[2890]! } + public var ChatSettings_OpenLinksIn: String { return self._s[2885]! } + public var TwoFactorSetup_Hint_SkipAction: String { return self._s[2886]! } + public var Message_Photo: String { return self._s[2887]! } + public var Media_LimitedAccessManage: String { return self._s[2889]! } + public var MediaPicker_AddCaption: String { return self._s[2890]! } + public var LogoutOptions_Title: String { return self._s[2891]! } public func PUSH_PINNED_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2891]!, self._r[2891]!, [_1]) + return formatWithArgumentRanges(self._s[2892]!, self._r[2892]!, [_1]) } - public var Conversation_StatusKickedFromGroup: String { return self._s[2892]! } - public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2893]! } - public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2894]! } - public var Channel_AdminLogFilter_Title: String { return self._s[2895]! } - public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[2896]! } - public var Compose_GroupTokenListPlaceholder: String { return self._s[2897]! } - public var Notifications_MessageNotificationsExceptions: String { return self._s[2898]! } - public var ChannelIntro_Title: String { return self._s[2899]! } - public var Stats_Message_Views: String { return self._s[2900]! } - public var Stickers_Install: String { return self._s[2901]! } + public var Conversation_StatusKickedFromGroup: String { return self._s[2893]! } + public var Channel_AdminLogFilter_AdminsTitle: String { return self._s[2894]! } + public var ChatList_DeleteSavedMessagesConfirmationTitle: String { return self._s[2895]! } + public var Channel_AdminLogFilter_Title: String { return self._s[2896]! } + public var Passport_Address_TypeRentalAgreementUploadScan: String { return self._s[2897]! } + public var Compose_GroupTokenListPlaceholder: String { return self._s[2898]! } + public var Notifications_MessageNotificationsExceptions: String { return self._s[2899]! } + public var ChannelIntro_Title: String { return self._s[2900]! } + public var Stats_Message_Views: String { return self._s[2901]! } + public var Stickers_Install: String { return self._s[2902]! } public func VoiceOver_Chat_FileFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2902]!, self._r[2902]!, [_0]) + return formatWithArgumentRanges(self._s[2903]!, self._r[2903]!, [_0]) } - public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[2903]! } - public var Conversation_SwipeToReplyHintTitle: String { return self._s[2905]! } - public var Settings_Username: String { return self._s[2908]! } - public var FastTwoStepSetup_Title: String { return self._s[2909]! } - public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2910]! } - public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[2911]! } - public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2913]! } - public var CallFeedback_ReasonEcho: String { return self._s[2914]! } + public var EditTheme_Create_Preview_IncomingReplyText: String { return self._s[2904]! } + public var Conversation_SwipeToReplyHintTitle: String { return self._s[2906]! } + public var Settings_Username: String { return self._s[2909]! } + public var FastTwoStepSetup_Title: String { return self._s[2910]! } + public var Notifications_Badge_CountUnreadMessages_InfoOff: String { return self._s[2911]! } + public var SettingsSearch_Synonyms_Privacy_Title: String { return self._s[2912]! } + public var Passport_Identity_IssueDatePlaceholder: String { return self._s[2914]! } + public var CallFeedback_ReasonEcho: String { return self._s[2915]! } public func Time_MonthOfYear_m1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2915]!, self._r[2915]!, [_0]) + return formatWithArgumentRanges(self._s[2916]!, self._r[2916]!, [_0]) } - public var Conversation_OpenBotLinkTitle: String { return self._s[2916]! } - public var SocksProxySetup_Title: String { return self._s[2917]! } - public var CallFeedback_Success: String { return self._s[2918]! } - public var WallpaperPreview_SwipeTopText: String { return self._s[2920]! } - public var InstantPage_AutoNightTheme: String { return self._s[2922]! } - public var Watch_Conversation_Reply: String { return self._s[2923]! } - public var VoiceChat_Share: String { return self._s[2925]! } - public var VoiceChat_AddPhoto: String { return self._s[2926]! } - public var Chat_PanelUnpinAllMessages: String { return self._s[2927]! } - public var WallpaperPreview_Pattern: String { return self._s[2928]! } - public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2929]! } + public var Conversation_OpenBotLinkTitle: String { return self._s[2917]! } + public var SocksProxySetup_Title: String { return self._s[2918]! } + public var CallFeedback_Success: String { return self._s[2919]! } + public var WallpaperPreview_SwipeTopText: String { return self._s[2921]! } + public var InstantPage_AutoNightTheme: String { return self._s[2923]! } + public var Watch_Conversation_Reply: String { return self._s[2924]! } + public var VoiceChat_Share: String { return self._s[2926]! } + public var VoiceChat_AddPhoto: String { return self._s[2927]! } + public var Chat_PanelUnpinAllMessages: String { return self._s[2928]! } + public var WallpaperPreview_Pattern: String { return self._s[2929]! } + public var CheckoutInfo_ReceiverInfoEmail: String { return self._s[2930]! } public func Conversation_DeleteMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2930]!, self._r[2930]!, [_0]) + return formatWithArgumentRanges(self._s[2931]!, self._r[2931]!, [_0]) } - public var AutoDownloadSettings_TypeGroupChats: String { return self._s[2931]! } - public var VoiceOver_Chat_GroupInfo: String { return self._s[2932]! } - public var DialogList_SavedMessagesTooltip: String { return self._s[2934]! } - public var Update_Title: String { return self._s[2935]! } - public var Conversation_ShareMyPhoneNumber: String { return self._s[2936]! } - public var WallpaperPreview_CropTopText: String { return self._s[2939]! } - public var Channel_EditMessageErrorGeneric: String { return self._s[2940]! } - public var AccessDenied_LocationAlwaysDenied: String { return self._s[2941]! } - public var ChatListFolder_DiscardCancel: String { return self._s[2942]! } - public var Message_PinnedPhotoMessage: String { return self._s[2943]! } - public var Appearance_ThemeDayClassic: String { return self._s[2944]! } - public var VoiceChat_ChangeName: String { return self._s[2945]! } - public var SocksProxySetup_ProxySocks5: String { return self._s[2947]! } - public var VoiceChat_DisplayAsInfo: String { return self._s[2949]! } - public var AccessDenied_Wallpapers: String { return self._s[2954]! } + public var AutoDownloadSettings_TypeGroupChats: String { return self._s[2932]! } + public var VoiceOver_Chat_GroupInfo: String { return self._s[2933]! } + public var DialogList_SavedMessagesTooltip: String { return self._s[2935]! } + public var Update_Title: String { return self._s[2936]! } + public var Conversation_ShareMyPhoneNumber: String { return self._s[2937]! } + public var WallpaperPreview_CropTopText: String { return self._s[2940]! } + public var Channel_EditMessageErrorGeneric: String { return self._s[2941]! } + public var AccessDenied_LocationAlwaysDenied: String { return self._s[2942]! } + public var ChatListFolder_DiscardCancel: String { return self._s[2943]! } + public var Message_PinnedPhotoMessage: String { return self._s[2944]! } + public var Appearance_ThemeDayClassic: String { return self._s[2945]! } + public var VoiceChat_ChangeName: String { return self._s[2946]! } + public var SocksProxySetup_ProxySocks5: String { return self._s[2948]! } + public var VoiceChat_DisplayAsInfo: String { return self._s[2950]! } + public var AccessDenied_Wallpapers: String { return self._s[2955]! } public func Channel_AdminLog_MessageChangedGroupAbout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2955]!, self._r[2955]!, [_0]) + return formatWithArgumentRanges(self._s[2956]!, self._r[2956]!, [_0]) } - public var Weekday_Sunday: String { return self._s[2956]! } - public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[2958]! } - public var PeopleNearby_MakeVisibleDescription: String { return self._s[2959]! } - public var AccessDenied_LocationDisabled: String { return self._s[2960]! } - public var Tour_Text3: String { return self._s[2961]! } - public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2962]! } + public var Weekday_Sunday: String { return self._s[2957]! } + public var SettingsSearch_Synonyms_Privacy_GroupsAndChannels: String { return self._s[2959]! } + public var PeopleNearby_MakeVisibleDescription: String { return self._s[2960]! } + public var AccessDenied_LocationDisabled: String { return self._s[2961]! } + public var Tour_Text3: String { return self._s[2962]! } + public var AuthSessions_AddDevice_ScanTitle: String { return self._s[2963]! } public func Time_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2963]!, self._r[2963]!, [_0]) + return formatWithArgumentRanges(self._s[2964]!, self._r[2964]!, [_0]) } - public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2964]! } - public var Conversation_ClearCache: String { return self._s[2965]! } - public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[2966]! } - public var ChatList_Tabs_AllChats: String { return self._s[2967]! } - public var DialogList_RecentTitlePeople: String { return self._s[2968]! } - public var Stickers_AddToFavorites: String { return self._s[2969]! } - public var ChatList_Context_RemoveFromFolder: String { return self._s[2970]! } - public var VoiceChat_CancelSpeakRequest: String { return self._s[2971]! } - public var Settings_RemoveVideo: String { return self._s[2972]! } - public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2973]! } - public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[2974]! } - public var VoiceOver_Chat_YourFile: String { return self._s[2975]! } - public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[2977]! } - public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[2978]! } - public var VoiceChat_TapToAddBio: String { return self._s[2979]! } - public var Channel_AdminLog_AddMembers: String { return self._s[2980]! } - public var Map_SendThisLocation: String { return self._s[2982]! } - public var TwoStepAuth_EmailSkipAlert: String { return self._s[2984]! } - public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2985]! } - public var CloudStorage_Title: String { return self._s[2986]! } - public var TwoFactorSetup_Password_Action: String { return self._s[2987]! } - public var TwoStepAuth_ConfirmationText: String { return self._s[2988]! } - public var Passport_Address_EditTemporaryRegistration: String { return self._s[2990]! } - public var Undo_LeftGroup: String { return self._s[2991]! } - public var Conversation_StopLiveLocation: String { return self._s[2992]! } - public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[2993]! } - public var Message_PinnedInvoice: String { return self._s[2994]! } - public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2995]! } + public var Privacy_SecretChatsLinkPreviewsHelp: String { return self._s[2965]! } + public var Conversation_ClearCache: String { return self._s[2966]! } + public var StickerPacksSettings_ArchivedMasks_Info: String { return self._s[2967]! } + public var ChatList_Tabs_AllChats: String { return self._s[2968]! } + public var DialogList_RecentTitlePeople: String { return self._s[2969]! } + public var Stickers_AddToFavorites: String { return self._s[2970]! } + public var ChatList_Context_RemoveFromFolder: String { return self._s[2971]! } + public var VoiceChat_CancelSpeakRequest: String { return self._s[2972]! } + public var Settings_RemoveVideo: String { return self._s[2973]! } + public var PhotoEditor_CropAspectRatioSquare: String { return self._s[2974]! } + public var ConversationProfile_LeaveDeleteAndExit: String { return self._s[2975]! } + public var VoiceOver_Chat_YourFile: String { return self._s[2976]! } + public var SettingsSearch_Synonyms_Privacy_Forwards: String { return self._s[2978]! } + public var Group_OwnershipTransfer_ErrorPrivacyRestricted: String { return self._s[2979]! } + public var VoiceChat_TapToAddBio: String { return self._s[2980]! } + public var Channel_AdminLog_AddMembers: String { return self._s[2981]! } + public var Map_SendThisLocation: String { return self._s[2983]! } + public var TwoStepAuth_EmailSkipAlert: String { return self._s[2985]! } + public var IntentsSettings_SuggestedChatsPrivateChats: String { return self._s[2986]! } + public var CloudStorage_Title: String { return self._s[2987]! } + public var TwoFactorSetup_Password_Action: String { return self._s[2988]! } + public var TwoStepAuth_ConfirmationText: String { return self._s[2989]! } + public var Passport_Address_EditTemporaryRegistration: String { return self._s[2991]! } + public var Undo_LeftGroup: String { return self._s[2992]! } + public var Conversation_StopLiveLocation: String { return self._s[2993]! } + public var NotificationSettings_ShowNotificationsFromAccountsSection: String { return self._s[2994]! } + public var Message_PinnedInvoice: String { return self._s[2995]! } + public var ApplyLanguage_LanguageNotSupportedError: String { return self._s[2996]! } public func PUSH_CHAT_MESSAGE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2997]!, self._r[2997]!, [_1, _2]) + return formatWithArgumentRanges(self._s[2998]!, self._r[2998]!, [_1, _2]) } public func Notification_PinnedAudioMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[2998]!, self._r[2998]!, [_0]) + return formatWithArgumentRanges(self._s[2999]!, self._r[2999]!, [_0]) } - public var TwoStepAuth_RecoveryUnavailableResetTitle: String { return self._s[2999]! } - public var Weekday_Tuesday: String { return self._s[3000]! } - public var ChangePhoneNumberCode_Code: String { return self._s[3001]! } - public var VoiceOver_Chat_YourMessage: String { return self._s[3002]! } - public var Calls_CallTabDescription: String { return self._s[3003]! } - public var ChatImport_SelectionErrorNotAdmin: String { return self._s[3004]! } - public var SocksProxySetup_UseProxy: String { return self._s[3006]! } - public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3007]! } - public var PasscodeSettings_AlphanumericCode: String { return self._s[3008]! } - public var VoiceOver_Chat_YourVideo: String { return self._s[3009]! } - public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[3011]! } - public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[3012]! } - public var Exceptions_AddToExceptions: String { return self._s[3013]! } - public var UserInfo_Title: String { return self._s[3014]! } - public var Passport_DeleteDocumentConfirmation: String { return self._s[3016]! } - public var VoiceChat_EditDescription: String { return self._s[3018]! } - public var ChatList_Unmute: String { return self._s[3019]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[3020]! } + public var TwoStepAuth_RecoveryUnavailableResetTitle: String { return self._s[3000]! } + public var Weekday_Tuesday: String { return self._s[3001]! } + public var ChangePhoneNumberCode_Code: String { return self._s[3002]! } + public var VoiceOver_Chat_YourMessage: String { return self._s[3003]! } + public var Calls_CallTabDescription: String { return self._s[3004]! } + public var ChatImport_SelectionErrorNotAdmin: String { return self._s[3005]! } + public var SocksProxySetup_UseProxy: String { return self._s[3007]! } + public var SettingsSearch_Synonyms_Stickers_Title: String { return self._s[3008]! } + public var PasscodeSettings_AlphanumericCode: String { return self._s[3009]! } + public var VoiceOver_Chat_YourVideo: String { return self._s[3010]! } + public var ChannelMembers_WhoCanAddMembersAdminsHelp: String { return self._s[3012]! } + public var SettingsSearch_Synonyms_Privacy_DeleteAccountIfAwayFor: String { return self._s[3013]! } + public var Exceptions_AddToExceptions: String { return self._s[3014]! } + public var UserInfo_Title: String { return self._s[3015]! } + public var Passport_DeleteDocumentConfirmation: String { return self._s[3017]! } + public var VoiceChat_EditDescription: String { return self._s[3019]! } + public var ChatList_Unmute: String { return self._s[3020]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsSync: String { return self._s[3021]! } public func Channel_AdminLog_MessageChangedAutoremoveTimeoutSet(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3021]!, self._r[3021]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3022]!, self._r[3022]!, [_1, _2]) } - public var Stats_GroupTopPostersTitle: String { return self._s[3022]! } - public var Username_CheckingUsername: String { return self._s[3024]! } - public var WallpaperColors_SetCustomColor: String { return self._s[3025]! } - public var PeerSelection_ImportIntoNewGroup: String { return self._s[3029]! } - public var Location_ProximityAlertSetTitle: String { return self._s[3030]! } - public var AuthSessions_AddedDeviceTerminate: String { return self._s[3031]! } - public var Conversation_JoinVoiceChatAsSpeaker: String { return self._s[3032]! } - public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[3033]! } - public var Settings_ChangePhoneNumber: String { return self._s[3034]! } - public var PeerInfo_PaneLinks: String { return self._s[3035]! } - public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3038]! } - public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[3040]! } + public var Stats_GroupTopPostersTitle: String { return self._s[3023]! } + public var Username_CheckingUsername: String { return self._s[3025]! } + public var WallpaperColors_SetCustomColor: String { return self._s[3026]! } + public var PeerSelection_ImportIntoNewGroup: String { return self._s[3030]! } + public var Location_ProximityAlertSetTitle: String { return self._s[3031]! } + public var AuthSessions_AddedDeviceTerminate: String { return self._s[3032]! } + public var Conversation_JoinVoiceChatAsSpeaker: String { return self._s[3033]! } + public var Privacy_ProfilePhoto_CustomHelp: String { return self._s[3034]! } + public var Settings_ChangePhoneNumber: String { return self._s[3035]! } + public var PeerInfo_PaneLinks: String { return self._s[3036]! } + public var Appearance_ThemePreview_ChatList_1_Text: String { return self._s[3039]! } + public var Channel_EditAdmin_PermissionInviteSubscribers: String { return self._s[3041]! } public func PUSH_CHAT_VOICECHAT_INVITE_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3041]!, self._r[3041]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3042]!, self._r[3042]!, [_1, _2]) } - public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3042]! } - public var VoiceOver_Media_PlaybackPause: String { return self._s[3043]! } - public var VoiceChat_CancelConfirmationEnd: String { return self._s[3044]! } - public var BroadcastGroups_ConfirmationAlert_Title: String { return self._s[3045]! } - public var Stats_FollowersBySourceTitle: String { return self._s[3047]! } + public var LogoutOptions_ChangePhoneNumberText: String { return self._s[3043]! } + public var VoiceOver_Media_PlaybackPause: String { return self._s[3044]! } + public var VoiceChat_CancelConfirmationEnd: String { return self._s[3045]! } + public var BroadcastGroups_ConfirmationAlert_Title: String { return self._s[3046]! } + public var Stats_FollowersBySourceTitle: String { return self._s[3048]! } public func Conversation_ScheduleMessage_SendOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3048]!, self._r[3048]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3049]!, self._r[3049]!, [_0, _1]) } - public var Compose_NewEncryptedChatTitle: String { return self._s[3049]! } - public var Channel_CommentsGroup_Header: String { return self._s[3051]! } + public var Compose_NewEncryptedChatTitle: String { return self._s[3050]! } + public var Channel_CommentsGroup_Header: String { return self._s[3052]! } public func ShareFileTip_Text(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3055]!, self._r[3055]!, [_0]) + return formatWithArgumentRanges(self._s[3056]!, self._r[3056]!, [_0]) } public func PUSH_MESSAGE_AUDIO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3056]!, self._r[3056]!, [_1]) + return formatWithArgumentRanges(self._s[3057]!, self._r[3057]!, [_1]) } - public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3058]! } + public var Group_Setup_BasicHistoryHiddenHelp: String { return self._s[3059]! } public func TwoStepAuth_RecoveryEmailUnavailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3059]!, self._r[3059]!, [_0]) + return formatWithArgumentRanges(self._s[3060]!, self._r[3060]!, [_0]) } - public var Conversation_ReportMessages: String { return self._s[3060]! } - public var Conversation_OpenBotLinkOpen: String { return self._s[3061]! } - public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3062]! } - public var PrivacySettings_LastSeen: String { return self._s[3064]! } - public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[3065]! } - public var Theme_Colors_Proceed: String { return self._s[3066]! } - public var UserInfo_ScamBotWarning: String { return self._s[3067]! } - public var LogoutOptions_LogOut: String { return self._s[3069]! } - public var Conversation_SendMessage: String { return self._s[3070]! } - public var Conversation_CancelForwardCancelForward: String { return self._s[3071]! } - public var VoiceChat_Scheduled: String { return self._s[3073]! } - public var Passport_Address_Region: String { return self._s[3074]! } - public var MediaPicker_CameraRoll: String { return self._s[3076]! } + public var Conversation_ReportMessages: String { return self._s[3061]! } + public var Conversation_OpenBotLinkOpen: String { return self._s[3062]! } + public var VoiceOver_Chat_RecordModeVoiceMessage: String { return self._s[3063]! } + public var PrivacySettings_LastSeen: String { return self._s[3065]! } + public var SettingsSearch_Synonyms_Privacy_Passcode: String { return self._s[3066]! } + public var Theme_Colors_Proceed: String { return self._s[3067]! } + public var UserInfo_ScamBotWarning: String { return self._s[3068]! } + public var LogoutOptions_LogOut: String { return self._s[3070]! } + public var Conversation_SendMessage: String { return self._s[3071]! } + public var Conversation_CancelForwardCancelForward: String { return self._s[3072]! } + public var VoiceChat_Scheduled: String { return self._s[3074]! } + public var Passport_Address_Region: String { return self._s[3075]! } + public var MediaPicker_CameraRoll: String { return self._s[3077]! } public func VoiceOver_Chat_ForwardedFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3078]!, self._r[3078]!, [_0]) + return formatWithArgumentRanges(self._s[3079]!, self._r[3079]!, [_0]) } - public var Call_ReportSend: String { return self._s[3080]! } - public var VoiceOver_ChatList_Message: String { return self._s[3081]! } - public var Month_ShortJune: String { return self._s[3082]! } - public var AutoDownloadSettings_GroupChats: String { return self._s[3083]! } + public var Call_ReportSend: String { return self._s[3081]! } + public var VoiceOver_ChatList_Message: String { return self._s[3082]! } + public var Month_ShortJune: String { return self._s[3083]! } + public var AutoDownloadSettings_GroupChats: String { return self._s[3084]! } public func Channel_AdminLog_CaptionEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3086]!, self._r[3086]!, [_0]) + return formatWithArgumentRanges(self._s[3087]!, self._r[3087]!, [_0]) } - public var TwoStepAuth_DisableSuccess: String { return self._s[3087]! } - public var Cache_KeepMedia: String { return self._s[3088]! } + public var TwoStepAuth_DisableSuccess: String { return self._s[3088]! } + public var Cache_KeepMedia: String { return self._s[3089]! } public func Date_ChatDateHeaderYear(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3089]!, self._r[3089]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3090]!, self._r[3090]!, [_1, _2, _3]) } - public var Appearance_LargeEmoji: String { return self._s[3090]! } + public var Appearance_LargeEmoji: String { return self._s[3091]! } public func Notification_NewAuthDetected(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3091]!, self._r[3091]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[3092]!, self._r[3092]!, [_1, _2, _3, _4, _5, _6]) } - public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[3092]! } - public var Privacy_PaymentsClear_PaymentInfoCleared: String { return self._s[3093]! } - public var Call_CameraConfirmationText: String { return self._s[3094]! } + public var Chat_AttachmentMultipleForwardDisabled: String { return self._s[3093]! } + public var Privacy_PaymentsClear_PaymentInfoCleared: String { return self._s[3094]! } + public var Call_CameraConfirmationText: String { return self._s[3095]! } public func AuthSessions_AppUnofficial(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3096]!, self._r[3096]!, [_0]) + return formatWithArgumentRanges(self._s[3097]!, self._r[3097]!, [_0]) } - public var DialogList_SearchSectionChats: String { return self._s[3097]! } - public var VoiceOver_MessageContextReport: String { return self._s[3099]! } - public var VoiceChat_RemovePeer: String { return self._s[3100]! } - public var ChatListFolder_ExcludeChatsTitle: String { return self._s[3101]! } - public var InviteLink_ContextCopy: String { return self._s[3102]! } - public var NotificationsSound_Tritone: String { return self._s[3104]! } - public var VoiceChat_YouAreSharingScreen: String { return self._s[3106]! } - public var Notifications_InAppNotificationsPreview: String { return self._s[3108]! } - public var Stats_GroupTopAdmin_Actions: String { return self._s[3109]! } - public var TwoFactorSetup_PasswordRecovery_SkipAlertText: String { return self._s[3110]! } - public var TwoStepAuth_ResetAction: String { return self._s[3111]! } - public var PeerInfo_AddToContacts: String { return self._s[3112]! } - public var VoiceChat_OpenChat: String { return self._s[3113]! } - public var AccessDenied_Title: String { return self._s[3114]! } - public var InviteLink_QRCode_InfoChannel: String { return self._s[3115]! } - public var Tour_Title1: String { return self._s[3116]! } - public var VoiceOver_AttachMedia: String { return self._s[3117]! } + public var DialogList_SearchSectionChats: String { return self._s[3098]! } + public var VoiceOver_MessageContextReport: String { return self._s[3100]! } + public var VoiceChat_RemovePeer: String { return self._s[3101]! } + public var ChatListFolder_ExcludeChatsTitle: String { return self._s[3102]! } + public var InviteLink_ContextCopy: String { return self._s[3103]! } + public var NotificationsSound_Tritone: String { return self._s[3105]! } + public var VoiceChat_YouAreSharingScreen: String { return self._s[3107]! } + public var Notifications_InAppNotificationsPreview: String { return self._s[3109]! } + public var Stats_GroupTopAdmin_Actions: String { return self._s[3110]! } + public var TwoFactorSetup_PasswordRecovery_SkipAlertText: String { return self._s[3111]! } + public var TwoStepAuth_ResetAction: String { return self._s[3112]! } + public var PeerInfo_AddToContacts: String { return self._s[3113]! } + public var VoiceChat_OpenChat: String { return self._s[3114]! } + public var AccessDenied_Title: String { return self._s[3115]! } + public var InviteLink_QRCode_InfoChannel: String { return self._s[3116]! } + public var Tour_Title1: String { return self._s[3117]! } + public var VoiceOver_AttachMedia: String { return self._s[3118]! } public func SharedMedia_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3119]!, self._r[3119]!, [_0]) + return formatWithArgumentRanges(self._s[3120]!, self._r[3120]!, [_0]) } - public var Chat_Gifs_SavedSectionHeader: String { return self._s[3120]! } - public var Privacy_DeleteDrafts_DraftsDeleted: String { return self._s[3121]! } - public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[3122]! } + public var Chat_Gifs_SavedSectionHeader: String { return self._s[3121]! } + public var Privacy_DeleteDrafts_DraftsDeleted: String { return self._s[3122]! } + public var LogoutOptions_ChangePhoneNumberTitle: String { return self._s[3123]! } public func Passport_Scans_ScanIndex(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3123]!, self._r[3123]!, [_0]) + return formatWithArgumentRanges(self._s[3124]!, self._r[3124]!, [_0]) } - public var Channel_AdminLog_MessagePreviousLink: String { return self._s[3124]! } - public var OldChannels_Title: String { return self._s[3125]! } - public var LoginPassword_FloodError: String { return self._s[3126]! } - public var ChatImportActivity_InProgress: String { return self._s[3128]! } - public var Checkout_ErrorPaymentFailed: String { return self._s[3129]! } + public var Channel_AdminLog_MessagePreviousLink: String { return self._s[3125]! } + public var OldChannels_Title: String { return self._s[3126]! } + public var LoginPassword_FloodError: String { return self._s[3127]! } + public var ChatImportActivity_InProgress: String { return self._s[3129]! } + public var Checkout_ErrorPaymentFailed: String { return self._s[3130]! } public func Time_MonthOfYear_m7(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3130]!, self._r[3130]!, [_0]) + return formatWithArgumentRanges(self._s[3131]!, self._r[3131]!, [_0]) } - public var VoiceOver_Media_PlaybackPlay: String { return self._s[3133]! } - public var Passport_CorrectErrors: String { return self._s[3135]! } + public var VoiceOver_Media_PlaybackPlay: String { return self._s[3134]! } + public var Passport_CorrectErrors: String { return self._s[3136]! } public func PUSH_CHAT_PHOTO_EDITED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3136]!, self._r[3136]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3137]!, self._r[3137]!, [_1, _2]) } - public var ChatListFolderSettings_Title: String { return self._s[3137]! } + public var ChatListFolderSettings_Title: String { return self._s[3138]! } public func AutoDownloadSettings_UpToFor(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3138]!, self._r[3138]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3139]!, self._r[3139]!, [_1, _2]) } - public var PhotoEditor_HighlightsTool: String { return self._s[3139]! } - public var Contacts_NotRegisteredSection: String { return self._s[3142]! } + public var PhotoEditor_HighlightsTool: String { return self._s[3140]! } + public var Contacts_NotRegisteredSection: String { return self._s[3143]! } public func Call_VoiceChatInProgressCallMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3143]!, self._r[3143]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3144]!, self._r[3144]!, [_1, _2]) } public func PUSH_PINNED_DOC(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3144]!, self._r[3144]!, [_1]) + return formatWithArgumentRanges(self._s[3145]!, self._r[3145]!, [_1]) } - public var InviteLink_Create_UsersLimitInfo: String { return self._s[3145]! } - public var User_DeletedAccount: String { return self._s[3146]! } - public var Conversation_ViewContactDetails: String { return self._s[3147]! } - public var Conversation_Dice_u1F3B3: String { return self._s[3148]! } - public var WebSearch_GIFs: String { return self._s[3149]! } - public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[3150]! } - public var Appearance_PreviewOutgoingText: String { return self._s[3151]! } - public var Calls_CallTabTitle: String { return self._s[3152]! } - public var Call_VoiceChatInProgressTitle: String { return self._s[3153]! } - public var Checkout_OptionalTipItem: String { return self._s[3154]! } + public var InviteLink_Create_UsersLimitInfo: String { return self._s[3146]! } + public var User_DeletedAccount: String { return self._s[3147]! } + public var Conversation_ViewContactDetails: String { return self._s[3148]! } + public var Conversation_Dice_u1F3B3: String { return self._s[3149]! } + public var WebSearch_GIFs: String { return self._s[3150]! } + public var ChatList_DeleteSavedMessagesConfirmationAction: String { return self._s[3151]! } + public var Appearance_PreviewOutgoingText: String { return self._s[3152]! } + public var Calls_CallTabTitle: String { return self._s[3153]! } + public var Call_VoiceChatInProgressTitle: String { return self._s[3154]! } + public var Checkout_OptionalTipItem: String { return self._s[3155]! } public func LastSeen_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3155]!, self._r[3155]!, [_0]) + return formatWithArgumentRanges(self._s[3156]!, self._r[3156]!, [_0]) } - public var Channel_Status: String { return self._s[3156]! } - public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[3158]! } - public var VoiceOver_Chat_OptionSelected: String { return self._s[3159]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3160]! } + public var Channel_Status: String { return self._s[3157]! } + public var Conversation_SendMessageErrorGroupRestricted: String { return self._s[3159]! } + public var VoiceOver_Chat_OptionSelected: String { return self._s[3160]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsAlert: String { return self._s[3161]! } public func ClearCache_Success(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3161]!, self._r[3161]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3162]!, self._r[3162]!, [_0, _1]) } - public var Passport_Identity_ExpiryDateNone: String { return self._s[3163]! } - public var Your_cards_expiration_month_is_invalid: String { return self._s[3165]! } - public var Month_ShortDecember: String { return self._s[3166]! } - public var Username_Help: String { return self._s[3167]! } - public var Login_InfoAvatarAdd: String { return self._s[3168]! } - public var Month_ShortMay: String { return self._s[3169]! } - public var DialogList_UnknownPinLimitError: String { return self._s[3170]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[3171]! } - public var TwoStepAuth_EnabledSuccess: String { return self._s[3172]! } - public var VoiceChat_StopScreenSharing: String { return self._s[3173]! } - public var VoiceChat_AskedToSpeak: String { return self._s[3174]! } - public var Weekday_ShortSunday: String { return self._s[3175]! } - public var Channel_Username_InvalidTooShort: String { return self._s[3176]! } - public var AuthSessions_TerminateSession: String { return self._s[3177]! } - public var Passport_Identity_FilesTitle: String { return self._s[3178]! } + public var Passport_Identity_ExpiryDateNone: String { return self._s[3164]! } + public var Your_cards_expiration_month_is_invalid: String { return self._s[3166]! } + public var Month_ShortDecember: String { return self._s[3167]! } + public var Username_Help: String { return self._s[3168]! } + public var Login_InfoAvatarAdd: String { return self._s[3169]! } + public var Month_ShortMay: String { return self._s[3170]! } + public var DialogList_UnknownPinLimitError: String { return self._s[3171]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5hours: String { return self._s[3172]! } + public var TwoStepAuth_EnabledSuccess: String { return self._s[3173]! } + public var VoiceChat_StopScreenSharing: String { return self._s[3174]! } + public var VoiceChat_AskedToSpeak: String { return self._s[3175]! } + public var Weekday_ShortSunday: String { return self._s[3176]! } + public var Channel_Username_InvalidTooShort: String { return self._s[3177]! } + public var AuthSessions_TerminateSession: String { return self._s[3178]! } + public var Passport_Identity_FilesTitle: String { return self._s[3179]! } public func Notification_PinnedRoundMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3179]!, self._r[3179]!, [_0]) + return formatWithArgumentRanges(self._s[3180]!, self._r[3180]!, [_0]) } - public var PeopleNearby_MakeVisible: String { return self._s[3181]! } + public var PeopleNearby_MakeVisible: String { return self._s[3182]! } public func Conversation_RestrictedMediaTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3182]!, self._r[3182]!, [_0]) + return formatWithArgumentRanges(self._s[3183]!, self._r[3183]!, [_0]) } - public var Widget_UpdatedAt: String { return self._s[3183]! } + public var Widget_UpdatedAt: String { return self._s[3184]! } public func Notification_MessageLifetimeChanged(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3184]!, self._r[3184]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3185]!, self._r[3185]!, [_1, _2]) } public func GroupInfo_AddParticipantConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3185]!, self._r[3185]!, [_0]) + return formatWithArgumentRanges(self._s[3186]!, self._r[3186]!, [_0]) } - public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3186]! } - public var VoiceChat_VideoPreviewShareScreen: String { return self._s[3187]! } - public var ImportStickerPack_ChooseStickerSet: String { return self._s[3189]! } - public var Conversation_ContextMenuForward: String { return self._s[3190]! } - public var Channel_AdminLog_CanManageCalls: String { return self._s[3191]! } + public var PrivacyPolicy_DeclineDeclineAndDelete: String { return self._s[3187]! } + public var VoiceChat_VideoPreviewShareScreen: String { return self._s[3188]! } + public var ImportStickerPack_ChooseStickerSet: String { return self._s[3190]! } + public var Conversation_ContextMenuForward: String { return self._s[3191]! } + public var Channel_AdminLog_CanManageCalls: String { return self._s[3192]! } public func PUSH_CHAT_MESSAGE_QUIZ(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3193]!, self._r[3193]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3194]!, self._r[3194]!, [_1, _2, _3]) } - public var Notification_GroupInviterSelf: String { return self._s[3195]! } - public var Privacy_Forwards_NeverLink: String { return self._s[3196]! } - public var AuthSessions_CurrentSession: String { return self._s[3197]! } - public var Passport_Address_EditPassportRegistration: String { return self._s[3198]! } - public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3199]! } - public var ChatSearch_ResultsTooltip: String { return self._s[3201]! } - public var CheckoutInfo_Pay: String { return self._s[3202]! } + public var Notification_GroupInviterSelf: String { return self._s[3196]! } + public var Privacy_Forwards_NeverLink: String { return self._s[3197]! } + public var AuthSessions_CurrentSession: String { return self._s[3198]! } + public var Passport_Address_EditPassportRegistration: String { return self._s[3199]! } + public var ChannelInfo_DeleteChannelConfirmation: String { return self._s[3200]! } + public var ChatSearch_ResultsTooltip: String { return self._s[3202]! } + public var CheckoutInfo_Pay: String { return self._s[3203]! } public func Conversation_PinMessagesFor(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3204]!, self._r[3204]!, [_0]) + return formatWithArgumentRanges(self._s[3205]!, self._r[3205]!, [_0]) } - public var GroupInfo_AddParticipant: String { return self._s[3205]! } - public var GroupPermission_ApplyAlertAction: String { return self._s[3206]! } + public var GroupInfo_AddParticipant: String { return self._s[3206]! } + public var GroupPermission_ApplyAlertAction: String { return self._s[3207]! } public func Channel_AdminLog_MessageChangedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3207]!, self._r[3207]!, [_0]) + return formatWithArgumentRanges(self._s[3208]!, self._r[3208]!, [_0]) } - public var Localization_LanguageCustom: String { return self._s[3208]! } - public var SettingsSearch_Synonyms_Passport: String { return self._s[3209]! } - public var Settings_UsernameEmpty: String { return self._s[3210]! } - public var Settings_FAQ_URL: String { return self._s[3211]! } - public var ChatList_UndoArchiveText1: String { return self._s[3212]! } - public var Common_Select: String { return self._s[3214]! } - public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[3215]! } - public var Notification_PassportValueAddress: String { return self._s[3216]! } - public var Conversation_MessageDialogDelete: String { return self._s[3217]! } - public var Map_OpenInYandexNavigator: String { return self._s[3219]! } - public var DialogList_SearchSectionDialogs: String { return self._s[3220]! } - public var AccessDenied_Contacts: String { return self._s[3221]! } - public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[3223]! } - public var Passport_ScanPassportHelp: String { return self._s[3224]! } - public var Chat_PinnedListPreview_HidePinnedMessages: String { return self._s[3225]! } - public var ChatListFolder_NameChannels: String { return self._s[3226]! } - public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[3227]! } + public var Localization_LanguageCustom: String { return self._s[3209]! } + public var SettingsSearch_Synonyms_Passport: String { return self._s[3210]! } + public var Settings_UsernameEmpty: String { return self._s[3211]! } + public var Settings_FAQ_URL: String { return self._s[3212]! } + public var ChatList_UndoArchiveText1: String { return self._s[3213]! } + public var Common_Select: String { return self._s[3215]! } + public var Notification_MessageLifetimeRemovedOutgoing: String { return self._s[3216]! } + public var Notification_PassportValueAddress: String { return self._s[3217]! } + public var Conversation_MessageDialogDelete: String { return self._s[3218]! } + public var Map_OpenInYandexNavigator: String { return self._s[3220]! } + public var DialogList_SearchSectionDialogs: String { return self._s[3221]! } + public var AccessDenied_Contacts: String { return self._s[3222]! } + public var SettingsSearch_Synonyms_Privacy_Data_DeleteDrafts: String { return self._s[3224]! } + public var Passport_ScanPassportHelp: String { return self._s[3225]! } + public var Chat_PinnedListPreview_HidePinnedMessages: String { return self._s[3226]! } + public var ChatListFolder_NameChannels: String { return self._s[3227]! } + public var Appearance_ThemePreview_Chat_5_Text: String { return self._s[3228]! } public func Channel_OwnershipTransfer_TransferCompleted(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3228]!, self._r[3228]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3229]!, self._r[3229]!, [_1, _2]) } - public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[3229]! } + public var Checkout_ErrorInvoiceAlreadyPaid: String { return self._s[3230]! } public func VoiceChat_InviteMemberToGroupFirstText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3230]!, self._r[3230]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3231]!, self._r[3231]!, [_1, _2]) } - public var Conversation_GifTooltip: String { return self._s[3231]! } - public var Widget_MessageAutoremoveTimerUpdated: String { return self._s[3232]! } - public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3234]! } - public var VoiceChat_Connecting: String { return self._s[3235]! } - public var AutoDownloadSettings_OffForAll: String { return self._s[3236]! } + public var Conversation_GifTooltip: String { return self._s[3232]! } + public var Widget_MessageAutoremoveTimerUpdated: String { return self._s[3233]! } + public var Passport_Identity_TypeDriversLicenseUploadScan: String { return self._s[3235]! } + public var VoiceChat_Connecting: String { return self._s[3236]! } + public var AutoDownloadSettings_OffForAll: String { return self._s[3237]! } public func Channel_AdminLog_CreatedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3237]!, self._r[3237]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3238]!, self._r[3238]!, [_1, _2]) } - public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3238]! } - public var AutoDownloadSettings_PreloadVideo: String { return self._s[3239]! } - public var CreatePoll_Quiz: String { return self._s[3240]! } - public var TwoFactorSetup_Email_Placeholder: String { return self._s[3242]! } - public var Watch_Message_Invoice: String { return self._s[3243]! } - public var Settings_AddAnotherAccount_Help: String { return self._s[3244]! } - public var Watch_Message_Unsupported: String { return self._s[3245]! } + public var Privacy_GroupsAndChannels_InviteToChannelMultipleError: String { return self._s[3239]! } + public var AutoDownloadSettings_PreloadVideo: String { return self._s[3240]! } + public var CreatePoll_Quiz: String { return self._s[3241]! } + public var TwoFactorSetup_Email_Placeholder: String { return self._s[3243]! } + public var Watch_Message_Invoice: String { return self._s[3244]! } + public var Settings_AddAnotherAccount_Help: String { return self._s[3245]! } + public var Watch_Message_Unsupported: String { return self._s[3246]! } public func Call_CameraOff(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3247]!, self._r[3247]!, [_0]) + return formatWithArgumentRanges(self._s[3248]!, self._r[3248]!, [_0]) } - public var AuthSessions_TerminateOtherSessions: String { return self._s[3248]! } - public var CreatePoll_AllOptionsAdded: String { return self._s[3250]! } - public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[3251]! } - public var Call_IncomingVoiceCall: String { return self._s[3252]! } + public var AuthSessions_TerminateOtherSessions: String { return self._s[3249]! } + public var CreatePoll_AllOptionsAdded: String { return self._s[3251]! } + public var TwoStepAuth_RecoveryEmailTitle: String { return self._s[3252]! } + public var Call_IncomingVoiceCall: String { return self._s[3253]! } public func Channel_AdminLog_MessageTransferedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3253]!, self._r[3253]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3254]!, self._r[3254]!, [_1, _2]) } - public var PrivacySettings_DeleteAccountHelp: String { return self._s[3254]! } - public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[3255]! } - public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[3256]! } - public var Group_ErrorAccessDenied: String { return self._s[3257]! } - public var PasscodeSettings_HelpTop: String { return self._s[3258]! } - public var Watch_ChatList_NoConversationsTitle: String { return self._s[3259]! } - public var AddContact_SharedContactException: String { return self._s[3260]! } - public var AccessDenied_MicrophoneRestricted: String { return self._s[3261]! } - public var Privacy_TopPeers: String { return self._s[3262]! } - public var Web_OpenExternal: String { return self._s[3263]! } - public var Group_ErrorSendRestrictedStickers: String { return self._s[3264]! } - public var Channel_Management_LabelAdministrator: String { return self._s[3265]! } + public var PrivacySettings_DeleteAccountHelp: String { return self._s[3255]! } + public var Passport_Address_TypePassportRegistrationUploadScan: String { return self._s[3256]! } + public var Group_EditAdmin_RankOwnerPlaceholder: String { return self._s[3257]! } + public var Group_ErrorAccessDenied: String { return self._s[3258]! } + public var PasscodeSettings_HelpTop: String { return self._s[3259]! } + public var Watch_ChatList_NoConversationsTitle: String { return self._s[3260]! } + public var AddContact_SharedContactException: String { return self._s[3261]! } + public var AccessDenied_MicrophoneRestricted: String { return self._s[3262]! } + public var Privacy_TopPeers: String { return self._s[3263]! } + public var Web_OpenExternal: String { return self._s[3264]! } + public var Group_ErrorSendRestrictedStickers: String { return self._s[3265]! } + public var Channel_Management_LabelAdministrator: String { return self._s[3266]! } public func ChangePhoneNumberCode_CallTimer(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3266]!, self._r[3266]!, [_0]) + return formatWithArgumentRanges(self._s[3267]!, self._r[3267]!, [_0]) } - public var Conversation_PhoneCopied: String { return self._s[3267]! } - public var Permissions_Skip: String { return self._s[3268]! } - public var Notifications_GroupNotificationsExceptions: String { return self._s[3269]! } + public var Conversation_PhoneCopied: String { return self._s[3268]! } + public var Permissions_Skip: String { return self._s[3269]! } + public var Notifications_GroupNotificationsExceptions: String { return self._s[3270]! } public func VoiceChat_ForwardTooltip_TwoChats(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3270]!, self._r[3270]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3271]!, self._r[3271]!, [_0, _1]) } - public var PeopleNearby_Title: String { return self._s[3271]! } - public var GroupInfo_SharedMediaNone: String { return self._s[3272]! } + public var PeopleNearby_Title: String { return self._s[3272]! } + public var GroupInfo_SharedMediaNone: String { return self._s[3273]! } public func PUSH_MESSAGE_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3274]!, self._r[3274]!, [_1]) + return formatWithArgumentRanges(self._s[3275]!, self._r[3275]!, [_1]) } - public var Profile_MessageLifetime1w: String { return self._s[3275]! } + public var Profile_MessageLifetime1w: String { return self._s[3276]! } public func Time_PreciseDate_m6(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3276]!, self._r[3276]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3277]!, self._r[3277]!, [_1, _2, _3]) } - public var WebBrowser_DefaultBrowser: String { return self._s[3277]! } - public var Conversation_PinOlderMessageAlertTitle: String { return self._s[3279]! } - public var EditTheme_Edit_BottomInfo: String { return self._s[3280]! } - public var Privacy_Forwards_Preview: String { return self._s[3281]! } - public var Settings_EditAccount: String { return self._s[3282]! } + public var WebBrowser_DefaultBrowser: String { return self._s[3278]! } + public var Conversation_PinOlderMessageAlertTitle: String { return self._s[3280]! } + public var EditTheme_Edit_BottomInfo: String { return self._s[3281]! } + public var Privacy_Forwards_Preview: String { return self._s[3282]! } + public var Settings_EditAccount: String { return self._s[3283]! } public func Conversation_RestrictedInlineTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3283]!, self._r[3283]!, [_0]) + return formatWithArgumentRanges(self._s[3284]!, self._r[3284]!, [_0]) } - public var TwoFactorSetup_Intro_Title: String { return self._s[3284]! } + public var TwoFactorSetup_Intro_Title: String { return self._s[3285]! } public func Channel_AdminLog_MessagePromotedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3286]!, self._r[3286]!, [_1]) + return formatWithArgumentRanges(self._s[3287]!, self._r[3287]!, [_1]) } - public var PeerInfo_ButtonVideoCall: String { return self._s[3287]! } + public var PeerInfo_ButtonVideoCall: String { return self._s[3288]! } public func DialogList_SingleUploadingPhotoSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3288]!, self._r[3288]!, [_0]) + return formatWithArgumentRanges(self._s[3289]!, self._r[3289]!, [_0]) } - public var Login_InfoHelp: String { return self._s[3289]! } - public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[3290]! } - public var VoiceChat_SpeakPermissionEveryone: String { return self._s[3291]! } - public var Profile_MessageLifetime1d: String { return self._s[3292]! } - public var Group_UpgradeConfirmation: String { return self._s[3293]! } + public var Login_InfoHelp: String { return self._s[3290]! } + public var Notification_SecretChatMessageScreenshotSelf: String { return self._s[3291]! } + public var VoiceChat_SpeakPermissionEveryone: String { return self._s[3292]! } + public var Profile_MessageLifetime1d: String { return self._s[3293]! } + public var Group_UpgradeConfirmation: String { return self._s[3294]! } public func PUSH_PINNED_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3294]!, self._r[3294]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3295]!, self._r[3295]!, [_1, _2]) } - public var Appearance_RemoveThemeColor: String { return self._s[3295]! } - public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3296]! } + public var Appearance_RemoveThemeColor: String { return self._s[3296]! } + public var VoiceChat_VideoPreviewFrontCamera: String { return self._s[3297]! } + public var Channel_AdminLog_TitleSelectedEvents: String { return self._s[3298]! } public func Call_AnsweringWithAccount(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3297]!, self._r[3297]!, [_0]) + return formatWithArgumentRanges(self._s[3299]!, self._r[3299]!, [_0]) } - public var UserInfo_BotSettings: String { return self._s[3298]! } + public var UserInfo_BotSettings: String { return self._s[3300]! } public func Notification_ChannelInviter(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3300]!, self._r[3300]!, [_0]) + return formatWithArgumentRanges(self._s[3302]!, self._r[3302]!, [_0]) } - public var Permissions_ContactsText_v0: String { return self._s[3301]! } - public var Conversation_PinMessagesForMe: String { return self._s[3302]! } - public var VoiceChat_PanelJoin: String { return self._s[3303]! } - public var Conversation_DiscussionStarted: String { return self._s[3305]! } - public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[3306]! } - public var SharedMedia_SearchNoResults: String { return self._s[3308]! } + public var Permissions_ContactsText_v0: String { return self._s[3303]! } + public var Conversation_PinMessagesForMe: String { return self._s[3304]! } + public var VoiceChat_PanelJoin: String { return self._s[3305]! } + public var Conversation_DiscussionStarted: String { return self._s[3307]! } + public var SettingsSearch_Synonyms_Privacy_TwoStepAuth: String { return self._s[3308]! } + public var SharedMedia_SearchNoResults: String { return self._s[3310]! } public func Login_EmailPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3310]!, self._r[3310]!, [_0]) - } - public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3312]!, self._r[3312]!, [_0]) } - public var ReportPeer_ReasonOther_Placeholder: String { return self._s[3313]! } - public func TwoStepAuth_ResetPendingText(_ _0: String) -> (String, [(Int, NSRange)]) { + public func Conversation_ShareMyPhoneNumber_StatusSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3314]!, self._r[3314]!, [_0]) } - public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3315]! } - public var Call_AudioRouteHeadphones: String { return self._s[3316]! } + public var ReportPeer_ReasonOther_Placeholder: String { return self._s[3315]! } + public func TwoStepAuth_ResetPendingText(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3316]!, self._r[3316]!, [_0]) + } + public var ContactInfo_PhoneLabelHomeFax: String { return self._s[3317]! } + public var Call_AudioRouteHeadphones: String { return self._s[3318]! } public func Notification_VoiceChatScheduledTomorrowChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3318]!, self._r[3318]!, [_0]) + return formatWithArgumentRanges(self._s[3320]!, self._r[3320]!, [_0]) } public func PUSH_AUTH_UNKNOWN(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3319]!, self._r[3319]!, [_1]) + return formatWithArgumentRanges(self._s[3321]!, self._r[3321]!, [_1]) } - public var Passport_Identity_FilesView: String { return self._s[3320]! } - public var TwoStepAuth_SetupEmail: String { return self._s[3321]! } - public var Widget_ApplicationStartRequired: String { return self._s[3322]! } - public var PhotoEditor_Original: String { return self._s[3323]! } - public var Call_YourMicrophoneOff: String { return self._s[3324]! } - public var Permissions_ContactsAllow_v0: String { return self._s[3325]! } - public var Conversation_CardNumberCopied: String { return self._s[3326]! } - public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[3327]! } - public var PrivacyPolicy_Decline: String { return self._s[3328]! } - public var SettingsSearch_Synonyms_ChatFolders: String { return self._s[3329]! } - public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[3330]! } - public var ChatListFolder_IncludeSectionInfo: String { return self._s[3331]! } + public var Passport_Identity_FilesView: String { return self._s[3322]! } + public var TwoStepAuth_SetupEmail: String { return self._s[3323]! } + public var Widget_ApplicationStartRequired: String { return self._s[3324]! } + public var PhotoEditor_Original: String { return self._s[3325]! } + public var Call_YourMicrophoneOff: String { return self._s[3326]! } + public var Permissions_ContactsAllow_v0: String { return self._s[3327]! } + public var Conversation_CardNumberCopied: String { return self._s[3328]! } + public var Notification_Exceptions_PreviewAlwaysOn: String { return self._s[3329]! } + public var PrivacyPolicy_Decline: String { return self._s[3330]! } + public var SettingsSearch_Synonyms_ChatFolders: String { return self._s[3331]! } + public var TwoStepAuth_PasswordRemoveConfirmation: String { return self._s[3332]! } + public var ChatListFolder_IncludeSectionInfo: String { return self._s[3333]! } public func Map_DirectionsDriveEta(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3332]!, self._r[3332]!, [_0]) + return formatWithArgumentRanges(self._s[3334]!, self._r[3334]!, [_0]) } - public var Passport_Identity_Name: String { return self._s[3333]! } - public var WallpaperPreview_PatternTitle: String { return self._s[3335]! } - public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[3336]! } - public var WallpaperSearch_ColorOrange: String { return self._s[3338]! } - public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[3339]! } - public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[3340]! } - public var Your_cards_security_code_is_invalid: String { return self._s[3341]! } - public var IntentsSettings_ResetAll: String { return self._s[3342]! } - public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3344]! } - public var Group_EditAdmin_TransferOwnership: String { return self._s[3345]! } - public var ChatList_DeleteForAllSubscribers: String { return self._s[3346]! } - public var Notification_Exceptions_Add: String { return self._s[3347]! } - public var Group_DeleteGroup: String { return self._s[3348]! } - public var Cache_Help: String { return self._s[3349]! } - public var Call_AudioRouteMute: String { return self._s[3350]! } - public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[3351]! } - public var SocksProxySetup_ProxyEnabled: String { return self._s[3352]! } + public var Passport_Identity_Name: String { return self._s[3335]! } + public var WallpaperPreview_PatternTitle: String { return self._s[3337]! } + public var VoiceOver_Chat_RecordModeVideoMessage: String { return self._s[3338]! } + public var WallpaperSearch_ColorOrange: String { return self._s[3340]! } + public var Appearance_ThemePreview_ChatList_5_Name: String { return self._s[3341]! } + public var GroupInfo_Permissions_SlowmodeInfo: String { return self._s[3342]! } + public var Your_cards_security_code_is_invalid: String { return self._s[3343]! } + public var IntentsSettings_ResetAll: String { return self._s[3344]! } + public var SettingsSearch_Synonyms_Calls_CallTab: String { return self._s[3346]! } + public var Group_EditAdmin_TransferOwnership: String { return self._s[3347]! } + public var ChatList_DeleteForAllSubscribers: String { return self._s[3348]! } + public var Notification_Exceptions_Add: String { return self._s[3349]! } + public var Group_DeleteGroup: String { return self._s[3350]! } + public var Cache_Help: String { return self._s[3351]! } + public var Call_AudioRouteMute: String { return self._s[3352]! } + public var VoiceOver_Chat_YourVoiceMessage: String { return self._s[3353]! } + public var SocksProxySetup_ProxyEnabled: String { return self._s[3354]! } public func VoiceChat_Status_MembersFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3353]!, self._r[3353]!, [_1, _2]) - } - public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3354]!, self._r[3354]!, [_1]) - } - public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[3355]!, self._r[3355]!, [_1, _2]) } - public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3356]! } - public var Channel_BanUser_PermissionAddMembers: String { return self._s[3357]! } + public func ApplyLanguage_UnsufficientDataText(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3356]!, self._r[3356]!, [_1]) + } + public func Call_CallInProgressMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[3357]!, self._r[3357]!, [_1, _2]) + } + public var AutoDownloadSettings_VideoMessagesTitle: String { return self._s[3358]! } + public var Channel_BanUser_PermissionAddMembers: String { return self._s[3359]! } public func PUSH_CHAT_VOICECHAT_INVITE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3358]!, self._r[3358]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3360]!, self._r[3360]!, [_1, _2, _3]) } - public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[3359]! } - public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3360]! } - public var ClearCache_StorageFree: String { return self._s[3361]! } + public var Contacts_MemberSearchSectionTitleGroup: String { return self._s[3361]! } + public var TwoStepAuth_RecoveryCodeHelp: String { return self._s[3362]! } + public var ClearCache_StorageFree: String { return self._s[3363]! } public func DialogList_SingleRecordingVideoMessageSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3362]!, self._r[3362]!, [_0]) + return formatWithArgumentRanges(self._s[3364]!, self._r[3364]!, [_0]) } - public var Privacy_Forwards_CustomHelp: String { return self._s[3363]! } + public var Privacy_Forwards_CustomHelp: String { return self._s[3365]! } public func Channel_AdminLog_EditedInviteLink(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3365]!, self._r[3365]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3367]!, self._r[3367]!, [_1, _2]) } - public var Group_ErrorAddTooMuchAdmins: String { return self._s[3366]! } - public var DialogList_Typing: String { return self._s[3367]! } + public var Group_ErrorAddTooMuchAdmins: String { return self._s[3368]! } + public var DialogList_Typing: String { return self._s[3369]! } public func Login_EmailCodeSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3368]!, self._r[3368]!, [_0]) + return formatWithArgumentRanges(self._s[3370]!, self._r[3370]!, [_0]) } - public var Target_SelectGroup: String { return self._s[3369]! } - public var AuthSessions_IncompleteAttempts: String { return self._s[3370]! } - public var TwoStepAuth_RecoveryEmailResetText: String { return self._s[3371]! } - public var TwoFactorRemember_Done_Text: String { return self._s[3372]! } + public var Target_SelectGroup: String { return self._s[3371]! } + public var AuthSessions_IncompleteAttempts: String { return self._s[3372]! } + public var TwoStepAuth_RecoveryEmailResetText: String { return self._s[3373]! } + public var TwoFactorRemember_Done_Text: String { return self._s[3374]! } public func Notification_ProximityReached(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3373]!, self._r[3373]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3375]!, self._r[3375]!, [_1, _2, _3]) } - public var Chat_PinnedListPreview_ShowAllMessages: String { return self._s[3374]! } - public var TwoStepAuth_EmailChangeSuccess: String { return self._s[3375]! } + public var Chat_PinnedListPreview_ShowAllMessages: String { return self._s[3376]! } + public var TwoStepAuth_EmailChangeSuccess: String { return self._s[3377]! } public func Settings_CheckPhoneNumberTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3376]!, self._r[3376]!, [_0]) + return formatWithArgumentRanges(self._s[3378]!, self._r[3378]!, [_0]) } - public var Channel_AdminLog_CanSendMessages: String { return self._s[3377]! } - public var TwoFactorSetup_EmailVerification_Title: String { return self._s[3378]! } - public var ChatSettings_TextSize: String { return self._s[3379]! } - public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[3381]! } - public var Map_SendThisPlace: String { return self._s[3382]! } - public var Conversation_TextCopied: String { return self._s[3383]! } - public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3384]! } - public var ContactInfo_BirthdayLabel: String { return self._s[3385]! } - public var Call_ShareStats: String { return self._s[3386]! } + public var Channel_AdminLog_CanSendMessages: String { return self._s[3379]! } + public var TwoFactorSetup_EmailVerification_Title: String { return self._s[3380]! } + public var ChatSettings_TextSize: String { return self._s[3381]! } + public var Channel_AdminLogFilter_EventsEditedMessages: String { return self._s[3383]! } + public var Map_SendThisPlace: String { return self._s[3384]! } + public var Conversation_TextCopied: String { return self._s[3385]! } + public var Login_PhoneNumberAlreadyAuthorized: String { return self._s[3386]! } + public var ContactInfo_BirthdayLabel: String { return self._s[3387]! } + public var Call_ShareStats: String { return self._s[3388]! } public func PUSH_CHAT_VOICECHAT_END(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3388]!, self._r[3388]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3390]!, self._r[3390]!, [_1, _2]) } - public var ChatList_UndoArchiveRevealedText: String { return self._s[3389]! } - public var Notifications_GroupNotificationsPreview: String { return self._s[3390]! } - public var Settings_Support: String { return self._s[3391]! } - public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3392]! } + public var ChatList_UndoArchiveRevealedText: String { return self._s[3391]! } + public var Notifications_GroupNotificationsPreview: String { return self._s[3392]! } + public var Settings_Support: String { return self._s[3393]! } + public var GroupInfo_ChannelListNamePlaceholder: String { return self._s[3394]! } public func EmptyGroupInfo_Line1(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3394]!, self._r[3394]!, [_0]) + return formatWithArgumentRanges(self._s[3396]!, self._r[3396]!, [_0]) } - public var Watch_Conversation_GroupInfo: String { return self._s[3395]! } - public var Tour_Text4: String { return self._s[3396]! } - public var VoiceChat_CancelReminder: String { return self._s[3397]! } - public var Calls_StartNewCall: String { return self._s[3398]! } - public var UserInfo_FakeUserWarning: String { return self._s[3400]! } - public var PasscodeSettings_AutoLock: String { return self._s[3401]! } - public var Channel_BanList_BlockedTitle: String { return self._s[3402]! } - public var Bot_DescriptionTitle: String { return self._s[3404]! } - public var Map_LocationTitle: String { return self._s[3405]! } - public var ChatListFolder_ExcludeSectionInfo: String { return self._s[3406]! } - public var Conversation_HashtagCopied: String { return self._s[3407]! } + public var Watch_Conversation_GroupInfo: String { return self._s[3397]! } + public var Tour_Text4: String { return self._s[3398]! } + public var VoiceChat_CancelReminder: String { return self._s[3399]! } + public var Calls_StartNewCall: String { return self._s[3400]! } + public var UserInfo_FakeUserWarning: String { return self._s[3402]! } + public var PasscodeSettings_AutoLock: String { return self._s[3403]! } + public var Channel_BanList_BlockedTitle: String { return self._s[3404]! } + public var Bot_DescriptionTitle: String { return self._s[3406]! } + public var Map_LocationTitle: String { return self._s[3407]! } + public var ChatListFolder_ExcludeSectionInfo: String { return self._s[3408]! } + public var Conversation_HashtagCopied: String { return self._s[3409]! } public func Notification_MessageLifetimeChangedOutgoing(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3408]!, self._r[3408]!, [_1]) + return formatWithArgumentRanges(self._s[3410]!, self._r[3410]!, [_1]) } - public var VoiceChat_ReminderNotify: String { return self._s[3409]! } - public var Login_EmailNotConfiguredError: String { return self._s[3410]! } - public var AutoDownloadSettings_LimitBySize: String { return self._s[3411]! } - public var PrivacySettings_LastSeenNobody: String { return self._s[3412]! } - public var Permissions_CellularDataText_v0: String { return self._s[3413]! } - public var Conversation_EncryptionProcessing: String { return self._s[3414]! } - public var GroupPermission_Delete: String { return self._s[3416]! } - public var Contacts_SortByName: String { return self._s[3417]! } - public var TwoStepAuth_RecoveryUnavailable: String { return self._s[3418]! } - public var Compose_ChannelTokenListPlaceholder: String { return self._s[3419]! } - public var Group_Management_AddModeratorHelp: String { return self._s[3421]! } - public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[3422]! } - public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3423]! } - public var CallFeedback_IncludeLogsInfo: String { return self._s[3425]! } + public var VoiceChat_ReminderNotify: String { return self._s[3411]! } + public var Login_EmailNotConfiguredError: String { return self._s[3412]! } + public var AutoDownloadSettings_LimitBySize: String { return self._s[3413]! } + public var PrivacySettings_LastSeenNobody: String { return self._s[3414]! } + public var Permissions_CellularDataText_v0: String { return self._s[3415]! } + public var Conversation_EncryptionProcessing: String { return self._s[3416]! } + public var GroupPermission_Delete: String { return self._s[3418]! } + public var Contacts_SortByName: String { return self._s[3419]! } + public var TwoStepAuth_RecoveryUnavailable: String { return self._s[3420]! } + public var Compose_ChannelTokenListPlaceholder: String { return self._s[3421]! } + public var Group_Management_AddModeratorHelp: String { return self._s[3423]! } + public var SettingsSearch_Synonyms_EditProfile_Logout: String { return self._s[3424]! } + public var Forward_ErrorPublicPollDisabledInChannels: String { return self._s[3425]! } + public var CallFeedback_IncludeLogsInfo: String { return self._s[3427]! } public func PUSH_CHANNEL_MESSAGE_QUIZ(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3426]!, self._r[3426]!, [_1]) + return formatWithArgumentRanges(self._s[3428]!, self._r[3428]!, [_1]) } public func SecretVideo_NotViewedYet(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3427]!, self._r[3427]!, [_0]) + return formatWithArgumentRanges(self._s[3429]!, self._r[3429]!, [_0]) } - public var ChatList_Context_Delete: String { return self._s[3428]! } - public var VoiceChat_InviteMember: String { return self._s[3429]! } - public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[3430]! } - public var Conversation_Processing: String { return self._s[3431]! } - public var TwoStepAuth_EmailCodeExpired: String { return self._s[3432]! } - public var ChatSettings_Stickers: String { return self._s[3433]! } - public var AppleWatch_ReplyPresetsHelp: String { return self._s[3434]! } - public var Passport_Language_cs: String { return self._s[3435]! } - public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3437]! } - public var Conversation_Contact: String { return self._s[3438]! } - public var Passport_Identity_ReverseSideHelp: String { return self._s[3439]! } - public var SocksProxySetup_PasteFromClipboard: String { return self._s[3441]! } - public var Theme_Unsupported: String { return self._s[3442]! } - public var Privacy_TopPeersWarning: String { return self._s[3443]! } + public var ChatList_Context_Delete: String { return self._s[3430]! } + public var VoiceChat_InviteMember: String { return self._s[3431]! } + public var PrivacyPhoneNumberSettings_CustomDisabledHelp: String { return self._s[3432]! } + public var Conversation_Processing: String { return self._s[3433]! } + public var TwoStepAuth_EmailCodeExpired: String { return self._s[3434]! } + public var ChatSettings_Stickers: String { return self._s[3435]! } + public var AppleWatch_ReplyPresetsHelp: String { return self._s[3436]! } + public var Passport_Language_cs: String { return self._s[3437]! } + public var GroupInfo_InvitationLinkGroupFull: String { return self._s[3439]! } + public var Conversation_Contact: String { return self._s[3440]! } + public var Passport_Identity_ReverseSideHelp: String { return self._s[3441]! } + public var SocksProxySetup_PasteFromClipboard: String { return self._s[3443]! } + public var Theme_Unsupported: String { return self._s[3444]! } + public var Privacy_TopPeersWarning: String { return self._s[3445]! } public func Conversation_ScheduledVoiceChatStartsTodayShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3444]!, self._r[3444]!, [_0]) + return formatWithArgumentRanges(self._s[3446]!, self._r[3446]!, [_0]) } - public var InviteLink_Title: String { return self._s[3446]! } + public var InviteLink_Title: String { return self._s[3448]! } public func UserInfo_BlockConfirmationTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3447]!, self._r[3447]!, [_0]) + return formatWithArgumentRanges(self._s[3449]!, self._r[3449]!, [_0]) } - public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3448]! } - public var TwoStepAuth_RemovePassword: String { return self._s[3449]! } - public var Settings_CheckPhoneNumberText: String { return self._s[3450]! } - public var PeopleNearby_Users: String { return self._s[3451]! } - public var Appearance_TextSize_UseSystem: String { return self._s[3452]! } - public var Settings_SetProfilePhoto: String { return self._s[3453]! } - public var Conversation_ContextMenuBan: String { return self._s[3454]! } - public var KeyCommand_ScrollUp: String { return self._s[3455]! } - public var Settings_ChatSettings: String { return self._s[3457]! } - public var CallList_RecentCallsHeader: String { return self._s[3458]! } + public var Conversation_SilentBroadcastTooltipOn: String { return self._s[3450]! } + public var TwoStepAuth_RemovePassword: String { return self._s[3451]! } + public var Settings_CheckPhoneNumberText: String { return self._s[3452]! } + public var PeopleNearby_Users: String { return self._s[3453]! } + public var Appearance_TextSize_UseSystem: String { return self._s[3454]! } + public var Settings_SetProfilePhoto: String { return self._s[3455]! } + public var Conversation_ContextMenuBan: String { return self._s[3456]! } + public var KeyCommand_ScrollUp: String { return self._s[3457]! } + public var Settings_ChatSettings: String { return self._s[3459]! } + public var CallList_RecentCallsHeader: String { return self._s[3460]! } public func PUSH_CHAT_MESSAGE_VIDEO(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3459]!, self._r[3459]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3461]!, self._r[3461]!, [_1, _2]) } - public var Stats_GroupTopInvitersTitle: String { return self._s[3460]! } - public var Passport_Phone_EnterOtherNumber: String { return self._s[3461]! } - public var VoiceChat_StartRecordingTitle: String { return self._s[3462]! } + public var Stats_GroupTopInvitersTitle: String { return self._s[3462]! } + public var Passport_Phone_EnterOtherNumber: String { return self._s[3463]! } + public var VoiceChat_StartRecordingTitle: String { return self._s[3464]! } public func Notification_VoiceChatScheduledToday(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3463]!, self._r[3463]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3465]!, self._r[3465]!, [_1, _2]) } - public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[3465]! } - public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3466]! } - public var VoiceOver_ChatList_MessageRead: String { return self._s[3468]! } - public var Stats_GroupTopPoster_Promote: String { return self._s[3471]! } - public var Cache_Title: String { return self._s[3472]! } + public var Passport_Identity_MiddleNamePlaceholder: String { return self._s[3467]! } + public var Passport_Address_OneOfTypeBankStatement: String { return self._s[3468]! } + public var VoiceOver_ChatList_MessageRead: String { return self._s[3470]! } + public var Stats_GroupTopPoster_Promote: String { return self._s[3473]! } + public var Cache_Title: String { return self._s[3474]! } public func Conversation_AutoremoveTimerSetToastText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3473]!, self._r[3473]!, [_0]) + return formatWithArgumentRanges(self._s[3475]!, self._r[3475]!, [_0]) } - public var Clipboard_SendPhoto: String { return self._s[3474]! } - public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[3476]! } - public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3477]! } - public var WatchRemote_AlertTitle: String { return self._s[3480]! } - public var Appearance_ReduceMotion: String { return self._s[3481]! } + public var Clipboard_SendPhoto: String { return self._s[3476]! } + public var Notifications_ExceptionsMessagePlaceholder: String { return self._s[3478]! } + public var TwoStepAuth_EnterPasswordForgot: String { return self._s[3479]! } + public var WatchRemote_AlertTitle: String { return self._s[3482]! } + public var Appearance_ReduceMotion: String { return self._s[3483]! } public func PUSH_CHAT_MESSAGE_ROUND(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3484]!, self._r[3484]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3486]!, self._r[3486]!, [_1, _2]) } - public var Notifications_PermissionsSuppressWarningText: String { return self._s[3485]! } - public var ChatList_UndoArchiveHiddenTitle: String { return self._s[3486]! } - public var Passport_Identity_TypePersonalDetails: String { return self._s[3487]! } + public var Notifications_PermissionsSuppressWarningText: String { return self._s[3487]! } + public var ChatList_UndoArchiveHiddenTitle: String { return self._s[3488]! } + public var Passport_Identity_TypePersonalDetails: String { return self._s[3489]! } public func Call_CallInProgressVoiceChatMessage(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3488]!, self._r[3488]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3490]!, self._r[3490]!, [_1, _2]) } public func Passport_Identity_UploadOneOfScan(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3490]!, self._r[3490]!, [_0]) + return formatWithArgumentRanges(self._s[3492]!, self._r[3492]!, [_0]) } - public var ChatListFolder_DiscardConfirmation: String { return self._s[3491]! } + public var ChatListFolder_DiscardConfirmation: String { return self._s[3493]! } public func Conversation_RestrictedStickersTimed(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3493]!, self._r[3493]!, [_0]) + return formatWithArgumentRanges(self._s[3495]!, self._r[3495]!, [_0]) } - public var InstantPage_Search: String { return self._s[3494]! } - public var ChatState_WaitingForNetwork: String { return self._s[3495]! } - public var GroupInfo_Sound: String { return self._s[3496]! } - public var NotificationsSound_Telegraph: String { return self._s[3497]! } + public var InstantPage_Search: String { return self._s[3496]! } + public var ChatState_WaitingForNetwork: String { return self._s[3497]! } + public var GroupInfo_Sound: String { return self._s[3498]! } + public var NotificationsSound_Telegraph: String { return self._s[3499]! } public func VoiceChat_ParticipantIsSpeaking(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3498]!, self._r[3498]!, [_1]) + return formatWithArgumentRanges(self._s[3500]!, self._r[3500]!, [_1]) } - public var NotificationsSound_Hello: String { return self._s[3499]! } - public var VoiceChat_LeaveConfirmation: String { return self._s[3500]! } - public var UserInfo_LinkForwardTooltip_SavedMessages_One: String { return self._s[3501]! } - public var Passport_FieldIdentityDetailsHelp: String { return self._s[3502]! } - public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[3503]! } - public var Conversation_HoldForVideo: String { return self._s[3504]! } - public var Conversation_PinOlderMessageAlertText: String { return self._s[3505]! } - public var Appearance_ShareTheme: String { return self._s[3506]! } - public var TwoStepAuth_SetupHint: String { return self._s[3507]! } - public var Stats_GrowthTitle: String { return self._s[3510]! } - public var GroupInfo_InviteLink_ShareLink: String { return self._s[3511]! } - public var Conversation_DefaultRestrictedMedia: String { return self._s[3512]! } - public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[3513]! } - public var GroupPermission_NoSendMessages: String { return self._s[3516]! } - public var Conversation_SetReminder_Title: String { return self._s[3517]! } - public var Privacy_Calls_CustomHelp: String { return self._s[3518]! } - public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3519]! } + public var NotificationsSound_Hello: String { return self._s[3501]! } + public var VoiceChat_LeaveConfirmation: String { return self._s[3502]! } + public var UserInfo_LinkForwardTooltip_SavedMessages_One: String { return self._s[3503]! } + public var Passport_FieldIdentityDetailsHelp: String { return self._s[3504]! } + public var Group_Members_AddMemberBotErrorNotAllowed: String { return self._s[3505]! } + public var Conversation_HoldForVideo: String { return self._s[3506]! } + public var Conversation_PinOlderMessageAlertText: String { return self._s[3507]! } + public var Appearance_ShareTheme: String { return self._s[3508]! } + public var TwoStepAuth_SetupHint: String { return self._s[3509]! } + public var Stats_GrowthTitle: String { return self._s[3512]! } + public var GroupInfo_InviteLink_ShareLink: String { return self._s[3513]! } + public var Conversation_DefaultRestrictedMedia: String { return self._s[3514]! } + public var Channel_EditAdmin_PermissionPostMessages: String { return self._s[3515]! } + public var GroupPermission_NoSendMessages: String { return self._s[3518]! } + public var Conversation_SetReminder_Title: String { return self._s[3519]! } + public var Privacy_Calls_CustomHelp: String { return self._s[3520]! } + public var CheckoutInfo_ErrorPostcodeInvalid: String { return self._s[3521]! } public func ClearCache_StorageTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3520]!, self._r[3520]!, [_0]) + return formatWithArgumentRanges(self._s[3522]!, self._r[3522]!, [_0]) } - public var InviteLinks_InviteLinkExpired: String { return self._s[3522]! } - public var Undo_SecretChatDeleted: String { return self._s[3523]! } - public var PhotoEditor_ContrastTool: String { return self._s[3524]! } - public var Privacy_Forwards: String { return self._s[3525]! } - public var AuthSessions_LoggedInWithTelegram: String { return self._s[3526]! } - public var KeyCommand_SendMessage: String { return self._s[3528]! } - public var Conversation_PrivateMessageLinkCopiedLong: String { return self._s[3529]! } + public var InviteLinks_InviteLinkExpired: String { return self._s[3524]! } + public var Undo_SecretChatDeleted: String { return self._s[3525]! } + public var PhotoEditor_ContrastTool: String { return self._s[3526]! } + public var Privacy_Forwards: String { return self._s[3527]! } + public var AuthSessions_LoggedInWithTelegram: String { return self._s[3528]! } + public var KeyCommand_SendMessage: String { return self._s[3530]! } + public var Conversation_PrivateMessageLinkCopiedLong: String { return self._s[3531]! } public func InstantPage_RelatedArticleAuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3530]!, self._r[3530]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3532]!, self._r[3532]!, [_1, _2]) } - public var VoiceChat_VideoPaused: String { return self._s[3531]! } - public var GroupPermission_NoSendGifs: String { return self._s[3532]! } + public var VoiceChat_VideoPaused: String { return self._s[3533]! } + public var GroupPermission_NoSendGifs: String { return self._s[3534]! } public func Notification_VoiceChatEndedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3533]!, self._r[3533]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3535]!, self._r[3535]!, [_1, _2]) } - public var Notification_MessageLifetime2s: String { return self._s[3534]! } - public var Message_Theme: String { return self._s[3535]! } - public var Conversation_Dice_u1F3AF: String { return self._s[3538]! } + public var Notification_MessageLifetime2s: String { return self._s[3536]! } + public var Message_Theme: String { return self._s[3537]! } + public var Conversation_Dice_u1F3AF: String { return self._s[3540]! } public func DialogList_SinglePlayingGameSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3539]!, self._r[3539]!, [_0]) + return formatWithArgumentRanges(self._s[3541]!, self._r[3541]!, [_0]) } - public var Group_UpgradeNoticeHeader: String { return self._s[3541]! } - public var PeerInfo_BioExpand: String { return self._s[3542]! } - public var Passport_DeletePersonalDetails: String { return self._s[3543]! } - public var Widget_NoUsers: String { return self._s[3544]! } - public var TwoStepAuth_AddHintTitle: String { return self._s[3545]! } - public var VoiceChat_VideoPreviewDescription: String { return self._s[3546]! } - public var Login_TermsOfServiceDecline: String { return self._s[3547]! } - public var VoiceChat_UnmuteSuggestion: String { return self._s[3548]! } - public var CreatePoll_QuizTip: String { return self._s[3550]! } - public var Watch_LastSeen_WithinAWeek: String { return self._s[3551]! } - public var MessagePoll_SubmitVote: String { return self._s[3553]! } - public var ChatSettings_AutoDownloadEnabled: String { return self._s[3554]! } - public var Passport_Address_EditRentalAgreement: String { return self._s[3555]! } - public var Conversation_SearchByName_Placeholder: String { return self._s[3556]! } - public var Conversation_UpdateTelegram: String { return self._s[3557]! } + public var Group_UpgradeNoticeHeader: String { return self._s[3543]! } + public var PeerInfo_BioExpand: String { return self._s[3544]! } + public var Passport_DeletePersonalDetails: String { return self._s[3545]! } + public var Widget_NoUsers: String { return self._s[3546]! } + public var TwoStepAuth_AddHintTitle: String { return self._s[3547]! } + public var VoiceChat_VideoPreviewDescription: String { return self._s[3548]! } + public var Login_TermsOfServiceDecline: String { return self._s[3549]! } + public var VoiceChat_UnmuteSuggestion: String { return self._s[3550]! } + public var CreatePoll_QuizTip: String { return self._s[3552]! } + public var VoiceChat_VideoPreviewBackCamera: String { return self._s[3553]! } + public var Watch_LastSeen_WithinAWeek: String { return self._s[3554]! } + public var MessagePoll_SubmitVote: String { return self._s[3556]! } + public var ChatSettings_AutoDownloadEnabled: String { return self._s[3557]! } + public var Passport_Address_EditRentalAgreement: String { return self._s[3558]! } + public var Conversation_SearchByName_Placeholder: String { return self._s[3559]! } + public var Conversation_UpdateTelegram: String { return self._s[3560]! } public func FileSize_KB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3558]!, self._r[3558]!, [_0]) + return formatWithArgumentRanges(self._s[3561]!, self._r[3561]!, [_0]) } - public var UserInfo_About_Placeholder: String { return self._s[3559]! } - public var CallSettings_Always: String { return self._s[3560]! } - public var ChannelInfo_ScamChannelWarning: String { return self._s[3561]! } - public var VoiceChat_MutedByAdminHelp: String { return self._s[3562]! } - public var Login_TermsOfServiceHeader: String { return self._s[3563]! } - public var KeyCommand_ChatInfo: String { return self._s[3564]! } - public var MessagePoll_LabelPoll: String { return self._s[3565]! } - public var Paint_Clear: String { return self._s[3566]! } - public var PeerInfo_ButtonMute: String { return self._s[3567]! } - public var LastSeen_WithinAWeek: String { return self._s[3568]! } - public var Invitation_JoinVoiceChatAsSpeaker: String { return self._s[3569]! } - public var Passport_Identity_FrontSide: String { return self._s[3570]! } - public var Stickers_GroupStickers: String { return self._s[3571]! } - public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[3572]! } + public var UserInfo_About_Placeholder: String { return self._s[3562]! } + public var CallSettings_Always: String { return self._s[3563]! } + public var ChannelInfo_ScamChannelWarning: String { return self._s[3564]! } + public var VoiceChat_MutedByAdminHelp: String { return self._s[3565]! } + public var Login_TermsOfServiceHeader: String { return self._s[3566]! } + public var KeyCommand_ChatInfo: String { return self._s[3567]! } + public var MessagePoll_LabelPoll: String { return self._s[3568]! } + public var Paint_Clear: String { return self._s[3569]! } + public var PeerInfo_ButtonMute: String { return self._s[3570]! } + public var LastSeen_WithinAWeek: String { return self._s[3571]! } + public var Invitation_JoinVoiceChatAsSpeaker: String { return self._s[3572]! } + public var Passport_Identity_FrontSide: String { return self._s[3573]! } + public var Stickers_GroupStickers: String { return self._s[3574]! } + public var ChangePhoneNumberNumber_NumberPlaceholder: String { return self._s[3575]! } public func Map_SearchNoResultsDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3573]!, self._r[3573]!, [_0]) + return formatWithArgumentRanges(self._s[3576]!, self._r[3576]!, [_0]) } - public var VoiceOver_BotCommands: String { return self._s[3574]! } + public var VoiceOver_BotCommands: String { return self._s[3577]! } public func PUSH_MESSAGE_GEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3577]!, self._r[3577]!, [_1]) + return formatWithArgumentRanges(self._s[3580]!, self._r[3580]!, [_1]) } - public var SocksProxySetup_ProxyStatusConnected: String { return self._s[3578]! } - public var Chat_MultipleTextMessagesDisabled: String { return self._s[3579]! } - public var InviteLink_ContextDelete: String { return self._s[3580]! } + public var SocksProxySetup_ProxyStatusConnected: String { return self._s[3581]! } + public var Chat_MultipleTextMessagesDisabled: String { return self._s[3582]! } + public var InviteLink_ContextDelete: String { return self._s[3583]! } public func Notification_LeftChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3581]!, self._r[3581]!, [_0]) + return formatWithArgumentRanges(self._s[3584]!, self._r[3584]!, [_0]) } - public var WebSearch_SearchNoResults: String { return self._s[3583]! } - public var Channel_DiscussionGroup_Create: String { return self._s[3584]! } - public var Passport_Language_es: String { return self._s[3585]! } - public var EnterPasscode_EnterCurrentPasscode: String { return self._s[3586]! } - public var Map_LiveLocationShowAll: String { return self._s[3587]! } - public var Cache_MaximumCacheSizeHelp: String { return self._s[3589]! } - public var Map_OpenInGoogleMaps: String { return self._s[3590]! } - public var CheckoutInfo_ErrorNameInvalid: String { return self._s[3592]! } - public var EditTheme_Create_BottomInfo: String { return self._s[3593]! } - public var PhotoEditor_BlurToolLinear: String { return self._s[3594]! } + public var WebSearch_SearchNoResults: String { return self._s[3586]! } + public var Channel_DiscussionGroup_Create: String { return self._s[3587]! } + public var Passport_Language_es: String { return self._s[3588]! } + public var EnterPasscode_EnterCurrentPasscode: String { return self._s[3589]! } + public var Map_LiveLocationShowAll: String { return self._s[3590]! } + public var Cache_MaximumCacheSizeHelp: String { return self._s[3592]! } + public var Map_OpenInGoogleMaps: String { return self._s[3593]! } + public var CheckoutInfo_ErrorNameInvalid: String { return self._s[3595]! } + public var EditTheme_Create_BottomInfo: String { return self._s[3596]! } + public var PhotoEditor_BlurToolLinear: String { return self._s[3597]! } public func Channel_AdminLog_MessageEdited(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3595]!, self._r[3595]!, [_0]) + return formatWithArgumentRanges(self._s[3598]!, self._r[3598]!, [_0]) } - public var Passport_Phone_Delete: String { return self._s[3596]! } - public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[3597]! } - public var PrivacySettings_PrivacyTitle: String { return self._s[3598]! } - public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3599]! } + public var Passport_Phone_Delete: String { return self._s[3599]! } + public var Channel_Username_CreatePrivateLinkHelp: String { return self._s[3600]! } + public var PrivacySettings_PrivacyTitle: String { return self._s[3601]! } + public var CheckoutInfo_ReceiverInfoNamePlaceholder: String { return self._s[3602]! } public func EncryptionKey_Description(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3600]!, self._r[3600]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3603]!, self._r[3603]!, [_1, _2]) } - public var LogoutOptions_LogOutInfo: String { return self._s[3601]! } - public var Cache_ByPeerHeader: String { return self._s[3603]! } - public var Username_InvalidCharacters: String { return self._s[3604]! } - public var Checkout_ShippingAddress: String { return self._s[3606]! } + public var LogoutOptions_LogOutInfo: String { return self._s[3604]! } + public var Cache_ByPeerHeader: String { return self._s[3606]! } + public var Username_InvalidCharacters: String { return self._s[3607]! } + public var Checkout_ShippingAddress: String { return self._s[3609]! } public func PUSH_CHAT_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3607]!, self._r[3607]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[3610]!, self._r[3610]!, [_1, _2, _3, _4]) } - public var VoiceChat_LeaveAndEndVoiceChat: String { return self._s[3609]! } - public var Conversation_AddContact: String { return self._s[3610]! } - public var Passport_Address_EditUtilityBill: String { return self._s[3611]! } - public var InviteLink_ContextGetQRCode: String { return self._s[3612]! } - public var Conversation_ChecksTooltip_Delivered: String { return self._s[3614]! } + public var VoiceChat_LeaveAndEndVoiceChat: String { return self._s[3612]! } + public var Conversation_AddContact: String { return self._s[3613]! } + public var Passport_Address_EditUtilityBill: String { return self._s[3614]! } + public var InviteLink_ContextGetQRCode: String { return self._s[3615]! } + public var Conversation_ChecksTooltip_Delivered: String { return self._s[3617]! } public func Channel_AdminLog_MessageAddedAdminNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3615]!, self._r[3615]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, [_1, _2]) } - public var Message_Video: String { return self._s[3616]! } + public var Message_Video: String { return self._s[3619]! } public func Watch_Time_ShortYesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3617]!, self._r[3617]!, [_0]) + return formatWithArgumentRanges(self._s[3620]!, self._r[3620]!, [_0]) } public func Conversation_Megabytes(_ _0: Float) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3618]!, self._r[3618]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[3621]!, self._r[3621]!, ["\(_0)"]) } - public var InviteLink_ReactivateLink: String { return self._s[3619]! } - public var Passport_Language_km: String { return self._s[3621]! } + public var InviteLink_ReactivateLink: String { return self._s[3622]! } + public var Passport_Language_km: String { return self._s[3624]! } public func PUSH_MESSAGE_CHANNEL_MESSAGE_GAME_SCORE(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3622]!, self._r[3622]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3625]!, self._r[3625]!, [_1, _2, _3]) } - public var EmptyGroupInfo_Line4: String { return self._s[3623]! } - public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3625]! } - public var Notification_CallCanceledShort: String { return self._s[3626]! } - public var PhotoEditor_FadeTool: String { return self._s[3627]! } - public var Group_PublicLink_Info: String { return self._s[3628]! } - public var Contacts_DeselectAll: String { return self._s[3629]! } - public var Conversation_Moderate_Delete: String { return self._s[3631]! } - public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3632]! } - public var NotificationsSound_Note: String { return self._s[3635]! } + public var EmptyGroupInfo_Line4: String { return self._s[3626]! } + public var Conversation_SendMessageErrorTooMuchScheduled: String { return self._s[3628]! } + public var Notification_CallCanceledShort: String { return self._s[3629]! } + public var PhotoEditor_FadeTool: String { return self._s[3630]! } + public var Group_PublicLink_Info: String { return self._s[3631]! } + public var Contacts_DeselectAll: String { return self._s[3632]! } + public var Conversation_Moderate_Delete: String { return self._s[3634]! } + public var TwoStepAuth_RecoveryCodeInvalid: String { return self._s[3635]! } + public var NotificationsSound_Note: String { return self._s[3638]! } public func Message_PaymentSent(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3636]!, self._r[3636]!, [_0]) + return formatWithArgumentRanges(self._s[3639]!, self._r[3639]!, [_0]) } - public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3637]! } - public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3639]! } - public var DialogList_SearchSectionGlobal: String { return self._s[3640]! } - public var AccessDenied_Settings: String { return self._s[3641]! } - public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3642]! } - public var AuthSessions_EmptyTitle: String { return self._s[3643]! } - public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[3644]! } - public var GroupInfo_GroupType: String { return self._s[3645]! } - public var Calls_Missed: String { return self._s[3646]! } - public var Contacts_VoiceOver_AddContact: String { return self._s[3647]! } - public var UserInfo_GenericPhoneLabel: String { return self._s[3649]! } - public var Passport_Language_uz: String { return self._s[3650]! } - public var Conversation_StopQuizConfirmationTitle: String { return self._s[3651]! } - public var PhotoEditor_BlurToolPortrait: String { return self._s[3652]! } - public var VoiceChat_CreateNewVoiceChatStartNow: String { return self._s[3653]! } - public var Map_ChooseLocationTitle: String { return self._s[3654]! } - public var Checkout_EnterPassword: String { return self._s[3655]! } - public var GroupInfo_ConvertToSupergroup: String { return self._s[3656]! } - public var AutoNightTheme_UpdateLocation: String { return self._s[3657]! } - public var NetworkUsageSettings_Title: String { return self._s[3658]! } - public var Location_ProximityAlertCancelled: String { return self._s[3659]! } - public var SettingsSearch_Synonyms_ChatSettings_IntentsSettings: String { return self._s[3660]! } - public var Message_PinnedLiveLocationMessage: String { return self._s[3661]! } - public var Compose_NewChannel: String { return self._s[3662]! } - public var Privacy_PaymentsClearInfo: String { return self._s[3664]! } + public var Appearance_ThemePreview_ChatList_7_Text: String { return self._s[3640]! } + public var Channel_EditAdmin_PermissionInviteViaLink: String { return self._s[3642]! } + public var DialogList_SearchSectionGlobal: String { return self._s[3643]! } + public var AccessDenied_Settings: String { return self._s[3644]! } + public var Passport_Identity_TypeIdentityCardUploadScan: String { return self._s[3645]! } + public var AuthSessions_EmptyTitle: String { return self._s[3646]! } + public var TwoStepAuth_PasswordChangeSuccess: String { return self._s[3647]! } + public var GroupInfo_GroupType: String { return self._s[3648]! } + public var Calls_Missed: String { return self._s[3649]! } + public var Contacts_VoiceOver_AddContact: String { return self._s[3650]! } + public var UserInfo_GenericPhoneLabel: String { return self._s[3652]! } + public var Passport_Language_uz: String { return self._s[3653]! } + public var Conversation_StopQuizConfirmationTitle: String { return self._s[3654]! } + public var PhotoEditor_BlurToolPortrait: String { return self._s[3655]! } + public var VoiceChat_CreateNewVoiceChatStartNow: String { return self._s[3656]! } + public var Map_ChooseLocationTitle: String { return self._s[3657]! } + public var Checkout_EnterPassword: String { return self._s[3658]! } + public var GroupInfo_ConvertToSupergroup: String { return self._s[3659]! } + public var AutoNightTheme_UpdateLocation: String { return self._s[3660]! } + public var NetworkUsageSettings_Title: String { return self._s[3661]! } + public var Location_ProximityAlertCancelled: String { return self._s[3662]! } + public var SettingsSearch_Synonyms_ChatSettings_IntentsSettings: String { return self._s[3663]! } + public var Message_PinnedLiveLocationMessage: String { return self._s[3664]! } + public var Compose_NewChannel: String { return self._s[3665]! } + public var Privacy_PaymentsClearInfo: String { return self._s[3667]! } public func PUSH_MESSAGE_POLL(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3665]!, self._r[3665]!, [_1]) + return formatWithArgumentRanges(self._s[3668]!, self._r[3668]!, [_1]) } - public var Notification_Exceptions_AlwaysOn: String { return self._s[3666]! } - public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3667]! } - public var AutoNightTheme_AutomaticSection: String { return self._s[3670]! } - public var WallpaperSearch_ColorBrown: String { return self._s[3671]! } - public var Appearance_AppIconDefault: String { return self._s[3672]! } - public var StickerSettings_ContextInfo: String { return self._s[3675]! } - public var Channel_AddBotErrorNoRights: String { return self._s[3676]! } - public var Passport_FieldPhone: String { return self._s[3678]! } - public var Contacts_PermissionsTitle: String { return self._s[3679]! } - public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3680]! } + public var Notification_Exceptions_AlwaysOn: String { return self._s[3669]! } + public var Privacy_GroupsAndChannels_WhoCanAddMe: String { return self._s[3670]! } + public var AutoNightTheme_AutomaticSection: String { return self._s[3673]! } + public var WallpaperSearch_ColorBrown: String { return self._s[3674]! } + public var Appearance_AppIconDefault: String { return self._s[3675]! } + public var StickerSettings_ContextInfo: String { return self._s[3678]! } + public var Channel_AddBotErrorNoRights: String { return self._s[3679]! } + public var Passport_FieldPhone: String { return self._s[3681]! } + public var Contacts_PermissionsTitle: String { return self._s[3682]! } + public var TwoFactorSetup_Email_SkipConfirmationSkip: String { return self._s[3683]! } public func Notification_JoinedChat(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3681]!, self._r[3681]!, [_0]) + return formatWithArgumentRanges(self._s[3684]!, self._r[3684]!, [_0]) } - public var Bot_Unblock: String { return self._s[3682]! } - public var PasscodeSettings_SimplePasscode: String { return self._s[3683]! } - public var InviteLink_InviteLinkCopiedText: String { return self._s[3684]! } - public var Passport_PasswordHelp: String { return self._s[3685]! } - public var TwoFactorSetup_PasswordRecovery_PlaceholderConfirmPassword: String { return self._s[3686]! } - public var Watch_Conversation_UserInfo: String { return self._s[3687]! } + public var Bot_Unblock: String { return self._s[3685]! } + public var PasscodeSettings_SimplePasscode: String { return self._s[3686]! } + public var InviteLink_InviteLinkCopiedText: String { return self._s[3687]! } + public var Passport_PasswordHelp: String { return self._s[3688]! } + public var TwoFactorSetup_PasswordRecovery_PlaceholderConfirmPassword: String { return self._s[3689]! } + public var Watch_Conversation_UserInfo: String { return self._s[3690]! } public func Channel_AdminLog_MessageChangedGroupGeoLocation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3691]!, self._r[3691]!, [_0]) + return formatWithArgumentRanges(self._s[3694]!, self._r[3694]!, [_0]) } - public var State_Connecting: String { return self._s[3693]! } - public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3694]! } - public var TextFormat_AddLinkPlaceholder: String { return self._s[3695]! } - public var Conversation_Dice_u1F3B2: String { return self._s[3696]! } + public var State_Connecting: String { return self._s[3696]! } + public var Passport_Address_TypeTemporaryRegistration: String { return self._s[3697]! } + public var TextFormat_AddLinkPlaceholder: String { return self._s[3698]! } + public var Conversation_Dice_u1F3B2: String { return self._s[3699]! } public func Call_StatusBar(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3697]!, self._r[3697]!, [_0]) + return formatWithArgumentRanges(self._s[3700]!, self._r[3700]!, [_0]) } - public var Conversation_SendingOptionsTooltip: String { return self._s[3698]! } - public var ChatList_UndoArchiveTitle: String { return self._s[3699]! } - public var ChatList_EmptyChatListNewMessage: String { return self._s[3700]! } - public var WallpaperSearch_ColorGreen: String { return self._s[3702]! } - public var PhotoEditor_BlurToolOff: String { return self._s[3703]! } - public var Conversation_AutoremoveOff: String { return self._s[3704]! } - public var SocksProxySetup_PortPlaceholder: String { return self._s[3705]! } - public var Weekday_Saturday: String { return self._s[3706]! } - public var DialogList_Unread: String { return self._s[3707]! } - public var Watch_LastSeen_ALongTimeAgo: String { return self._s[3708]! } - public var Stats_GroupPosters: String { return self._s[3709]! } + public var Conversation_SendingOptionsTooltip: String { return self._s[3701]! } + public var ChatList_UndoArchiveTitle: String { return self._s[3702]! } + public var ChatList_EmptyChatListNewMessage: String { return self._s[3703]! } + public var WallpaperSearch_ColorGreen: String { return self._s[3705]! } + public var PhotoEditor_BlurToolOff: String { return self._s[3706]! } + public var Conversation_AutoremoveOff: String { return self._s[3707]! } + public var SocksProxySetup_PortPlaceholder: String { return self._s[3708]! } + public var Weekday_Saturday: String { return self._s[3709]! } + public var DialogList_Unread: String { return self._s[3710]! } + public var Watch_LastSeen_ALongTimeAgo: String { return self._s[3711]! } + public var Stats_GroupPosters: String { return self._s[3712]! } public func PUSH_ENCRYPTION_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3710]!, self._r[3710]!, [_1]) + return formatWithArgumentRanges(self._s[3713]!, self._r[3713]!, [_1]) } - public var Conversation_AlsoClearCacheTitle: String { return self._s[3711]! } + public var Conversation_AlsoClearCacheTitle: String { return self._s[3714]! } public func Conversation_ForwardTooltip_TwoChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3712]!, self._r[3712]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3715]!, self._r[3715]!, [_0, _1]) } public func Target_ShareGameConfirmationGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3715]!, self._r[3715]!, [_0]) + return formatWithArgumentRanges(self._s[3718]!, self._r[3718]!, [_0]) } - public var ReportPeer_ReasonChildAbuse: String { return self._s[3716]! } + public var ReportPeer_ReasonChildAbuse: String { return self._s[3719]! } public func Channel_AdminLog_MessageUnkickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3717]!, self._r[3717]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3720]!, self._r[3720]!, [_1, _2]) } - public var InfoPlist_NSContactsUsageDescription: String { return self._s[3718]! } - public var Conversation_EmailCopied: String { return self._s[3720]! } - public var AutoNightTheme_UseSunsetSunrise: String { return self._s[3721]! } - public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[3722]! } - public var Call_VoiceOver_VoiceCallCanceled: String { return self._s[3723]! } - public var VoiceChat_LateBy: String { return self._s[3724]! } - public var Passport_Language_dv: String { return self._s[3725]! } - public var TwoFactorSetup_PasswordRecovery_Text: String { return self._s[3726]! } - public var GroupPermission_AddSuccess: String { return self._s[3728]! } - public var Passport_Email_Help: String { return self._s[3729]! } - public var Call_ReportPlaceholder: String { return self._s[3730]! } - public var CreatePoll_AddOption: String { return self._s[3731]! } - public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3733]! } - public var PeerInfo_ButtonLeave: String { return self._s[3734]! } - public var PhotoEditor_TiltShift: String { return self._s[3737]! } - public var SecretGif_Title: String { return self._s[3739]! } - public var GroupInfo_InviteLinks: String { return self._s[3740]! } - public var PhotoEditor_QualityVeryLow: String { return self._s[3741]! } - public var SocksProxySetup_Connecting: String { return self._s[3743]! } - public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3744]! } - public var ContactInfo_PhoneLabelWork: String { return self._s[3745]! } - public var Stats_GroupTopHoursTitle: String { return self._s[3746]! } - public var Compose_NewMessage: String { return self._s[3747]! } - public var VoiceOver_Common_SwitchHint: String { return self._s[3748]! } - public var NotificationsSound_Synth: String { return self._s[3749]! } - public var ChatImport_UserErrorNotMutual: String { return self._s[3750]! } - public var Conversation_FileOpenIn: String { return self._s[3751]! } - public var AutoDownloadSettings_WifiTitle: String { return self._s[3752]! } - public var UserInfo_SendMessage: String { return self._s[3753]! } - public var Checkout_PayWithFaceId: String { return self._s[3754]! } + public var InfoPlist_NSContactsUsageDescription: String { return self._s[3721]! } + public var Conversation_EmailCopied: String { return self._s[3723]! } + public var AutoNightTheme_UseSunsetSunrise: String { return self._s[3724]! } + public var Channel_OwnershipTransfer_ChangeOwner: String { return self._s[3725]! } + public var Call_VoiceOver_VoiceCallCanceled: String { return self._s[3726]! } + public var VoiceChat_LateBy: String { return self._s[3727]! } + public var Passport_Language_dv: String { return self._s[3728]! } + public var TwoFactorSetup_PasswordRecovery_Text: String { return self._s[3729]! } + public var GroupPermission_AddSuccess: String { return self._s[3731]! } + public var Passport_Email_Help: String { return self._s[3732]! } + public var Call_ReportPlaceholder: String { return self._s[3733]! } + public var CreatePoll_AddOption: String { return self._s[3734]! } + public var MessagePoll_LabelAnonymousQuiz: String { return self._s[3736]! } + public var PeerInfo_ButtonLeave: String { return self._s[3737]! } + public var PhotoEditor_TiltShift: String { return self._s[3740]! } + public var SecretGif_Title: String { return self._s[3742]! } + public var GroupInfo_InviteLinks: String { return self._s[3743]! } + public var PhotoEditor_QualityVeryLow: String { return self._s[3744]! } + public var SocksProxySetup_Connecting: String { return self._s[3746]! } + public var PrivacySettings_PasscodeAndFaceId: String { return self._s[3747]! } + public var ContactInfo_PhoneLabelWork: String { return self._s[3748]! } + public var Stats_GroupTopHoursTitle: String { return self._s[3749]! } + public var Compose_NewMessage: String { return self._s[3750]! } + public var VoiceOver_Common_SwitchHint: String { return self._s[3751]! } + public var NotificationsSound_Synth: String { return self._s[3752]! } + public var ChatImport_UserErrorNotMutual: String { return self._s[3753]! } + public var Conversation_FileOpenIn: String { return self._s[3754]! } + public var AutoDownloadSettings_WifiTitle: String { return self._s[3755]! } + public var UserInfo_SendMessage: String { return self._s[3756]! } + public var Checkout_PayWithFaceId: String { return self._s[3757]! } public func Map_LiveLocationShortHour(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3755]!, self._r[3755]!, [_0]) + return formatWithArgumentRanges(self._s[3758]!, self._r[3758]!, [_0]) } - public var TextFormat_Strikethrough: String { return self._s[3756]! } - public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[3757]! } - public var Conversation_ViewChannel: String { return self._s[3758]! } + public var TextFormat_Strikethrough: String { return self._s[3759]! } + public var SettingsSearch_Synonyms_Notifications_DisplayNamesOnLockScreen: String { return self._s[3760]! } + public var Conversation_ViewChannel: String { return self._s[3761]! } public func Message_ForwardedMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3759]!, self._r[3759]!, [_0]) + return formatWithArgumentRanges(self._s[3762]!, self._r[3762]!, [_0]) } - public var Channel_Stickers_Placeholder: String { return self._s[3760]! } - public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3761]! } - public var Message_ScamAccount: String { return self._s[3762]! } - public var Camera_FlashAuto: String { return self._s[3763]! } - public var Conversation_EncryptedDescription1: String { return self._s[3764]! } - public var LocalGroup_Text: String { return self._s[3765]! } - public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[3766]! } - public var UserInfo_FirstNamePlaceholder: String { return self._s[3767]! } - public var Conversation_SendMessageErrorFlood: String { return self._s[3768]! } - public var Conversation_EncryptedDescription2: String { return self._s[3769]! } - public var Conversation_CancelForwardText: String { return self._s[3770]! } - public var Notification_GroupActivated: String { return self._s[3771]! } - public var LastSeen_Lately: String { return self._s[3772]! } - public var Conversation_EncryptedDescription3: String { return self._s[3773]! } - public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[3774]! } - public var TwoStepAuth_RecoveryUnavailableResetText: String { return self._s[3775]! } - public var Conversation_SwipeToReplyHintText: String { return self._s[3776]! } - public var Conversation_EncryptedDescription4: String { return self._s[3777]! } - public var SharedMedia_EmptyTitle: String { return self._s[3778]! } - public var Appearance_CreateTheme: String { return self._s[3780]! } - public var Stats_SharesPerPost: String { return self._s[3781]! } - public var Contacts_TabTitle: String { return self._s[3782]! } - public var Weekday_ShortThursday: String { return self._s[3783]! } - public var MessageTimer_Forever: String { return self._s[3784]! } - public var ChatListFolder_CategoryArchived: String { return self._s[3785]! } - public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3786]! } - public var EditTheme_Create_TopInfo: String { return self._s[3788]! } - public var TwoFactorRemember_Forgot: String { return self._s[3789]! } + public var Channel_Stickers_Placeholder: String { return self._s[3763]! } + public var Channel_OwnershipTransfer_PasswordPlaceholder: String { return self._s[3764]! } + public var Message_ScamAccount: String { return self._s[3765]! } + public var Camera_FlashAuto: String { return self._s[3766]! } + public var Conversation_EncryptedDescription1: String { return self._s[3767]! } + public var LocalGroup_Text: String { return self._s[3768]! } + public var SettingsSearch_Synonyms_Data_Storage_KeepMedia: String { return self._s[3769]! } + public var UserInfo_FirstNamePlaceholder: String { return self._s[3770]! } + public var Conversation_SendMessageErrorFlood: String { return self._s[3771]! } + public var Conversation_EncryptedDescription2: String { return self._s[3772]! } + public var Conversation_CancelForwardText: String { return self._s[3773]! } + public var Notification_GroupActivated: String { return self._s[3774]! } + public var LastSeen_Lately: String { return self._s[3775]! } + public var Conversation_EncryptedDescription3: String { return self._s[3776]! } + public var SettingsSearch_Synonyms_Privacy_ProfilePhoto: String { return self._s[3777]! } + public var TwoStepAuth_RecoveryUnavailableResetText: String { return self._s[3778]! } + public var Conversation_SwipeToReplyHintText: String { return self._s[3779]! } + public var Conversation_EncryptedDescription4: String { return self._s[3780]! } + public var SharedMedia_EmptyTitle: String { return self._s[3781]! } + public var Appearance_CreateTheme: String { return self._s[3783]! } + public var Stats_SharesPerPost: String { return self._s[3784]! } + public var Contacts_TabTitle: String { return self._s[3785]! } + public var Weekday_ShortThursday: String { return self._s[3786]! } + public var MessageTimer_Forever: String { return self._s[3787]! } + public var ChatListFolder_CategoryArchived: String { return self._s[3788]! } + public var Channel_EditAdmin_PermissionDeleteMessages: String { return self._s[3789]! } + public var EditTheme_Create_TopInfo: String { return self._s[3791]! } + public var TwoFactorRemember_Forgot: String { return self._s[3792]! } public func VoiceOver_ChatList_MessageFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3790]!, self._r[3790]!, [_0]) + return formatWithArgumentRanges(self._s[3793]!, self._r[3793]!, [_0]) } - public var Month_GenDecember: String { return self._s[3791]! } - public var EnterPasscode_EnterPasscode: String { return self._s[3792]! } - public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3793]! } - public var PeopleNearby_CreateGroup: String { return self._s[3795]! } - public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3796]! } - public var Paint_ClearConfirm: String { return self._s[3797]! } - public var ChatList_ReadAll: String { return self._s[3798]! } - public var ChatSettings_IntentsSettings: String { return self._s[3799]! } - public var Passport_PassportInformation: String { return self._s[3801]! } - public var Login_CheckOtherSessionMessages: String { return self._s[3803]! } - public var Location_ProximityNotification_DistanceMI: String { return self._s[3806]! } - public var PhotoEditor_ExposureTool: String { return self._s[3807]! } - public var Group_Username_CreatePrivateLinkHelp: String { return self._s[3808]! } - public var SettingsSearch_Synonyms_Watch: String { return self._s[3809]! } - public var Stats_GroupTopPoster_History: String { return self._s[3810]! } - public var UserInfo_AddPhone: String { return self._s[3811]! } - public var Media_SendWithTimer: String { return self._s[3813]! } - public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[3814]! } - public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3815]! } - public var GroupInfo_GroupHistoryShort: String { return self._s[3816]! } - public var PasscodeSettings_AutoLock_Disabled: String { return self._s[3817]! } - public var ChatList_Context_Unarchive: String { return self._s[3819]! } + public var Month_GenDecember: String { return self._s[3794]! } + public var EnterPasscode_EnterPasscode: String { return self._s[3795]! } + public var SettingsSearch_Synonyms_Appearance_LargeEmoji: String { return self._s[3796]! } + public var PeopleNearby_CreateGroup: String { return self._s[3798]! } + public var Group_EditAdmin_PermissionChangeInfo: String { return self._s[3799]! } + public var Paint_ClearConfirm: String { return self._s[3800]! } + public var ChatList_ReadAll: String { return self._s[3801]! } + public var ChatSettings_IntentsSettings: String { return self._s[3802]! } + public var Passport_PassportInformation: String { return self._s[3804]! } + public var Login_CheckOtherSessionMessages: String { return self._s[3806]! } + public var Location_ProximityNotification_DistanceMI: String { return self._s[3809]! } + public var PhotoEditor_ExposureTool: String { return self._s[3810]! } + public var Group_Username_CreatePrivateLinkHelp: String { return self._s[3811]! } + public var SettingsSearch_Synonyms_Watch: String { return self._s[3812]! } + public var Stats_GroupTopPoster_History: String { return self._s[3813]! } + public var UserInfo_AddPhone: String { return self._s[3814]! } + public var Media_SendWithTimer: String { return self._s[3816]! } + public var SettingsSearch_Synonyms_Notifications_Title: String { return self._s[3817]! } + public var Channel_EditAdmin_PermissionEnabledByDefault: String { return self._s[3818]! } + public var GroupInfo_GroupHistoryShort: String { return self._s[3819]! } + public var PasscodeSettings_AutoLock_Disabled: String { return self._s[3820]! } + public var ChatList_Context_Unarchive: String { return self._s[3822]! } public func DialogList_LiveLocationSharingTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3820]!, self._r[3820]!, [_0]) + return formatWithArgumentRanges(self._s[3823]!, self._r[3823]!, [_0]) } - public var BlockedUsers_Title: String { return self._s[3822]! } - public var TwoStepAuth_EmailPlaceholder: String { return self._s[3823]! } - public var Media_ShareThisPhoto: String { return self._s[3824]! } - public var Notifications_DisplayNamesOnLockScreen: String { return self._s[3825]! } - public var Conversation_FilePhotoOrVideo: String { return self._s[3826]! } - public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3830]! } - public var CallFeedback_ReasonNoise: String { return self._s[3832]! } - public var WebBrowser_Title: String { return self._s[3833]! } + public var BlockedUsers_Title: String { return self._s[3825]! } + public var TwoStepAuth_EmailPlaceholder: String { return self._s[3826]! } + public var Media_ShareThisPhoto: String { return self._s[3827]! } + public var Notifications_DisplayNamesOnLockScreen: String { return self._s[3828]! } + public var Conversation_FilePhotoOrVideo: String { return self._s[3829]! } + public var Appearance_ThemePreview_Chat_2_ReplyName: String { return self._s[3833]! } + public var CallFeedback_ReasonNoise: String { return self._s[3835]! } + public var WebBrowser_Title: String { return self._s[3836]! } public func Checkout_SavePasswordTimeoutAndTouchId(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3834]!, self._r[3834]!, [_0]) + return formatWithArgumentRanges(self._s[3837]!, self._r[3837]!, [_0]) } - public var Notification_MessageLifetime5s: String { return self._s[3836]! } - public var Passport_Address_AddResidentialAddress: String { return self._s[3837]! } - public var Profile_MessageLifetime1m: String { return self._s[3839]! } - public var Passport_ScanPassport: String { return self._s[3840]! } - public var Stats_LoadingTitle: String { return self._s[3841]! } - public var Passport_Address_AddTemporaryRegistration: String { return self._s[3843]! } - public var Permissions_NotificationsAllow_v0: String { return self._s[3844]! } - public var Login_InvalidFirstNameError: String { return self._s[3845]! } - public var Undo_ChatCleared: String { return self._s[3847]! } + public var Notification_MessageLifetime5s: String { return self._s[3839]! } + public var Passport_Address_AddResidentialAddress: String { return self._s[3840]! } + public var Profile_MessageLifetime1m: String { return self._s[3842]! } + public var Passport_ScanPassport: String { return self._s[3843]! } + public var Stats_LoadingTitle: String { return self._s[3844]! } + public var Passport_Address_AddTemporaryRegistration: String { return self._s[3846]! } + public var Permissions_NotificationsAllow_v0: String { return self._s[3847]! } + public var Login_InvalidFirstNameError: String { return self._s[3848]! } + public var Undo_ChatCleared: String { return self._s[3850]! } public func ApplyLanguage_ChangeLanguageUnofficialText(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3849]!, self._r[3849]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3852]!, self._r[3852]!, [_1, _2]) } - public var Conversation_PinMessageAlertPin: String { return self._s[3850]! } + public var Conversation_PinMessageAlertPin: String { return self._s[3853]! } public func Login_PhoneBannedEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3851]!, self._r[3851]!, [_1, _2, _3, _4, _5]) + return formatWithArgumentRanges(self._s[3854]!, self._r[3854]!, [_1, _2, _3, _4, _5]) } public func PUSH_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3852]!, self._r[3852]!, [_1]) + return formatWithArgumentRanges(self._s[3855]!, self._r[3855]!, [_1]) } - public var Share_MultipleMessagesDisabled: String { return self._s[3853]! } - public var TwoStepAuth_EmailInvalid: String { return self._s[3854]! } - public var EnterPasscode_ChangeTitle: String { return self._s[3856]! } - public var VoiceChat_InviteLink_Speaker: String { return self._s[3857]! } - public var CallSettings_RecentCalls: String { return self._s[3858]! } - public var GroupInfo_DeactivatedStatus: String { return self._s[3859]! } - public var AuthSessions_OtherSessions: String { return self._s[3860]! } - public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3861]! } - public var Tour_Text5: String { return self._s[3862]! } - public var Login_PadPhoneHelp: String { return self._s[3863]! } - public var Wallpaper_PhotoLibrary: String { return self._s[3866]! } - public var Conversation_ViewGroup: String { return self._s[3867]! } - public var PeopleNearby_MakeVisibleTitle: String { return self._s[3869]! } - public var VoiceOver_Chat_YourContact: String { return self._s[3870]! } - public var Watch_AuthRequired: String { return self._s[3871]! } - public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3873]! } - public var Conversation_ForwardContacts: String { return self._s[3874]! } - public var Conversation_InputTextPlaceholder: String { return self._s[3875]! } + public var Share_MultipleMessagesDisabled: String { return self._s[3856]! } + public var TwoStepAuth_EmailInvalid: String { return self._s[3857]! } + public var EnterPasscode_ChangeTitle: String { return self._s[3859]! } + public var VoiceChat_InviteLink_Speaker: String { return self._s[3860]! } + public var CallSettings_RecentCalls: String { return self._s[3861]! } + public var GroupInfo_DeactivatedStatus: String { return self._s[3862]! } + public var AuthSessions_OtherSessions: String { return self._s[3863]! } + public var PrivacyLastSeenSettings_CustomHelp: String { return self._s[3864]! } + public var Tour_Text5: String { return self._s[3865]! } + public var Login_PadPhoneHelp: String { return self._s[3866]! } + public var Wallpaper_PhotoLibrary: String { return self._s[3869]! } + public var Conversation_ViewGroup: String { return self._s[3870]! } + public var PeopleNearby_MakeVisibleTitle: String { return self._s[3872]! } + public var VoiceOver_Chat_YourContact: String { return self._s[3873]! } + public var Watch_AuthRequired: String { return self._s[3874]! } + public var VoiceOver_Chat_ForwardedFromYou: String { return self._s[3876]! } + public var Conversation_ForwardContacts: String { return self._s[3877]! } + public var Conversation_InputTextPlaceholder: String { return self._s[3878]! } public func PUSH_CHANNEL_MESSAGE_PHOTO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3876]!, self._r[3876]!, [_1]) + return formatWithArgumentRanges(self._s[3879]!, self._r[3879]!, [_1]) } public func Conversation_MessageViaUser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3877]!, self._r[3877]!, [_0]) + return formatWithArgumentRanges(self._s[3880]!, self._r[3880]!, [_0]) } - public var Channel_Setup_TypePrivate: String { return self._s[3878]! } + public var Channel_Setup_TypePrivate: String { return self._s[3881]! } public func Conversation_NoticeInvitedByInChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3879]!, self._r[3879]!, [_0]) + return formatWithArgumentRanges(self._s[3882]!, self._r[3882]!, [_0]) } - public var Checkout_OptionalTipItemPlaceholder: String { return self._s[3880]! } - public var InviteLink_Create_TimeLimitExpiryDate: String { return self._s[3881]! } - public var InfoPlist_NSSiriUsageDescription: String { return self._s[3882]! } - public var AutoDownloadSettings_Delimeter: String { return self._s[3883]! } - public var EmptyGroupInfo_Subtitle: String { return self._s[3884]! } - public var UserInfo_StartSecretChatStart: String { return self._s[3885]! } + public var Checkout_OptionalTipItemPlaceholder: String { return self._s[3883]! } + public var InviteLink_Create_TimeLimitExpiryDate: String { return self._s[3884]! } + public var InfoPlist_NSSiriUsageDescription: String { return self._s[3885]! } + public var AutoDownloadSettings_Delimeter: String { return self._s[3886]! } + public var EmptyGroupInfo_Subtitle: String { return self._s[3887]! } + public var UserInfo_StartSecretChatStart: String { return self._s[3888]! } public func GroupPermission_AddedInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3886]!, self._r[3886]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3889]!, self._r[3889]!, [_1, _2]) } public func Channel_AdminLog_MessageRestricted(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3887]!, self._r[3887]!, [_0, _1, _2]) + return formatWithArgumentRanges(self._s[3890]!, self._r[3890]!, [_0, _1, _2]) } public func Conversation_ForwardTooltip_TwoChats_Many(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3888]!, self._r[3888]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3891]!, self._r[3891]!, [_0, _1]) } - public var PrivacySettings_AutoArchiveTitle: String { return self._s[3889]! } - public var GroupInfo_InviteLink_LinkSection: String { return self._s[3890]! } - public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[3891]! } - public var StickerPacksSettings_ArchivedMasks: String { return self._s[3893]! } - public var NewContact_Title: String { return self._s[3896]! } - public var Appearance_ThemeCarouselTintedNight: String { return self._s[3897]! } - public var VoiceChat_StatusSpeaking: String { return self._s[3898]! } - public var Notifications_PermissionsKeepDisabled: String { return self._s[3899]! } + public var PrivacySettings_AutoArchiveTitle: String { return self._s[3892]! } + public var GroupInfo_InviteLink_LinkSection: String { return self._s[3893]! } + public var FastTwoStepSetup_EmailPlaceholder: String { return self._s[3894]! } + public var StickerPacksSettings_ArchivedMasks: String { return self._s[3896]! } + public var NewContact_Title: String { return self._s[3899]! } + public var Appearance_ThemeCarouselTintedNight: String { return self._s[3900]! } + public var VoiceChat_StatusSpeaking: String { return self._s[3901]! } + public var Notifications_PermissionsKeepDisabled: String { return self._s[3902]! } public func Time_YesterdayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3900]!, self._r[3900]!, [_0]) + return formatWithArgumentRanges(self._s[3903]!, self._r[3903]!, [_0]) } public func AutoNightTheme_LocationHelp(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3901]!, self._r[3901]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3904]!, self._r[3904]!, [_0, _1]) } - public var Chat_SlowmodeTooltipPending: String { return self._s[3902]! } + public var Chat_SlowmodeTooltipPending: String { return self._s[3905]! } public func Time_MediumDate(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3904]!, self._r[3904]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3907]!, self._r[3907]!, [_1, _2]) } - public var ContactInfo_PhoneLabelHome: String { return self._s[3905]! } - public var CallFeedback_ReasonInterruption: String { return self._s[3906]! } - public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[3907]! } - public var Conversation_MessageEditedLabel: String { return self._s[3910]! } - public var CallList_ActiveVoiceChatsHeader: String { return self._s[3911]! } - public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3912]! } - public var ChatList_Context_AddToContacts: String { return self._s[3913]! } - public var Passport_Language_is: String { return self._s[3914]! } - public var Notification_PassportValueProofOfIdentity: String { return self._s[3915]! } - public var PhotoEditor_CurvesBlue: String { return self._s[3916]! } + public var ContactInfo_PhoneLabelHome: String { return self._s[3908]! } + public var CallFeedback_ReasonInterruption: String { return self._s[3909]! } + public var Passport_Identity_OneOfTypeDriversLicense: String { return self._s[3910]! } + public var Conversation_MessageEditedLabel: String { return self._s[3913]! } + public var CallList_ActiveVoiceChatsHeader: String { return self._s[3914]! } + public var SocksProxySetup_PasswordPlaceholder: String { return self._s[3915]! } + public var ChatList_Context_AddToContacts: String { return self._s[3916]! } + public var Passport_Language_is: String { return self._s[3917]! } + public var Notification_PassportValueProofOfIdentity: String { return self._s[3918]! } + public var PhotoEditor_CurvesBlue: String { return self._s[3919]! } public func FileSize_MB(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3917]!, self._r[3917]!, [_0]) + return formatWithArgumentRanges(self._s[3920]!, self._r[3920]!, [_0]) } - public var SocksProxySetup_Username: String { return self._s[3918]! } - public var Login_SmsRequestState3: String { return self._s[3919]! } - public var Message_PinnedVideoMessage: String { return self._s[3920]! } - public var SharedMedia_TitleLink: String { return self._s[3921]! } - public var Passport_FieldIdentity: String { return self._s[3922]! } - public var GroupInfo_Permissions_BroadcastConvert: String { return self._s[3924]! } + public var SocksProxySetup_Username: String { return self._s[3921]! } + public var Login_SmsRequestState3: String { return self._s[3922]! } + public var Message_PinnedVideoMessage: String { return self._s[3923]! } + public var SharedMedia_TitleLink: String { return self._s[3924]! } + public var Passport_FieldIdentity: String { return self._s[3925]! } + public var GroupInfo_Permissions_BroadcastConvert: String { return self._s[3927]! } public func Conversation_EncryptedPlaceholderTitleOutgoing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3927]!, self._r[3927]!, [_0]) + return formatWithArgumentRanges(self._s[3930]!, self._r[3930]!, [_0]) } - public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[3930]! } - public var ReportSpam_DeleteThisChat: String { return self._s[3931]! } - public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3932]! } - public var Passport_Identity_DateOfBirth: String { return self._s[3933]! } - public var Call_StatusIncoming: String { return self._s[3934]! } - public var ChatAdmins_AdminLabel: String { return self._s[3935]! } + public var DialogList_ProxyConnectionIssuesTooltip: String { return self._s[3933]! } + public var ReportSpam_DeleteThisChat: String { return self._s[3934]! } + public var Checkout_NewCard_CardholderNamePlaceholder: String { return self._s[3935]! } + public var Passport_Identity_DateOfBirth: String { return self._s[3936]! } + public var Call_StatusIncoming: String { return self._s[3937]! } + public var ChatAdmins_AdminLabel: String { return self._s[3938]! } public func InstantPage_OpenInBrowser(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3936]!, self._r[3936]!, [_0]) + return formatWithArgumentRanges(self._s[3939]!, self._r[3939]!, [_0]) } public func Time_MonthOfYear_m10(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3938]!, self._r[3938]!, [_0]) + return formatWithArgumentRanges(self._s[3941]!, self._r[3941]!, [_0]) } - public var Message_PinnedAnimationMessage: String { return self._s[3939]! } - public var VoiceChat_TapToViewCameraVideo: String { return self._s[3940]! } - public var Conversation_ReportSpamAndLeave: String { return self._s[3941]! } - public var Preview_CopyAddress: String { return self._s[3942]! } - public var MediaPlayer_UnknownTrack: String { return self._s[3944]! } - public var Login_CancelSignUpConfirmation: String { return self._s[3945]! } - public var Map_OpenInYandexMaps: String { return self._s[3947]! } + public var Message_PinnedAnimationMessage: String { return self._s[3942]! } + public var VoiceChat_TapToViewCameraVideo: String { return self._s[3943]! } + public var Conversation_ReportSpamAndLeave: String { return self._s[3944]! } + public var Preview_CopyAddress: String { return self._s[3945]! } + public var MediaPlayer_UnknownTrack: String { return self._s[3947]! } + public var Login_CancelSignUpConfirmation: String { return self._s[3948]! } + public var Map_OpenInYandexMaps: String { return self._s[3950]! } public func Time_PreciseDate_m11(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3950]!, self._r[3950]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[3953]!, self._r[3953]!, [_1, _2, _3]) } - public var GroupRemoved_Remove: String { return self._s[3951]! } - public var ChatListFolder_TitleCreate: String { return self._s[3952]! } + public var GroupRemoved_Remove: String { return self._s[3954]! } + public var ChatListFolder_TitleCreate: String { return self._s[3955]! } public func InstantPage_AuthorAndDateTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3954]!, self._r[3954]!, [_1, _2]) + return formatWithArgumentRanges(self._s[3957]!, self._r[3957]!, [_1, _2]) } - public var Watch_UserInfo_MuteTitle: String { return self._s[3955]! } + public var Watch_UserInfo_MuteTitle: String { return self._s[3958]! } public func UserInfo_LinkForwardTooltip_TwoChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3957]!, self._r[3957]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3960]!, self._r[3960]!, [_0, _1]) } - public var Group_UpgradeNoticeText2: String { return self._s[3958]! } - public var Stats_GroupGrowthTitle: String { return self._s[3959]! } - public var CreatePoll_CancelConfirmation: String { return self._s[3962]! } - public var Month_GenOctober: String { return self._s[3963]! } - public var Conversation_TitleCommentsEmpty: String { return self._s[3964]! } - public var Settings_Appearance: String { return self._s[3965]! } + public var Group_UpgradeNoticeText2: String { return self._s[3961]! } + public var Stats_GroupGrowthTitle: String { return self._s[3962]! } + public var CreatePoll_CancelConfirmation: String { return self._s[3965]! } + public var Month_GenOctober: String { return self._s[3966]! } + public var Conversation_TitleCommentsEmpty: String { return self._s[3967]! } + public var Settings_Appearance: String { return self._s[3968]! } public func Time_MonthOfYear_m6(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3966]!, self._r[3966]!, [_0]) + return formatWithArgumentRanges(self._s[3969]!, self._r[3969]!, [_0]) } - public var UserInfo_AddToExisting: String { return self._s[3967]! } - public var Call_PhoneCallInProgressMessage: String { return self._s[3969]! } - public var Map_HomeAndWorkInfo: String { return self._s[3970]! } - public var VoiceChat_ContextAudio: String { return self._s[3971]! } - public var InstantPage_VoiceOver_ResetFontSize: String { return self._s[3972]! } - public var Paint_Arrow: String { return self._s[3973]! } - public var InviteLink_CreatePrivateLinkHelp: String { return self._s[3974]! } + public var UserInfo_AddToExisting: String { return self._s[3970]! } + public var Call_PhoneCallInProgressMessage: String { return self._s[3972]! } + public var Map_HomeAndWorkInfo: String { return self._s[3973]! } + public var VoiceChat_ContextAudio: String { return self._s[3974]! } + public var InstantPage_VoiceOver_ResetFontSize: String { return self._s[3975]! } + public var Paint_Arrow: String { return self._s[3976]! } + public var InviteLink_CreatePrivateLinkHelp: String { return self._s[3977]! } public func DialogList_MultipleTypingPair(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3975]!, self._r[3975]!, [_0, _1]) + return formatWithArgumentRanges(self._s[3978]!, self._r[3978]!, [_0, _1]) } - public var CancelResetAccount_Title: String { return self._s[3976]! } - public var NotificationsSound_Circles: String { return self._s[3977]! } - public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[3978]! } - public var ChatState_Connecting: String { return self._s[3980]! } - public var Profile_MessageLifetime5s: String { return self._s[3981]! } + public var CancelResetAccount_Title: String { return self._s[3979]! } + public var NotificationsSound_Circles: String { return self._s[3980]! } + public var Notifications_GroupNotificationsExceptionsHelp: String { return self._s[3981]! } + public var ChatState_Connecting: String { return self._s[3983]! } + public var Profile_MessageLifetime5s: String { return self._s[3984]! } public func DialogList_AwaitingEncryption(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3982]!, self._r[3982]!, [_0]) + return formatWithArgumentRanges(self._s[3985]!, self._r[3985]!, [_0]) } - public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[3983]! } - public var Channel_Username_CreatePublicLinkHelp: String { return self._s[3984]! } - public var AutoNightTheme_ScheduledTo: String { return self._s[3985]! } - public var Conversation_DefaultRestrictedStickers: String { return self._s[3987]! } - public var TwoStepAuth_ConfirmationTitle: String { return self._s[3988]! } + public var PrivacyPolicy_AgeVerificationTitle: String { return self._s[3986]! } + public var Channel_Username_CreatePublicLinkHelp: String { return self._s[3987]! } + public var AutoNightTheme_ScheduledTo: String { return self._s[3988]! } + public var Conversation_DefaultRestrictedStickers: String { return self._s[3990]! } + public var TwoStepAuth_ConfirmationTitle: String { return self._s[3991]! } public func Chat_UnsendMyMessagesAlertTitle(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[3989]!, self._r[3989]!, [_0]) + return formatWithArgumentRanges(self._s[3992]!, self._r[3992]!, [_0]) } - public var Passport_Phone_Help: String { return self._s[3990]! } - public var Privacy_ContactsSync: String { return self._s[3991]! } - public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3992]! } - public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[3994]! } - public var Map_SendMyCurrentLocation: String { return self._s[3995]! } - public var Map_AddressOnMap: String { return self._s[3996]! } - public var BroadcastGroups_ConfirmationAlert_Convert: String { return self._s[3998]! } - public var DialogList_SearchLabel: String { return self._s[3999]! } - public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[4000]! } - public var GroupInfo_FakeGroupWarning: String { return self._s[4001]! } - public var Conversation_ChecksTooltip_Read: String { return self._s[4003]! } - public var TwoFactorRemember_Placeholder: String { return self._s[4005]! } - public var ConversationProfile_UnknownAddMemberError: String { return self._s[4006]! } - public var ChatList_Search_ShowMore: String { return self._s[4007]! } - public var DialogList_EncryptionRejected: String { return self._s[4008]! } - public var VoiceChat_InviteLinkCopiedText: String { return self._s[4009]! } - public var DialogList_DeleteBotConfirmation: String { return self._s[4010]! } - public var VoiceChat_StartRecordingText: String { return self._s[4011]! } - public var Privacy_TopPeersDelete: String { return self._s[4012]! } - public var AttachmentMenu_SendAsFile: String { return self._s[4014]! } - public var ChatList_GenericPsaAlert: String { return self._s[4016]! } - public var SecretTimer_ImageDescription: String { return self._s[4018]! } + public var Passport_Phone_Help: String { return self._s[3993]! } + public var Privacy_ContactsSync: String { return self._s[3994]! } + public var CheckoutInfo_ReceiverInfoPhone: String { return self._s[3995]! } + public var Channel_AdminLogFilter_EventsLeavingSubscribers: String { return self._s[3997]! } + public var Map_SendMyCurrentLocation: String { return self._s[3998]! } + public var Map_AddressOnMap: String { return self._s[3999]! } + public var BroadcastGroups_ConfirmationAlert_Convert: String { return self._s[4001]! } + public var DialogList_SearchLabel: String { return self._s[4002]! } + public var Notification_Exceptions_NewException_NotificationHeader: String { return self._s[4003]! } + public var GroupInfo_FakeGroupWarning: String { return self._s[4004]! } + public var Conversation_ChecksTooltip_Read: String { return self._s[4006]! } + public var TwoFactorRemember_Placeholder: String { return self._s[4008]! } + public var ConversationProfile_UnknownAddMemberError: String { return self._s[4009]! } + public var ChatList_Search_ShowMore: String { return self._s[4010]! } + public var DialogList_EncryptionRejected: String { return self._s[4011]! } + public var VoiceChat_InviteLinkCopiedText: String { return self._s[4012]! } + public var DialogList_DeleteBotConfirmation: String { return self._s[4013]! } + public var VoiceChat_StartRecordingText: String { return self._s[4014]! } + public var Privacy_TopPeersDelete: String { return self._s[4015]! } + public var AttachmentMenu_SendAsFile: String { return self._s[4017]! } + public var ChatList_GenericPsaAlert: String { return self._s[4019]! } + public var SecretTimer_ImageDescription: String { return self._s[4021]! } public func Conversation_SetReminder_RemindOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4019]!, self._r[4019]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4022]!, self._r[4022]!, [_0, _1]) } - public var VoiceChat_EditNameSuccess: String { return self._s[4020]! } - public var ChatSettings_TextSizeUnits: String { return self._s[4021]! } - public var Notification_RenamedGroup: String { return self._s[4023]! } - public var Tour_Title2: String { return self._s[4024]! } - public var Settings_CopyUsername: String { return self._s[4025]! } - public var Compose_NewEncryptedChat: String { return self._s[4026]! } - public var Conversation_CloudStorageInfo_Title: String { return self._s[4027]! } - public var VoiceChat_SetReminder: String { return self._s[4028]! } - public var Month_ShortSeptember: String { return self._s[4029]! } - public var AutoDownloadSettings_OnForAll: String { return self._s[4030]! } - public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[4031]! } - public var VoiceChat_StartNow: String { return self._s[4032]! } - public var Call_StatusConnecting: String { return self._s[4034]! } - public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[4035]! } - public var Map_ShareLiveLocationHelp: String { return self._s[4036]! } - public var Cache_Files: String { return self._s[4037]! } - public var Notifications_Reset: String { return self._s[4038]! } + public var VoiceChat_EditNameSuccess: String { return self._s[4023]! } + public var ChatSettings_TextSizeUnits: String { return self._s[4024]! } + public var Notification_RenamedGroup: String { return self._s[4026]! } + public var Tour_Title2: String { return self._s[4027]! } + public var Settings_CopyUsername: String { return self._s[4028]! } + public var Compose_NewEncryptedChat: String { return self._s[4029]! } + public var Conversation_CloudStorageInfo_Title: String { return self._s[4030]! } + public var VoiceChat_SetReminder: String { return self._s[4031]! } + public var Month_ShortSeptember: String { return self._s[4032]! } + public var AutoDownloadSettings_OnForAll: String { return self._s[4033]! } + public var ChatList_DeleteForEveryoneConfirmationText: String { return self._s[4034]! } + public var VoiceChat_StartNow: String { return self._s[4035]! } + public var Call_StatusConnecting: String { return self._s[4037]! } + public var Privacy_GroupsAndChannels_NeverAllow_Placeholder: String { return self._s[4038]! } + public var Map_ShareLiveLocationHelp: String { return self._s[4039]! } + public var Cache_Files: String { return self._s[4040]! } + public var Notifications_Reset: String { return self._s[4041]! } public func Settings_KeepPhoneNumber(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4039]!, self._r[4039]!, [_0]) + return formatWithArgumentRanges(self._s[4042]!, self._r[4042]!, [_0]) } - public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[4040]! } + public var Privacy_GroupsAndChannels_AlwaysAllow_Title: String { return self._s[4043]! } public func Conversation_OpenBotLinkLogin(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4041]!, self._r[4041]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4044]!, self._r[4044]!, [_1, _2]) } - public var Notification_CallIncomingShort: String { return self._s[4042]! } - public var UserInfo_BotPrivacy: String { return self._s[4045]! } - public var Appearance_BubbleCorners_Apply: String { return self._s[4046]! } - public var WebSearch_RecentClearConfirmation: String { return self._s[4047]! } - public var Conversation_ContextMenuLookUp: String { return self._s[4049]! } - public var Calls_RatingTitle: String { return self._s[4050]! } - public var SecretImage_Title: String { return self._s[4051]! } - public var Weekday_Monday: String { return self._s[4052]! } + public var Notification_CallIncomingShort: String { return self._s[4045]! } + public var UserInfo_BotPrivacy: String { return self._s[4048]! } + public var Appearance_BubbleCorners_Apply: String { return self._s[4049]! } + public var WebSearch_RecentClearConfirmation: String { return self._s[4050]! } + public var Conversation_ContextMenuLookUp: String { return self._s[4052]! } + public var Calls_RatingTitle: String { return self._s[4053]! } + public var SecretImage_Title: String { return self._s[4054]! } + public var Weekday_Monday: String { return self._s[4055]! } public func Passport_PrivacyPolicy(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4053]!, self._r[4053]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4056]!, self._r[4056]!, [_1, _2]) } - public var KeyCommand_JumpToPreviousChat: String { return self._s[4054]! } - public var VoiceChat_InviteLink_CopySpeakerLink: String { return self._s[4055]! } - public var Invitation_JoinVoiceChatAsListener: String { return self._s[4056]! } + public var KeyCommand_JumpToPreviousChat: String { return self._s[4057]! } + public var VoiceChat_InviteLink_CopySpeakerLink: String { return self._s[4058]! } + public var Invitation_JoinVoiceChatAsListener: String { return self._s[4059]! } public func DialogList_SearchSubtitleFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4057]!, self._r[4057]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4060]!, self._r[4060]!, [_1, _2]) } - public var Stats_GroupMembers: String { return self._s[4058]! } - public var Camera_Retake: String { return self._s[4059]! } - public var Conversation_SearchPlaceholder: String { return self._s[4061]! } + public var Stats_GroupMembers: String { return self._s[4061]! } + public var Camera_Retake: String { return self._s[4062]! } + public var Conversation_SearchPlaceholder: String { return self._s[4064]! } public func Passport_Identity_NativeNameGenericHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4062]!, self._r[4062]!, [_0]) + return formatWithArgumentRanges(self._s[4065]!, self._r[4065]!, [_0]) } - public var Channel_DiscussionGroup_Info: String { return self._s[4063]! } - public var SocksProxySetup_Hostname: String { return self._s[4064]! } - public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[4065]! } - public var Privacy_DeleteDrafts: String { return self._s[4067]! } - public var Login_CancelPhoneVerification: String { return self._s[4069]! } - public var TwoStepAuth_ResetAccountHelp: String { return self._s[4070]! } - public var VoiceOver_Chat_Profile: String { return self._s[4071]! } + public var Channel_DiscussionGroup_Info: String { return self._s[4066]! } + public var SocksProxySetup_Hostname: String { return self._s[4067]! } + public var PrivacyLastSeenSettings_EmpryUsersPlaceholder: String { return self._s[4068]! } + public var Privacy_DeleteDrafts: String { return self._s[4070]! } + public var Login_CancelPhoneVerification: String { return self._s[4072]! } + public var TwoStepAuth_ResetAccountHelp: String { return self._s[4073]! } + public var VoiceOver_Chat_Profile: String { return self._s[4074]! } public func SocksProxySetup_ProxyStatusPing(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4072]!, self._r[4072]!, [_0]) + return formatWithArgumentRanges(self._s[4075]!, self._r[4075]!, [_0]) } - public var TwoStepAuth_EmailSent: String { return self._s[4073]! } - public var Cache_Indexing: String { return self._s[4074]! } - public var Notifications_ExceptionsNone: String { return self._s[4075]! } - public var MessagePoll_LabelQuiz: String { return self._s[4076]! } - public var Call_EncryptionKey_Title: String { return self._s[4077]! } - public var Common_Yes: String { return self._s[4078]! } - public var Channel_ErrorAddBlocked: String { return self._s[4079]! } - public var Month_GenJanuary: String { return self._s[4080]! } - public var Checkout_NewCard_Title: String { return self._s[4081]! } + public var TwoStepAuth_EmailSent: String { return self._s[4076]! } + public var Cache_Indexing: String { return self._s[4077]! } + public var Notifications_ExceptionsNone: String { return self._s[4078]! } + public var MessagePoll_LabelQuiz: String { return self._s[4079]! } + public var Call_EncryptionKey_Title: String { return self._s[4080]! } + public var Common_Yes: String { return self._s[4081]! } + public var Channel_ErrorAddBlocked: String { return self._s[4082]! } + public var Month_GenJanuary: String { return self._s[4083]! } + public var Checkout_NewCard_Title: String { return self._s[4084]! } public func TwoStepAuth_EnterPasswordHint(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4082]!, self._r[4082]!, [_0]) + return formatWithArgumentRanges(self._s[4085]!, self._r[4085]!, [_0]) } - public var Conversation_InputTextPlaceholderReply: String { return self._s[4084]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[4085]! } - public var Conversation_SendDice: String { return self._s[4086]! } + public var Conversation_InputTextPlaceholderReply: String { return self._s[4087]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1hour: String { return self._s[4088]! } + public var Conversation_SendDice: String { return self._s[4089]! } public func ChatSettings_AutoDownloadSettings_TypeVideo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4087]!, self._r[4087]!, [_0]) + return formatWithArgumentRanges(self._s[4090]!, self._r[4090]!, [_0]) } public func VoiceOver_Chat_VideoFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4088]!, self._r[4088]!, [_0]) + return formatWithArgumentRanges(self._s[4091]!, self._r[4091]!, [_0]) } - public var Weekday_Wednesday: String { return self._s[4089]! } - public var ReportPeer_ReasonOther_Send: String { return self._s[4090]! } - public var PasscodeSettings_EncryptDataHelp: String { return self._s[4091]! } - public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[4092]! } - public var OldChannels_NoticeTitle: String { return self._s[4093]! } - public var TwoStepAuth_ChangeEmail: String { return self._s[4094]! } - public var PasscodeSettings_PasscodeOptions: String { return self._s[4095]! } - public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[4096]! } - public var Passport_Address_AddUtilityBill: String { return self._s[4097]! } + public var Weekday_Wednesday: String { return self._s[4092]! } + public var ReportPeer_ReasonOther_Send: String { return self._s[4093]! } + public var PasscodeSettings_EncryptDataHelp: String { return self._s[4094]! } + public var PrivacyLastSeenSettings_CustomShareSettingsHelp: String { return self._s[4095]! } + public var OldChannels_NoticeTitle: String { return self._s[4096]! } + public var TwoStepAuth_ChangeEmail: String { return self._s[4097]! } + public var PasscodeSettings_PasscodeOptions: String { return self._s[4098]! } + public var InfoPlist_NSPhotoLibraryUsageDescription: String { return self._s[4099]! } + public var Passport_Address_AddUtilityBill: String { return self._s[4100]! } public func Time_PreciseDate_m5(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4099]!, self._r[4099]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4102]!, self._r[4102]!, [_1, _2, _3]) } - public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[4101]! } - public var Stats_GroupTopAdminsTitle: String { return self._s[4102]! } - public var Paint_Regular: String { return self._s[4104]! } - public var Message_Contact: String { return self._s[4105]! } - public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[4106]! } - public var VoiceOver_Chat_YourPhoto: String { return self._s[4107]! } - public var Notification_Mute1hMin: String { return self._s[4108]! } + public var TwoFactorSetup_EmailVerification_ResendAction: String { return self._s[4104]! } + public var Stats_GroupTopAdminsTitle: String { return self._s[4105]! } + public var Paint_Regular: String { return self._s[4107]! } + public var Message_Contact: String { return self._s[4108]! } + public var NetworkUsageSettings_MediaVideoDataSection: String { return self._s[4109]! } + public var VoiceOver_Chat_YourPhoto: String { return self._s[4110]! } + public var Notification_Mute1hMin: String { return self._s[4111]! } public func Login_BannedPhoneSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4109]!, self._r[4109]!, [_0]) + return formatWithArgumentRanges(self._s[4112]!, self._r[4112]!, [_0]) } - public var Profile_MessageLifetime1h: String { return self._s[4110]! } - public var TwoStepAuth_GenericHelp: String { return self._s[4111]! } - public var TwoFactorSetup_PasswordRecovery_Skip: String { return self._s[4112]! } - public var TextFormat_Monospace: String { return self._s[4113]! } - public var VoiceOver_Media_PlaybackRateChange: String { return self._s[4115]! } - public var Conversation_DeleteMessagesForMe: String { return self._s[4116]! } - public var ChatList_DeleteChat: String { return self._s[4117]! } - public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[4120]! } + public var Profile_MessageLifetime1h: String { return self._s[4113]! } + public var TwoStepAuth_GenericHelp: String { return self._s[4114]! } + public var TwoFactorSetup_PasswordRecovery_Skip: String { return self._s[4115]! } + public var TextFormat_Monospace: String { return self._s[4116]! } + public var VoiceOver_Media_PlaybackRateChange: String { return self._s[4118]! } + public var Conversation_DeleteMessagesForMe: String { return self._s[4119]! } + public var ChatList_DeleteChat: String { return self._s[4120]! } + public var Channel_OwnershipTransfer_EnterPasswordText: String { return self._s[4123]! } public func Settings_ApplyProxyAlertCredentials(_ _1: String, _ _2: String, _ _3: String, _ _4: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4121]!, self._r[4121]!, [_1, _2, _3, _4]) + return formatWithArgumentRanges(self._s[4124]!, self._r[4124]!, [_1, _2, _3, _4]) } - public var Login_CancelPhoneVerificationStop: String { return self._s[4122]! } - public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[4123]! } - public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[4124]! } + public var Login_CancelPhoneVerificationStop: String { return self._s[4125]! } + public var Appearance_ThemePreview_ChatList_4_Name: String { return self._s[4126]! } + public var MediaPicker_MomentsDateRangeSameMonthYearFormat: String { return self._s[4127]! } public func Channel_AdminLog_MessageToggleInvitesOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4125]!, self._r[4125]!, [_0]) + return formatWithArgumentRanges(self._s[4128]!, self._r[4128]!, [_0]) } - public var Notifications_Badge_IncludeChannels: String { return self._s[4126]! } - public var InviteLink_CreatePrivateLinkHelpChannel: String { return self._s[4127]! } - public var StickerPack_ViewPack: String { return self._s[4130]! } - public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[4132]! } - public var EditTheme_Expand_Preview_IncomingText: String { return self._s[4133]! } - public var Notifications_Title: String { return self._s[4134]! } - public var Conversation_InputTextPlaceholderComment: String { return self._s[4135]! } - public var GroupInfo_PublicLink: String { return self._s[4136]! } + public var Notifications_Badge_IncludeChannels: String { return self._s[4129]! } + public var InviteLink_CreatePrivateLinkHelpChannel: String { return self._s[4130]! } + public var StickerPack_ViewPack: String { return self._s[4133]! } + public var FastTwoStepSetup_PasswordConfirmationPlaceholder: String { return self._s[4135]! } + public var EditTheme_Expand_Preview_IncomingText: String { return self._s[4136]! } + public var Notifications_Title: String { return self._s[4137]! } + public var Conversation_InputTextPlaceholderComment: String { return self._s[4138]! } + public var GroupInfo_PublicLink: String { return self._s[4139]! } public func ScheduleVoiceChat_GroupText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4137]!, self._r[4137]!, [_0]) + return formatWithArgumentRanges(self._s[4140]!, self._r[4140]!, [_0]) } - public var VoiceOver_DiscardPreparedContent: String { return self._s[4138]! } - public var Conversation_Moderate_Ban: String { return self._s[4142]! } - public var InviteLink_Manage: String { return self._s[4143]! } - public var InstantPage_FontNewYork: String { return self._s[4144]! } + public var VoiceOver_DiscardPreparedContent: String { return self._s[4141]! } + public var Conversation_Moderate_Ban: String { return self._s[4145]! } + public var InviteLink_Manage: String { return self._s[4146]! } + public var InstantPage_FontNewYork: String { return self._s[4147]! } public func Activity_RemindAboutGroup(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4145]!, self._r[4145]!, [_0]) + return formatWithArgumentRanges(self._s[4148]!, self._r[4148]!, [_0]) } - public var TextFormat_Underline: String { return self._s[4146]! } + public var TextFormat_Underline: String { return self._s[4149]! } public func DownloadingStatus(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4147]!, self._r[4147]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4150]!, self._r[4150]!, [_0, _1]) } public func PUSH_PINNED_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4148]!, self._r[4148]!, [_1]) + return formatWithArgumentRanges(self._s[4151]!, self._r[4151]!, [_1]) } - public var PollResults_Collapse: String { return self._s[4150]! } - public var Contacts_GlobalSearch: String { return self._s[4151]! } + public var PollResults_Collapse: String { return self._s[4153]! } + public var Contacts_GlobalSearch: String { return self._s[4154]! } public func Conversation_EncryptionWaiting(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4153]!, self._r[4153]!, [_0]) + return formatWithArgumentRanges(self._s[4156]!, self._r[4156]!, [_0]) } - public var Channel_Management_LabelEditor: String { return self._s[4154]! } - public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[4156]! } - public var Conversation_Theme: String { return self._s[4157]! } + public var Channel_Management_LabelEditor: String { return self._s[4157]! } + public var SettingsSearch_Synonyms_Stickers_FeaturedPacks: String { return self._s[4159]! } + public var Conversation_Theme: String { return self._s[4160]! } public func PUSH_CHANNEL_MESSAGE_DOCS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4158]!, self._r[4158]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4161]!, self._r[4161]!, [_1, "\(_2)"]) } - public var Conversation_LinkDialogSave: String { return self._s[4159]! } - public var EnterPasscode_TouchId: String { return self._s[4160]! } - public var Conversation_VoiceChatMediaRecordingRestricted: String { return self._s[4161]! } - public var Group_ErrorAdminsTooMuch: String { return self._s[4162]! } - public var Stats_MessageOverview: String { return self._s[4163]! } - public var Privacy_Calls_P2PAlways: String { return self._s[4165]! } - public var Message_Sticker: String { return self._s[4166]! } - public var TwoFactorSetup_PasswordRecovery_SkipAlertTitle: String { return self._s[4167]! } - public var Conversation_Mute: String { return self._s[4170]! } - public var VoiceChat_AnonymousDisabledAlertText: String { return self._s[4171]! } - public var ContactInfo_Title: String { return self._s[4172]! } + public var Conversation_LinkDialogSave: String { return self._s[4162]! } + public var EnterPasscode_TouchId: String { return self._s[4163]! } + public var Conversation_VoiceChatMediaRecordingRestricted: String { return self._s[4164]! } + public var Group_ErrorAdminsTooMuch: String { return self._s[4165]! } + public var Stats_MessageOverview: String { return self._s[4166]! } + public var Privacy_Calls_P2PAlways: String { return self._s[4168]! } + public var Message_Sticker: String { return self._s[4169]! } + public var TwoFactorSetup_PasswordRecovery_SkipAlertTitle: String { return self._s[4170]! } + public var Conversation_Mute: String { return self._s[4173]! } + public var VoiceChat_AnonymousDisabledAlertText: String { return self._s[4174]! } + public var ContactInfo_Title: String { return self._s[4175]! } public func PUSH_CHANNEL_MESSAGE_CONTACT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4173]!, self._r[4173]!, [_1]) + return formatWithArgumentRanges(self._s[4176]!, self._r[4176]!, [_1]) } - public var Channel_Setup_TypeHeader: String { return self._s[4174]! } - public var AuthSessions_LogOut: String { return self._s[4175]! } - public var ChatSettings_AutoDownloadReset: String { return self._s[4176]! } - public var VoiceChat_PinVideo: String { return self._s[4177]! } - public var Group_Info_Members: String { return self._s[4179]! } - public var ChatListFolderSettings_NewFolder: String { return self._s[4180]! } - public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[4181]! } - public var CreatePoll_Title: String { return self._s[4182]! } - public var EditTheme_EditTitle: String { return self._s[4183]! } - public var ChatListFolderSettings_RecommendedFoldersSection: String { return self._s[4184]! } - public var TwoStepAuth_SetPassword: String { return self._s[4185]! } + public var Channel_Setup_TypeHeader: String { return self._s[4177]! } + public var AuthSessions_LogOut: String { return self._s[4178]! } + public var ChatSettings_AutoDownloadReset: String { return self._s[4179]! } + public var VoiceChat_PinVideo: String { return self._s[4180]! } + public var Group_Info_Members: String { return self._s[4182]! } + public var ChatListFolderSettings_NewFolder: String { return self._s[4183]! } + public var Appearance_ThemePreview_ChatList_3_AuthorName: String { return self._s[4184]! } + public var CreatePoll_Title: String { return self._s[4185]! } + public var EditTheme_EditTitle: String { return self._s[4186]! } + public var ChatListFolderSettings_RecommendedFoldersSection: String { return self._s[4187]! } + public var TwoStepAuth_SetPassword: String { return self._s[4188]! } public func Login_InvalidPhoneEmailSubject(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4186]!, self._r[4186]!, [_0]) + return formatWithArgumentRanges(self._s[4189]!, self._r[4189]!, [_0]) } - public var BlockedUsers_Info: String { return self._s[4187]! } - public var AuthSessions_Sessions: String { return self._s[4188]! } - public var Group_EditAdmin_RankTitle: String { return self._s[4189]! } - public var Common_ActionNotAllowedError: String { return self._s[4190]! } - public var WebPreview_GettingLinkInfo: String { return self._s[4191]! } - public var Appearance_AppIconFilledX: String { return self._s[4192]! } - public var Passport_Email_EmailPlaceholder: String { return self._s[4193]! } - public var FeaturedStickers_OtherSection: String { return self._s[4194]! } - public var VoiceChat_RecordingStarted: String { return self._s[4195]! } - public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[4196]! } - public var Profile_Username: String { return self._s[4197]! } - public var TwoFactorRemember_Done_Title: String { return self._s[4198]! } - public var Settings_TipsUsername: String { return self._s[4199]! } - public var Appearance_RemoveTheme: String { return self._s[4200]! } - public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[4201]! } - public var Message_PinnedStickerMessage: String { return self._s[4202]! } - public var AccessDenied_VideoMicrophone: String { return self._s[4203]! } - public var WallpaperPreview_CustomColorBottomText: String { return self._s[4204]! } - public var Passport_Address_RegionPlaceholder: String { return self._s[4205]! } - public var Conversation_VoiceChat: String { return self._s[4206]! } - public var VoiceChat_EditBioSuccess: String { return self._s[4207]! } - public var ImportStickerPack_LinkAvailable: String { return self._s[4208]! } - public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[4209]! } - public var TwoStepAuth_Title: String { return self._s[4210]! } - public var VoiceOver_Chat_YourAnimatedSticker: String { return self._s[4211]! } - public var Checkout_WebConfirmation_Title: String { return self._s[4212]! } - public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[4213]! } - public var ChatListFolder_CategoryGroups: String { return self._s[4215]! } - public var Stats_GroupTopInviter_Promote: String { return self._s[4216]! } - public var Conversation_EditingPhotoPanelTitle: String { return self._s[4217]! } - public var Month_GenJuly: String { return self._s[4218]! } - public var Passport_Identity_Gender: String { return self._s[4219]! } - public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[4220]! } - public var Notification_Exceptions_DeleteAll: String { return self._s[4221]! } - public var VoiceChat_StopRecording: String { return self._s[4222]! } + public var BlockedUsers_Info: String { return self._s[4190]! } + public var AuthSessions_Sessions: String { return self._s[4191]! } + public var Group_EditAdmin_RankTitle: String { return self._s[4192]! } + public var Common_ActionNotAllowedError: String { return self._s[4193]! } + public var WebPreview_GettingLinkInfo: String { return self._s[4194]! } + public var Appearance_AppIconFilledX: String { return self._s[4195]! } + public var Passport_Email_EmailPlaceholder: String { return self._s[4196]! } + public var FeaturedStickers_OtherSection: String { return self._s[4197]! } + public var VoiceChat_RecordingStarted: String { return self._s[4198]! } + public var EditTheme_Edit_Preview_OutgoingText: String { return self._s[4199]! } + public var Profile_Username: String { return self._s[4200]! } + public var TwoFactorRemember_Done_Title: String { return self._s[4201]! } + public var Settings_TipsUsername: String { return self._s[4202]! } + public var Appearance_RemoveTheme: String { return self._s[4203]! } + public var TwoStepAuth_SetupPasswordConfirmPassword: String { return self._s[4204]! } + public var Message_PinnedStickerMessage: String { return self._s[4205]! } + public var AccessDenied_VideoMicrophone: String { return self._s[4206]! } + public var WallpaperPreview_CustomColorBottomText: String { return self._s[4207]! } + public var Passport_Address_RegionPlaceholder: String { return self._s[4208]! } + public var Conversation_VoiceChat: String { return self._s[4209]! } + public var VoiceChat_EditBioSuccess: String { return self._s[4210]! } + public var ImportStickerPack_LinkAvailable: String { return self._s[4211]! } + public var SettingsSearch_Synonyms_Data_Storage_Title: String { return self._s[4212]! } + public var TwoStepAuth_Title: String { return self._s[4213]! } + public var VoiceOver_Chat_YourAnimatedSticker: String { return self._s[4214]! } + public var Checkout_WebConfirmation_Title: String { return self._s[4215]! } + public var AutoDownloadSettings_VoiceMessagesInfo: String { return self._s[4216]! } + public var ChatListFolder_CategoryGroups: String { return self._s[4218]! } + public var Stats_GroupTopInviter_Promote: String { return self._s[4219]! } + public var Conversation_EditingPhotoPanelTitle: String { return self._s[4220]! } + public var Month_GenJuly: String { return self._s[4221]! } + public var Passport_Identity_Gender: String { return self._s[4222]! } + public var Channel_DiscussionGroup_UnlinkGroup: String { return self._s[4223]! } + public var Notification_Exceptions_DeleteAll: String { return self._s[4224]! } + public var VoiceChat_StopRecording: String { return self._s[4225]! } public func Conversation_FileHowToText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4223]!, self._r[4223]!, [_0]) - } - public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4224]!, self._r[4224]!, [_0, _1, _2]) - } - public var Login_CodeSentSms: String { return self._s[4225]! } - public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4226]!, self._r[4226]!, [_0]) } - public var Login_CallRequestState2: String { return self._s[4227]! } - public var Channel_DiscussionGroup_Header: String { return self._s[4228]! } - public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { + public func Channel_AdminLog_MessageAdmin(_ _0: String, _ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4227]!, self._r[4227]!, [_0, _1, _2]) + } + public var Login_CodeSentSms: String { return self._s[4228]! } + public func VoiceOver_Chat_ReplyFrom(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4229]!, self._r[4229]!, [_0]) } - public var Passport_Language_ms: String { return self._s[4230]! } - public var PeopleNearby_MakeInvisible: String { return self._s[4232]! } - public var ImportStickerPack_CreateStickerSet: String { return self._s[4234]! } - public var ChatList_Search_FilterVoice: String { return self._s[4235]! } - public var Camera_TapAndHoldForVideo: String { return self._s[4237]! } - public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[4238]! } + public var Login_CallRequestState2: String { return self._s[4230]! } + public var Channel_DiscussionGroup_Header: String { return self._s[4231]! } + public func Channel_AdminLog_MessageToggleInvitesOff(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4232]!, self._r[4232]!, [_0]) + } + public var Passport_Language_ms: String { return self._s[4233]! } + public var PeopleNearby_MakeInvisible: String { return self._s[4235]! } + public var ImportStickerPack_CreateStickerSet: String { return self._s[4237]! } + public var ChatList_Search_FilterVoice: String { return self._s[4238]! } + public var Camera_TapAndHoldForVideo: String { return self._s[4240]! } + public var Permissions_NotificationsAllowInSettings_v0: String { return self._s[4241]! } public func Notification_LeftChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4239]!, self._r[4239]!, [_0]) + return formatWithArgumentRanges(self._s[4242]!, self._r[4242]!, [_0]) } public func Call_VoiceChatInProgressMessageCall(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4240]!, self._r[4240]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4243]!, self._r[4243]!, [_1, _2]) } - public var Map_Locating: String { return self._s[4241]! } + public var Map_Locating: String { return self._s[4244]! } public func Checkout_SavePasswordTimeout(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4243]!, self._r[4243]!, [_0]) + return formatWithArgumentRanges(self._s[4246]!, self._r[4246]!, [_0]) } - public var Passport_Identity_TypeInternalPassport: String { return self._s[4245]! } - public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[4246]! } - public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[4247]! } - public var Stickers_Installed: String { return self._s[4248]! } - public var Notifications_PermissionsAllowInSettings: String { return self._s[4249]! } - public var StickerPackActionInfo_RemovedTitle: String { return self._s[4250]! } - public var CallSettings_Never: String { return self._s[4252]! } - public var Channel_Setup_TypePublicHelp: String { return self._s[4253]! } + public var Passport_Identity_TypeInternalPassport: String { return self._s[4248]! } + public var Appearance_ThemePreview_Chat_4_Text: String { return self._s[4249]! } + public var SettingsSearch_Synonyms_EditProfile_Username: String { return self._s[4250]! } + public var Stickers_Installed: String { return self._s[4251]! } + public var Notifications_PermissionsAllowInSettings: String { return self._s[4252]! } + public var StickerPackActionInfo_RemovedTitle: String { return self._s[4253]! } + public var CallSettings_Never: String { return self._s[4255]! } + public var Channel_Setup_TypePublicHelp: String { return self._s[4256]! } public func ChatList_DeleteForEveryone(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4255]!, self._r[4255]!, [_0]) + return formatWithArgumentRanges(self._s[4258]!, self._r[4258]!, [_0]) } - public var Message_Game: String { return self._s[4256]! } - public var Call_Message: String { return self._s[4257]! } + public var Message_Game: String { return self._s[4259]! } + public var Call_Message: String { return self._s[4260]! } public func PUSH_CHANNEL_MESSAGE_VIDEO(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4258]!, self._r[4258]!, [_1]) + return formatWithArgumentRanges(self._s[4261]!, self._r[4261]!, [_1]) } - public var ChannelIntro_Text: String { return self._s[4259]! } - public var VoiceChat_NoiseSuppressionEnabled: String { return self._s[4260]! } - public var StickerPack_Send: String { return self._s[4261]! } - public var Share_AuthDescription: String { return self._s[4262]! } - public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[4263]! } - public var CallFeedback_WhatWentWrong: String { return self._s[4264]! } - public var Common_Create: String { return self._s[4267]! } - public var Passport_Language_hy: String { return self._s[4268]! } - public var CreatePoll_Explanation: String { return self._s[4269]! } - public var GroupPermission_AddMembersNotAvailable: String { return self._s[4270]! } - public var ChatImport_CreateGroupAlertImportAction: String { return self._s[4271]! } - public var PeerInfo_ButtonVoiceChat: String { return self._s[4272]! } - public var Undo_ChatClearedForBothSides: String { return self._s[4273]! } - public var DialogList_NoMessagesTitle: String { return self._s[4274]! } - public var GroupInfo_Title: String { return self._s[4276]! } + public var ChannelIntro_Text: String { return self._s[4262]! } + public var VoiceChat_NoiseSuppressionEnabled: String { return self._s[4263]! } + public var StickerPack_Send: String { return self._s[4264]! } + public var Share_AuthDescription: String { return self._s[4265]! } + public var PasscodeSettings_AutoLock_IfAwayFor_5minutes: String { return self._s[4266]! } + public var CallFeedback_WhatWentWrong: String { return self._s[4267]! } + public var Common_Create: String { return self._s[4270]! } + public var Passport_Language_hy: String { return self._s[4271]! } + public var CreatePoll_Explanation: String { return self._s[4272]! } + public var GroupPermission_AddMembersNotAvailable: String { return self._s[4273]! } + public var ChatImport_CreateGroupAlertImportAction: String { return self._s[4274]! } + public var PeerInfo_ButtonVoiceChat: String { return self._s[4275]! } + public var Undo_ChatClearedForBothSides: String { return self._s[4276]! } + public var DialogList_NoMessagesTitle: String { return self._s[4277]! } + public var GroupInfo_Title: String { return self._s[4279]! } public func ScheduleVoiceChat_ScheduleToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4277]!, self._r[4277]!, [_0]) + return formatWithArgumentRanges(self._s[4280]!, self._r[4280]!, [_0]) } - public var UserInfo_ContactForwardTooltip_SavedMessages_One: String { return self._s[4278]! } - public var Channel_AdminLog_CanBanUsers: String { return self._s[4279]! } - public var PhoneNumberHelp_Help: String { return self._s[4280]! } - public var TwoStepAuth_AdditionalPassword: String { return self._s[4281]! } - public var Settings_Logout: String { return self._s[4282]! } - public var Privacy_PaymentsTitle: String { return self._s[4283]! } - public var StickerPacksSettings_StickerPacksSection: String { return self._s[4284]! } - public var Tour_Text6: String { return self._s[4285]! } - public var ChatImportActivity_Title: String { return self._s[4287]! } - public var Channel_Username_Help: String { return self._s[4288]! } - public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[4289]! } - public var AttachmentMenu_Poll: String { return self._s[4290]! } - public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[4291]! } - public var Conversation_ReportSpamChannelConfirmation: String { return self._s[4292]! } - public var Passport_DeletePassport: String { return self._s[4293]! } - public var Login_Code: String { return self._s[4294]! } - public var Notification_SecretChatScreenshot: String { return self._s[4295]! } - public var VoiceChat_AddBio: String { return self._s[4296]! } - public var Login_CodeFloodError: String { return self._s[4297]! } + public var UserInfo_ContactForwardTooltip_SavedMessages_One: String { return self._s[4281]! } + public var Channel_AdminLog_CanBanUsers: String { return self._s[4282]! } + public var PhoneNumberHelp_Help: String { return self._s[4283]! } + public var TwoStepAuth_AdditionalPassword: String { return self._s[4284]! } + public var Settings_Logout: String { return self._s[4285]! } + public var Privacy_PaymentsTitle: String { return self._s[4286]! } + public var StickerPacksSettings_StickerPacksSection: String { return self._s[4287]! } + public var Tour_Text6: String { return self._s[4288]! } + public var ChatImportActivity_Title: String { return self._s[4290]! } + public var Channel_Username_Help: String { return self._s[4291]! } + public var VoiceOver_Chat_RecordModeVoiceMessageInfo: String { return self._s[4292]! } + public var AttachmentMenu_Poll: String { return self._s[4293]! } + public var EditTheme_Create_Preview_IncomingReplyName: String { return self._s[4294]! } + public var Conversation_ReportSpamChannelConfirmation: String { return self._s[4295]! } + public var Passport_DeletePassport: String { return self._s[4296]! } + public var Login_Code: String { return self._s[4297]! } + public var Notification_SecretChatScreenshot: String { return self._s[4298]! } + public var VoiceChat_AddBio: String { return self._s[4299]! } + public var Login_CodeFloodError: String { return self._s[4300]! } public func Notification_PinnedAnimationMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4298]!, self._r[4298]!, [_0]) + return formatWithArgumentRanges(self._s[4301]!, self._r[4301]!, [_0]) } public func Channel_Username_UsernameIsAvailable(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4299]!, self._r[4299]!, [_0]) - } - public var Watch_Stickers_Recents: String { return self._s[4300]! } - public var Generic_ErrorMoreInfo: String { return self._s[4301]! } - public func Call_AccountIsLoggedOnCurrentDevice(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4302]!, self._r[4302]!, [_0]) } - public var AutoDownloadSettings_DataUsage: String { return self._s[4303]! } - public var Conversation_ViewTheme: String { return self._s[4304]! } - public var Contacts_InviteSearchLabel: String { return self._s[4305]! } - public var Settings_CancelUpload: String { return self._s[4307]! } - public var Settings_AppLanguage_Unofficial: String { return self._s[4308]! } + public var Watch_Stickers_Recents: String { return self._s[4303]! } + public var Generic_ErrorMoreInfo: String { return self._s[4304]! } + public func Call_AccountIsLoggedOnCurrentDevice(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4305]!, self._r[4305]!, [_0]) + } + public var AutoDownloadSettings_DataUsage: String { return self._s[4306]! } + public var Conversation_ViewTheme: String { return self._s[4307]! } + public var Contacts_InviteSearchLabel: String { return self._s[4308]! } + public var Settings_CancelUpload: String { return self._s[4310]! } + public var Settings_AppLanguage_Unofficial: String { return self._s[4311]! } public func ChatList_ClearChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4309]!, self._r[4309]!, [_0]) + return formatWithArgumentRanges(self._s[4312]!, self._r[4312]!, [_0]) } - public var ChatList_AddFolder: String { return self._s[4310]! } - public var Conversation_Location: String { return self._s[4312]! } - public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[4313]! } - public var DialogList_AdLabel: String { return self._s[4314]! } + public var ChatList_AddFolder: String { return self._s[4313]! } + public var Conversation_Location: String { return self._s[4315]! } + public var Appearance_BubbleCorners_AdjustAdjacent: String { return self._s[4316]! } + public var DialogList_AdLabel: String { return self._s[4317]! } public func Time_TomorrowAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4316]!, self._r[4316]!, [_0]) + return formatWithArgumentRanges(self._s[4319]!, self._r[4319]!, [_0]) } - public var Message_InvoiceLabel: String { return self._s[4317]! } - public var Channel_TooMuchBots: String { return self._s[4318]! } + public var Message_InvoiceLabel: String { return self._s[4320]! } + public var Channel_TooMuchBots: String { return self._s[4321]! } public func Channel_AdminLog_MessageRemovedChannelUsername(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4320]!, self._r[4320]!, [_0]) + return formatWithArgumentRanges(self._s[4323]!, self._r[4323]!, [_0]) } - public var Call_IncomingVideoCall: String { return self._s[4321]! } - public var Conversation_LiveLocation: String { return self._s[4322]! } - public var VoiceChat_AskedToSpeakHelp: String { return self._s[4323]! } - public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[4324]! } - public var Passport_Identity_EditPassport: String { return self._s[4325]! } - public var Permissions_CellularDataTitle_v0: String { return self._s[4327]! } - public var ChatList_Search_NoResultsFitlerVoice: String { return self._s[4328]! } - public var GroupInfo_Permissions_AddException: String { return self._s[4329]! } + public var Call_IncomingVideoCall: String { return self._s[4324]! } + public var Conversation_LiveLocation: String { return self._s[4325]! } + public var VoiceChat_AskedToSpeakHelp: String { return self._s[4326]! } + public var TwoStepAuth_SetupPasswordEnterPasswordChange: String { return self._s[4327]! } + public var Passport_Identity_EditPassport: String { return self._s[4328]! } + public var Permissions_CellularDataTitle_v0: String { return self._s[4330]! } + public var ChatList_Search_NoResultsFitlerVoice: String { return self._s[4331]! } + public var GroupInfo_Permissions_AddException: String { return self._s[4332]! } public func VoiceChat_RemovePeerConfirmationChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4331]!, self._r[4331]!, [_0]) + return formatWithArgumentRanges(self._s[4334]!, self._r[4334]!, [_0]) } - public var Channel_AdminLog_CanInviteUsers: String { return self._s[4332]! } - public var Channel_MessageVideoUpdated: String { return self._s[4333]! } - public var GroupInfo_Permissions_EditingDisabled: String { return self._s[4334]! } - public var AutoremoveSetup_TimeSectionHeader: String { return self._s[4337]! } - public var AccessDenied_Camera: String { return self._s[4338]! } + public var Channel_AdminLog_CanInviteUsers: String { return self._s[4335]! } + public var Channel_MessageVideoUpdated: String { return self._s[4336]! } + public var GroupInfo_Permissions_EditingDisabled: String { return self._s[4337]! } + public var AutoremoveSetup_TimeSectionHeader: String { return self._s[4340]! } + public var AccessDenied_Camera: String { return self._s[4341]! } public func Target_InviteToGroupConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4339]!, self._r[4339]!, [_0]) + return formatWithArgumentRanges(self._s[4342]!, self._r[4342]!, [_0]) } - public var Theme_Context_ChangeColors: String { return self._s[4340]! } - public var PrivacySettings_TwoStepAuth: String { return self._s[4341]! } - public var Privacy_Forwards_PreviewMessageText: String { return self._s[4342]! } - public var Login_CodeExpiredError: String { return self._s[4343]! } - public var State_ConnectingToProxy: String { return self._s[4344]! } - public var TextFormat_Link: String { return self._s[4345]! } - public var Passport_Language_lv: String { return self._s[4347]! } - public var Conversation_AutoremoveTimerRemovedGroup: String { return self._s[4348]! } - public var AccessDenied_VoiceMicrophone: String { return self._s[4349]! } - public var WallpaperPreview_SwipeBottomText: String { return self._s[4350]! } - public var ProfilePhoto_SetMainVideo: String { return self._s[4351]! } - public var AutoDownloadSettings_Cellular: String { return self._s[4353]! } - public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[4354]! } - public var Calls_NoVoiceAndVideoCallsPlaceholder: String { return self._s[4355]! } + public var Theme_Context_ChangeColors: String { return self._s[4343]! } + public var PrivacySettings_TwoStepAuth: String { return self._s[4344]! } + public var Privacy_Forwards_PreviewMessageText: String { return self._s[4345]! } + public var Login_CodeExpiredError: String { return self._s[4346]! } + public var State_ConnectingToProxy: String { return self._s[4347]! } + public var TextFormat_Link: String { return self._s[4348]! } + public var Passport_Language_lv: String { return self._s[4350]! } + public var Conversation_AutoremoveTimerRemovedGroup: String { return self._s[4351]! } + public var AccessDenied_VoiceMicrophone: String { return self._s[4352]! } + public var WallpaperPreview_SwipeBottomText: String { return self._s[4353]! } + public var ProfilePhoto_SetMainVideo: String { return self._s[4354]! } + public var AutoDownloadSettings_Cellular: String { return self._s[4356]! } + public var ChatSettings_AutoDownloadVoiceMessages: String { return self._s[4357]! } + public var Calls_NoVoiceAndVideoCallsPlaceholder: String { return self._s[4358]! } public func Channel_AdminLog_MessageKickedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4356]!, self._r[4356]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4359]!, self._r[4359]!, [_1, _2]) } - public var ChatList_EmptyChatListFilterTitle: String { return self._s[4357]! } - public var Checkout_PayNone: String { return self._s[4358]! } - public var NotificationsSound_Complete: String { return self._s[4360]! } - public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[4361]! } - public var InviteLink_CreateInfo: String { return self._s[4362]! } - public var AuthSessions_DevicesTitle: String { return self._s[4363]! } + public var ChatList_EmptyChatListFilterTitle: String { return self._s[4360]! } + public var Checkout_PayNone: String { return self._s[4361]! } + public var NotificationsSound_Complete: String { return self._s[4363]! } + public var TwoStepAuth_ConfirmEmailCodePlaceholder: String { return self._s[4364]! } + public var InviteLink_CreateInfo: String { return self._s[4365]! } + public var AuthSessions_DevicesTitle: String { return self._s[4366]! } public func DialogList_MultipleTyping(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4364]!, self._r[4364]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4367]!, self._r[4367]!, [_0, _1]) } - public var Message_LiveLocation: String { return self._s[4365]! } - public var Watch_Suggestion_BRB: String { return self._s[4366]! } - public var Channel_BanUser_Title: String { return self._s[4367]! } - public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4368]! } - public var Conversation_Dice_u1F3C0: String { return self._s[4369]! } - public var Conversation_ClearSelfHistory: String { return self._s[4370]! } - public var ProfilePhoto_OpenGallery: String { return self._s[4371]! } - public var PrivacySettings_LastSeenTitle: String { return self._s[4372]! } - public var Weekday_Thursday: String { return self._s[4373]! } - public var BroadcastListInfo_AddRecipient: String { return self._s[4374]! } - public var Privacy_ProfilePhoto: String { return self._s[4376]! } - public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[4377]! } + public var Message_LiveLocation: String { return self._s[4368]! } + public var Watch_Suggestion_BRB: String { return self._s[4369]! } + public var Channel_BanUser_Title: String { return self._s[4370]! } + public var SettingsSearch_Synonyms_Privacy_Data_Title: String { return self._s[4371]! } + public var Conversation_Dice_u1F3C0: String { return self._s[4372]! } + public var Conversation_ClearSelfHistory: String { return self._s[4373]! } + public var ProfilePhoto_OpenGallery: String { return self._s[4374]! } + public var PrivacySettings_LastSeenTitle: String { return self._s[4375]! } + public var Weekday_Thursday: String { return self._s[4376]! } + public var BroadcastListInfo_AddRecipient: String { return self._s[4377]! } + public var Privacy_ProfilePhoto: String { return self._s[4379]! } + public var StickerPacksSettings_ArchivedPacks_Info: String { return self._s[4380]! } public func Channel_AdminLog_MessageChangedUnlinkedGroup(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4378]!, self._r[4378]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4381]!, self._r[4381]!, [_1, _2]) } - public var Message_Audio: String { return self._s[4379]! } - public var Conversation_Info: String { return self._s[4380]! } - public var Cache_Videos: String { return self._s[4381]! } - public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[4382]! } - public var Channel_ErrorAddTooMuch: String { return self._s[4383]! } - public var TwoFactorSetup_ResetDone_Text: String { return self._s[4384]! } + public var Message_Audio: String { return self._s[4382]! } + public var Conversation_Info: String { return self._s[4383]! } + public var Cache_Videos: String { return self._s[4384]! } + public var Appearance_ThemePreview_ChatList_6_Text: String { return self._s[4385]! } + public var Channel_ErrorAddTooMuch: String { return self._s[4386]! } + public var TwoFactorSetup_ResetDone_Text: String { return self._s[4387]! } public func ChatList_DeleteSecretChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4385]!, self._r[4385]!, [_0]) + return formatWithArgumentRanges(self._s[4388]!, self._r[4388]!, [_0]) } - public var VoiceChat_EditBio: String { return self._s[4386]! } - public var ChannelMembers_ChannelAdminsTitle: String { return self._s[4388]! } - public var VoiceChat_ShareScreen: String { return self._s[4391]! } - public var ScheduledMessages_Title: String { return self._s[4392]! } - public var ShareFileTip_Title: String { return self._s[4395]! } - public var Chat_Gifs_TrendingSectionHeader: String { return self._s[4396]! } - public var ChatList_RemoveFolderConfirmation: String { return self._s[4397]! } + public var VoiceChat_EditBio: String { return self._s[4389]! } + public var ChannelMembers_ChannelAdminsTitle: String { return self._s[4391]! } + public var VoiceChat_ShareScreen: String { return self._s[4394]! } + public var ScheduledMessages_Title: String { return self._s[4395]! } + public var ShareFileTip_Title: String { return self._s[4398]! } + public var Chat_Gifs_TrendingSectionHeader: String { return self._s[4399]! } + public var ChatList_RemoveFolderConfirmation: String { return self._s[4400]! } public func PUSH_CHAT_MESSAGE_GEOLIVE(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4398]!, self._r[4398]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4401]!, self._r[4401]!, [_1, _2]) } - public var Conversation_ContextViewStats: String { return self._s[4400]! } - public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[4401]! } - public var PasscodeSettings_Title: String { return self._s[4402]! } - public var Channel_AdminLog_SendPolls: String { return self._s[4403]! } - public var LastSeen_ALongTimeAgo: String { return self._s[4404]! } + public var Conversation_ContextViewStats: String { return self._s[4403]! } + public var Channel_DiscussionGroup_SearchPlaceholder: String { return self._s[4404]! } + public var PasscodeSettings_Title: String { return self._s[4405]! } + public var Channel_AdminLog_SendPolls: String { return self._s[4406]! } + public var LastSeen_ALongTimeAgo: String { return self._s[4407]! } public func PUSH_CHANNEL_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4405]!, self._r[4405]!, [_1]) + return formatWithArgumentRanges(self._s[4408]!, self._r[4408]!, [_1]) } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4406]! } - public var ChannelInfo_FakeChannelWarning: String { return self._s[4407]! } - public var CallFeedback_VideoReasonLowQuality: String { return self._s[4408]! } - public var Conversation_PinnedPreviousMessage: String { return self._s[4409]! } - public var SocksProxySetup_AddProxyTitle: String { return self._s[4410]! } - public var Passport_Identity_AddInternalPassport: String { return self._s[4411]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChannels: String { return self._s[4409]! } + public var ChannelInfo_FakeChannelWarning: String { return self._s[4410]! } + public var CallFeedback_VideoReasonLowQuality: String { return self._s[4411]! } + public var VoiceChat_VideoPreviewShareScreenInfo: String { return self._s[4412]! } + public var Conversation_PinnedPreviousMessage: String { return self._s[4413]! } + public var SocksProxySetup_AddProxyTitle: String { return self._s[4414]! } + public var Passport_Identity_AddInternalPassport: String { return self._s[4415]! } public func ChatList_RemovedFromFolderTooltip(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4412]!, self._r[4412]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4416]!, self._r[4416]!, [_1, _2]) } public func Conversation_SetReminder_RemindToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4413]!, self._r[4413]!, [_0]) + return formatWithArgumentRanges(self._s[4417]!, self._r[4417]!, [_0]) } - public var Passport_Identity_GenderFemale: String { return self._s[4414]! } - public var Location_ProximityNotification_DistanceKM: String { return self._s[4417]! } - public var ConvertToSupergroup_HelpTitle: String { return self._s[4418]! } + public var Passport_Identity_GenderFemale: String { return self._s[4418]! } + public var Location_ProximityNotification_DistanceKM: String { return self._s[4421]! } + public var ConvertToSupergroup_HelpTitle: String { return self._s[4422]! } public func Message_ImportedDateFormat(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4419]!, self._r[4419]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4423]!, self._r[4423]!, [_1, _2, _3]) } - public var VoiceChat_Audio: String { return self._s[4420]! } - public var SharedMedia_TitleAll: String { return self._s[4421]! } - public var Settings_Context_Logout: String { return self._s[4422]! } - public var GroupInfo_SetGroupPhotoDelete: String { return self._s[4425]! } - public var Settings_About_Title: String { return self._s[4426]! } - public var StickerSettings_ContextHide: String { return self._s[4427]! } + public var VoiceChat_Audio: String { return self._s[4424]! } + public var SharedMedia_TitleAll: String { return self._s[4425]! } + public var Settings_Context_Logout: String { return self._s[4426]! } + public var GroupInfo_SetGroupPhotoDelete: String { return self._s[4429]! } + public var Settings_About_Title: String { return self._s[4430]! } + public var StickerSettings_ContextHide: String { return self._s[4431]! } public func AutoDownloadSettings_UpTo(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4428]!, self._r[4428]!, [_0]) + return formatWithArgumentRanges(self._s[4432]!, self._r[4432]!, [_0]) } public func Conversation_LiveLocationYouAndOther(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4429]!, self._r[4429]!, [_0]) + return formatWithArgumentRanges(self._s[4433]!, self._r[4433]!, [_0]) } - public var ChatImport_SelectionConfirmationAlertImportAction: String { return self._s[4431]! } - public var Common_Cancel: String { return self._s[4432]! } - public var CallFeedback_Title: String { return self._s[4434]! } + public var ChatImport_SelectionConfirmationAlertImportAction: String { return self._s[4435]! } + public var Common_Cancel: String { return self._s[4436]! } + public var CallFeedback_Title: String { return self._s[4438]! } public func Notification_PinnedContactMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4435]!, self._r[4435]!, [_0]) + return formatWithArgumentRanges(self._s[4439]!, self._r[4439]!, [_0]) } - public var Conversation_StickerAddedToFavorites: String { return self._s[4436]! } - public var Activity_UploadingVideoMessage: String { return self._s[4438]! } - public var MediaPicker_Send: String { return self._s[4439]! } - public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[4440]! } - public var Conversation_LiveLocationYou: String { return self._s[4441]! } - public var Notifications_ExceptionsUnmuted: String { return self._s[4442]! } + public var Conversation_StickerAddedToFavorites: String { return self._s[4440]! } + public var Activity_UploadingVideoMessage: String { return self._s[4442]! } + public var MediaPicker_Send: String { return self._s[4443]! } + public var PasscodeSettings_AutoLock_IfAwayFor_1minute: String { return self._s[4444]! } + public var Conversation_LiveLocationYou: String { return self._s[4445]! } + public var Notifications_ExceptionsUnmuted: String { return self._s[4446]! } public func Channel_AdminLog_MessageGroupPreHistoryHidden(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4444]!, self._r[4444]!, [_0]) + return formatWithArgumentRanges(self._s[4448]!, self._r[4448]!, [_0]) } public func PUSH_CHAT_ADD_YOU(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4445]!, self._r[4445]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4449]!, self._r[4449]!, [_1, _2]) } - public var Checkout_PaymentLiabilityAlert: String { return self._s[4446]! } - public var Conversation_ViewBackground: String { return self._s[4447]! } - public var ChatSettings_PrivateChats: String { return self._s[4450]! } - public var Conversation_ErrorInaccessibleMessage: String { return self._s[4451]! } - public var BroadcastGroups_LimitAlert_LearnMore: String { return self._s[4452]! } - public var Appearance_ThemeNight: String { return self._s[4453]! } - public var Common_Search: String { return self._s[4454]! } - public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[4455]! } - public var ChangePhoneNumberNumber_Help: String { return self._s[4457]! } - public var InviteLink_QRCode_Share: String { return self._s[4458]! } - public var Stickers_SuggestAdded: String { return self._s[4460]! } + public var Checkout_PaymentLiabilityAlert: String { return self._s[4450]! } + public var Conversation_ViewBackground: String { return self._s[4451]! } + public var ChatSettings_PrivateChats: String { return self._s[4454]! } + public var Conversation_ErrorInaccessibleMessage: String { return self._s[4455]! } + public var BroadcastGroups_LimitAlert_LearnMore: String { return self._s[4456]! } + public var Appearance_ThemeNight: String { return self._s[4457]! } + public var Common_Search: String { return self._s[4458]! } + public var TwoStepAuth_ReEnterPasswordTitle: String { return self._s[4459]! } + public var ChangePhoneNumberNumber_Help: String { return self._s[4461]! } + public var InviteLink_QRCode_Share: String { return self._s[4462]! } + public var Stickers_SuggestAdded: String { return self._s[4464]! } public func VoiceChat_VideoParticipantsLimitExceeded(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4462]!, self._r[4462]!, [_0]) + return formatWithArgumentRanges(self._s[4466]!, self._r[4466]!, [_0]) } - public var Conversation_DiscardVoiceMessageDescription: String { return self._s[4464]! } - public var Widget_UpdatedTodayAt: String { return self._s[4465]! } - public var NetworkUsageSettings_Cellular: String { return self._s[4466]! } - public var CheckoutInfo_Title: String { return self._s[4467]! } - public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[4468]! } - public var Channel_BotDoesntSupportGroups: String { return self._s[4469]! } + public var Conversation_DiscardVoiceMessageDescription: String { return self._s[4468]! } + public var Widget_UpdatedTodayAt: String { return self._s[4469]! } + public var NetworkUsageSettings_Cellular: String { return self._s[4470]! } + public var CheckoutInfo_Title: String { return self._s[4471]! } + public var Conversation_ShareBotLocationConfirmationTitle: String { return self._s[4472]! } + public var Channel_BotDoesntSupportGroups: String { return self._s[4473]! } public func DialogList_SingleRecordingAudioSuffix(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4470]!, self._r[4470]!, [_0]) + return formatWithArgumentRanges(self._s[4474]!, self._r[4474]!, [_0]) } - public var MaskStickerSettings_Info: String { return self._s[4472]! } - public var GroupRemoved_DeleteUser: String { return self._s[4474]! } - public var Contacts_ShareTelegram: String { return self._s[4475]! } - public var Group_UpgradeNoticeText1: String { return self._s[4476]! } + public var MaskStickerSettings_Info: String { return self._s[4476]! } + public var GroupRemoved_DeleteUser: String { return self._s[4478]! } + public var Contacts_ShareTelegram: String { return self._s[4479]! } + public var Group_UpgradeNoticeText1: String { return self._s[4480]! } public func PUSH_PHONE_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4477]!, self._r[4477]!, [_1]) + return formatWithArgumentRanges(self._s[4481]!, self._r[4481]!, [_1]) } - public var PrivacyLastSeenSettings_Title: String { return self._s[4478]! } - public var SettingsSearch_Synonyms_Support: String { return self._s[4482]! } - public var PhotoEditor_TintTool: String { return self._s[4483]! } - public var ChatImportActivity_OpenApp: String { return self._s[4485]! } - public var GroupPermission_NoSendPolls: String { return self._s[4486]! } - public var NotificationsSound_None: String { return self._s[4487]! } + public var PrivacyLastSeenSettings_Title: String { return self._s[4482]! } + public var SettingsSearch_Synonyms_Support: String { return self._s[4486]! } + public var PhotoEditor_TintTool: String { return self._s[4487]! } + public var ChatImportActivity_OpenApp: String { return self._s[4489]! } + public var GroupPermission_NoSendPolls: String { return self._s[4490]! } + public var NotificationsSound_None: String { return self._s[4491]! } public func LOCAL_CHANNEL_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4488]!, self._r[4488]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[4492]!, self._r[4492]!, [_1, "\(_2)"]) } - public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4491]! } + public var CheckoutInfo_ShippingInfoCityPlaceholder: String { return self._s[4495]! } public func Conversation_AutoremoveTimerSetChannel(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4493]!, self._r[4493]!, [_1]) + return formatWithArgumentRanges(self._s[4497]!, self._r[4497]!, [_1]) } - public var ExplicitContent_AlertChannel: String { return self._s[4494]! } - public var Conversation_ClousStorageInfo_Description1: String { return self._s[4495]! } - public var Contacts_SortedByPresence: String { return self._s[4496]! } - public var WallpaperSearch_ColorGray: String { return self._s[4497]! } - public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4498]! } - public var Conversation_ReportSpam: String { return self._s[4499]! } - public var ChatList_Search_NoResultsFilter: String { return self._s[4502]! } - public var WallpaperSearch_ColorBlack: String { return self._s[4503]! } - public var ArchivedChats_IntroTitle3: String { return self._s[4504]! } - public var InviteLink_DeleteAllRevokedLinksAlert_Action: String { return self._s[4505]! } + public var ExplicitContent_AlertChannel: String { return self._s[4498]! } + public var Conversation_ClousStorageInfo_Description1: String { return self._s[4499]! } + public var Contacts_SortedByPresence: String { return self._s[4500]! } + public var WallpaperSearch_ColorGray: String { return self._s[4501]! } + public var Channel_AdminLogFilter_EventsNewSubscribers: String { return self._s[4502]! } + public var Conversation_ReportSpam: String { return self._s[4503]! } + public var ChatList_Search_NoResultsFilter: String { return self._s[4506]! } + public var WallpaperSearch_ColorBlack: String { return self._s[4507]! } + public var ArchivedChats_IntroTitle3: String { return self._s[4508]! } + public var InviteLink_DeleteAllRevokedLinksAlert_Action: String { return self._s[4509]! } public func VoiceChat_PeerJoinedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4506]!, self._r[4506]!, [_0]) + return formatWithArgumentRanges(self._s[4510]!, self._r[4510]!, [_0]) } - public var Conversation_DefaultRestrictedText: String { return self._s[4507]! } - public var Settings_Devices: String { return self._s[4508]! } - public var Call_AudioRouteSpeaker: String { return self._s[4509]! } - public var GroupInfo_InviteLink_CopyLink: String { return self._s[4510]! } - public var VoiceChat_StartsIn: String { return self._s[4511]! } - public var VoiceChat_CreateNewVoiceChatSchedule: String { return self._s[4512]! } - public var VoiceChat_EditDescriptionTitle: String { return self._s[4514]! } - public var Passport_Address_Country: String { return self._s[4515]! } - public var Cache_MaximumCacheSize: String { return self._s[4516]! } - public var Chat_PanelHidePinnedMessages: String { return self._s[4517]! } - public var Notifications_Badge_IncludePublicGroups: String { return self._s[4518]! } - public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4520]! } - public var Login_TermsOfServiceLabel: String { return self._s[4521]! } - public var Calls_NoMissedCallsPlacehoder: String { return self._s[4522]! } - public var SocksProxySetup_RequiredCredentials: String { return self._s[4523]! } - public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4524]! } - public var AutoNightTheme_ScheduledFrom: String { return self._s[4525]! } - public var ChatSettings_AutoDownloadDocuments: String { return self._s[4526]! } - public var ConvertToSupergroup_Note: String { return self._s[4528]! } - public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4529]! } - public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4530]! } - public var Common_More: String { return self._s[4531]! } - public var ShareMenu_SelectChats: String { return self._s[4533]! } + public var Conversation_DefaultRestrictedText: String { return self._s[4511]! } + public var Settings_Devices: String { return self._s[4512]! } + public var Call_AudioRouteSpeaker: String { return self._s[4513]! } + public var GroupInfo_InviteLink_CopyLink: String { return self._s[4514]! } + public var VoiceChat_StartsIn: String { return self._s[4515]! } + public var VoiceChat_CreateNewVoiceChatSchedule: String { return self._s[4516]! } + public var VoiceChat_EditDescriptionTitle: String { return self._s[4518]! } + public var Passport_Address_Country: String { return self._s[4519]! } + public var Cache_MaximumCacheSize: String { return self._s[4520]! } + public var Chat_PanelHidePinnedMessages: String { return self._s[4521]! } + public var Notifications_Badge_IncludePublicGroups: String { return self._s[4522]! } + public var ChatSettings_AutoDownloadUsingWiFi: String { return self._s[4524]! } + public var Login_TermsOfServiceLabel: String { return self._s[4525]! } + public var Calls_NoMissedCallsPlacehoder: String { return self._s[4526]! } + public var SocksProxySetup_RequiredCredentials: String { return self._s[4527]! } + public var VoiceOver_MessageContextOpenMessageMenu: String { return self._s[4528]! } + public var AutoNightTheme_ScheduledFrom: String { return self._s[4529]! } + public var ChatSettings_AutoDownloadDocuments: String { return self._s[4530]! } + public var ConvertToSupergroup_Note: String { return self._s[4532]! } + public var Settings_SetNewProfilePhotoOrVideo: String { return self._s[4533]! } + public var PrivacySettings_PasscodeAndTouchId: String { return self._s[4534]! } + public var Common_More: String { return self._s[4535]! } + public var ShareMenu_SelectChats: String { return self._s[4537]! } public func Conversation_ScheduleMessage_SendToday(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4534]!, self._r[4534]!, [_0]) + return formatWithArgumentRanges(self._s[4538]!, self._r[4538]!, [_0]) } public func Channel_AdminLog_MessageRemovedGroupStickerPack(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4535]!, self._r[4535]!, [_0]) - } - public var Contacts_PermissionsKeepDisabled: String { return self._s[4537]! } - public var VoiceChat_EditBioText: String { return self._s[4538]! } - public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4539]!, self._r[4539]!, [_0]) } - public var WatchRemote_AlertOpen: String { return self._s[4540]! } + public var Contacts_PermissionsKeepDisabled: String { return self._s[4541]! } + public var VoiceChat_EditBioText: String { return self._s[4542]! } + public func Call_ParticipantVersionOutdatedError(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4543]!, self._r[4543]!, [_0]) + } + public var WatchRemote_AlertOpen: String { return self._s[4544]! } public func PUSH_CHAT_ADD_MEMBER(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4541]!, self._r[4541]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4545]!, self._r[4545]!, [_1, _2, _3]) } - public var Channel_Members_AddMembersHelp: String { return self._s[4542]! } - public var Shortcut_SwitchAccount: String { return self._s[4543]! } - public var Map_LiveLocationFor8Hours: String { return self._s[4544]! } + public var Channel_Members_AddMembersHelp: String { return self._s[4546]! } + public var Shortcut_SwitchAccount: String { return self._s[4547]! } + public var Map_LiveLocationFor8Hours: String { return self._s[4548]! } public func AutoNightTheme_AutomaticHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4545]!, self._r[4545]!, [_0]) + return formatWithArgumentRanges(self._s[4549]!, self._r[4549]!, [_0]) } - public var Compose_NewGroupTitle: String { return self._s[4546]! } - public var DialogList_You: String { return self._s[4547]! } - public var Call_VoiceOver_VoiceCallOutgoing: String { return self._s[4548]! } - public var ReportPeer_ReasonViolence: String { return self._s[4549]! } + public var Compose_NewGroupTitle: String { return self._s[4550]! } + public var DialogList_You: String { return self._s[4551]! } + public var Call_VoiceOver_VoiceCallOutgoing: String { return self._s[4552]! } + public var ReportPeer_ReasonViolence: String { return self._s[4553]! } public func PUSH_CHANNEL_MESSAGE_STICKER(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4550]!, self._r[4550]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4554]!, self._r[4554]!, [_1, _2]) } - public var VoiceChat_Reconnecting: String { return self._s[4552]! } - public var KeyCommand_ScrollDown: String { return self._s[4555]! } - public var ChatSettings_DownloadInBackground: String { return self._s[4556]! } - public var Wallpaper_ResetWallpapers: String { return self._s[4557]! } - public var Channel_BanList_RestrictedTitle: String { return self._s[4558]! } - public var ArchivedChats_IntroText3: String { return self._s[4559]! } - public var HashtagSearch_AllChats: String { return self._s[4561]! } - public var VoiceChat_EndVoiceChat: String { return self._s[4562]! } - public var Conversation_MessageCopied: String { return self._s[4564]! } - public var Channel_Info_BlackList: String { return self._s[4565]! } - public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4566]! } - public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4567]! } - public var Paint_Neon: String { return self._s[4569]! } - public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4570]! } - public var AutoDownloadSettings_AutoDownload: String { return self._s[4571]! } - public var ImportStickerPack_CreateNewStickerSet: String { return self._s[4572]! } + public var VoiceChat_Reconnecting: String { return self._s[4556]! } + public var KeyCommand_ScrollDown: String { return self._s[4559]! } + public var ChatSettings_DownloadInBackground: String { return self._s[4560]! } + public var Wallpaper_ResetWallpapers: String { return self._s[4561]! } + public var Channel_BanList_RestrictedTitle: String { return self._s[4562]! } + public var ArchivedChats_IntroText3: String { return self._s[4563]! } + public var HashtagSearch_AllChats: String { return self._s[4565]! } + public var VoiceChat_EndVoiceChat: String { return self._s[4566]! } + public var Conversation_MessageCopied: String { return self._s[4568]! } + public var Channel_Info_BlackList: String { return self._s[4569]! } + public var Contacts_SearchUsersAndGroupsLabel: String { return self._s[4570]! } + public var PrivacyPhoneNumberSettings_DiscoveryHeader: String { return self._s[4571]! } + public var Paint_Neon: String { return self._s[4573]! } + public var SettingsSearch_Synonyms_AppLanguage: String { return self._s[4574]! } + public var AutoDownloadSettings_AutoDownload: String { return self._s[4575]! } + public var ImportStickerPack_CreateNewStickerSet: String { return self._s[4576]! } public func Notification_PinnedVideoMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4574]!, self._r[4574]!, [_0]) + return formatWithArgumentRanges(self._s[4578]!, self._r[4578]!, [_0]) } - public var Map_StopLiveLocation: String { return self._s[4575]! } - public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4576]! } - public var Channel_Username_InvalidCharacters: String { return self._s[4577]! } - public var InstantPage_Reference: String { return self._s[4579]! } - public var Group_Members_AddMembers: String { return self._s[4581]! } + public var Map_StopLiveLocation: String { return self._s[4579]! } + public var SettingsSearch_Synonyms_Data_SaveEditedPhotos: String { return self._s[4580]! } + public var Channel_Username_InvalidCharacters: String { return self._s[4581]! } + public var InstantPage_Reference: String { return self._s[4583]! } + public var Group_Members_AddMembers: String { return self._s[4585]! } public func Conversation_ScheduledVoiceChatStartsOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4582]!, self._r[4582]!, [_0]) + return formatWithArgumentRanges(self._s[4586]!, self._r[4586]!, [_0]) } - public var ChatList_HideAction: String { return self._s[4583]! } - public var Conversation_FileICloudDrive: String { return self._s[4585]! } + public var ChatList_HideAction: String { return self._s[4587]! } + public var Conversation_FileICloudDrive: String { return self._s[4589]! } public func PUSH_PINNED_GEOLIVE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4586]!, self._r[4586]!, [_1]) + return formatWithArgumentRanges(self._s[4590]!, self._r[4590]!, [_1]) } - public var Passport_PasswordReset: String { return self._s[4588]! } - public var ChatList_Context_UnhideArchive: String { return self._s[4590]! } - public var ConvertToSupergroup_HelpText: String { return self._s[4591]! } - public var Calls_AddTab: String { return self._s[4592]! } - public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4594]! } - public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4595]! } - public var Privacy_GroupsAndChannels: String { return self._s[4598]! } - public var Conversation_UsernameCopied: String { return self._s[4599]! } - public var AutoNightTheme_Disabled: String { return self._s[4600]! } - public var CreatePoll_MultipleChoice: String { return self._s[4601]! } + public var Passport_PasswordReset: String { return self._s[4592]! } + public var ChatList_Context_UnhideArchive: String { return self._s[4594]! } + public var ConvertToSupergroup_HelpText: String { return self._s[4595]! } + public var Calls_AddTab: String { return self._s[4596]! } + public var TwoStepAuth_ConfirmEmailResendCode: String { return self._s[4598]! } + public var SettingsSearch_Synonyms_Stickers_SuggestStickers: String { return self._s[4599]! } + public var Privacy_GroupsAndChannels: String { return self._s[4602]! } + public var Conversation_UsernameCopied: String { return self._s[4603]! } + public var AutoNightTheme_Disabled: String { return self._s[4604]! } + public var CreatePoll_MultipleChoice: String { return self._s[4605]! } public func PINNED_INVOICE(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4602]!, self._r[4602]!, [_1]) + return formatWithArgumentRanges(self._s[4606]!, self._r[4606]!, [_1]) } - public var Watch_Bot_Restart: String { return self._s[4604]! } + public var Watch_Bot_Restart: String { return self._s[4608]! } public func Conversation_Kilobytes(_ _0: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4605]!, self._r[4605]!, ["\(_0)"]) + return formatWithArgumentRanges(self._s[4609]!, self._r[4609]!, ["\(_0)"]) } - public var GroupInfo_ScamGroupWarning: String { return self._s[4607]! } - public var Conversation_EditingMessagePanelMedia: String { return self._s[4608]! } - public var Appearance_PreviewIncomingText: String { return self._s[4609]! } - public var ChatSettings_WidgetSettings: String { return self._s[4610]! } - public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4611]! } - public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4613]! } - public var Stats_GroupOverview: String { return self._s[4615]! } - public var ScheduledMessages_EditTime: String { return self._s[4618]! } - public var Month_GenFebruary: String { return self._s[4619]! } - public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4620]! } - public var Stickers_ClearRecent: String { return self._s[4621]! } - public var InviteLink_Create_UsersLimitNumberOfUsersUnlimited: String { return self._s[4622]! } - public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4623]! } - public var Stats_Message_PublicShares: String { return self._s[4624]! } + public var GroupInfo_ScamGroupWarning: String { return self._s[4611]! } + public var Conversation_EditingMessagePanelMedia: String { return self._s[4612]! } + public var Appearance_PreviewIncomingText: String { return self._s[4613]! } + public var ChatSettings_WidgetSettings: String { return self._s[4614]! } + public var Notifications_ChannelNotificationsExceptionsHelp: String { return self._s[4615]! } + public var ChatList_UndoArchiveRevealedTitle: String { return self._s[4617]! } + public var Stats_GroupOverview: String { return self._s[4619]! } + public var ScheduledMessages_EditTime: String { return self._s[4622]! } + public var Month_GenFebruary: String { return self._s[4623]! } + public var ChatList_AutoarchiveSuggestion_OpenSettings: String { return self._s[4624]! } + public var Stickers_ClearRecent: String { return self._s[4625]! } + public var InviteLink_Create_UsersLimitNumberOfUsersUnlimited: String { return self._s[4626]! } + public var TwoStepAuth_EnterPasswordPassword: String { return self._s[4627]! } + public var Stats_Message_PublicShares: String { return self._s[4628]! } public func Checkout_PayPrice(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4625]!, self._r[4625]!, [_0]) + return formatWithArgumentRanges(self._s[4629]!, self._r[4629]!, [_0]) } - public var Login_TermsOfServiceSignupDecline: String { return self._s[4626]! } - public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4627]! } - public var VoiceOver_Chat_PlayHint: String { return self._s[4628]! } - public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4629]! } - public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4631]! } - public var CreatePoll_Create: String { return self._s[4632]! } - public var ChatList_Search_FilterLinks: String { return self._s[4633]! } - public var Your_cards_number_is_invalid: String { return self._s[4634]! } - public var Month_ShortApril: String { return self._s[4635]! } - public var SocksProxySetup_UseForCalls: String { return self._s[4636]! } - public var Conversation_EditingCaptionPanelTitle: String { return self._s[4637]! } - public var SocksProxySetup_Status: String { return self._s[4638]! } - public var VoiceChat_UnmuteForMe: String { return self._s[4639]! } - public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4640]! } - public var ChatListFolder_CategoryBots: String { return self._s[4641]! } - public var Passport_FieldIdentitySelfieHelp: String { return self._s[4643]! } - public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4644]! } - public var Chat_PinnedListPreview_UnpinAllMessages: String { return self._s[4645]! } - public var Wallpaper_ResetWallpapersInfo: String { return self._s[4646]! } - public var Conversation_TitleUnmute: String { return self._s[4647]! } - public var Group_Setup_TypeHeader: String { return self._s[4648]! } + public var Login_TermsOfServiceSignupDecline: String { return self._s[4630]! } + public var CheckoutInfo_ErrorCityInvalid: String { return self._s[4631]! } + public var VoiceOver_Chat_PlayHint: String { return self._s[4632]! } + public var ChatAdmins_AllMembersAreAdminsOffHelp: String { return self._s[4633]! } + public var CheckoutInfo_ShippingInfoTitle: String { return self._s[4635]! } + public var CreatePoll_Create: String { return self._s[4636]! } + public var ChatList_Search_FilterLinks: String { return self._s[4637]! } + public var Your_cards_number_is_invalid: String { return self._s[4638]! } + public var Month_ShortApril: String { return self._s[4639]! } + public var SocksProxySetup_UseForCalls: String { return self._s[4640]! } + public var Conversation_EditingCaptionPanelTitle: String { return self._s[4641]! } + public var SocksProxySetup_Status: String { return self._s[4642]! } + public var VoiceChat_UnmuteForMe: String { return self._s[4643]! } + public var ChannelInfo_DeleteGroupConfirmation: String { return self._s[4644]! } + public var ChatListFolder_CategoryBots: String { return self._s[4645]! } + public var Passport_FieldIdentitySelfieHelp: String { return self._s[4647]! } + public var GroupInfo_BroadcastListNamePlaceholder: String { return self._s[4648]! } + public var Chat_PinnedListPreview_UnpinAllMessages: String { return self._s[4649]! } + public var Wallpaper_ResetWallpapersInfo: String { return self._s[4650]! } + public var Conversation_TitleUnmute: String { return self._s[4651]! } + public var Group_Setup_TypeHeader: String { return self._s[4652]! } public func Conversation_ForwardTooltip_ManyChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4649]!, self._r[4649]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4653]!, self._r[4653]!, [_0, _1]) } - public var Stats_ViewsPerPost: String { return self._s[4650]! } - public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4651]! } - public var Passport_Identity_TranslationHelp: String { return self._s[4652]! } + public var Stats_ViewsPerPost: String { return self._s[4654]! } + public var CheckoutInfo_ShippingInfoCountry: String { return self._s[4655]! } + public var Passport_Identity_TranslationHelp: String { return self._s[4656]! } public func PUSH_CHANNEL_MESSAGE_FWD(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4653]!, self._r[4653]!, [_1]) + return formatWithArgumentRanges(self._s[4657]!, self._r[4657]!, [_1]) } - public var GroupInfo_Administrators_Title: String { return self._s[4654]! } + public var GroupInfo_Administrators_Title: String { return self._s[4658]! } public func Channel_AdminLog_MessageRankName(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4655]!, self._r[4655]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4659]!, self._r[4659]!, [_1, _2]) } public func PUSH_CHAT_MESSAGE_POLL(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4656]!, self._r[4656]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4660]!, self._r[4660]!, [_1, _2, _3]) } - public var CheckoutInfo_ShippingInfoState: String { return self._s[4657]! } - public var Passport_Language_my: String { return self._s[4659]! } - public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4660]! } - public var VoiceChat_Unpin: String { return self._s[4661]! } - public var Map_PlacesNearby: String { return self._s[4662]! } - public var Channel_About_Help: String { return self._s[4663]! } - public var LogoutOptions_AddAccountTitle: String { return self._s[4664]! } - public var ChatSettings_AutomaticAudioDownload: String { return self._s[4665]! } - public var Channel_Username_Title: String { return self._s[4666]! } - public var Activity_RecordingVideoMessage: String { return self._s[4667]! } + public var CheckoutInfo_ShippingInfoState: String { return self._s[4661]! } + public var Passport_Language_my: String { return self._s[4663]! } + public var PrivacyLastSeenSettings_AlwaysShareWith_Title: String { return self._s[4664]! } + public var VoiceChat_Unpin: String { return self._s[4665]! } + public var Map_PlacesNearby: String { return self._s[4666]! } + public var Channel_About_Help: String { return self._s[4667]! } + public var LogoutOptions_AddAccountTitle: String { return self._s[4668]! } + public var ChatSettings_AutomaticAudioDownload: String { return self._s[4669]! } + public var Channel_Username_Title: String { return self._s[4670]! } + public var Activity_RecordingVideoMessage: String { return self._s[4671]! } public func StickerPackActionInfo_RemovedText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4668]!, self._r[4668]!, [_0]) + return formatWithArgumentRanges(self._s[4672]!, self._r[4672]!, [_0]) } - public var CheckoutInfo_ShippingInfoCity: String { return self._s[4669]! } - public var Passport_DiscardMessageDescription: String { return self._s[4670]! } - public var Conversation_LinkDialogOpen: String { return self._s[4671]! } - public var ChatList_Context_HideArchive: String { return self._s[4672]! } + public var CheckoutInfo_ShippingInfoCity: String { return self._s[4673]! } + public var Passport_DiscardMessageDescription: String { return self._s[4674]! } + public var Conversation_LinkDialogOpen: String { return self._s[4675]! } + public var ChatList_Context_HideArchive: String { return self._s[4676]! } public func Message_AuthorPinnedGame(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4673]!, self._r[4673]!, [_0]) + return formatWithArgumentRanges(self._s[4677]!, self._r[4677]!, [_0]) } - public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4674]! } - public var Conversation_Admin: String { return self._s[4675]! } - public var DialogList_TabTitle: String { return self._s[4676]! } + public var Privacy_GroupsAndChannels_CustomShareHelp: String { return self._s[4678]! } + public var Conversation_Admin: String { return self._s[4679]! } + public var DialogList_TabTitle: String { return self._s[4680]! } public func PUSH_CHAT_ALBUM(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4677]!, self._r[4677]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4681]!, self._r[4681]!, [_1, _2]) } - public var Notifications_PermissionsUnreachableText: String { return self._s[4678]! } - public var Passport_Identity_GenderMale: String { return self._s[4680]! } + public var Notifications_PermissionsUnreachableText: String { return self._s[4682]! } + public var Passport_Identity_GenderMale: String { return self._s[4684]! } public func VoiceChat_EditTitleSuccess(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4682]!, self._r[4682]!, [_0]) + return formatWithArgumentRanges(self._s[4686]!, self._r[4686]!, [_0]) } - public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4683]! } - public var PhoneNumberHelp_Alert: String { return self._s[4684]! } - public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4685]! } - public var Notifications_InAppNotifications: String { return self._s[4686]! } + public var SettingsSearch_Synonyms_Privacy_BlockedUsers: String { return self._s[4687]! } + public var PhoneNumberHelp_Alert: String { return self._s[4688]! } + public var EnterPasscode_EnterNewPasscodeChange: String { return self._s[4689]! } + public var Notifications_InAppNotifications: String { return self._s[4690]! } public func Update_AppVersion(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4687]!, self._r[4687]!, [_0]) + return formatWithArgumentRanges(self._s[4691]!, self._r[4691]!, [_0]) } - public var Notification_VideoCallOutgoing: String { return self._s[4688]! } - public var Login_InvalidCodeError: String { return self._s[4689]! } - public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4690]! } + public var Notification_VideoCallOutgoing: String { return self._s[4692]! } + public var Login_InvalidCodeError: String { return self._s[4693]! } + public var Conversation_PrivateChannelTimeLimitedAlertJoin: String { return self._s[4694]! } public func LastSeen_TodayAt(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4692]!, self._r[4692]!, [_0]) + return formatWithArgumentRanges(self._s[4696]!, self._r[4696]!, [_0]) } - public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4693]! } - public var ReportPeer_Report: String { return self._s[4694]! } - public var Camera_FlashOff: String { return self._s[4697]! } - public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4700]! } + public var Conversation_InputTextCaptionPlaceholder: String { return self._s[4697]! } + public var ReportPeer_Report: String { return self._s[4698]! } + public var Camera_FlashOff: String { return self._s[4701]! } + public var Conversation_InputTextBroadcastPlaceholder: String { return self._s[4704]! } public func Notification_VoiceChatScheduledTomorrow(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4701]!, self._r[4701]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4705]!, self._r[4705]!, [_1, _2]) } - public var PrivacyPolicy_DeclineTitle: String { return self._s[4704]! } - public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4705]! } - public var Passport_FieldEmail: String { return self._s[4706]! } + public var PrivacyPolicy_DeclineTitle: String { return self._s[4708]! } + public var SettingsSearch_Synonyms_Privacy_PasscodeAndTouchId: String { return self._s[4709]! } + public var Passport_FieldEmail: String { return self._s[4710]! } public func Channel_AdminLog_MessageKickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4707]!, self._r[4707]!, [_1]) + return formatWithArgumentRanges(self._s[4711]!, self._r[4711]!, [_1]) } - public var Notifications_ExceptionsResetToDefaults: String { return self._s[4708]! } - public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4709]! } - public var Group_OwnershipTransfer_Title: String { return self._s[4710]! } - public var Conversation_DefaultRestrictedInline: String { return self._s[4711]! } - public var Login_PhoneNumberHelp: String { return self._s[4713]! } - public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4714]! } - public var Conversation_PinnedQuiz: String { return self._s[4715]! } - public var CreateGroup_SoftUserLimitAlert: String { return self._s[4716]! } - public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4717]! } - public var Group_MessagePhotoUpdated: String { return self._s[4718]! } - public var LoginPassword_PasswordPlaceholder: String { return self._s[4719]! } - public var BroadcastGroups_ConfirmationAlert_Text: String { return self._s[4720]! } - public var Passport_Identity_Translations: String { return self._s[4722]! } - public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4723]! } - public var ChannelInfo_DeleteChannel: String { return self._s[4725]! } - public var PasscodeSettings_HelpBottom: String { return self._s[4726]! } - public var Channel_Members_AddMembers: String { return self._s[4727]! } - public var AutoDownloadSettings_LastDelimeter: String { return self._s[4728]! } - public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4730]! } - public var Conversation_HoldForAudio: String { return self._s[4731]! } - public var Media_LimitedAccessChangeSettings: String { return self._s[4733]! } - public var Watch_LastSeen_Lately: String { return self._s[4734]! } - public var ChatList_Context_MarkAsRead: String { return self._s[4735]! } - public var Conversation_PinnedMessage: String { return self._s[4736]! } - public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4737]! } - public var VoiceChat_StopRecordingStop: String { return self._s[4739]! } - public var Passport_UpdateRequiredError: String { return self._s[4740]! } - public var PrivacySettings_Passcode: String { return self._s[4741]! } + public var Notifications_ExceptionsResetToDefaults: String { return self._s[4712]! } + public var PeerInfo_PaneVoiceAndVideo: String { return self._s[4713]! } + public var Group_OwnershipTransfer_Title: String { return self._s[4714]! } + public var Conversation_DefaultRestrictedInline: String { return self._s[4715]! } + public var Login_PhoneNumberHelp: String { return self._s[4717]! } + public var Channel_AdminLogFilter_EventsNewMembers: String { return self._s[4718]! } + public var Conversation_PinnedQuiz: String { return self._s[4719]! } + public var CreateGroup_SoftUserLimitAlert: String { return self._s[4720]! } + public var Login_PhoneNumberAlreadyAuthorizedSwitch: String { return self._s[4721]! } + public var Group_MessagePhotoUpdated: String { return self._s[4722]! } + public var LoginPassword_PasswordPlaceholder: String { return self._s[4723]! } + public var BroadcastGroups_ConfirmationAlert_Text: String { return self._s[4724]! } + public var Passport_Identity_Translations: String { return self._s[4726]! } + public var ChatAdmins_AllMembersAreAdmins: String { return self._s[4727]! } + public var ChannelInfo_DeleteChannel: String { return self._s[4729]! } + public var PasscodeSettings_HelpBottom: String { return self._s[4730]! } + public var Channel_Members_AddMembers: String { return self._s[4731]! } + public var AutoDownloadSettings_LastDelimeter: String { return self._s[4732]! } + public var Notification_Exceptions_DeleteAllConfirmation: String { return self._s[4734]! } + public var Conversation_HoldForAudio: String { return self._s[4735]! } + public var Media_LimitedAccessChangeSettings: String { return self._s[4737]! } + public var Watch_LastSeen_Lately: String { return self._s[4738]! } + public var ChatList_Context_MarkAsRead: String { return self._s[4739]! } + public var Conversation_PinnedMessage: String { return self._s[4740]! } + public var SettingsSearch_Synonyms_Appearance_ColorTheme: String { return self._s[4741]! } + public var VoiceChat_StopRecordingStop: String { return self._s[4743]! } + public var Passport_UpdateRequiredError: String { return self._s[4744]! } + public var PrivacySettings_Passcode: String { return self._s[4745]! } public func Call_EmojiDescription(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4742]!, self._r[4742]!, [_0]) + return formatWithArgumentRanges(self._s[4746]!, self._r[4746]!, [_0]) } - public var AutoNightTheme_NotAvailable: String { return self._s[4743]! } - public var Conversation_PressVolumeButtonForSound: String { return self._s[4744]! } - public var VoiceOver_Common_On: String { return self._s[4745]! } - public var LoginPassword_InvalidPasswordError: String { return self._s[4746]! } - public var ChatListFolder_IncludedSectionHeader: String { return self._s[4747]! } - public var Channel_SignMessages_Help: String { return self._s[4748]! } - public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4749]! } - public var Conversation_TitleNoComments: String { return self._s[4750]! } - public var MediaPicker_LivePhotoDescription: String { return self._s[4751]! } - public var GroupInfo_Permissions: String { return self._s[4752]! } - public var GroupPermission_NoSendLinks: String { return self._s[4755]! } + public var AutoNightTheme_NotAvailable: String { return self._s[4747]! } + public var Conversation_PressVolumeButtonForSound: String { return self._s[4748]! } + public var VoiceOver_Common_On: String { return self._s[4749]! } + public var LoginPassword_InvalidPasswordError: String { return self._s[4750]! } + public var ChatListFolder_IncludedSectionHeader: String { return self._s[4751]! } + public var Channel_SignMessages_Help: String { return self._s[4752]! } + public var ChatList_DeleteForEveryoneConfirmationTitle: String { return self._s[4753]! } + public var Conversation_TitleNoComments: String { return self._s[4754]! } + public var MediaPicker_LivePhotoDescription: String { return self._s[4755]! } + public var GroupInfo_Permissions: String { return self._s[4756]! } + public var GroupPermission_NoSendLinks: String { return self._s[4759]! } public func Conversation_ScheduledVoiceChatStartsTomorrow(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4756]!, self._r[4756]!, [_0]) + return formatWithArgumentRanges(self._s[4760]!, self._r[4760]!, [_0]) } - public var Passport_Identity_ResidenceCountry: String { return self._s[4757]! } - public var Appearance_ThemeCarouselNightBlue: String { return self._s[4759]! } - public var ChatList_ArchiveAction: String { return self._s[4760]! } + public var Passport_Identity_ResidenceCountry: String { return self._s[4761]! } + public var Appearance_ThemeCarouselNightBlue: String { return self._s[4763]! } + public var ChatList_ArchiveAction: String { return self._s[4764]! } public func Channel_AdminLog_DisabledSlowmode(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4761]!, self._r[4761]!, [_0]) + return formatWithArgumentRanges(self._s[4765]!, self._r[4765]!, [_0]) } - public var GroupInfo_GroupHistory: String { return self._s[4762]! } + public var GroupInfo_GroupHistory: String { return self._s[4766]! } public func Channel_Management_ErrorNotMember(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4764]!, self._r[4764]!, [_0]) + return formatWithArgumentRanges(self._s[4768]!, self._r[4768]!, [_0]) } - public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4766]! } - public var Channel_Info_Banned: String { return self._s[4767]! } - public var Paint_RecentStickers: String { return self._s[4768]! } - public var VoiceOver_MessageContextSend: String { return self._s[4769]! } - public var Group_ErrorNotMutualContact: String { return self._s[4770]! } - public var ReportPeer_ReasonOther: String { return self._s[4772]! } - public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4773]! } - public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4775]! } - public var KeyCommand_Find: String { return self._s[4776]! } + public var Privacy_Forwards_LinkIfAllowed: String { return self._s[4770]! } + public var Channel_Info_Banned: String { return self._s[4771]! } + public var Paint_RecentStickers: String { return self._s[4772]! } + public var VoiceOver_MessageContextSend: String { return self._s[4773]! } + public var Group_ErrorNotMutualContact: String { return self._s[4774]! } + public var ReportPeer_ReasonOther: String { return self._s[4776]! } + public var Channel_BanUser_PermissionChangeGroupInfo: String { return self._s[4777]! } + public var SocksProxySetup_ShareQRCodeInfo: String { return self._s[4779]! } + public var KeyCommand_Find: String { return self._s[4780]! } public func Channel_MessageTitleUpdated(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4777]!, self._r[4777]!, [_0]) + return formatWithArgumentRanges(self._s[4781]!, self._r[4781]!, [_0]) } - public var ChatList_Context_Unmute: String { return self._s[4778]! } - public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4779]! } - public var TwoFactorSetup_ResetDone_Action: String { return self._s[4780]! } - public var Stickers_GroupStickersHelp: String { return self._s[4781]! } - public var Checkout_Title: String { return self._s[4782]! } - public var Activity_RecordingAudio: String { return self._s[4783]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4784]! } - public var BlockedUsers_BlockTitle: String { return self._s[4785]! } - public var DialogList_SavedMessagesHelp: String { return self._s[4787]! } - public var Calls_All: String { return self._s[4788]! } - public var Settings_FAQ_Button: String { return self._s[4790]! } - public var Conversation_Dice_u1F3B0: String { return self._s[4792]! } + public var ChatList_Context_Unmute: String { return self._s[4782]! } + public var Chat_SlowmodeAttachmentLimitReached: String { return self._s[4783]! } + public var TwoFactorSetup_ResetDone_Action: String { return self._s[4784]! } + public var Stickers_GroupStickersHelp: String { return self._s[4785]! } + public var Checkout_Title: String { return self._s[4786]! } + public var Activity_RecordingAudio: String { return self._s[4787]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsPreview: String { return self._s[4788]! } + public var BlockedUsers_BlockTitle: String { return self._s[4789]! } + public var DialogList_SavedMessagesHelp: String { return self._s[4791]! } + public var Calls_All: String { return self._s[4792]! } + public var Settings_FAQ_Button: String { return self._s[4794]! } + public var Conversation_Dice_u1F3B0: String { return self._s[4796]! } public func Time_MonthOfYear_m5(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4793]!, self._r[4793]!, [_0]) + return formatWithArgumentRanges(self._s[4797]!, self._r[4797]!, [_0]) } - public var Conversation_ReportGroupLocation: String { return self._s[4794]! } - public var Passport_Scans_Upload: String { return self._s[4795]! } - public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4797]! } - public var ChatList_UnarchiveAction: String { return self._s[4798]! } - public var Stats_GroupTopInviter_History: String { return self._s[4799]! } - public var GroupInfo_Permissions_Title: String { return self._s[4800]! } - public var VoiceChat_CreateNewVoiceChatStart: String { return self._s[4801]! } - public var Passport_Language_el: String { return self._s[4802]! } - public var Channel_DiscussionMessageUnavailable: String { return self._s[4803]! } + public var Conversation_ReportGroupLocation: String { return self._s[4798]! } + public var Passport_Scans_Upload: String { return self._s[4799]! } + public var Channel_EditAdmin_PermissionPinMessages: String { return self._s[4801]! } + public var ChatList_UnarchiveAction: String { return self._s[4802]! } + public var Stats_GroupTopInviter_History: String { return self._s[4803]! } + public var GroupInfo_Permissions_Title: String { return self._s[4804]! } + public var VoiceChat_CreateNewVoiceChatStart: String { return self._s[4805]! } + public var Passport_Language_el: String { return self._s[4806]! } + public var Channel_DiscussionMessageUnavailable: String { return self._s[4807]! } public func UserInfo_ContactForwardTooltip_TwoChats_One(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4804]!, self._r[4804]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4808]!, self._r[4808]!, [_0, _1]) } - public var GroupInfo_ActionPromote: String { return self._s[4805]! } - public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4806]! } - public var Media_LimitedAccessSelectMore: String { return self._s[4807]! } + public var GroupInfo_ActionPromote: String { return self._s[4809]! } + public var Group_OwnershipTransfer_ErrorLocatedGroupsTooMuch: String { return self._s[4810]! } + public var Media_LimitedAccessSelectMore: String { return self._s[4811]! } public func TwoStepAuth_PendingEmailHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4808]!, self._r[4808]!, [_0]) + return formatWithArgumentRanges(self._s[4812]!, self._r[4812]!, [_0]) } - public var VoiceOver_Chat_Reply: String { return self._s[4809]! } - public var Month_GenMay: String { return self._s[4810]! } - public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4811]! } - public var Chat_PsaTooltip_covid: String { return self._s[4812]! } - public var Watch_Suggestion_CantTalk: String { return self._s[4813]! } - public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4814]! } - public var AppUpgrade_Running: String { return self._s[4815]! } - public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4818]! } - public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4819]! } - public var SharedMedia_EmptyText: String { return self._s[4820]! } - public var Passport_Address_EditResidentialAddress: String { return self._s[4821]! } - public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4822]! } - public var Message_PinnedGame: String { return self._s[4823]! } - public var KeyCommand_SearchInChat: String { return self._s[4824]! } - public var Appearance_ThemeCarouselNewNight: String { return self._s[4825]! } - public var ChatList_Search_FilterMedia: String { return self._s[4826]! } - public var Message_PinnedAudioMessage: String { return self._s[4827]! } - public var ChannelInfo_ConfirmLeave: String { return self._s[4829]! } + public var VoiceOver_Chat_Reply: String { return self._s[4813]! } + public var Month_GenMay: String { return self._s[4814]! } + public var DialogList_DeleteBotConversationConfirmation: String { return self._s[4815]! } + public var Chat_PsaTooltip_covid: String { return self._s[4816]! } + public var Watch_Suggestion_CantTalk: String { return self._s[4817]! } + public var Privacy_GroupsAndChannels_NeverAllow_Title: String { return self._s[4818]! } + public var AppUpgrade_Running: String { return self._s[4819]! } + public var PasscodeSettings_UnlockWithFaceId: String { return self._s[4822]! } + public var Notification_Exceptions_PreviewAlwaysOff: String { return self._s[4823]! } + public var SharedMedia_EmptyText: String { return self._s[4824]! } + public var Passport_Address_EditResidentialAddress: String { return self._s[4825]! } + public var SettingsSearch_Synonyms_Notifications_GroupNotificationsAlert: String { return self._s[4826]! } + public var Message_PinnedGame: String { return self._s[4827]! } + public var KeyCommand_SearchInChat: String { return self._s[4828]! } + public var Appearance_ThemeCarouselNewNight: String { return self._s[4829]! } + public var ChatList_Search_FilterMedia: String { return self._s[4830]! } + public var Message_PinnedAudioMessage: String { return self._s[4831]! } + public var ChannelInfo_ConfirmLeave: String { return self._s[4833]! } public func Channel_AdminLog_MessagePromotedNameUsername(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4830]!, self._r[4830]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4834]!, self._r[4834]!, [_1, _2]) } - public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4831]! } - public var InviteLink_Create: String { return self._s[4832]! } + public var SocksProxySetup_ProxyStatusUnavailable: String { return self._s[4835]! } + public var InviteLink_Create: String { return self._s[4836]! } public func Passport_Email_CodeHelp(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4833]!, self._r[4833]!, [_0]) + return formatWithArgumentRanges(self._s[4837]!, self._r[4837]!, [_0]) } public func Message_PinnedTextMessage(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4834]!, self._r[4834]!, [_0]) + return formatWithArgumentRanges(self._s[4838]!, self._r[4838]!, [_0]) } - public var Settings_AddAccount: String { return self._s[4835]! } - public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4836]! } - public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4837]! } - public var Channel_JoinChannel: String { return self._s[4838]! } - public var Watch_UserInfo_Unblock: String { return self._s[4839]! } - public var PhoneLabel_Title: String { return self._s[4840]! } - public var VoiceChat_EditPermissions: String { return self._s[4842]! } - public var Group_Setup_HistoryHiddenHelp: String { return self._s[4843]! } - public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4844]! } + public var Settings_AddAccount: String { return self._s[4839]! } + public var Channel_AdminLog_CanDeleteMessages: String { return self._s[4840]! } + public var Conversation_DiscardVoiceMessageTitle: String { return self._s[4841]! } + public var Channel_JoinChannel: String { return self._s[4842]! } + public var Watch_UserInfo_Unblock: String { return self._s[4843]! } + public var PhoneLabel_Title: String { return self._s[4844]! } + public var VoiceChat_EditPermissions: String { return self._s[4846]! } + public var Group_Setup_HistoryHiddenHelp: String { return self._s[4847]! } + public var Privacy_ProfilePhoto_AlwaysShareWith_Title: String { return self._s[4848]! } public func Login_PhoneGenericEmailBody(_ _1: String, _ _2: String, _ _3: String, _ _4: String, _ _5: String, _ _6: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4845]!, self._r[4845]!, [_1, _2, _3, _4, _5, _6]) + return formatWithArgumentRanges(self._s[4849]!, self._r[4849]!, [_1, _2, _3, _4, _5, _6]) } - public var Channel_AddBotErrorHaveRights: String { return self._s[4846]! } - public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4847]! } - public var DialogList_EncryptionProcessing: String { return self._s[4848]! } - public var ChatList_Search_FilterChats: String { return self._s[4849]! } - public var WatchRemote_NotificationText: String { return self._s[4850]! } - public var EditTheme_ChangeColors: String { return self._s[4852]! } - public var GroupRemoved_ViewUserInfo: String { return self._s[4853]! } - public var CallSettings_OnMobile: String { return self._s[4855]! } - public var Month_ShortFebruary: String { return self._s[4857]! } - public var VoiceOver_MessageContextReply: String { return self._s[4858]! } - public var AutoremoveSetup_TimerValueNever: String { return self._s[4859]! } - public var Group_Location_ChangeLocation: String { return self._s[4861]! } + public var Channel_AddBotErrorHaveRights: String { return self._s[4850]! } + public var ChatList_TabIconFoldersTooltipNonEmptyFolders: String { return self._s[4851]! } + public var DialogList_EncryptionProcessing: String { return self._s[4852]! } + public var ChatList_Search_FilterChats: String { return self._s[4853]! } + public var WatchRemote_NotificationText: String { return self._s[4854]! } + public var EditTheme_ChangeColors: String { return self._s[4856]! } + public var GroupRemoved_ViewUserInfo: String { return self._s[4857]! } + public var CallSettings_OnMobile: String { return self._s[4859]! } + public var Month_ShortFebruary: String { return self._s[4861]! } + public var VoiceOver_MessageContextReply: String { return self._s[4862]! } + public var AutoremoveSetup_TimerValueNever: String { return self._s[4863]! } + public var Group_Location_ChangeLocation: String { return self._s[4865]! } public func PUSH_VIDEO_CALL_REQUEST(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4862]!, self._r[4862]!, [_1]) + return formatWithArgumentRanges(self._s[4866]!, self._r[4866]!, [_1]) } - public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4863]! } - public var VoiceOver_Media_PlaybackStop: String { return self._s[4864]! } - public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4865]! } + public var Passport_Address_TypeBankStatementUploadScan: String { return self._s[4867]! } + public var VoiceOver_Media_PlaybackStop: String { return self._s[4868]! } + public var SettingsSearch_Synonyms_Data_SaveIncomingPhotos: String { return self._s[4869]! } public func Channel_AdminLog_MessageRestrictedUntil(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4867]!, self._r[4867]!, [_0]) + return formatWithArgumentRanges(self._s[4871]!, self._r[4871]!, [_0]) } - public var PhotoEditor_WarmthTool: String { return self._s[4868]! } - public var Login_InfoAvatarPhoto: String { return self._s[4869]! } - public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4870]! } - public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4871]! } - public var Map_PlacesInThisArea: String { return self._s[4872]! } - public var VoiceOver_Chat_ContactEmail: String { return self._s[4873]! } - public var Notifications_InAppNotificationsSounds: String { return self._s[4874]! } + public var PhotoEditor_WarmthTool: String { return self._s[4872]! } + public var Login_InfoAvatarPhoto: String { return self._s[4873]! } + public var Notification_Exceptions_NewException_MessagePreviewHeader: String { return self._s[4874]! } + public var Permissions_CellularDataAllowInSettings_v0: String { return self._s[4875]! } + public var Map_PlacesInThisArea: String { return self._s[4876]! } + public var VoiceOver_Chat_ContactEmail: String { return self._s[4877]! } + public var Notifications_InAppNotificationsSounds: String { return self._s[4878]! } public func PUSH_PINNED_NOTEXT(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4875]!, self._r[4875]!, [_1]) - } - public var PeerInfo_ReportProfileVideo: String { return self._s[4876]! } - public var ShareMenu_Send: String { return self._s[4877]! } - public var Username_InvalidStartsWithNumber: String { return self._s[4878]! } - public func Channel_AdminLog_StartedVoiceChat(_ _1: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4879]!, self._r[4879]!, [_1]) } - public var Appearance_AppIconClassicX: String { return self._s[4880]! } - public var Report_Report: String { return self._s[4881]! } + public var PeerInfo_ReportProfileVideo: String { return self._s[4880]! } + public var ShareMenu_Send: String { return self._s[4881]! } + public var Username_InvalidStartsWithNumber: String { return self._s[4882]! } + public func Channel_AdminLog_StartedVoiceChat(_ _1: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4883]!, self._r[4883]!, [_1]) + } + public var Appearance_AppIconClassicX: String { return self._s[4884]! } + public var Report_Report: String { return self._s[4885]! } public func PUSH_CHANNEL_MESSAGE_ROUND(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4882]!, self._r[4882]!, [_1]) + return formatWithArgumentRanges(self._s[4886]!, self._r[4886]!, [_1]) } - public var Conversation_StopPoll: String { return self._s[4883]! } - public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4885]! } - public var Passport_Identity_EditIdentityCard: String { return self._s[4886]! } - public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4887]! } - public var Conversation_Timer_Title: String { return self._s[4888]! } - public var Common_Next: String { return self._s[4889]! } - public var Notification_Exceptions_NewException: String { return self._s[4890]! } + public var Conversation_StopPoll: String { return self._s[4887]! } + public var InfoPlist_NSLocationAlwaysUsageDescription: String { return self._s[4889]! } + public var Passport_Identity_EditIdentityCard: String { return self._s[4890]! } + public var Appearance_ThemePreview_ChatList_3_Name: String { return self._s[4891]! } + public var Conversation_Timer_Title: String { return self._s[4892]! } + public var Common_Next: String { return self._s[4893]! } + public var Notification_Exceptions_NewException: String { return self._s[4894]! } public func Generic_OpenHiddenLinkAlert(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4891]!, self._r[4891]!, [_0]) + return formatWithArgumentRanges(self._s[4895]!, self._r[4895]!, [_0]) } - public var AccessDenied_CallMicrophone: String { return self._s[4892]! } - public var VoiceChat_UnmutePeer: String { return self._s[4893]! } - public var ChatImportActivity_Retry: String { return self._s[4894]! } - public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4895]! } - public var ChangePhoneNumberCode_Help: String { return self._s[4896]! } - public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4897]! } - public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4898]! } - public var BlockedUsers_LeavePrefix: String { return self._s[4899]! } + public var AccessDenied_CallMicrophone: String { return self._s[4896]! } + public var VoiceChat_UnmutePeer: String { return self._s[4897]! } + public var ChatImportActivity_Retry: String { return self._s[4898]! } + public var SettingsSearch_Synonyms_Data_AutoDownloadUsingCellular: String { return self._s[4899]! } + public var ChangePhoneNumberCode_Help: String { return self._s[4900]! } + public var Passport_Identity_OneOfTypeIdentityCard: String { return self._s[4901]! } + public var Channel_AdminLogFilter_EventsLeaving: String { return self._s[4902]! } + public var BlockedUsers_LeavePrefix: String { return self._s[4903]! } public func Passport_RequestHeader(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4900]!, self._r[4900]!, [_0]) + return formatWithArgumentRanges(self._s[4904]!, self._r[4904]!, [_0]) } - public var Group_About_Help: String { return self._s[4901]! } - public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4902]! } - public var Tour_Title3: String { return self._s[4903]! } - public var Watch_Conversation_Unblock: String { return self._s[4904]! } - public var Watch_UserInfo_Block: String { return self._s[4905]! } - public var Notifications_ChannelNotificationsAlert: String { return self._s[4906]! } - public var TwoFactorSetup_Hint_Action: String { return self._s[4907]! } - public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4908]! } - public var TextFormat_AddLinkTitle: String { return self._s[4909]! } - public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4910]! } + public var Group_About_Help: String { return self._s[4905]! } + public var TwoStepAuth_ChangePasswordDescription: String { return self._s[4906]! } + public var Tour_Title3: String { return self._s[4907]! } + public var Watch_Conversation_Unblock: String { return self._s[4908]! } + public var Watch_UserInfo_Block: String { return self._s[4909]! } + public var Notifications_ChannelNotificationsAlert: String { return self._s[4910]! } + public var TwoFactorSetup_Hint_Action: String { return self._s[4911]! } + public var IntentsSettings_SuggestedChatsInfo: String { return self._s[4912]! } + public var TextFormat_AddLinkTitle: String { return self._s[4913]! } + public var GroupInfo_InviteLink_RevokeAlert_Revoke: String { return self._s[4914]! } public func Notification_VoiceChatScheduled(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4911]!, self._r[4911]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4915]!, self._r[4915]!, [_1, _2]) } - public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4912]! } - public var FastTwoStepSetup_PasswordSection: String { return self._s[4914]! } - public var Compose_ChannelMembers: String { return self._s[4915]! } - public var Conversation_ForwardTitle: String { return self._s[4916]! } - public var Conversation_PinnedPoll: String { return self._s[4919]! } + public var TwoStepAuth_EnterPasswordTitle: String { return self._s[4916]! } + public var FastTwoStepSetup_PasswordSection: String { return self._s[4918]! } + public var Compose_ChannelMembers: String { return self._s[4919]! } + public var Conversation_ForwardTitle: String { return self._s[4920]! } + public var Conversation_PinnedPoll: String { return self._s[4923]! } public func VoiceOver_Chat_AnonymousPollFrom(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4920]!, self._r[4920]!, [_0]) + return formatWithArgumentRanges(self._s[4924]!, self._r[4924]!, [_0]) } - public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4921]! } - public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4923]! } - public var Stats_Overview: String { return self._s[4924]! } - public var Map_HomeAndWorkTitle: String { return self._s[4925]! } + public var SettingsSearch_Synonyms_EditProfile_AddAccount: String { return self._s[4925]! } + public var Conversation_ContextMenuStickerPackAdd: String { return self._s[4927]! } + public var Stats_Overview: String { return self._s[4928]! } + public var Map_HomeAndWorkTitle: String { return self._s[4929]! } public func Time_PreciseDate_m4(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4926]!, self._r[4926]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4930]!, self._r[4930]!, [_1, _2, _3]) } - public var Passport_Address_CityPlaceholder: String { return self._s[4927]! } - public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4928]! } - public var Privacy_PhoneNumber: String { return self._s[4929]! } - public var ChatList_Search_FilterFiles: String { return self._s[4930]! } - public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4931]! } - public var ChannelIntro_CreateChannel: String { return self._s[4932]! } - public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4933]! } + public var Passport_Address_CityPlaceholder: String { return self._s[4931]! } + public var InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription: String { return self._s[4932]! } + public var Privacy_PhoneNumber: String { return self._s[4933]! } + public var ChatList_Search_FilterFiles: String { return self._s[4934]! } + public var ChatList_DeleteForEveryoneConfirmationAction: String { return self._s[4935]! } + public var ChannelIntro_CreateChannel: String { return self._s[4936]! } + public var Conversation_InputTextAnonymousPlaceholder: String { return self._s[4937]! } public func Login_EmailCodeBody(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4934]!, self._r[4934]!, [_0]) + return formatWithArgumentRanges(self._s[4938]!, self._r[4938]!, [_0]) } - public var Weekday_ShortMonday: String { return self._s[4935]! } - public var Passport_Language_ar: String { return self._s[4937]! } - public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4938]! } - public var TwoFactorSetup_Done_Title: String { return self._s[4939]! } - public var Calls_RatingFeedback: String { return self._s[4940]! } - public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4941]! } - public var AutoDownloadSettings_ResetSettings: String { return self._s[4944]! } + public var Weekday_ShortMonday: String { return self._s[4939]! } + public var Passport_Language_ar: String { return self._s[4941]! } + public var SettingsSearch_Synonyms_EditProfile_Title: String { return self._s[4942]! } + public var TwoFactorSetup_Done_Title: String { return self._s[4943]! } + public var Calls_RatingFeedback: String { return self._s[4944]! } + public var SettingsSearch_Synonyms_Notifications_ChannelNotificationsPreview: String { return self._s[4945]! } + public var AutoDownloadSettings_ResetSettings: String { return self._s[4948]! } public func VoiceOver_SelfDestructTimerOn(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4945]!, self._r[4945]!, [_0]) - } - public var Watch_Compose_Send: String { return self._s[4946]! } - public var PasscodeSettings_ChangePasscode: String { return self._s[4947]! } - public var WebSearch_RecentSectionClear: String { return self._s[4948]! } - public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { return formatWithArgumentRanges(self._s[4949]!, self._r[4949]!, [_0]) } - public var WallpaperSearch_ColorTeal: String { return self._s[4950]! } - public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4951]! } - public var Permissions_ContactsTitle_v0: String { return self._s[4952]! } - public var Checkout_PasswordEntry_Pay: String { return self._s[4954]! } - public var Settings_SavedMessages: String { return self._s[4955]! } - public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4956]! } - public var Month_ShortMarch: String { return self._s[4957]! } - public var Message_Location: String { return self._s[4958]! } + public var Watch_Compose_Send: String { return self._s[4950]! } + public var PasscodeSettings_ChangePasscode: String { return self._s[4951]! } + public var WebSearch_RecentSectionClear: String { return self._s[4952]! } + public func Contacts_AccessDeniedHelpPortrait(_ _0: String) -> (String, [(Int, NSRange)]) { + return formatWithArgumentRanges(self._s[4953]!, self._r[4953]!, [_0]) + } + public var WallpaperSearch_ColorTeal: String { return self._s[4954]! } + public var Wallpaper_SetCustomBackgroundInfo: String { return self._s[4955]! } + public var Permissions_ContactsTitle_v0: String { return self._s[4956]! } + public var Checkout_PasswordEntry_Pay: String { return self._s[4958]! } + public var Settings_SavedMessages: String { return self._s[4959]! } + public var TwoStepAuth_ReEnterPasswordDescription: String { return self._s[4960]! } + public var Month_ShortMarch: String { return self._s[4961]! } + public var Message_Location: String { return self._s[4962]! } public func PUSH_MESSAGE_GIF(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4959]!, self._r[4959]!, [_1]) + return formatWithArgumentRanges(self._s[4963]!, self._r[4963]!, [_1]) } public func Channel_AdminLog_MessageRemovedAdminName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4960]!, self._r[4960]!, [_1]) + return formatWithArgumentRanges(self._s[4964]!, self._r[4964]!, [_1]) } public func Notification_CallTimeFormat(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4961]!, self._r[4961]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4965]!, self._r[4965]!, [_1, _2]) } - public var VoiceOver_Chat_VoiceMessage: String { return self._s[4963]! } + public var VoiceOver_Chat_VoiceMessage: String { return self._s[4967]! } public func Channel_AdminLog_MessageChangedUnlinkedChannel(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4964]!, self._r[4964]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4968]!, self._r[4968]!, [_1, _2]) } - public var GroupPermission_NoSendMedia: String { return self._s[4965]! } - public var Conversation_ClousStorageInfo_Description2: String { return self._s[4966]! } - public var SharedMedia_CategoryDocs: String { return self._s[4967]! } - public var Appearance_RemoveThemeConfirmation: String { return self._s[4968]! } - public var Paint_Framed: String { return self._s[4969]! } - public var Channel_Setup_LinkTypePublic: String { return self._s[4970]! } - public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4971]! } - public var Passport_Identity_DoesNotExpire: String { return self._s[4972]! } + public var GroupPermission_NoSendMedia: String { return self._s[4969]! } + public var Conversation_ClousStorageInfo_Description2: String { return self._s[4970]! } + public var SharedMedia_CategoryDocs: String { return self._s[4971]! } + public var Appearance_RemoveThemeConfirmation: String { return self._s[4972]! } + public var Paint_Framed: String { return self._s[4973]! } + public var Channel_Setup_LinkTypePublic: String { return self._s[4974]! } + public var Channel_EditAdmin_PermissionAddAdmins: String { return self._s[4975]! } + public var Passport_Identity_DoesNotExpire: String { return self._s[4976]! } public func ChatImport_SelectionConfirmationUserWithTitle(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4973]!, self._r[4973]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4977]!, self._r[4977]!, [_1, _2]) } - public var TwoStepAuth_RecoveryUnavailableResetAction: String { return self._s[4974]! } - public var Channel_SignMessages: String { return self._s[4975]! } - public var Contacts_AccessDeniedHelpON: String { return self._s[4976]! } - public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4977]! } + public var TwoStepAuth_RecoveryUnavailableResetAction: String { return self._s[4978]! } + public var Channel_SignMessages: String { return self._s[4979]! } + public var Contacts_AccessDeniedHelpON: String { return self._s[4980]! } + public var Conversation_ContextMenuStickerPackInfo: String { return self._s[4981]! } public func PUSH_CHAT_LEFT(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4978]!, self._r[4978]!, [_1, _2]) + return formatWithArgumentRanges(self._s[4982]!, self._r[4982]!, [_1, _2]) } - public var InviteLink_Create_TimeLimitNoLimit: String { return self._s[4979]! } - public var ImportStickerPack_ChooseName: String { return self._s[4980]! } - public var GroupInfo_UpgradeButton: String { return self._s[4981]! } - public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4982]! } + public var InviteLink_Create_TimeLimitNoLimit: String { return self._s[4983]! } + public var ImportStickerPack_ChooseName: String { return self._s[4984]! } + public var GroupInfo_UpgradeButton: String { return self._s[4985]! } + public var Channel_EditAdmin_PermissionInviteMembers: String { return self._s[4986]! } public func Conversation_ScheduledVoiceChatStartsTomorrowShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4983]!, self._r[4983]!, [_0]) + return formatWithArgumentRanges(self._s[4987]!, self._r[4987]!, [_0]) } - public var AutoDownloadSettings_Files: String { return self._s[4984]! } + public var AutoDownloadSettings_Files: String { return self._s[4988]! } public func Notification_ChangedGroupName(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4985]!, self._r[4985]!, [_0, _1]) + return formatWithArgumentRanges(self._s[4989]!, self._r[4989]!, [_0, _1]) } - public var Login_SendCodeViaSms: String { return self._s[4987]! } - public var Update_UpdateApp: String { return self._s[4988]! } - public var Channel_Setup_TypePublic: String { return self._s[4989]! } - public var Watch_Compose_CreateMessage: String { return self._s[4990]! } + public var Login_SendCodeViaSms: String { return self._s[4991]! } + public var Update_UpdateApp: String { return self._s[4992]! } + public var Channel_Setup_TypePublic: String { return self._s[4993]! } + public var Watch_Compose_CreateMessage: String { return self._s[4994]! } public func PUSH_CHAT_MESSAGE_VIDEOS(_ _1: String, _ _2: String, _ _3: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[4991]!, self._r[4991]!, [_1, _2, _3]) + return formatWithArgumentRanges(self._s[4995]!, self._r[4995]!, [_1, _2, _3]) } - public var StickerPacksSettings_ManagingHelp: String { return self._s[4992]! } - public var VoiceOver_Chat_Video: String { return self._s[4993]! } - public var Forward_ChannelReadOnly: String { return self._s[4994]! } - public var StickerPack_HideStickers: String { return self._s[4995]! } - public var ChatListFolder_NameContacts: String { return self._s[4996]! } - public var Profile_BotInfo: String { return self._s[4997]! } - public var Document_TargetConfirmationFormat: String { return self._s[4998]! } - public var GroupInfo_InviteByLink: String { return self._s[4999]! } - public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[5000]! } - public var Watch_Stickers_RecentPlaceholder: String { return self._s[5001]! } - public var Broadcast_AdminLog_EmptyText: String { return self._s[5002]! } - public var Passport_NotLoggedInMessage: String { return self._s[5003]! } - public var Conversation_StopQuizConfirmation: String { return self._s[5004]! } - public var Checkout_PaymentMethod: String { return self._s[5005]! } - public var ChatList_ArchivedChatsTitle: String { return self._s[5010]! } - public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[5011]! } - public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[5012]! } - public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[5013]! } - public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[5014]! } - public var Conversation_GigagroupDescription: String { return self._s[5015]! } - public var Camera_Title: String { return self._s[5016]! } - public var Map_Directions: String { return self._s[5017]! } - public var Stats_MessagePublicForwardsTitle: String { return self._s[5019]! } - public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[5020]! } - public var Profile_EncryptionKey: String { return self._s[5021]! } + public var StickerPacksSettings_ManagingHelp: String { return self._s[4996]! } + public var VoiceOver_Chat_Video: String { return self._s[4997]! } + public var Forward_ChannelReadOnly: String { return self._s[4998]! } + public var StickerPack_HideStickers: String { return self._s[4999]! } + public var ChatListFolder_NameContacts: String { return self._s[5000]! } + public var Profile_BotInfo: String { return self._s[5001]! } + public var Document_TargetConfirmationFormat: String { return self._s[5002]! } + public var GroupInfo_InviteByLink: String { return self._s[5003]! } + public var Channel_AdminLog_BanSendStickersAndGifs: String { return self._s[5004]! } + public var Watch_Stickers_RecentPlaceholder: String { return self._s[5005]! } + public var Broadcast_AdminLog_EmptyText: String { return self._s[5006]! } + public var Passport_NotLoggedInMessage: String { return self._s[5007]! } + public var Conversation_StopQuizConfirmation: String { return self._s[5008]! } + public var Checkout_PaymentMethod: String { return self._s[5009]! } + public var ChatList_ArchivedChatsTitle: String { return self._s[5014]! } + public var TwoStepAuth_SetupPasswordConfirmFailed: String { return self._s[5015]! } + public var VoiceOver_Chat_RecordPreviewVoiceMessage: String { return self._s[5016]! } + public var PrivacyLastSeenSettings_GroupsAndChannelsHelp: String { return self._s[5017]! } + public var SettingsSearch_Synonyms_Privacy_Data_ContactsReset: String { return self._s[5018]! } + public var Conversation_GigagroupDescription: String { return self._s[5019]! } + public var Camera_Title: String { return self._s[5020]! } + public var Map_Directions: String { return self._s[5021]! } + public var Stats_MessagePublicForwardsTitle: String { return self._s[5023]! } + public var Privacy_ProfilePhoto_WhoCanSeeMyPhoto: String { return self._s[5024]! } + public var Profile_EncryptionKey: String { return self._s[5025]! } public func LOCAL_CHAT_MESSAGE_FWDS(_ _1: String, _ _2: Int) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5022]!, self._r[5022]!, [_1, "\(_2)"]) + return formatWithArgumentRanges(self._s[5026]!, self._r[5026]!, [_1, "\(_2)"]) } - public var VoiceChat_VideoPreviewShareCamera: String { return self._s[5023]! } + public var VoiceChat_VideoPreviewShareCamera: String { return self._s[5027]! } public func Compatibility_SecretMediaVersionTooLow(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5024]!, self._r[5024]!, [_0, _1]) + return formatWithArgumentRanges(self._s[5028]!, self._r[5028]!, [_0, _1]) } - public var Passport_Identity_TypePassport: String { return self._s[5025]! } - public var CreatePoll_QuizOptionsHeader: String { return self._s[5027]! } - public var Common_No: String { return self._s[5028]! } - public var Conversation_SendMessage_ScheduleMessage: String { return self._s[5029]! } - public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[5030]! } - public var Settings_AboutEmpty: String { return self._s[5031]! } - public var TwoStepAuth_FloodError: String { return self._s[5033]! } - public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[5034]! } + public var Passport_Identity_TypePassport: String { return self._s[5029]! } + public var CreatePoll_QuizOptionsHeader: String { return self._s[5031]! } + public var Common_No: String { return self._s[5032]! } + public var Conversation_SendMessage_ScheduleMessage: String { return self._s[5033]! } + public var SettingsSearch_Synonyms_Privacy_LastSeen: String { return self._s[5034]! } + public var Settings_AboutEmpty: String { return self._s[5035]! } + public var TwoStepAuth_FloodError: String { return self._s[5037]! } + public var SettingsSearch_Synonyms_Appearance_TextSize: String { return self._s[5038]! } public func Notification_VoiceChatScheduledChannel(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5035]!, self._r[5035]!, [_0]) + return formatWithArgumentRanges(self._s[5039]!, self._r[5039]!, [_0]) } public func Channel_AdminLog_MessageUnkickedName(_ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5037]!, self._r[5037]!, [_1]) + return formatWithArgumentRanges(self._s[5041]!, self._r[5041]!, [_1]) } - public var Notification_Exceptions_MessagePreviewAlwaysOn: String { return self._s[5040]! } - public var Conversation_Edit: String { return self._s[5041]! } - public var CheckoutInfo_SaveInfo: String { return self._s[5043]! } - public var VoiceOver_Chat_AnonymousPoll: String { return self._s[5044]! } - public var Call_CameraTooltip: String { return self._s[5046]! } - public var InstantPage_FeedbackButtonShort: String { return self._s[5047]! } - public var Contacts_InviteToTelegram: String { return self._s[5048]! } - public var Notifications_ResetAllNotifications: String { return self._s[5049]! } - public var Calls_NewCall: String { return self._s[5050]! } - public var VoiceOver_Chat_Music: String { return self._s[5053]! } - public var Channel_AdminLogFilter_EventsInviteLinks: String { return self._s[5054]! } - public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[5055]! } - public var Channel_Edit_AboutItem: String { return self._s[5056]! } - public var Message_VideoExpired: String { return self._s[5057]! } - public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[5058]! } - public var Settings_TryEnterPassword: String { return self._s[5059]! } + public var Notification_Exceptions_MessagePreviewAlwaysOn: String { return self._s[5044]! } + public var Conversation_Edit: String { return self._s[5045]! } + public var CheckoutInfo_SaveInfo: String { return self._s[5047]! } + public var VoiceOver_Chat_AnonymousPoll: String { return self._s[5048]! } + public var Call_CameraTooltip: String { return self._s[5050]! } + public var InstantPage_FeedbackButtonShort: String { return self._s[5051]! } + public var Contacts_InviteToTelegram: String { return self._s[5052]! } + public var Notifications_ResetAllNotifications: String { return self._s[5053]! } + public var Calls_NewCall: String { return self._s[5054]! } + public var VoiceOver_Chat_Music: String { return self._s[5057]! } + public var Channel_AdminLogFilter_EventsInviteLinks: String { return self._s[5058]! } + public var Channel_Members_AddAdminErrorNotAMember: String { return self._s[5059]! } + public var Channel_Edit_AboutItem: String { return self._s[5060]! } + public var Message_VideoExpired: String { return self._s[5061]! } + public var Passport_Address_TypeTemporaryRegistrationUploadScan: String { return self._s[5062]! } + public var Settings_TryEnterPassword: String { return self._s[5063]! } public func PUSH_CHAT_RETURNED(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5060]!, self._r[5060]!, [_1, _2]) + return formatWithArgumentRanges(self._s[5064]!, self._r[5064]!, [_1, _2]) } - public var NotificationsSound_Input: String { return self._s[5062]! } - public var Notifications_ClassicTones: String { return self._s[5063]! } - public var Conversation_StatusTyping: String { return self._s[5064]! } - public var Checkout_ErrorProviderAccountInvalid: String { return self._s[5065]! } - public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[5066]! } - public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[5067]! } - public var Conversation_MessageLeaveComment: String { return self._s[5068]! } - public var UserInfo_TapToCall: String { return self._s[5069]! } - public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[5070]! } + public var NotificationsSound_Input: String { return self._s[5066]! } + public var Notifications_ClassicTones: String { return self._s[5067]! } + public var Conversation_StatusTyping: String { return self._s[5068]! } + public var Checkout_ErrorProviderAccountInvalid: String { return self._s[5069]! } + public var ChatSettings_AutoDownloadSettings_Delimeter: String { return self._s[5070]! } + public var SettingsSearch_Synonyms_Notifications_BadgeIncludeMutedChats: String { return self._s[5071]! } + public var Conversation_MessageLeaveComment: String { return self._s[5072]! } + public var UserInfo_TapToCall: String { return self._s[5073]! } + public var EnterPasscode_EnterNewPasscodeNew: String { return self._s[5074]! } public func ScheduleVoiceChat_ScheduleOn(_ _0: String, _ _1: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5071]!, self._r[5071]!, [_0, _1]) + return formatWithArgumentRanges(self._s[5075]!, self._r[5075]!, [_0, _1]) } - public var Conversation_ClearAll: String { return self._s[5073]! } - public var UserInfo_NotificationsDefault: String { return self._s[5074]! } + public var Conversation_ClearAll: String { return self._s[5077]! } + public var UserInfo_NotificationsDefault: String { return self._s[5078]! } public func TwoFactorSetup_ResetFloodWait(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5075]!, self._r[5075]!, [_0]) + return formatWithArgumentRanges(self._s[5079]!, self._r[5079]!, [_0]) } - public var Location_ProximityGroupTip: String { return self._s[5076]! } - public var Map_ChooseAPlace: String { return self._s[5077]! } - public var GroupInfo_AddParticipantTitle: String { return self._s[5079]! } - public var ChatList_PeerTypeNonContact: String { return self._s[5080]! } - public var Conversation_SlideToCancel: String { return self._s[5081]! } - public var Month_ShortJuly: String { return self._s[5082]! } - public var SocksProxySetup_ProxyType: String { return self._s[5083]! } + public var Location_ProximityGroupTip: String { return self._s[5080]! } + public var Map_ChooseAPlace: String { return self._s[5081]! } + public var GroupInfo_AddParticipantTitle: String { return self._s[5083]! } + public var ChatList_PeerTypeNonContact: String { return self._s[5084]! } + public var Conversation_SlideToCancel: String { return self._s[5085]! } + public var Month_ShortJuly: String { return self._s[5086]! } + public var SocksProxySetup_ProxyType: String { return self._s[5087]! } public func ChatList_DeleteChatConfirmation(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5084]!, self._r[5084]!, [_0]) + return formatWithArgumentRanges(self._s[5088]!, self._r[5088]!, [_0]) } - public var StickerPacks_ActionArchive: String { return self._s[5085]! } - public var ChatList_EditFolders: String { return self._s[5086]! } - public var TwoStepAuth_SetPasswordHelp: String { return self._s[5087]! } - public var ScheduledMessages_RemindersTitle: String { return self._s[5089]! } + public var StickerPacks_ActionArchive: String { return self._s[5089]! } + public var ChatList_EditFolders: String { return self._s[5090]! } + public var TwoStepAuth_SetPasswordHelp: String { return self._s[5091]! } + public var ScheduledMessages_RemindersTitle: String { return self._s[5093]! } public func GroupPermission_ApplyAlertText(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5090]!, self._r[5090]!, [_0]) + return formatWithArgumentRanges(self._s[5094]!, self._r[5094]!, [_0]) } - public var Permissions_PeopleNearbyTitle_v0: String { return self._s[5091]! } - public var Your_cards_expiration_year_is_invalid: String { return self._s[5092]! } - public var UserInfo_ShareMyContactInfo: String { return self._s[5094]! } + public var Permissions_PeopleNearbyTitle_v0: String { return self._s[5095]! } + public var Your_cards_expiration_year_is_invalid: String { return self._s[5096]! } + public var UserInfo_ShareMyContactInfo: String { return self._s[5098]! } public func Conversation_ScheduledVoiceChatStartsOnShort(_ _0: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5096]!, self._r[5096]!, [_0]) + return formatWithArgumentRanges(self._s[5100]!, self._r[5100]!, [_0]) } - public var Passport_DeleteAddress: String { return self._s[5097]! } - public var Passport_DeletePassportConfirmation: String { return self._s[5098]! } - public var Passport_Identity_ReverseSide: String { return self._s[5099]! } - public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[5101]! } - public var Login_InfoLastNamePlaceholder: String { return self._s[5102]! } - public var InviteLink_CreatedBy: String { return self._s[5103]! } - public var Passport_FieldAddress: String { return self._s[5104]! } - public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[5105]! } - public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[5108]! } - public var VoiceChat_Panel_TapToJoin: String { return self._s[5109]! } - public var Map_Home: String { return self._s[5110]! } - public var PollResults_Title: String { return self._s[5113]! } + public var Passport_DeleteAddress: String { return self._s[5101]! } + public var Passport_DeletePassportConfirmation: String { return self._s[5102]! } + public var Passport_Identity_ReverseSide: String { return self._s[5103]! } + public var CheckoutInfo_ErrorEmailInvalid: String { return self._s[5105]! } + public var Login_InfoLastNamePlaceholder: String { return self._s[5106]! } + public var InviteLink_CreatedBy: String { return self._s[5107]! } + public var Passport_FieldAddress: String { return self._s[5108]! } + public var SettingsSearch_Synonyms_Calls_Title: String { return self._s[5109]! } + public var Passport_Identity_ResidenceCountryPlaceholder: String { return self._s[5112]! } + public var VoiceChat_Panel_TapToJoin: String { return self._s[5113]! } + public var Map_Home: String { return self._s[5114]! } + public var PollResults_Title: String { return self._s[5117]! } public func InviteLink_OtherPermanentLinkInfo(_ _1: String, _ _2: String) -> (String, [(Int, NSRange)]) { - return formatWithArgumentRanges(self._s[5114]!, self._r[5114]!, [_1, _2]) + return formatWithArgumentRanges(self._s[5118]!, self._r[5118]!, [_1, _2]) } - public var ArchivedChats_IntroText2: String { return self._s[5116]! } - public var VoiceChat_VideoPreviewTitle: String { return self._s[5117]! } - public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[5118]! } - public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[5119]! } - public var VoiceChat_Muted: String { return self._s[5121]! } - public var CallFeedback_ReasonSilentRemote: String { return self._s[5122]! } - public var Passport_Identity_AddPersonalDetails: String { return self._s[5123]! } - public var Conversation_AutoremoveActionEnable: String { return self._s[5125]! } - public var Group_Info_AdminLog: String { return self._s[5126]! } - public var ChatSettings_AutoPlayTitle: String { return self._s[5127]! } - public var Appearance_Animations: String { return self._s[5128]! } - public var Appearance_TextSizeSetting: String { return self._s[5129]! } - public func Conversation_StatusOnline(_ value: Int32) -> String { + public var ArchivedChats_IntroText2: String { return self._s[5120]! } + public var VoiceChat_VideoPreviewTitle: String { return self._s[5121]! } + public var PasscodeSettings_SimplePasscodeHelp: String { return self._s[5122]! } + public var VoiceOver_Chat_ContactPhoneNumber: String { return self._s[5123]! } + public var VoiceChat_Muted: String { return self._s[5125]! } + public var CallFeedback_ReasonSilentRemote: String { return self._s[5126]! } + public var Passport_Identity_AddPersonalDetails: String { return self._s[5127]! } + public var Conversation_AutoremoveActionEnable: String { return self._s[5129]! } + public var Group_Info_AdminLog: String { return self._s[5130]! } + public var ChatSettings_AutoPlayTitle: String { return self._s[5131]! } + public var Appearance_Animations: String { return self._s[5132]! } + public var Appearance_TextSizeSetting: String { return self._s[5133]! } + public func LastSeen_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[0 * 6 + Int(form.rawValue)]!, stringValue) } - public func Watch_UserInfo_Mute(_ value: Int32) -> String { + public func OldChannels_InactiveMonth(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[1 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedPolls(_ value: Int32) -> String { + public func ForwardedMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[2 * 6 + Int(form.rawValue)]!, stringValue) } - public func Contacts_InviteContacts(_ value: Int32) -> String { + public func UserCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[3 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_Hours(_ value: Int32) -> String { + public func VoiceOver_Chat_MessagesSelected(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[4 * 6 + Int(form.rawValue)]!, stringValue) } - public func AttachmentMenu_SendItem(_ value: Int32) -> String { + public func ScheduledIn_Hours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[5 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_DeleteConfirmation(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[6 * 6 + Int(form.rawValue)]!, stringValue) } - public func Map_ETAHours(_ value: Int32) -> String { + public func ScheduledIn_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[7 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_SharePhoto(_ value: Int32) -> String { + public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[8 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_AutoremoveRemainingDays(_ value: Int32) -> String { + public func InviteLink_InviteLinks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[9 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_MessageForwards(_ value: Int32) -> String { + public func Media_SharePhoto(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[10 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPacks_ArchiveStickerPacksConfirmation(_ value: Int32) -> String { + public func InstantPage_Views(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[11 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteLink_PeopleCanJoin(_ value: Int32) -> String { + public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[12 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_MessageVideos(_ value: Int32) -> String { + public func ForwardedVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[13 * 6 + Int(form.rawValue)]!, stringValue) } - public func Call_ShortMinutes(_ value: Int32) -> String { + public func InviteLink_PeopleJoined(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[14 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) return String(format: self._ps[15 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + public func ChatList_DeleteConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[16 * 6 + Int(form.rawValue)]!, stringValue) } - public func GroupInfo_ParticipantCount(_ value: Int32) -> String { + public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[17 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Days(_ value: Int32) -> String { + public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[18 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceChat_InviteLink_InviteSpeakers(_ value: Int32) -> String { + public func InviteText_ContactsCountText(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[19 * 6 + Int(form.rawValue)]!, stringValue) } - public func ScheduledIn_Hours(_ value: Int32) -> String { + public func InviteLink_PeopleRemaining(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[20 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + public func MessageTimer_ShortWeeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[21 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[22 * 6 + Int(form.rawValue)]!, _2, _1, _3) } - public func InviteText_ContactsCountText(_ value: Int32) -> String { + public func ChatList_MessageVideos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[23 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { + public func Stats_GroupTopAdminBans(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[24 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteLink_PeopleJoinedShort(_ value: Int32) -> String { + public func Conversation_StatusSubscribers(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[25 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_Link(_ value: Int32) -> String { + public func Conversation_MessageViewComments(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[26 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { + public func MessageTimer_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[27 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func ScheduledIn_Days(_ value: Int32) -> String { + public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, _0, _1) + return String(format: self._ps[28 * 6 + Int(form.rawValue)]!, stringValue) } public func PUSH_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func UserCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[29 * 6 + Int(form.rawValue)]!, _1, _2) } public func StickerPack_StickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopPosterMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendGif(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteFor_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_ContextMenuSelectAll(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InstantPage_Views(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Generic(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) - } - public func GroupInfo_ShowMoreMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func AttachmentMenu_SendVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) - } - public func LastSeen_MinutesAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedPhotos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_AddStickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusMembers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveWeek(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminBans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_UnreadMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopPosterChars(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_DeletedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) - } - public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func SharedMedia_Video(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_FILES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func VoiceChat_InviteLink_InviteListeners(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ImportStickerPack_StickerCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedVideoMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedGifs(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ServiceMessage_GameScoreSimple(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Call_ShortSeconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Chat_TitlePinnedMessages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ScheduledIn_Seconds(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Media_ShareVideo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedContacts(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_ContextViewReplies(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHAT_MESSAGE_DOCS_FIX1(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessagePoll_QuizCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Months(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_File(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_StatusSubscribers(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PollResults_ShowMore(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_ContactEmailCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_InactiveYear(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_TitleReplies(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) - } - public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessagePoll_VotedCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortWeeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, stringValue) - } - public func SharedMedia_Photo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_MessagesSelected(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_MessageViewComments(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Conversation_TitleComments(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_ShortHours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) - } - public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, _1, _2) - } - public func Theme_UsersCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ScheduledIn_Years(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_SelectedChats(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Map_ETAMinutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) - } - public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceChat_Status_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedFiles(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Passport_Scans(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Call_Days(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedAudios(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MessageTimer_Hours(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Invitation_Members(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ForwardedLocations(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ChatList_Search_Messages(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) - } - public func MuteExpires_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) - } - public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) - } - public func OldChannels_GroupFormat(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ScheduledIn_Minutes(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) - } - public func ScheduledIn_Weeks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) - } - public func InviteLink_PeopleJoined(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[30 * 6 + Int(form.rawValue)]!, stringValue) } public func MessageTimer_ShortDays(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[31 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + public func VoiceChat_Status_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[32 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_AddMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[33 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_File(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[34 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_DeletedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[35 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopInviterInvites(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[36 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessageFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[37 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Forward_ConfirmMultipleFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[38 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[39 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[40 * 6 + Int(form.rawValue)]!, stringValue) + } + public func LiveLocation_MenuChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[41 * 6 + Int(form.rawValue)]!, stringValue) + } + public func StickerPack_RemoveMaskCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[42 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[43 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PasscodeSettings_FailedAttempts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[44 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedStickers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[45 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ImportStickerPack_StickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[46 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_DeleteMessagesConfirmation(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[47 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[48 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, _2, _1, _3) + return String(format: self._ps[49 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[50 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + public func SharedMedia_Video(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[51 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + public func ForwardedPolls(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[52 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_MessagePhotos(_ value: Int32) -> String { + public func Stats_GroupTopPosterChars(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[53 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreExtended(_ value: Int32) -> String { + public func MessageTimer_ShortHours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[54 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + public func Conversation_TitleComments(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[55 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusMembers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[56 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Chat_TitlePinnedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[57 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Photo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[58 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Invitation_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[59 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[60 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_VotedCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[61 * 6 + Int(form.rawValue)]!, stringValue) } public func VoiceChat_Panel_Members(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[62 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[63 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendVideo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[64 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[65 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Generic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[66 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ForwardedVideoMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[67 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[68 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupShowMoreTopAdmins(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[69 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_SelectedMessages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[70 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_PHOTOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[71 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[72 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessagePoll_QuizCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[73 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_UserInfo_Mute(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[74 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[75 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Months(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[76 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_Search_Messages(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[77 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[78 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func ForwardedFiles(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[79 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_ContextMenuSelectAll(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[80 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[81 * 6 + Int(form.rawValue)]!, stringValue) + } + public func VoiceChat_InviteLink_InviteSpeakers(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[82 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_AutoremoveRemainingDays(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[83 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteLink_PeopleJoinedShort(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[84 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_Exceptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[85 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_GroupTopAdminDeletions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[86 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_Seconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[87 * 6 + Int(form.rawValue)]!, stringValue) + } + public func OldChannels_InactiveWeek(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[88 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[89 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[90 * 6 + Int(form.rawValue)]!, stringValue) + } + public func InviteLink_PeopleCanJoin(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[91 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHANNEL_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[92 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[93 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func Stats_GroupShowMoreTopInviters(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[94 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Days(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[95 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_SelectedChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[96 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_LiveLocationMembersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[97 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[98 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func PUSH_MESSAGE_PHOTOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[99 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func AttachmentMenu_SendItem(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[100 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreExtended(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[101 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_StatusOnline(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[102 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[103 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Weeks(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[104 * 6 + Int(form.rawValue)]!, stringValue) + } + public func SharedMedia_Link(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[105 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_VIDEOS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[106 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func StickerPack_AddStickerCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[107 * 6 + Int(form.rawValue)]!, stringValue) + } + public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[108 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Contacts_ImportersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[109 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[110 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Watch_LastSeen_HoursAgo(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[111 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[112 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSelfSimple(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[113 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MuteExpires_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[114 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_MESSAGE_FILES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[115 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Call_ShortSeconds(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[116 * 6 + Int(form.rawValue)]!, stringValue) + } + public func MessageTimer_ShortMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[117 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessagePhotos(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[118 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendGif(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[119 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Map_ETAMinutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[120 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Call_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[121 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ScheduledIn_Years(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[122 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notifications_ExceptionMuteExpires_Minutes(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[123 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Passport_Scans(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[124 * 6 + Int(form.rawValue)]!, stringValue) + } + public func ChatList_MessageMusic(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[125 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Stats_MessageViews(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[126 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PUSH_CHAT_MESSAGE_DOCS_FIX1(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[127 * 6 + Int(form.rawValue)]!, _2, _1, _3) + } + public func ChatListFilter_ShowMoreChats(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[128 * 6 + Int(form.rawValue)]!, stringValue) + } + public func DialogList_LiveLocationChatsCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[129 * 6 + Int(form.rawValue)]!, stringValue) + } + public func AttachmentMenu_SendPhoto(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[130 * 6 + Int(form.rawValue)]!, stringValue) + } + public func PollResults_ShowMore(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[131 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Conversation_ContextViewReplies(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[132 * 6 + Int(form.rawValue)]!, stringValue) + } + public func Notification_GameScoreSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[133 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteLink_InviteLinks(_ value: Int32) -> String { + public func MessageTimer_Minutes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[134 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedVideos(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[135 * 6 + Int(form.rawValue)]!, stringValue) + public func ForwardedAuthorsOthers(_ selector: Int32, _ _0: String, _ _1: String) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[135 * 6 + Int(form.rawValue)]!, _0, _1) } public func QuickSend_Photos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[136 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_MESSAGE_FWDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[137 * 6 + Int(form.rawValue)]!, _1, _2) + public func Theme_UsersCount(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[137 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_Years(_ value: Int32) -> String { + public func MessageTimer_Weeks(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[138 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreExtended(_ value: Int32) -> String { + public func Contacts_InviteContacts(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[139 * 6 + Int(form.rawValue)]!, stringValue) } - public func Wallpaper_DeleteConfirmation(_ value: Int32) -> String { + public func OldChannels_Leave(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[140 * 6 + Int(form.rawValue)]!, stringValue) } - public func InviteLink_PeopleRemaining(_ value: Int32) -> String { + public func ForwardedGifs(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[141 * 6 + Int(form.rawValue)]!, stringValue) } - public func MuteExpires_Days(_ value: Int32) -> String { + public func VoiceOver_Chat_PollOptionCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[142 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notifications_Exceptions(_ value: Int32) -> String { + public func LastSeen_HoursAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[143 * 6 + Int(form.rawValue)]!, stringValue) } - public func Notification_GameScoreSimple(_ value: Int32) -> String { + public func OldChannels_GroupFormat(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[144 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[145 * 6 + Int(form.rawValue)]!, _1, _2) + public func ForwardedContacts(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[145 * 6 + Int(form.rawValue)]!, stringValue) } - public func Stats_MessageViews(_ value: Int32) -> String { + public func MessageTimer_Years(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[146 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_ROUNDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[147 * 6 + Int(form.rawValue)]!, _2, _1, _3) - } - public func MessageTimer_Minutes(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfSimple(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[148 * 6 + Int(form.rawValue)]!, stringValue) + return String(format: self._ps[147 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedStickers(_ value: Int32) -> String { + public func PUSH_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[148 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func MessageTimer_Months(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[149 * 6 + Int(form.rawValue)]!, stringValue) } - public func Contacts_ImportersCount(_ value: Int32) -> String { + public func VoiceChat_InviteLink_InviteListeners(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[150 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_InactiveMonth(_ value: Int32) -> String { + public func Media_ShareItem(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[151 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_MessageMusic(_ value: Int32) -> String { + public func GroupInfo_ParticipantCount(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[152 * 6 + Int(form.rawValue)]!, stringValue) } - public func OldChannels_Leave(_ value: Int32) -> String { + public func Watch_LastSeen_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[153 * 6 + Int(form.rawValue)]!, stringValue) } - public func PrivacyLastSeenSettings_AddUsers(_ value: Int32) -> String { + public func MuteExpires_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[154 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGE_FWDS(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[155 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func Chat_MessagesUnpinned(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[155 * 6 + Int(form.rawValue)]!, stringValue) } - public func MessageTimer_ShortSeconds(_ value: Int32) -> String { + public func Stats_GroupTopPosterMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[156 * 6 + Int(form.rawValue)]!, stringValue) } - public func PeopleNearby_ShowMorePeople(_ value: Int32) -> String { + public func LiveLocationUpdated_MinutesAgo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[157 * 6 + Int(form.rawValue)]!, stringValue) } - public func Conversation_SelectedMessages(_ value: Int32) -> String { + public func Stats_MessageForwards(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[158 * 6 + Int(form.rawValue)]!, stringValue) } - public func ChatList_MessageFiles(_ value: Int32) -> String { + public func VoiceOver_Chat_PollVotes(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[159 * 6 + Int(form.rawValue)]!, stringValue) } - public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { + public func Map_ETAHours(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[160 * 6 + Int(form.rawValue)]!, stringValue) } - public func ForwardedMessages(_ value: Int32) -> String { + public func ServiceMessage_GameScoreSelfExtended(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[161 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPacks_DeleteStickerPacksConfirmation(_ value: Int32) -> String { + public func OldChannels_InactiveYear(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[162 * 6 + Int(form.rawValue)]!, stringValue) } - public func SharedMedia_DeleteItemsConfirmation(_ value: Int32) -> String { + public func Media_ShareVideo(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[163 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHANNEL_MESSAGE_VIDEOS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[164 * 6 + Int(form.rawValue)]!, _1, _2) + public func Stats_GroupShowMoreTopPosters(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[164 * 6 + Int(form.rawValue)]!, stringValue) } - public func PUSH_CHAT_MESSAGES(_ selector: Int32, _ _2: String, _ _1: String, _ _3: Int32) -> String { - let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[165 * 6 + Int(form.rawValue)]!, _2, _1, _3) + public func MuteFor_Hours(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[165 * 6 + Int(form.rawValue)]!, stringValue) } - public func ScheduledIn_Months(_ value: Int32) -> String { + public func MuteFor_Days(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[166 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_RemoveStickerCount(_ value: Int32) -> String { + public func StickerPacks_ArchiveStickerPacksConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[167 * 6 + Int(form.rawValue)]!, stringValue) } - public func StickerPack_AddMaskCount(_ value: Int32) -> String { + public func ForwardedAudios(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[168 * 6 + Int(form.rawValue)]!, stringValue) } - public func CreatePoll_AddMoreOptions(_ value: Int32) -> String { + public func ForwardedPhotos(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[169 * 6 + Int(form.rawValue)]!, stringValue) } - public func Chat_MessagesUnpinned(_ value: Int32) -> String { + public func VoiceOver_Chat_UnreadMessages(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[170 * 6 + Int(form.rawValue)]!, stringValue) } - public func LastSeen_HoursAgo(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[171 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGE_ROUNDS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[171 * 6 + Int(form.rawValue)]!, _1, _2) } - public func Notification_GameScoreSelfExtended(_ value: Int32) -> String { + public func ForwardedLocations(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[172 * 6 + Int(form.rawValue)]!, stringValue) } - public func Media_ShareItem(_ value: Int32) -> String { + public func StickerPacks_DeleteStickerPacksConfirmation(_ value: Int32) -> String { let form = getPluralizationForm(self.lc, value) let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) return String(format: self._ps[173 * 6 + Int(form.rawValue)]!, stringValue) } - public func VoiceOver_Chat_ContactPhoneNumberCount(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[174 * 6 + Int(form.rawValue)]!, stringValue) - } - public func Stats_GroupTopAdminKicks(_ value: Int32) -> String { - let form = getPluralizationForm(self.lc, value) - let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) - return String(format: self._ps[175 * 6 + Int(form.rawValue)]!, stringValue) + public func PUSH_CHANNEL_MESSAGES(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { + let form = getPluralizationForm(self.lc, selector) + return String(format: self._ps[174 * 6 + Int(form.rawValue)]!, _1, _2) } public func PUSH_CHANNEL_MESSAGE_DOCS(_ selector: Int32, _ _1: String, _ _2: Int32) -> String { let form = getPluralizationForm(self.lc, selector) - return String(format: self._ps[176 * 6 + Int(form.rawValue)]!, _1, _2) + return String(format: self._ps[175 * 6 + Int(form.rawValue)]!, _1, _2) + } + public func Conversation_TitleReplies(_ value: Int32) -> String { + let form = getPluralizationForm(self.lc, value) + let stringValue = presentationStringsFormattedNumber(value, self.groupingSeparator) + return String(format: self._ps[176 * 6 + Int(form.rawValue)]!, stringValue) } public init(primaryComponent: PresentationStringsComponent, secondaryComponent: PresentationStringsComponent?, groupingSeparator: String) { diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Collapse.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Collapse.imageset/Contents.json new file mode 100644 index 0000000000..829a0300d8 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Collapse.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "smallscreen_30.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Collapse.imageset/smallscreen_30.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Collapse.imageset/smallscreen_30.pdf new file mode 100644 index 0000000000..7c2c50ebb8 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Collapse.imageset/smallscreen_30.pdf @@ -0,0 +1,161 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 5.334991 5.334999 cm +0.000000 0.000000 0.000000 scn +6.665000 19.330002 m +7.032269 19.330002 7.330000 19.032270 7.330000 18.665001 c +7.330000 15.865002 l +7.330000 15.837518 l +7.330000 15.837514 l +7.330000 15.837511 l +7.330009 15.300820 7.330016 14.857977 7.300543 14.497252 c +7.269935 14.122624 7.204253 13.778399 7.039532 13.455116 c +6.784030 12.953665 6.376337 12.545971 5.874885 12.290468 c +5.551602 12.125748 5.207376 12.060066 4.832748 12.029457 c +4.472024 11.999985 4.029181 11.999992 3.492490 12.000001 c +3.492487 12.000001 l +3.492483 12.000001 l +3.465000 12.000001 l +0.665000 12.000001 l +0.297731 12.000001 0.000000 12.297731 0.000000 12.665001 c +0.000000 13.032270 0.297731 13.330001 0.665000 13.330001 c +3.465000 13.330001 l +4.036026 13.330001 4.424301 13.330519 4.724444 13.355041 c +5.016824 13.378929 5.166537 13.422241 5.271077 13.475508 c +5.522274 13.603498 5.726503 13.807728 5.854494 14.058924 c +5.907760 14.163464 5.951072 14.313177 5.974960 14.605556 c +5.999483 14.905701 6.000000 15.293976 6.000000 15.865002 c +6.000000 18.665001 l +6.000000 19.032270 6.297730 19.330002 6.665000 19.330002 c +h +13.330000 18.665001 m +13.330000 19.032270 13.032269 19.330002 12.665000 19.330002 c +12.297730 19.330002 12.000000 19.032270 12.000000 18.665001 c +12.000000 15.865002 l +12.000000 15.837526 l +12.000000 15.837497 l +11.999991 15.300814 11.999985 14.857974 12.029457 14.497252 c +12.060065 14.122624 12.125747 13.778399 12.290467 13.455116 c +12.545970 12.953665 12.953663 12.545971 13.455115 12.290468 c +13.778399 12.125748 14.122623 12.060066 14.497252 12.029457 c +14.857978 11.999985 15.300823 11.999992 15.837517 12.000001 c +15.865000 12.000001 l +18.665001 12.000001 l +19.032270 12.000001 19.330002 12.297731 19.330002 12.665001 c +19.330002 13.032270 19.032270 13.330001 18.665001 13.330001 c +15.865000 13.330001 l +15.293975 13.330001 14.905700 13.330519 14.605556 13.355041 c +14.313176 13.378929 14.163464 13.422241 14.058923 13.475508 c +13.807726 13.603498 13.603498 13.807728 13.475507 14.058924 c +13.422240 14.163464 13.378928 14.313177 13.355040 14.605556 c +13.330517 14.905701 13.330000 15.293976 13.330000 15.865002 c +13.330000 18.665001 l +h +15.865000 7.330001 m +15.837525 7.330001 l +15.837497 7.330001 l +15.300811 7.330009 14.857973 7.330016 14.497252 7.300544 c +14.122623 7.269936 13.778399 7.204254 13.455115 7.039534 c +12.953663 6.784031 12.545970 6.376338 12.290467 5.874886 c +12.125747 5.551602 12.060065 5.207377 12.029457 4.832749 c +11.999985 4.472028 11.999991 4.029190 12.000000 3.492504 c +12.000000 3.492476 l +12.000000 3.465000 l +12.000000 0.665001 l +12.000000 0.297731 12.297730 0.000000 12.665000 0.000000 c +13.032269 0.000000 13.330000 0.297731 13.330000 0.665001 c +13.330000 3.465000 l +13.330000 4.036026 13.330517 4.424301 13.355040 4.724444 c +13.378928 5.016825 13.422240 5.166537 13.475507 5.271078 c +13.603498 5.522275 13.807726 5.726503 14.058923 5.854494 c +14.163464 5.907761 14.313176 5.951073 14.605556 5.974961 c +14.905700 5.999484 15.293975 6.000001 15.865000 6.000001 c +18.665001 6.000001 l +19.032270 6.000001 19.330002 6.297731 19.330002 6.665001 c +19.330002 7.032270 19.032270 7.330001 18.665001 7.330001 c +15.865000 7.330001 l +h +3.465000 6.000001 m +4.036026 6.000001 4.424301 5.999484 4.724444 5.974961 c +5.016824 5.951073 5.166537 5.907761 5.271077 5.854494 c +5.522274 5.726503 5.726503 5.522275 5.854494 5.271078 c +5.907760 5.166537 5.951072 5.016825 5.974960 4.724444 c +5.999483 4.424301 6.000000 4.036026 6.000000 3.465000 c +6.000000 0.665001 l +6.000000 0.297731 6.297730 0.000000 6.665000 0.000000 c +7.032269 0.000000 7.330000 0.297731 7.330000 0.665001 c +7.330000 3.465000 l +7.330000 3.492484 l +7.330009 4.029178 7.330016 4.472023 7.300543 4.832749 c +7.269935 5.207377 7.204253 5.551602 7.039532 5.874886 c +6.784030 6.376338 6.376337 6.784031 5.874885 7.039534 c +5.551602 7.204254 5.207376 7.269936 4.832748 7.300544 c +4.472027 7.330016 4.029188 7.330009 3.492504 7.330001 c +3.492474 7.330001 l +3.465000 7.330001 l +0.665000 7.330001 l +0.297731 7.330001 0.000000 7.032270 0.000000 6.665001 c +0.000000 6.297731 0.297731 6.000001 0.665000 6.000001 c +3.465000 6.000001 l +h +f* +n +Q + +endstream +endobj + +3 0 obj + 4194 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 30.000000 30.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Type /Catalog + /Pages 5 0 R + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000004284 00000 n +0000004307 00000 n +0000004480 00000 n +0000004554 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +4613 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Download.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Download.imageset/Contents.json new file mode 100644 index 0000000000..c5c261d24f --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Download.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "down_24.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Download.imageset/down_24.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Download.imageset/down_24.pdf new file mode 100644 index 0000000000..074b2bc7ae --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Download.imageset/down_24.pdf @@ -0,0 +1,92 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 3.334999 3.334999 cm +0.000000 0.000000 0.000000 scn +8.665000 16.000002 m +4.613991 16.000002 1.330000 12.716011 1.330000 8.665002 c +1.330000 4.613994 4.613991 1.330002 8.665000 1.330002 c +12.716008 1.330002 16.000000 4.613994 16.000000 8.665002 c +16.000000 12.716011 12.716008 16.000002 8.665000 16.000002 c +h +0.000000 8.665002 m +0.000000 13.450549 3.879453 17.330002 8.665000 17.330002 c +13.450547 17.330002 17.330002 13.450549 17.330002 8.665002 c +17.330002 3.879455 13.450547 0.000000 8.665000 0.000000 c +3.879453 0.000000 0.000000 3.879455 0.000000 8.665002 c +h +8.665000 12.830002 m +9.032269 12.830002 9.330000 12.532271 9.330000 12.165002 c +9.330000 6.770453 l +11.194775 8.635228 l +11.454473 8.894926 11.875527 8.894926 12.135225 8.635228 c +12.394924 8.375529 12.394924 7.954474 12.135225 7.694776 c +9.135226 4.694776 l +8.875527 4.435078 8.454473 4.435078 8.194774 4.694776 c +5.194774 7.694776 l +4.935075 7.954474 4.935075 8.375529 5.194774 8.635228 c +5.454473 8.894926 5.875527 8.894926 6.135226 8.635228 c +8.000000 6.770453 l +8.000000 12.165002 l +8.000000 12.532271 8.297730 12.830002 8.665000 12.830002 c +h +f* +n +Q + +endstream +endobj + +3 0 obj + 1188 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Type /Catalog + /Pages 5 0 R + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001278 00000 n +0000001301 00000 n +0000001474 00000 n +0000001548 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +1607 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Expand.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Expand.imageset/Contents.json new file mode 100644 index 0000000000..fa440a32b6 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Expand.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "fullscreen_30.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Expand.imageset/fullscreen_30.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Expand.imageset/fullscreen_30.pdf new file mode 100644 index 0000000000..7df6de5287 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Expand.imageset/fullscreen_30.pdf @@ -0,0 +1,161 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 5.334991 5.334970 cm +0.000000 0.000000 0.000000 scn +15.465001 18.000031 m +16.036026 18.000031 16.424301 17.999512 16.724445 17.974989 c +17.016825 17.951101 17.166538 17.907789 17.271078 17.854523 c +17.522274 17.726532 17.726503 17.522303 17.854494 17.271107 c +17.907761 17.166567 17.951073 17.016853 17.974960 16.724474 c +17.999483 16.424330 18.000000 16.036055 18.000000 15.465029 c +18.000000 12.665030 l +18.000000 12.297760 18.297731 12.000029 18.665001 12.000029 c +19.032270 12.000029 19.330002 12.297760 19.330002 12.665030 c +19.330002 15.465029 l +19.330002 15.492513 l +19.330002 15.492586 l +19.330009 16.029245 19.330015 16.472069 19.300545 16.832777 c +19.269936 17.207407 19.204254 17.551632 19.039534 17.874914 c +18.784031 18.376366 18.376337 18.784060 17.874886 19.039562 c +17.551603 19.204283 17.207378 19.269964 16.832748 19.300573 c +16.472025 19.330046 16.029184 19.330038 15.492496 19.330030 c +15.492476 19.330030 l +15.465001 19.330030 l +12.665001 19.330030 l +12.297731 19.330030 12.000001 19.032299 12.000001 18.665030 c +12.000001 18.297760 12.297731 18.000031 12.665001 18.000031 c +15.465001 18.000031 l +h +3.865001 19.330030 m +3.837527 19.330030 l +3.837508 19.330030 l +3.300819 19.330038 2.857976 19.330046 2.497253 19.300573 c +2.122624 19.269964 1.778399 19.204283 1.455116 19.039562 c +0.953664 18.784060 0.545971 18.376366 0.290469 17.874914 c +0.125748 17.551632 0.060066 17.207407 0.029458 16.832777 c +-0.000015 16.472054 -0.000008 16.029211 0.000000 15.492522 c +0.000000 15.492504 l +0.000000 15.465029 l +0.000000 12.665030 l +0.000000 12.297760 0.297732 12.000029 0.665001 12.000029 c +1.032270 12.000029 1.330001 12.297760 1.330001 12.665030 c +1.330001 15.465029 l +1.330001 16.036055 1.330518 16.424330 1.355041 16.724474 c +1.378929 17.016853 1.422241 17.166567 1.475507 17.271107 c +1.603498 17.522303 1.807727 17.726532 2.058923 17.854523 c +2.163464 17.907789 2.313177 17.951101 2.605557 17.974989 c +2.905700 17.999512 3.293975 18.000031 3.865001 18.000031 c +6.665001 18.000031 l +7.032271 18.000031 7.330001 18.297760 7.330001 18.665030 c +7.330001 19.032299 7.032271 19.330030 6.665001 19.330030 c +3.865001 19.330030 l +h +1.330001 6.665030 m +1.330001 7.032299 1.032270 7.330029 0.665001 7.330029 c +0.297732 7.330029 0.000000 7.032299 0.000000 6.665030 c +0.000000 3.865030 l +0.000000 3.837555 l +0.000000 3.837535 l +-0.000008 3.300846 -0.000015 2.858006 0.029458 2.497282 c +0.060066 2.122652 0.125748 1.778427 0.290469 1.455145 c +0.545971 0.953693 0.953664 0.546000 1.455116 0.290497 c +1.778399 0.125776 2.122624 0.060095 2.497253 0.029486 c +2.857963 0.000015 3.300784 0.000021 3.837445 0.000029 c +3.837518 0.000029 l +3.865001 0.000029 l +6.665001 0.000029 l +7.032271 0.000029 7.330001 0.297760 7.330001 0.665030 c +7.330001 1.032299 7.032271 1.330030 6.665001 1.330030 c +3.865001 1.330030 l +3.293975 1.330030 2.905700 1.330547 2.605557 1.355070 c +2.313177 1.378958 2.163464 1.422270 2.058923 1.475536 c +1.807727 1.603527 1.603498 1.807756 1.475507 2.058952 c +1.422241 2.163492 1.378929 2.313206 1.355041 2.605585 c +1.330518 2.905729 1.330001 3.294004 1.330001 3.865030 c +1.330001 6.665030 l +h +18.665001 7.330029 m +19.032270 7.330029 19.330002 7.032299 19.330002 6.665030 c +19.330002 3.865030 l +19.330002 3.837546 l +19.330002 3.837475 l +19.330009 3.300812 19.330015 2.857990 19.300545 2.497282 c +19.269936 2.122652 19.204254 1.778427 19.039534 1.455145 c +18.784031 0.953693 18.376337 0.546000 17.874886 0.290497 c +17.551603 0.125776 17.207378 0.060095 16.832748 0.029486 c +16.472040 0.000015 16.029217 0.000021 15.492556 0.000029 c +15.492484 0.000029 l +15.465001 0.000029 l +12.665001 0.000029 l +12.297731 0.000029 12.000001 0.297760 12.000001 0.665030 c +12.000001 1.032299 12.297731 1.330030 12.665001 1.330030 c +15.465001 1.330030 l +16.036026 1.330030 16.424301 1.330547 16.724445 1.355070 c +17.016825 1.378958 17.166538 1.422270 17.271078 1.475536 c +17.522274 1.603527 17.726503 1.807756 17.854494 2.058952 c +17.907761 2.163492 17.951073 2.313206 17.974960 2.605585 c +17.999483 2.905729 18.000000 3.294004 18.000000 3.865030 c +18.000000 6.665030 l +18.000000 7.032299 18.297731 7.330029 18.665001 7.330029 c +h +f* +n +Q + +endstream +endobj + +3 0 obj + 4198 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 30.000000 30.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Type /Catalog + /Pages 5 0 R + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000004288 00000 n +0000004311 00000 n +0000004484 00000 n +0000004558 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +4617 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed24.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed24.imageset/Contents.json new file mode 100644 index 0000000000..3bf115d3ba --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed24.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "playspeed_24.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed24.imageset/playspeed_24.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed24.imageset/playspeed_24.pdf new file mode 100644 index 0000000000..c8af2af3b2 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed24.imageset/playspeed_24.pdf @@ -0,0 +1,113 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 3.335007 3.334999 cm +0.000000 0.000000 0.000000 scn +0.000007 16.665001 m +0.000007 17.032270 0.297737 17.330002 0.665007 17.330002 c +1.165007 17.330002 l +1.532276 17.330002 1.830007 17.032270 1.830007 16.665001 c +1.830007 16.297733 1.532276 16.000002 1.165007 16.000002 c +0.665007 16.000002 l +0.297737 16.000002 0.000007 16.297733 0.000007 16.665001 c +h +9.665000 17.330002 m +9.297730 17.330002 9.000000 17.032270 9.000000 16.665001 c +9.000000 16.297731 9.297730 16.000000 9.665000 16.000000 c +16.665001 16.000000 l +17.032270 16.000000 17.330002 16.297731 17.330002 16.665001 c +17.330002 17.032270 17.032270 17.330002 16.665001 17.330002 c +9.665000 17.330002 l +h +9.665000 1.330002 m +9.297730 1.330002 9.000000 1.032270 9.000000 0.665001 c +9.000000 0.297731 9.297730 0.000000 9.665000 0.000000 c +16.665001 0.000000 l +17.032270 0.000000 17.330002 0.297731 17.330002 0.665001 c +17.330002 1.032270 17.032270 1.330002 16.665001 1.330002 c +9.665000 1.330002 l +h +0.665000 1.330002 m +0.297731 1.330002 0.000000 1.032270 0.000000 0.665001 c +0.000000 0.297731 0.297731 0.000000 0.665000 0.000000 c +1.165000 0.000000 l +1.532269 0.000000 1.830000 0.297731 1.830000 0.665001 c +1.830000 1.032270 1.532269 1.330002 1.165000 1.330002 c +0.665000 1.330002 l +h +3.000000 16.665001 m +3.000000 17.032270 3.297731 17.330002 3.665000 17.330002 c +7.165000 17.330002 l +7.532269 17.330002 7.830000 17.032270 7.830000 16.665001 c +7.830000 16.297731 7.532269 16.000000 7.165000 16.000000 c +3.665000 16.000000 l +3.297731 16.000000 3.000000 16.297731 3.000000 16.665001 c +h +3.665000 1.330002 m +3.297731 1.330002 3.000000 1.032270 3.000000 0.665001 c +3.000000 0.297731 3.297731 0.000000 3.665000 0.000000 c +7.165000 0.000000 l +7.532269 0.000000 7.830000 0.297731 7.830000 0.665001 c +7.830000 1.032270 7.532269 1.330002 7.165000 1.330002 c +3.665000 1.330002 l +h +f* +n +Q + +endstream +endobj + +3 0 obj + 1901 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 24.000000 24.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Type /Catalog + /Pages 5 0 R + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000001991 00000 n +0000002014 00000 n +0000002187 00000 n +0000002261 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2320 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed30.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed30.imageset/Contents.json new file mode 100644 index 0000000000..e75becabad --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed30.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "playspeed_30.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed30.imageset/playspeed_30.pdf b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed30.imageset/playspeed_30.pdf new file mode 100644 index 0000000000..4d99d69bdb --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Chat/Context Menu/Playspeed30.imageset/playspeed_30.pdf @@ -0,0 +1,113 @@ +%PDF-1.7 + +1 0 obj + << >> +endobj + +2 0 obj + << /Length 3 0 R >> +stream +/DeviceRGB CS +/DeviceRGB cs +q +1.000000 0.000000 -0.000000 1.000000 5.335007 5.334999 cm +0.000000 0.000000 0.000000 scn +0.000000 18.665001 m +0.000000 19.032270 0.297731 19.330002 0.665000 19.330002 c +1.665000 19.330002 l +2.032269 19.330002 2.330000 19.032270 2.330000 18.665001 c +2.330000 18.297733 2.032269 18.000002 1.665000 18.000002 c +0.665000 18.000002 l +0.297731 18.000002 0.000000 18.297733 0.000000 18.665001 c +h +11.665000 19.330002 m +11.297730 19.330002 11.000000 19.032270 11.000000 18.665001 c +11.000000 18.297733 11.297730 18.000002 11.665000 18.000002 c +18.665001 18.000002 l +19.032269 18.000002 19.330000 18.297733 19.330000 18.665001 c +19.330000 19.032270 19.032269 19.330002 18.665001 19.330002 c +11.665000 19.330002 l +h +11.665000 1.330002 m +11.297730 1.330002 11.000000 1.032270 11.000000 0.665001 c +11.000000 0.297731 11.297730 0.000000 11.665000 0.000000 c +18.665001 0.000000 l +19.032269 0.000000 19.330000 0.297731 19.330000 0.665001 c +19.330000 1.032270 19.032269 1.330002 18.665001 1.330002 c +11.665000 1.330002 l +h +0.665000 1.330002 m +0.297731 1.330002 0.000000 1.032270 0.000000 0.665001 c +0.000000 0.297731 0.297731 0.000000 0.665000 0.000000 c +1.665000 0.000000 l +2.032269 0.000000 2.330000 0.297731 2.330000 0.665001 c +2.330000 1.032270 2.032269 1.330002 1.665000 1.330002 c +0.665000 1.330002 l +h +4.000000 18.665001 m +4.000000 19.032270 4.297730 19.330002 4.665000 19.330002 c +8.665000 19.330002 l +9.032269 19.330002 9.330000 19.032270 9.330000 18.665001 c +9.330000 18.297733 9.032269 18.000002 8.665000 18.000002 c +4.665000 18.000002 l +4.297730 18.000002 4.000000 18.297733 4.000000 18.665001 c +h +4.665000 1.330002 m +4.297730 1.330002 4.000000 1.032270 4.000000 0.665001 c +4.000000 0.297731 4.297730 0.000000 4.665000 0.000000 c +8.665000 0.000000 l +9.032269 0.000000 9.330000 0.297731 9.330000 0.665001 c +9.330000 1.032270 9.032269 1.330002 8.665000 1.330002 c +4.665000 1.330002 l +h +f* +n +Q + +endstream +endobj + +3 0 obj + 1917 +endobj + +4 0 obj + << /Annots [] + /Type /Page + /MediaBox [ 0.000000 0.000000 30.000000 30.000000 ] + /Resources 1 0 R + /Contents 2 0 R + /Parent 5 0 R + >> +endobj + +5 0 obj + << /Kids [ 4 0 R ] + /Count 1 + /Type /Pages + >> +endobj + +6 0 obj + << /Type /Catalog + /Pages 5 0 R + >> +endobj + +xref +0 7 +0000000000 65535 f +0000000010 00000 n +0000000034 00000 n +0000002007 00000 n +0000002030 00000 n +0000002203 00000 n +0000002277 00000 n +trailer +<< /ID [ (some) (id) ] + /Root 6 0 R + /Size 7 +>> +startxref +2336 +%%EOF \ No newline at end of file diff --git a/submodules/TelegramUI/Resources/Fonts/AremacFS-Regular.otf b/submodules/TelegramUI/Resources/Fonts/AremacFS-Regular.otf new file mode 100644 index 0000000000..bb02badf76 Binary files /dev/null and b/submodules/TelegramUI/Resources/Fonts/AremacFS-Regular.otf differ diff --git a/submodules/TelegramUI/Resources/Fonts/AremacFS-Semibold.otf b/submodules/TelegramUI/Resources/Fonts/AremacFS-Semibold.otf new file mode 100644 index 0000000000..ae36bb6c9f Binary files /dev/null and b/submodules/TelegramUI/Resources/Fonts/AremacFS-Semibold.otf differ diff --git a/submodules/TelegramUI/Resources/PresentationStrings.mapping b/submodules/TelegramUI/Resources/PresentationStrings.mapping index 72fa0b81fc..d07b105905 100644 Binary files a/submodules/TelegramUI/Resources/PresentationStrings.mapping and b/submodules/TelegramUI/Resources/PresentationStrings.mapping differ diff --git a/submodules/TelegramUI/Sources/ChatController.swift b/submodules/TelegramUI/Sources/ChatController.swift index d4575e2663..55b66f3974 100644 --- a/submodules/TelegramUI/Sources/ChatController.swift +++ b/submodules/TelegramUI/Sources/ChatController.swift @@ -804,13 +804,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G if let strongSelf = self { strongSelf.controllerInteraction?.addContact(phoneNumber) } - }, storeMediaPlaybackState: { [weak self] messageId, timestamp in + }, storeMediaPlaybackState: { [weak self] messageId, timestamp, playbackRate in guard let strongSelf = self else { return } var storedState: MediaPlaybackStoredState? if let timestamp = timestamp { - storedState = MediaPlaybackStoredState(timestamp: timestamp, playbackRate: .x1) + storedState = MediaPlaybackStoredState(timestamp: timestamp, playbackRate: AudioPlaybackRate(playbackRate)) } let _ = updateMediaPlaybackStoredStateInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, state: storedState).start() }, editMedia: { [weak self] messageId, snapshots, transitionCompletion in diff --git a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift index b0d0fe07b1..35b8af1dd1 100644 --- a/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift +++ b/submodules/TelegramUI/Sources/ChatInterfaceStateContextMenus.swift @@ -843,13 +843,20 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState if !hasAutoremove { for media in message.media { - if media is TelegramMediaAction { + if let action = media as? TelegramMediaAction { if let channel = message.peers[message.id.peerId] as? TelegramChannel { if channel.flags.contains(.isCreator) || (channel.adminRights?.rights.contains(.canDeleteMessages) == true) { } else { isUnremovableAction = true } } + + switch action.action { + case .historyScreenshot: + isUnremovableAction = true + default: + break + } } if let file = media as? TelegramMediaFile { if file.isVideo { diff --git a/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift b/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift index 65d88a5c6b..2b14bb7d5c 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInstantVideoItemNode.swift @@ -19,7 +19,7 @@ private let nameFont = Font.medium(14.0) private let inlineBotPrefixFont = Font.regular(14.0) private let inlineBotNameFont = nameFont -class ChatMessageInstantVideoItemNode: ChatMessageItemView { +class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerDelegate { let contextSourceNode: ContextExtractedContentContainingNode private let containerNode: ContextControllerSourceNode private let interactiveVideoNode: ChatMessageInteractiveInstantVideoNode @@ -53,6 +53,8 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { private var recognizer: TapLongTapOrDoubleTapGestureRecognizer? + private var seekRecognizer: UIPanGestureRecognizer? + private var currentSwipeAction: ChatControllerInteractionSwipeAction? override var visibility: ListViewItemNodeVisibility { @@ -171,6 +173,12 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { return false } self.view.addGestureRecognizer(replyRecognizer) + + let seekRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.seekGesture(_:))) + seekRecognizer.isEnabled = false + seekRecognizer.delegate = self + self.seekRecognizer = seekRecognizer + self.interactiveVideoNode.view.addGestureRecognizer(seekRecognizer) } override func updateAccessibilityData(_ accessibilityData: ChatMessageAccessibilityData) { @@ -326,9 +334,11 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { var isPlaying = false var displaySize = layoutConstants.instantVideo.dimensions let maximumDisplaySize = CGSize(width: params.width - 20.0, height: params.width - 20.0) + var effectiveAvatarInset = avatarInset if item.associatedData.currentlyPlayingMessageId == item.message.index { isPlaying = true displaySize = maximumDisplaySize + effectiveAvatarInset = 0.0 } var automaticDownload = true @@ -345,7 +355,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { let (videoLayout, videoApply) = makeVideoLayout(ChatMessageBubbleContentItem(context: item.context, controllerInteraction: item.controllerInteraction, message: item.message, read: item.read, chatLocation: item.chatLocation, presentationData: item.presentationData, associatedData: item.associatedData, attributes: item.content.firstMessageAttributes, isItemPinned: item.message.tags.contains(.pinned) && !isReplyThread, isItemEdited: false), params.width - params.leftInset - params.rightInset - avatarInset, displaySize, maximumDisplaySize, isPlaying ? 1.0 : 0.0, .free, automaticDownload) - let videoFrame = CGRect(origin: CGPoint(x: (incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + avatarInset + layoutConstants.bubble.contentInsets.left) : (params.width - params.rightInset - videoLayout.contentSize.width - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - deliveryFailedInset)), y: 0.0), size: videoLayout.contentSize) + let videoFrame = CGRect(origin: CGPoint(x: (incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + effectiveAvatarInset + layoutConstants.bubble.contentInsets.left) : (params.width - params.rightInset - videoLayout.contentSize.width - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - deliveryFailedInset)), y: 0.0), size: videoLayout.contentSize) var viaBotApply: (TextNodeLayout, () -> TextNode)? var replyInfoApply: (CGSize, () -> ChatMessageReplyInfoNode)? @@ -526,8 +536,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { strongSelf.updateAccessibilityData(accessibilityData) - - let videoLayoutData: ChatMessageInstantVideoItemLayoutData if incoming { videoLayoutData = .constrained(left: 0.0, right: max(0.0, availableContentWidth - videoFrame.width)) @@ -541,6 +549,9 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { videoApply(videoLayoutData, transition) } + strongSelf.interactiveVideoNode.view.disablesInteractiveTransitionGestureRecognizer = isPlaying + strongSelf.seekRecognizer?.isEnabled = isPlaying + strongSelf.contextSourceNode.contentRect = videoFrame strongSelf.containerNode.targetNodeForActivationProgressContentRect = strongSelf.contextSourceNode.contentRect @@ -854,6 +865,30 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { } } + override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer, panGestureRecognizer === self.seekRecognizer { + let velocity = panGestureRecognizer.velocity(in: self.interactiveVideoNode.view) + return abs(velocity.x) > abs(velocity.y) + } + return true + } + + private var wasPlaying = false + @objc func seekGesture(_ recognizer: UIPanGestureRecognizer) { + var location = recognizer.location(in: self.interactiveVideoNode.view) + switch recognizer.state { + case .began: + self.interactiveVideoNode.pause() + case .changed: + self.interactiveVideoNode.seekTo(Double(location.x / self.interactiveVideoNode.bounds.size.width)) + case .ended, .cancelled: + self.interactiveVideoNode.seekTo(Double(location.x / self.interactiveVideoNode.bounds.size.width)) + self.interactiveVideoNode.play() + default: + break + } + } + @objc func swipeToReplyGesture(_ recognizer: ChatSwipeToReplyRecognizer) { switch recognizer.state { case .began: @@ -1087,6 +1122,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { let targetSize: CGSize let animationProgress: CGFloat = (currentValue - initialHeight) / (targetHeight - initialHeight) let scaleProgress: CGFloat + var effectiveAvatarInset = avatarInset if currentValue < targetHeight { initialSize = displaySize targetSize = maximumDisplaySize @@ -1100,12 +1136,13 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView { targetSize = initialSize scaleProgress = isPlaying ? 1.0 : 0.0 } + effectiveAvatarInset *= (1.0 - scaleProgress) displaySize = CGSize(width: initialSize.width + (targetSize.width - initialSize.width) * animationProgress, height: initialSize.height + (targetSize.height - initialSize.height) * animationProgress) let (videoLayout, videoApply) = makeVideoLayout(ChatMessageBubbleContentItem(context: item.context, controllerInteraction: item.controllerInteraction, message: item.message, read: item.read, chatLocation: item.chatLocation, presentationData: item.presentationData, associatedData: item.associatedData, attributes: item.content.firstMessageAttributes, isItemPinned: item.message.tags.contains(.pinned) && !isReplyThread, isItemEdited: false), params.width - params.leftInset - params.rightInset - avatarInset, displaySize, maximumDisplaySize, scaleProgress, .free, self.appliedAutomaticDownload) let availableContentWidth = params.width - params.leftInset - params.rightInset - layoutConstants.bubble.edgeInset * 2.0 - avatarInset - layoutConstants.bubble.contentInsets.left - let videoFrame = CGRect(origin: CGPoint(x: (incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + avatarInset + layoutConstants.bubble.contentInsets.left) : (params.width - params.rightInset - videoLayout.contentSize.width - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - deliveryFailedInset)), y: 0.0), size: videoLayout.contentSize) + let videoFrame = CGRect(origin: CGPoint(x: (incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + effectiveAvatarInset + layoutConstants.bubble.contentInsets.left) : (params.width - params.rightInset - videoLayout.contentSize.width - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - deliveryFailedInset)), y: 0.0), size: videoLayout.contentSize) self.interactiveVideoNode.frame = videoFrame let videoLayoutData: ChatMessageInstantVideoItemLayoutData diff --git a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift index b263ed4117..f5f84b52b3 100644 --- a/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageInteractiveInstantVideoNode.swift @@ -317,7 +317,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { strongSelf.videoFrame = displayVideoFrame strongSelf.secretProgressIcon = secretProgressIcon strongSelf.automaticDownload = automaticDownload - + if let updatedInfoBackgroundImage = updatedInfoBackgroundImage { strongSelf.infoBackgroundNode.image = updatedInfoBackgroundImage } @@ -832,6 +832,20 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { } } + func seekTo(_ position: Double) { + if let duration = self.playbackStatusNode?.duration { + self.videoNode?.seek(position * duration) + } + } + + func play() { + self.videoNode?.play() + } + + func pause() { + self.videoNode?.pause() + } + func playMediaWithSound() -> (action: (Double?) -> Void, soundEnabled: Bool, isVideoMessage: Bool, isUnread: Bool, badgeNode: ASDisplayNode?)? { if let item = self.item { var isUnconsumed = false diff --git a/submodules/TelegramUI/Sources/InstantVideoRadialStatusNode.swift b/submodules/TelegramUI/Sources/InstantVideoRadialStatusNode.swift index ff02ac1547..9e4768f70a 100644 --- a/submodules/TelegramUI/Sources/InstantVideoRadialStatusNode.swift +++ b/submodules/TelegramUI/Sources/InstantVideoRadialStatusNode.swift @@ -40,6 +40,14 @@ final class InstantVideoRadialStatusNode: ASDisplayNode { private var statusDisposable: Disposable? private var statusValuePromise = Promise() + var duration: Double? { + if let statusValue = self.statusValue { + return statusValue.duration + } else { + return nil + } + } + var status: Signal? { didSet { if let status = self.status { diff --git a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift index 347603e336..6d6cb6672c 100644 --- a/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift +++ b/submodules/TelegramUI/Sources/PeerInfo/PeerInfoScreen.swift @@ -3072,13 +3072,13 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD } }, completed: {}) } - }, storeMediaPlaybackState: { [weak self] messageId, timestamp in + }, storeMediaPlaybackState: { [weak self] messageId, timestamp, playbackRate in guard let strongSelf = self else { return } var storedState: MediaPlaybackStoredState? if let timestamp = timestamp { - storedState = MediaPlaybackStoredState(timestamp: timestamp, playbackRate: .x1) + storedState = MediaPlaybackStoredState(timestamp: timestamp, playbackRate: AudioPlaybackRate(playbackRate) ?? .x1) } let _ = updateMediaPlaybackStoredStateInteractively(postbox: strongSelf.context.account.postbox, messageId: messageId, state: storedState).start() }, editMedia: { [weak self] messageId, snapshots, transitionCompletion in diff --git a/submodules/TelegramUI/Sources/SharedMediaPlayer.swift b/submodules/TelegramUI/Sources/SharedMediaPlayer.swift index c9eba8d4c0..0277922cae 100644 --- a/submodules/TelegramUI/Sources/SharedMediaPlayer.swift +++ b/submodules/TelegramUI/Sources/SharedMediaPlayer.swift @@ -442,19 +442,7 @@ final class SharedMediaPlayer { case let .setBaseRate(baseRate): self.playbackRate = baseRate if let playbackItem = self.playbackItem { - let rateValue: Double - switch baseRate { - case .x1: - rateValue = 1.0 - case .x2: - rateValue = 1.8 - case .x4: - rateValue = 4.0 - case .x8: - rateValue = 8.0 - case .x16: - rateValue = 16.0 - } + let rateValue: Double = baseRate.doubleValue switch playbackItem { case let .audio(player): player.setBaseRate(rateValue) diff --git a/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift b/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift index 14cfe6a36c..d2707fa138 100644 --- a/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift +++ b/submodules/TelegramUIPreferences/Sources/MusicPlaybackSettings.swift @@ -15,15 +15,25 @@ public enum MusicPlaybackSettingsLooping: Int32 { } public enum AudioPlaybackRate: Int32 { + case x0_5 = 500 case x1 = 1000 + case x1_5 = 1500 case x2 = 2000 case x4 = 4000 case x8 = 8000 case x16 = 16000 - var doubleValue: Double { + public var doubleValue: Double { return Double(self.rawValue) / 1000.0 } + + public init(_ value: Double) { + if let resolved = AudioPlaybackRate(rawValue: Int32(value * 1000.0)) { + self = resolved + } else { + self = .x1 + } + } } public struct MusicPlaybackSettings: PreferencesEntry, Equatable { diff --git a/submodules/TgVoipWebrtc/BUILD b/submodules/TgVoipWebrtc/BUILD index e7da0a33c9..a5203c7319 100644 --- a/submodules/TgVoipWebrtc/BUILD +++ b/submodules/TgVoipWebrtc/BUILD @@ -44,7 +44,8 @@ objc_library( "-Ithird-party/webrtc/webrtc/sdk/objc/components/renderer/metal", "-Ithird-party/webrtc/webrtc/sdk/objc/components/renderer/opengl", "-Ithird-party/webrtc/webrtc/sdk/objc/components/video_codec", - "-Ithird-party/webrtc/dependencies/third_party/libyuv/include", + "-Ithird-party/libyuv/third_party/libyuv/include", + "-Ithird-party/libyuv", "-Ithird-party/webrtc/webrtc/sdk/objc/api/video_codec", "-DWEBRTC_IOS", "-DWEBRTC_MAC", @@ -65,6 +66,7 @@ objc_library( "//third-party/opusfile:opusfile", "//submodules/ffmpeg:ffmpeg", "//third-party/rnnoise:rnnoise", + "//third-party/libyuv:libyuv", ], sdk_frameworks = [ "Foundation", diff --git a/third-party/libyuv/BUILD b/third-party/libyuv/BUILD new file mode 100644 index 0000000000..9936c678c3 --- /dev/null +++ b/third-party/libyuv/BUILD @@ -0,0 +1,142 @@ + +config_setting( + name = "debug_build", + values = { + "compilation_mode": "dbg", + }, +) + +optimization_flags = select({ + ":debug_build": ["-O2", "-DNDEBUG"], + "//conditions:default": ["-DNDEBUG"], +}) + +common_flags = [] + +arm_specific_flags = [ + "-DLIBYUV_NEON", +] + +arm64_specific_flags = [ + "-DLIBYUV_NEON", +] + +x86_64_specific_flags = [ + "-DHAVE_SSE2", +] + +arch_specific_cflags = select({ + "@build_bazel_rules_apple//apple:ios_armv7": common_flags + arm_specific_flags, + "@build_bazel_rules_apple//apple:ios_arm64": common_flags + arm64_specific_flags, + "//build-system:ios_sim_arm64": common_flags + arm64_specific_flags, + "@build_bazel_rules_apple//apple:ios_x86_64": common_flags + x86_64_specific_flags, +}) + +cc_library( + name = "libyuv", + srcs = [ "third_party/libyuv/" + path for path in [ + # Headers + "include/libyuv.h", + "include/libyuv/basic_types.h", + "include/libyuv/compare.h", + "include/libyuv/compare_row.h", + "include/libyuv/convert.h", + "include/libyuv/convert_argb.h", + "include/libyuv/convert_from.h", + "include/libyuv/convert_from_argb.h", + "include/libyuv/cpu_id.h", + "include/libyuv/mjpeg_decoder.h", + "include/libyuv/planar_functions.h", + "include/libyuv/rotate.h", + "include/libyuv/rotate_argb.h", + "include/libyuv/rotate_row.h", + "include/libyuv/row.h", + "include/libyuv/scale.h", + "include/libyuv/scale_argb.h", + "include/libyuv/scale_row.h", + "include/libyuv/scale_uv.h", + "include/libyuv/version.h", + "include/libyuv/video_common.h", + + # Source Files + "source/compare.cc", + "source/compare_common.cc", + "source/compare_gcc.cc", + "source/compare_win.cc", + "source/convert.cc", + "source/convert_argb.cc", + "source/convert_from.cc", + "source/convert_from_argb.cc", + "source/convert_jpeg.cc", + "source/convert_to_argb.cc", + "source/convert_to_i420.cc", + "source/cpu_id.cc", + "source/mjpeg_decoder.cc", + "source/mjpeg_validate.cc", + "source/planar_functions.cc", + "source/rotate.cc", + "source/rotate_any.cc", + "source/rotate_argb.cc", + "source/rotate_common.cc", + "source/rotate_gcc.cc", + "source/rotate_win.cc", + "source/row_any.cc", + "source/row_common.cc", + "source/row_gcc.cc", + "source/row_win.cc", + "source/scale.cc", + "source/scale_any.cc", + "source/scale_argb.cc", + "source/scale_common.cc", + "source/scale_gcc.cc", + "source/scale_uv.cc", + "source/scale_win.cc", + "source/video_common.cc", + + # ARM Source Files + "source/compare_neon.cc", + "source/compare_neon64.cc", + "source/rotate_neon.cc", + "source/rotate_neon64.cc", + "source/row_neon.cc", + "source/row_neon64.cc", + "source/scale_neon.cc", + "source/scale_neon64.cc", + ]], + copts = [ + "-ffp-contract=fast", + "-Ithird-party/libyuv/third_party/libyuv/include", + ] + arch_specific_cflags + optimization_flags, + visibility = ["//visibility:public"], +) + + +objc_library( + name = "LibYuvBinding", + enable_modules = True, + module_name = "LibYuvBinding", + srcs = glob([ + "LibYuvBinding/Sources/**/*.m", + "LibYuvBinding/Sources/**/*.c", + "LibYuvBinding/Sources/**/*.h", + ]), + hdrs = glob([ + "LibYuvBinding/PublicHeaders/**/*.h", + ]), + includes = [ + "LibYuvBinding/PublicHeaders", + ], + copts = [ + "-Ithird-party/libyuv/third_party/libyuv/include", + ], + deps = [ + ":libyuv", + ], + sdk_frameworks = [ + "Foundation", + ], + visibility = [ + "//visibility:public", + ], +) + diff --git a/third-party/libyuv/LibYuvBinding/PublicHeaders/LibYuvBinding/LibYuvBinding.h b/third-party/libyuv/LibYuvBinding/PublicHeaders/LibYuvBinding/LibYuvBinding.h new file mode 100644 index 0000000000..7cd4095930 --- /dev/null +++ b/third-party/libyuv/LibYuvBinding/PublicHeaders/LibYuvBinding/LibYuvBinding.h @@ -0,0 +1,21 @@ +#ifndef LIBYUV_BINDING_H +#define LIBYUV_BINDING_H + +#import + +bool libyuv_I420ToNV12( + const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height +); + +#endif diff --git a/third-party/libyuv/LibYuvBinding/Sources/LibYuvBinding.m b/third-party/libyuv/LibYuvBinding/Sources/LibYuvBinding.m new file mode 100644 index 0000000000..8876bfc135 --- /dev/null +++ b/third-party/libyuv/LibYuvBinding/Sources/LibYuvBinding.m @@ -0,0 +1,33 @@ +#include + +#include "libyuv/convert_from.h" + +bool libyuv_I420ToNV12( + const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height +) { + return I420ToNV12( + src_y, + src_stride_y, + src_u, + src_stride_u, + src_v, + src_stride_v, + dst_y, + dst_stride_y, + dst_uv, + dst_stride_uv, + width, + height + ) == 0; +} diff --git a/third-party/webrtc/dependencies/third_party/libyuv/AUTHORS b/third-party/libyuv/third_party/libyuv/AUTHORS similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/AUTHORS rename to third-party/libyuv/third_party/libyuv/AUTHORS diff --git a/third-party/webrtc/dependencies/third_party/libyuv/Android.bp b/third-party/libyuv/third_party/libyuv/Android.bp similarity index 74% rename from third-party/webrtc/dependencies/third_party/libyuv/Android.bp rename to third-party/libyuv/third_party/libyuv/Android.bp index d0b2343262..e2ea47a038 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/Android.bp +++ b/third-party/libyuv/third_party/libyuv/Android.bp @@ -1,6 +1,32 @@ +package { + default_applicable_licenses: ["external_libyuv_files_license"], +} + +// Added automatically by a large-scale-change +// +// large-scale-change included anything that looked like it might be a license +// text as a license_text. e.g. LICENSE, NOTICE, COPYING etc. +// +// Please consider removing redundant or irrelevant files from 'license_text:'. +// See: http://go/android-license-faq +license { + name: "external_libyuv_files_license", + visibility: [":__subpackages__"], + license_kinds: [ + "SPDX-license-identifier-BSD", + ], + license_text: [ + "LICENSE", + "LICENSE_THIRD_PARTY", + "PATENTS", + ], +} + cc_library { name: "libyuv", vendor_available: true, + product_available: true, + host_supported: true, vndk: { enabled: true, }, @@ -61,9 +87,21 @@ cc_library { "-DHAVE_JPEG", ], + arch: { + arm: { + cflags: ["-mfpu=neon"], + }, + }, + shared_libs: ["libjpeg"], export_include_dirs: ["include"], + + apex_available: [ + "//apex_available:platform", + "com.android.media.swcodec", + ], + min_sdk_version: "29", } // compatibilty static library until all uses of libyuv_static are replaced @@ -72,6 +110,11 @@ cc_library_static { name: "libyuv_static", vendor_available: true, whole_static_libs: ["libyuv"], + apex_available: [ + "//apex_available:platform", + "com.android.media.swcodec", + ], + min_sdk_version: "29", } cc_test { @@ -108,19 +151,19 @@ cc_test { } cc_test { - name: "i444tonv12_eg", + name: "cpuid", gtest: false, srcs: [ - "util/i444tonv12_eg.cc", + "util/cpuid.c", ], static_libs: ["libyuv"], } cc_test { - name: "cpuid", + name: "i444tonv12_eg", gtest: false, srcs: [ - "util/cpuid.c", + "util/i444tonv12_eg.cc", ], static_libs: ["libyuv"], } @@ -136,6 +179,15 @@ cc_test { static_libs: ["libyuv"], } +cc_test { + name: "yuvconstants", + gtest: false, + srcs: [ + "util/yuvconstants.c", + ], + static_libs: ["libyuv"], +} + cc_test { name: "yuvconvert", gtest: false, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/Android.mk b/third-party/libyuv/third_party/libyuv/Android.mk similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/Android.mk rename to third-party/libyuv/third_party/libyuv/Android.mk diff --git a/third-party/webrtc/dependencies/third_party/libyuv/BUILD.gn b/third-party/libyuv/third_party/libyuv/BUILD.gn similarity index 94% rename from third-party/webrtc/dependencies/third_party/libyuv/BUILD.gn rename to third-party/libyuv/third_party/libyuv/BUILD.gn index d733e71de8..e1c7c1da4d 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/BUILD.gn +++ b/third-party/libyuv/third_party/libyuv/BUILD.gn @@ -10,8 +10,8 @@ import("//testing/test.gni") import("libyuv.gni") declare_args() { - # Set to false to disable building with gflags. - libyuv_use_gflags = true + # Set to false to disable building with absl flags. + libyuv_use_absl_flags = true # When building a shared library using a target in WebRTC or # Chromium projects that depends on libyuv, setting this flag @@ -40,6 +40,7 @@ group("default") { ":i444tonv12_eg", ":libyuv_unittest", ":psnr", + ":yuvconstants", ":yuvconvert", ] } @@ -293,9 +294,12 @@ if (libyuv_include_tests) { ] defines = [] - if (libyuv_use_gflags) { - defines += [ "LIBYUV_USE_GFLAGS" ] - deps += [ "//third_party/gflags" ] + if (libyuv_use_absl_flags) { + defines += [ "LIBYUV_USE_ABSL_FLAGS" ] + deps += [ + "//third_party/abseil-cpp/absl/flags:flag", + "//third_party/abseil-cpp/absl/flags:parse", + ] } configs += [ ":libyuv_unittest_warnings_config" ] @@ -357,6 +361,17 @@ if (libyuv_include_tests) { } } + executable("yuvconstants") { + sources = [ + # sources + "util/yuvconstants.c", + ] + deps = [ ":libyuv" ] + if (is_linux || is_chromeos) { + cflags = [ "-fexceptions" ] + } + } + executable("psnr") { sources = [ # sources @@ -376,9 +391,7 @@ if (libyuv_include_tests) { # sources "util/i444tonv12_eg.cc", ] - deps = [ - ":libyuv", - ] + deps = [ ":libyuv" ] } executable("cpuid") { diff --git a/third-party/webrtc/dependencies/third_party/libyuv/CM_linux_packages.cmake b/third-party/libyuv/third_party/libyuv/CM_linux_packages.cmake similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/CM_linux_packages.cmake rename to third-party/libyuv/third_party/libyuv/CM_linux_packages.cmake diff --git a/third-party/webrtc/dependencies/third_party/libyuv/CMakeLists.txt b/third-party/libyuv/third_party/libyuv/CMakeLists.txt similarity index 93% rename from third-party/webrtc/dependencies/third_party/libyuv/CMakeLists.txt rename to third-party/libyuv/third_party/libyuv/CMakeLists.txt index ed4948f066..636531eee0 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/CMakeLists.txt +++ b/third-party/libyuv/third_party/libyuv/CMakeLists.txt @@ -71,12 +71,6 @@ if(TEST) if(NACL AND NACL_LIBC STREQUAL "newlib") target_link_libraries(libyuv_unittest glibc-compat) endif() - - find_library(GFLAGS_LIBRARY gflags) - if(NOT GFLAGS_LIBRARY STREQUAL "GFLAGS_LIBRARY-NOTFOUND") - target_link_libraries(libyuv_unittest gflags) - add_definitions(-DLIBYUV_USE_GFLAGS) - endif() endif() diff --git a/third-party/webrtc/dependencies/third_party/libyuv/DEPS b/third-party/libyuv/third_party/libyuv/DEPS similarity index 65% rename from third-party/webrtc/dependencies/third_party/libyuv/DEPS rename to third-party/libyuv/third_party/libyuv/DEPS index de18543450..b4bf027833 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/DEPS +++ b/third-party/libyuv/third_party/libyuv/DEPS @@ -1,18 +1,26 @@ +gclient_gn_args_file = 'src/build/config/gclient_args.gni' +gclient_gn_args = [ + 'generate_location_tags', +] + vars = { 'chromium_git': 'https://chromium.googlesource.com', - 'chromium_revision': '64c8c30faaf969c15c028131dfcd0819208039c1', + 'chromium_revision': 'eaac4f14d951eb92181830ed7c346d3ad3ebe7a5', 'gn_version': 'git_revision:6f13aaac55a977e1948910942675c69f2b4f7a94', + + # Keep the Chromium default of generating location tags. + 'generate_location_tags': True, } deps = { 'src/build': - Var('chromium_git') + '/chromium/src/build' + '@' + '2d2f9f2b85592bb9af5753ef300c055e6feb709f', + Var('chromium_git') + '/chromium/src/build' + '@' + 'fd86d60f33cbc794537c4da2ef7e298d7f81138e', 'src/buildtools': - Var('chromium_git') + '/chromium/src/buildtools' + '@' + '6302c1175607a436e18947a5abe9df2209e845fc', + Var('chromium_git') + '/chromium/src/buildtools' + '@' + '37dc929ecb351687006a61744b116cda601753d7', 'src/testing': - Var('chromium_git') + '/chromium/src/testing' + '@' + '40b44171056045ed1f85ca0b57485e46c03d7867', + Var('chromium_git') + '/chromium/src/testing' + '@' + 'c4bd9205eeb6037d567de781d736ab81ff63ecee', 'src/third_party': - Var('chromium_git') + '/chromium/src/third_party' + '@' + '24ccdf9b7553446791983bf357261c5e0a4314a0', + Var('chromium_git') + '/chromium/src/third_party' + '@' + 'f7d9d7e9dd45109820780e5bfbc3e6f0892d56d7', 'src/buildtools/linux64': { 'packages': [ @@ -46,47 +54,41 @@ deps = { }, 'src/buildtools/clang_format/script': - Var('chromium_git') + '/chromium/llvm-project/cfe/tools/clang-format.git' + '@' + '96636aa0e9f047f17447f2d45a094d0b59ed7917', + Var('chromium_git') + '/external/github.com/llvm/llvm-project/clang/tools/clang-format.git' + '@' + '99803d74e35962f63a775f29477882afd4d57d94', 'src/buildtools/third_party/libc++/trunk': - Var('chromium_git') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + 'd9040c75cfea5928c804ab7c235fed06a63f743a', + Var('chromium_git') + '/external/github.com/llvm/llvm-project/libcxx.git' + '@' + '79a2e924d96e2fc1e4b937c42efd08898fa472d7', 'src/buildtools/third_party/libc++abi/trunk': - Var('chromium_git') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + '196ba1aaa8ac285d94f4ea8d9836390a45360533', + Var('chromium_git') + '/external/github.com/llvm/llvm-project/libcxxabi.git' + '@' + '7d5c92f6cfb1ddb73158233a194bb568c5b13554', 'src/buildtools/third_party/libunwind/trunk': - Var('chromium_git') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + 'd999d54f4bca789543a2eb6c995af2d9b5a1f3ed', + Var('chromium_git') + '/external/github.com/llvm/llvm-project/libunwind.git' + '@' + 'd7b11d7989774617bd7df93af95734faac8c0b2c', 'src/third_party/catapult': - Var('chromium_git') + '/catapult.git' + '@' + 'ccc9dd2835f5a7c5c82ae3c1a2fbc2fe2fd9dfd1', + Var('chromium_git') + '/catapult.git' + '@' + '5cb305306ad74c3b68e432ee221a1943dd79b64d', 'src/third_party/colorama/src': Var('chromium_git') + '/external/colorama.git' + '@' + '799604a1041e9b3bc5d2789ecbd7e8db2e18e6b8', 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '91bb7506bd20ed22b8787e7a8b9975cc07e97175', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + 'a806594b95a39141fdbf1f359087a44ffb2deaaf', 'src/third_party/freetype/src': - Var('chromium_git') + '/chromium/src/third_party/freetype2.git' + '@' + '26e2a89598d69c7aba76c83f6a1fcf1db17574ab', + Var('chromium_git') + '/chromium/src/third_party/freetype2.git' + '@' + '86b9c9347f99174f4fea3e9deca5800e57a987f2', 'src/third_party/googletest/src': - Var('chromium_git') + '/external/github.com/google/googletest.git' + '@' + '4fe018038f87675c083d0cfb6a6b57c274fb1753', + Var('chromium_git') + '/external/github.com/google/googletest.git' + '@' + '4ec4cd23f486bf70efcc5d2caa40f24368f752e3', 'src/third_party/harfbuzz-ng/src': - Var('chromium_git') + '/external/github.com/harfbuzz/harfbuzz.git' + '@' + 'c39ab82c90479341dcf28eaa8174af6f08c0d7ae', + Var('chromium_git') + '/external/github.com/harfbuzz/harfbuzz.git' + '@' + 'cc9bb294919e846ef8a0731b5e9f304f95ef3bb8', 'src/third_party/libjpeg_turbo': - Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + 'd5148db386ceb4a608058320071cbed890bd6ad2', + Var('chromium_git') + '/chromium/deps/libjpeg_turbo.git' + '@' + 'ad8b3b0f84baf155f3bde5626c3bf9d20535bcae', 'src/third_party/nasm': - Var('chromium_git') + '/chromium/deps/nasm.git' + '@' + '19f3fad68da99277b2882939d3b2fa4c4b8d51d9', - 'src/third_party/yasm/source/patched-yasm': - Var('chromium_git') + '/chromium/deps/yasm/patched-yasm.git' + '@' + '720b70524a4424b15fc57e82263568c8ba0496ad', + Var('chromium_git') + '/chromium/deps/nasm.git' + '@' + 'e9be5fd6d723a435ca2da162f9e0ffcb688747c1', 'src/tools': - Var('chromium_git') + '/chromium/src/tools' + '@' + '1bb7c085e67a0fc8c63511af83299d1632f5a3f3', + Var('chromium_git') + '/chromium/src/tools' + '@' + '4f73c6f51dc2198347630219417cbf21a7064bdd', 'src/tools/swarming_client': - Var('chromium_git') + '/infra/luci/client-py.git' + '@' + 'd46ea7635f2911208268170512cb611412488fd8', + Var('chromium_git') + '/infra/luci/client-py.git' + '@' + 'a32a1607f6093d338f756c7e7c7b4333b0c50c9c', # libyuv-only dependencies (not present in Chromium). - 'src/third_party/gflags': - Var('chromium_git') + '/external/webrtc/deps/third_party/gflags' + '@' + '892576179b45861b53e04a112996a738309cf364', - 'src/third_party/gflags/src': - Var('chromium_git') + '/external/github.com/gflags/gflags' + '@' + '03bebcb065c83beff83d50ae025a55a4bf94dfca', 'src/third_party/gtest-parallel': Var('chromium_git') + '/external/webrtc/deps/third_party/gtest-parallel' + '@' + '1dad0e9f6d82ff994130b529d7d814b40eb32b0e', 'src/third_party/lss': { - 'url': Var('chromium_git') + '/linux-syscall-support.git' + '@' + '29f7c7e018f4ce706a709f0b0afbf8bacf869480', + 'url': Var('chromium_git') + '/linux-syscall-support.git' + '@' + '92a65a8f5d705d1928874420c8d0d15bde8c89e5', 'condition': 'checkout_android or checkout_linux', }, @@ -102,13 +104,13 @@ deps = { 'dep_type': 'cipd', }, 'src/third_party/auto/src': { - 'url': Var('chromium_git') + '/external/github.com/google/auto.git' + '@' + 'f40317ae215863102cf87fe0679ad66f4b19454e', + 'url': Var('chromium_git') + '/external/github.com/google/auto.git' + '@' + '00cb81ed0959a55eb671e89768934094ca0e5e6f', 'condition': 'checkout_android', }, 'src/third_party/boringssl/src': - 'https://boringssl.googlesource.com/boringssl.git' + '@' + '1607f54fed72c6589d560254626909a64124f091', + 'https://boringssl.googlesource.com/boringssl.git' + '@' + 'a10017c548b0805eb98e7847c37370dbd37cd8d6', 'src/base': { - 'url': Var('chromium_git') + '/chromium/src/base' + '@' + 'e096814b0448fba1095c6e7be7c7a0b5d7264251', + 'url': Var('chromium_git') + '/chromium/src/base' + '@' + '4045370905def8e415021737f13e02ed6444a45c', 'condition': 'checkout_android', }, 'src/third_party/bazel': { @@ -132,9 +134,19 @@ deps = { 'dep_type': 'cipd', }, 'src/third_party/android_ndk': { - 'url': Var('chromium_git') + '/android_ndk.git' + '@' + '27c0a8d090c666a50e40fceb4ee5b40b1a2d3f87', + 'url': Var('chromium_git') + '/android_ndk.git' + '@' + '401019bf85744311b26c88ced255cd53401af8b7', 'condition': 'checkout_android', }, + 'src/third_party/androidx': { + 'packages': [ + { + 'package': 'chromium/third_party/androidx', + 'version': 'YiuL0FMMTU_K_n0aBAT3GBA4dMfL8JHhn6dkcz5SFgAC', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, 'src/third_party/android_support_test_runner': { 'packages': [ { @@ -151,10 +163,6 @@ deps = { 'package': 'chromium/third_party/android_sdk/public/build-tools/30.0.1', 'version': '8LZujEmLjSh0g3JciDA3cslSptxKs9HOa_iUPXkOeYQC', }, - { - 'package': 'chromium/third_party/android_sdk/public/cmdline-tools', - 'version': 'ijpIFSitwBfaEdO9VXBGPqDHUVzPimXy_whw3aHTN9oC', - }, { 'package': 'chromium/third_party/android_sdk/public/emulator', 'version': 'A4EvXZUIuQho0QRDJopMUpgyp6NA3aiDQjGKPUKbowMC', @@ -179,6 +187,10 @@ deps = { 'package': 'chromium/third_party/android_sdk/public/sources/android-29', 'version': '4gxhM8E62bvZpQs7Q3d0DinQaW0RLCIefhXrQBFkNy8C', }, + { + 'package': 'chromium/third_party/android_sdk/public/cmdline-tools', + 'version': 'V__2Ycej-H2-6AcXX5A3gi7sIk74SuN44PBm2uC_N1sC', + }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', @@ -257,7 +269,7 @@ deps = { }, 'src/third_party/icu': { - 'url': Var('chromium_git') + '/chromium/deps/icu.git' + '@' + 'c2a4cae149aae7fd30c4cbe3cf1b30df03b386f1', + 'url': Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '2a822c5626ab1ed40366758e4740b4f0ea40237d', }, 'src/third_party/icu4j': { 'packages': [ @@ -302,7 +314,7 @@ deps = { 'condition': 'checkout_android', }, 'src/third_party/libunwindstack': { - 'url': Var('chromium_git') + '/chromium/src/third_party/libunwindstack.git' + '@' + '11659d420a71e7323b379ea8781f07c6f384bc7e', + 'url': Var('chromium_git') + '/chromium/src/third_party/libunwindstack.git' + '@' + 'b34a0059a648f179ef05da2c0927f564bdaea2b3', 'condition': 'checkout_android', }, 'src/third_party/mockito/src': { @@ -333,7 +345,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/r8', - 'version': 'N9LppKV-9lFkp7JQtmcLHhm7xHqFv0SPa6aDPtgNCdwC', + 'version': 'Nu_mvQJe34CotIXadFlA3w732CJ9EvQGuVs4udcZedAC', }, ], 'condition': 'checkout_android', @@ -343,7 +355,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/proguard', - 'version': '3bd778c422ea5496de2ef25c007a517dbb5ce5ca', + 'version': 'Fd91BJFVlmiO6c46YMTsdy7n2f5Sk2hVVGlzPLvqZPsC', }, ], 'condition': 'checkout_android', @@ -357,16 +369,12 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/robolectric', - 'version': '1KXoOiNP1a_uZNdM2ybWKwAQNow1dHTXTig-ZK4Xgq8C', + 'version': 'iC6RDM5EH3GEAzR-1shW_Mg0FeeNE5shq1okkFfuuNQC', }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', }, - 'src/third_party/robolectric/robolectric': { - 'url': Var('chromium_git') + '/external/robolectric.git' + '@' + '2f3e0a3ac450a17dbf2e7d4eaab3a1f14dda50e6', - 'condition': 'checkout_android', - }, 'src/third_party/sqlite4java': { 'packages': [ { @@ -381,16 +389,12 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/turbine', - 'version': 'O_jNDJ4VdwYKBSDbd2BJ3mknaTFoVkvE7Po8XIiKy8sC', + 'version': 'Om6yIEXgJxuqghErK29h9RcMH6VaymMbxwScwXmcN6EC', }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', }, - 'src/third_party/turbine/src': { - 'url': Var('chromium_git') + '/external/github.com/google/turbine.git' + '@' + '0f2a5024fe4a9bb745bcd5ac7c655cebe11649bc', - 'condition': 'checkout_android', - }, 'src/third_party/ub-uiautomator/lib': { 'url': Var('chromium_git') + '/chromium/third_party/ub-uiautomator.git' + '@' + '00270549ce3161ae72ceb24712618ea28b4f9434', 'condition': 'checkout_android', @@ -408,24 +412,18 @@ deps = { # iOS deps: 'src/ios': { - 'url': Var('chromium_git') + '/chromium/src/ios' + '@' + '60ef55beac67e3c0eda1c35ab7944c786b377313', + 'url': Var('chromium_git') + '/chromium/src/ios' + '@' + '57422bee2ccad3d8b1f0f288845c86df024430d5', 'condition': 'checkout_ios' }, - # Win deps: - # Dependencies used by libjpeg-turbo - 'src/third_party/yasm/binaries': { - 'url': Var('chromium_git') + '/chromium/deps/yasm/binaries.git' + '@' + '52f9b3f4b0aa06da24ef8b123058bb61ee468881', - 'condition': 'checkout_win', - }, - + # Everything coming after this is automatically updated by the auto-roller. # === ANDROID_DEPS Generated Code Start === # Generated by //third_party/android_deps/fetch_all.py 'src/third_party/android_deps/libs/android_arch_core_common': { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/android_arch_core_common', - 'version': 'version:1.1.1-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -436,7 +434,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/android_arch_core_runtime', - 'version': 'version:1.1.1-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -447,7 +445,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/android_arch_lifecycle_common', - 'version': 'version:1.1.1-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -458,7 +456,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/android_arch_lifecycle_common_java8', - 'version': 'version:1.1.1-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -469,7 +467,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata', - 'version': 'version:1.1.1-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -480,7 +478,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/android_arch_lifecycle_livedata_core', - 'version': 'version:1.1.1-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -491,7 +489,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/android_arch_lifecycle_runtime', - 'version': 'version:1.1.1-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -502,766 +500,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/android_arch_lifecycle_viewmodel', - 'version': 'version:1.1.1-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_activity_activity': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_activity_activity', - 'version': 'version:1.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_annotation_annotation': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_annotation_annotation', - 'version': 'version:1.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_annotation_annotation_experimental': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_annotation_annotation_experimental', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_appcompat_appcompat': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_appcompat_appcompat', - 'version': 'version:1.2.0-beta01-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_appcompat_appcompat_resources': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_appcompat_appcompat_resources', - 'version': 'version:1.2.0-beta01-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_arch_core_core_common': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_arch_core_core_common', - 'version': 'version:2.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_arch_core_core_runtime': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_arch_core_core_runtime', - 'version': 'version:2.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_asynclayoutinflater_asynclayoutinflater': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_asynclayoutinflater_asynclayoutinflater', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_cardview_cardview': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_cardview_cardview', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_collection_collection': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_collection_collection', - 'version': 'version:1.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_concurrent_concurrent_futures': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_concurrent_concurrent_futures', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_coordinatorlayout_coordinatorlayout': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_coordinatorlayout_coordinatorlayout', - 'version': 'version:1.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_core_core': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_core_core', - 'version': 'version:1.3.0-beta01-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_cursoradapter_cursoradapter': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_cursoradapter_cursoradapter', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_customview_customview': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_customview_customview', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_documentfile_documentfile': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_documentfile_documentfile', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_drawerlayout_drawerlayout': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_drawerlayout_drawerlayout', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_exifinterface_exifinterface': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_exifinterface_exifinterface', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_fragment_fragment': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_fragment_fragment', - 'version': 'version:1.2.5-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_gridlayout_gridlayout': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_gridlayout_gridlayout', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_interpolator_interpolator': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_interpolator_interpolator', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_leanback_leanback': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_leanback_leanback', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_leanback_leanback_preference': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_leanback_leanback_preference', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_legacy_legacy_preference_v14': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_legacy_legacy_preference_v14', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_legacy_legacy_support_core_ui': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_legacy_legacy_support_core_ui', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_legacy_legacy_support_core_utils': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_legacy_legacy_support_core_utils', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_legacy_legacy_support_v13': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_legacy_legacy_support_v13', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_legacy_legacy_support_v4': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_legacy_legacy_support_v4', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_lifecycle_lifecycle_common': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_lifecycle_lifecycle_common', - 'version': 'version:2.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_lifecycle_lifecycle_common_java8': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_lifecycle_lifecycle_common_java8', - 'version': 'version:2.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_lifecycle_lifecycle_livedata': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_lifecycle_lifecycle_livedata', - 'version': 'version:2.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_lifecycle_lifecycle_livedata_core': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_lifecycle_lifecycle_livedata_core', - 'version': 'version:2.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_lifecycle_lifecycle_runtime': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_lifecycle_lifecycle_runtime', - 'version': 'version:2.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_lifecycle_lifecycle_viewmodel': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_lifecycle_lifecycle_viewmodel', - 'version': 'version:2.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate', - 'version': 'version:2.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_loader_loader': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_loader_loader', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_localbroadcastmanager_localbroadcastmanager': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_localbroadcastmanager_localbroadcastmanager', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_media_media': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_media_media', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_mediarouter_mediarouter': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_mediarouter_mediarouter', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_multidex_multidex': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_multidex_multidex', - 'version': 'version:2.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_palette_palette': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_palette_palette', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_preference_preference': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_preference_preference', - 'version': 'version:1.1.1-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_print_print': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_print_print', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_recyclerview_recyclerview': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_recyclerview_recyclerview', - 'version': 'version:1.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_savedstate_savedstate': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_savedstate_savedstate', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_slice_slice_builders': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_slice_slice_builders', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_slice_slice_core': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_slice_slice_core', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_slidingpanelayout_slidingpanelayout': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_slidingpanelayout_slidingpanelayout', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_swiperefreshlayout_swiperefreshlayout': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_swiperefreshlayout_swiperefreshlayout', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_core': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_core', - 'version': 'version:1.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_espresso_espresso_contrib': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_espresso_espresso_contrib', - 'version': 'version:3.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_espresso_espresso_core': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_espresso_espresso_core', - 'version': 'version:3.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_espresso_espresso_idling_resource': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_espresso_espresso_idling_resource', - 'version': 'version:3.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_espresso_espresso_intents': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_espresso_espresso_intents', - 'version': 'version:3.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_espresso_espresso_web': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_espresso_espresso_web', - 'version': 'version:3.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_ext_junit': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_ext_junit', - 'version': 'version:1.1.1-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_monitor': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_monitor', - 'version': 'version:1.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_rules': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_rules', - 'version': 'version:1.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_runner': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_runner', - 'version': 'version:1.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_test_uiautomator_uiautomator': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_test_uiautomator_uiautomator', - 'version': 'version:2.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_transition_transition': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_transition_transition', - 'version': 'version:1.2.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_tvprovider_tvprovider': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_tvprovider_tvprovider', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_vectordrawable_vectordrawable': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_vectordrawable_vectordrawable', - 'version': 'version:1.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_vectordrawable_vectordrawable_animated': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_vectordrawable_vectordrawable_animated', - 'version': 'version:1.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_versionedparcelable_versionedparcelable': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_versionedparcelable_versionedparcelable', - 'version': 'version:1.1.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_viewpager2_viewpager2': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_viewpager2_viewpager2', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_viewpager_viewpager': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_viewpager_viewpager', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_webkit_webkit': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_webkit_webkit', - 'version': 'version:1.3.0-rc01-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/androidx_window_window': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/androidx_window_window', - 'version': 'version:1.0.0-alpha01-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -1272,7 +511,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/backport_util_concurrent_backport_util_concurrent', - 'version': 'version:3.1-cr0', + 'version': 'version:2@3.1.cr0', }, ], 'condition': 'checkout_android', @@ -1283,7 +522,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/classworlds_classworlds', - 'version': 'version:1.1-alpha-2-cr0', + 'version': 'version:2@1.1-alpha-2.cr0', }, ], 'condition': 'checkout_android', @@ -1294,7 +533,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_animated_vector_drawable', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1305,7 +544,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_appcompat_v7', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1316,7 +555,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_asynclayoutinflater', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1327,7 +566,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_cardview_v7', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1338,7 +577,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_collections', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1349,7 +588,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_coordinatorlayout', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1360,7 +599,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_cursoradapter', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1371,7 +610,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_customview', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1382,7 +621,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_design', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1393,7 +632,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_documentfile', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1404,18 +643,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_drawerlayout', - 'version': 'version:28.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_gridlayout_v7': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_gridlayout_v7', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1426,18 +654,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_interpolator', - 'version': 'version:28.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_leanback_v17': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_leanback_v17', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1448,7 +665,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_loader', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1459,18 +676,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_localbroadcastmanager', - 'version': 'version:28.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_mediarouter_v7': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_mediarouter_v7', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1481,51 +687,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_multidex', - 'version': 'version:1.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_palette_v7': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_palette_v7', - 'version': 'version:28.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_preference_leanback_v17': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_preference_leanback_v17', - 'version': 'version:28.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_preference_v14': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_preference_v14', - 'version': 'version:28.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_preference_v7': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_preference_v7', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@1.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1536,7 +698,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_print', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1547,7 +709,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_recyclerview_v7', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1558,7 +720,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_slidingpanelayout', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1569,7 +731,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_annotations', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1580,7 +742,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_compat', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1591,7 +753,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_core_ui', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1602,7 +764,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_core_utils', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1613,7 +775,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_fragment', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1624,18 +786,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_media_compat', - 'version': 'version:28.0.0-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_support_v13': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_v13', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1646,7 +797,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_v4', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1657,7 +808,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_vector_drawable', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1668,7 +819,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_swiperefreshlayout', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1679,7 +830,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_transition', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1690,7 +841,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_versionedparcelable', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1701,29 +852,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_support_viewpager', - 'version': 'version:28.0.0-cr0', + 'version': 'version:2@28.0.0.cr0', }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_android_tools_build_jetifier_jetifier_core': { + 'src/third_party/android_deps/libs/com_android_tools_common': { 'packages': [ { - 'package': 'chromium/third_party/android_deps/libs/com_android_tools_build_jetifier_jetifier_core', - 'version': 'version:1.0.0-beta08-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_tools_build_jetifier_jetifier_processor': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_tools_build_jetifier_jetifier_processor', - 'version': 'version:1.0.0-beta08-cr0', + 'package': 'chromium/third_party/android_deps/libs/com_android_tools_common', + 'version': 'version:2@30.0.0-alpha10.cr0', }, ], 'condition': 'checkout_android', @@ -1734,7 +874,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs', - 'version': 'version:1.0.10-cr0', + 'version': 'version:2@1.1.1.cr0', }, ], 'condition': 'checkout_android', @@ -1745,7 +885,29 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_android_tools_desugar_jdk_libs_configuration', - 'version': 'version:1.0.10-cr0', + 'version': 'version:2@1.1.1.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_android_tools_layoutlib_layoutlib_api', + 'version': 'version:2@30.0.0-alpha10.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_android_tools_sdk_common': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_android_tools_sdk_common', + 'version': 'version:2@30.0.0-alpha10.cr0', }, ], 'condition': 'checkout_android', @@ -1756,7 +918,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_github_ben_manes_caffeine_caffeine', - 'version': 'version:2.8.0-cr0', + 'version': 'version:2@2.8.8.cr0', }, ], 'condition': 'checkout_android', @@ -1767,7 +929,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_github_kevinstern_software_and_algorithms', - 'version': 'version:1.0-cr0', + 'version': 'version:2@1.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_android_datatransport_transport_api': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_android_datatransport_transport_api', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -1778,7 +951,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1789,7 +962,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_api_phone', - 'version': 'version:17.1.0-cr0', + 'version': 'version:2@17.5.0.cr0', }, ], 'condition': 'checkout_android', @@ -1800,7 +973,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_auth_base', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1811,7 +984,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_base', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.5.0.cr0', }, ], 'condition': 'checkout_android', @@ -1822,7 +995,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_basement', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.5.0.cr0', }, ], 'condition': 'checkout_android', @@ -1833,7 +1006,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1844,7 +1017,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cast_framework', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1855,7 +1028,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_clearcut', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_cloud_messaging', + 'version': 'version:2@16.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1866,7 +1050,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_fido', - 'version': 'version:18.1.0-cr0', + 'version': 'version:2@19.0.0-beta.cr0', }, ], 'condition': 'checkout_android', @@ -1877,7 +1061,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_flags', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1888,7 +1072,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_gcm', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1899,7 +1083,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_iid', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1910,7 +1094,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_instantapps', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1921,7 +1105,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_location', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1932,7 +1116,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_phenotype', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1943,7 +1127,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_places_placereport', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1954,7 +1138,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_stats', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1965,7 +1149,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_tasks', - 'version': 'version:17.0.0-cr0', + 'version': 'version:2@17.2.0.cr0', }, ], 'condition': 'checkout_android', @@ -1976,7 +1160,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision', - 'version': 'version:18.0.0-cr0', + 'version': 'version:2@18.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1987,7 +1171,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_gms_play_services_vision_common', - 'version': 'version:18.0.0-cr0', + 'version': 'version:2@18.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -1998,7 +1182,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_android_material_material', - 'version': 'version:1.2.0-alpha06-cr0', + 'version': 'version:2@1.4.0-rc01.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_android_play_core': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_android_play_core', + 'version': 'version:2@1.10.0.cr0', }, ], 'condition': 'checkout_android', @@ -2009,7 +1204,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_auto_auto_common', - 'version': 'version:0.10-cr0', + 'version': 'version:2@0.10.cr0', }, ], 'condition': 'checkout_android', @@ -2020,7 +1215,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_auto_service_auto_service', - 'version': 'version:1.0-rc6-cr0', + 'version': 'version:2@1.0-rc6.cr0', }, ], 'condition': 'checkout_android', @@ -2031,7 +1226,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_auto_service_auto_service_annotations', - 'version': 'version:1.0-rc6-cr0', + 'version': 'version:2@1.0-rc6.cr0', }, ], 'condition': 'checkout_android', @@ -2042,18 +1237,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_auto_value_auto_value_annotations', - 'version': 'version:1.7-cr0', + 'version': 'version:2@1.7.cr0', }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_google_code_findbugs_jFormatString': { + 'src/third_party/android_deps/libs/com_google_code_findbugs_jformatstring': { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_code_findbugs_jformatstring', - 'version': 'version:3.0.0-cr0', + 'version': 'version:2@3.0.0.cr0', }, ], 'condition': 'checkout_android', @@ -2064,7 +1259,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_code_findbugs_jsr305', - 'version': 'version:3.0.2-cr0', + 'version': 'version:2@3.0.2.cr0', }, ], 'condition': 'checkout_android', @@ -2075,7 +1270,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_code_gson_gson', - 'version': 'version:2.8.0-cr0', + 'version': 'version:2@2.8.0.cr0', }, ], 'condition': 'checkout_android', @@ -2086,7 +1281,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_dagger_dagger', - 'version': 'version:2.26-cr0', + 'version': 'version:2@2.30.cr0', }, ], 'condition': 'checkout_android', @@ -2097,7 +1292,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_dagger_dagger_compiler', - 'version': 'version:2.26-cr0', + 'version': 'version:2@2.30.cr0', }, ], 'condition': 'checkout_android', @@ -2108,7 +1303,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_dagger_dagger_producers', - 'version': 'version:2.26-cr0', + 'version': 'version:2@2.30.cr0', }, ], 'condition': 'checkout_android', @@ -2119,7 +1314,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_dagger_dagger_spi', - 'version': 'version:2.26-cr0', + 'version': 'version:2@2.30.cr0', }, ], 'condition': 'checkout_android', @@ -2130,7 +1325,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotation', - 'version': 'version:2.4.0-cr0', + 'version': 'version:2@2.7.1.cr0', }, ], 'condition': 'checkout_android', @@ -2141,7 +1336,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_annotations', - 'version': 'version:2.4.0-cr0', + 'version': 'version:2@2.7.1.cr0', }, ], 'condition': 'checkout_android', @@ -2152,7 +1347,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_check_api', - 'version': 'version:2.4.0-cr0', + 'version': 'version:2@2.7.1.cr0', }, ], 'condition': 'checkout_android', @@ -2163,7 +1358,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_core', - 'version': 'version:2.4.0-cr0', + 'version': 'version:2@2.7.1.cr0', }, ], 'condition': 'checkout_android', @@ -2174,7 +1369,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_error_prone_type_annotations', - 'version': 'version:2.4.0-cr0', + 'version': 'version:2@2.7.1.cr0', }, ], 'condition': 'checkout_android', @@ -2185,7 +1380,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_javac', - 'version': 'version:9+181-r4173-1-cr0', + 'version': 'version:2@9+181-r4173-1.cr0', }, ], 'condition': 'checkout_android', @@ -2196,7 +1391,128 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_errorprone_javac_shaded', - 'version': 'version:9-dev-r4023-3-cr0', + 'version': 'version:2@9-dev-r4023-3.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_annotations': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_annotations', + 'version': 'version:2@16.0.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_common': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_common', + 'version': 'version:2@19.5.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_components': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_components', + 'version': 'version:2@16.1.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_encoders': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders', + 'version': 'version:2@16.1.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_encoders_json', + 'version': 'version:2@17.1.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_iid': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid', + 'version': 'version:2@21.0.1.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_iid_interop', + 'version': 'version:2@17.0.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_installations': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations', + 'version': 'version:2@16.3.5.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_installations_interop', + 'version': 'version:2@16.0.1.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_measurement_connector', + 'version': 'version:2@18.0.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_firebase_firebase_messaging': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_firebase_firebase_messaging', + 'version': 'version:2@21.0.1.cr0', }, ], 'condition': 'checkout_android', @@ -2207,7 +1523,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_googlejavaformat_google_java_format', - 'version': 'version:1.5-cr0', + 'version': 'version:2@1.5.cr0', }, ], 'condition': 'checkout_android', @@ -2218,7 +1534,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_guava_failureaccess', - 'version': 'version:1.0.1-cr0', + 'version': 'version:2@1.0.1.cr0', }, ], 'condition': 'checkout_android', @@ -2229,7 +1545,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_guava_guava', - 'version': 'version:27.1-jre-cr0', + 'version': 'version:2@30.1-jre.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/com_google_guava_guava_android': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/com_google_guava_guava_android', + 'version': 'version:2@30.1-android.cr0', }, ], 'condition': 'checkout_android', @@ -2240,7 +1567,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_guava_listenablefuture', - 'version': 'version:1.0-cr0', + 'version': 'version:2@1.0.cr0', }, ], 'condition': 'checkout_android', @@ -2251,7 +1578,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_j2objc_j2objc_annotations', - 'version': 'version:1.1-cr0', + 'version': 'version:2@1.3.cr0', }, ], 'condition': 'checkout_android', @@ -2262,7 +1589,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_java', - 'version': 'version:3.4.0-cr0', + 'version': 'version:2@3.4.0.cr0', }, ], 'condition': 'checkout_android', @@ -2273,7 +1600,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_google_protobuf_protobuf_javalite', - 'version': 'version:3.13.0-cr0', + 'version': 'version:2@3.13.0.cr0', }, ], 'condition': 'checkout_android', @@ -2284,7 +1611,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_googlecode_java_diff_utils_diffutils', - 'version': 'version:1.3.0-cr0', + 'version': 'version:2@1.3.0.cr0', }, ], 'condition': 'checkout_android', @@ -2295,7 +1622,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_squareup_javapoet', - 'version': 'version:1.11.1-cr0', + 'version': 'version:2@1.13.0.cr0', }, ], 'condition': 'checkout_android', @@ -2306,18 +1633,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/com_squareup_javawriter', - 'version': 'version:2.1.1-cr0', + 'version': 'version:2@2.1.1.cr0', }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/commons_cli_commons_cli': { + 'src/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils': { 'packages': [ { - 'package': 'chromium/third_party/android_deps/libs/commons_cli_commons_cli', - 'version': 'version:1.3.1-cr0', + 'package': 'chromium/third_party/android_deps/libs/io_github_java_diff_utils_java_diff_utils', + 'version': 'version:2@4.0.cr0', }, ], 'condition': 'checkout_android', @@ -2328,7 +1655,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/javax_annotation_javax_annotation_api', - 'version': 'version:1.3.2-cr0', + 'version': 'version:2@1.3.2.cr0', }, ], 'condition': 'checkout_android', @@ -2339,7 +1666,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/javax_annotation_jsr250_api', - 'version': 'version:1.0-cr0', + 'version': 'version:2@1.0.cr0', }, ], 'condition': 'checkout_android', @@ -2350,7 +1677,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/javax_inject_javax_inject', - 'version': 'version:1-cr0', + 'version': 'version:2@1.cr0', }, ], 'condition': 'checkout_android', @@ -2361,18 +1688,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/nekohtml_nekohtml', - 'version': 'version:1.9.6.2-cr0', + 'version': 'version:2@1.9.6.2.cr0', }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/nekohtml_xercesMinimal': { + 'src/third_party/android_deps/libs/nekohtml_xercesminimal': { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/nekohtml_xercesminimal', - 'version': 'version:1.9.6.2-cr0', + 'version': 'version:2@1.9.6.2.cr0', }, ], 'condition': 'checkout_android', @@ -2383,7 +1710,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/net_ltgt_gradle_incap_incap', - 'version': 'version:0.2-cr0', + 'version': 'version:2@0.2.cr0', }, ], 'condition': 'checkout_android', @@ -2394,7 +1721,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/net_sf_kxml_kxml2', - 'version': 'version:2.3.0-cr0', + 'version': 'version:2@2.3.0.cr0', }, ], 'condition': 'checkout_android', @@ -2405,7 +1732,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_ant_ant', - 'version': 'version:1.8.0-cr0', + 'version': 'version:2@1.8.0.cr0', }, ], 'condition': 'checkout_android', @@ -2416,7 +1743,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_ant_ant_launcher', - 'version': 'version:1.8.0-cr0', + 'version': 'version:2@1.8.0.cr0', }, ], 'condition': 'checkout_android', @@ -2427,7 +1754,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_ant_tasks', - 'version': 'version:2.1.3-cr0', + 'version': 'version:2@2.1.3.cr0', }, ], 'condition': 'checkout_android', @@ -2438,7 +1765,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2449,7 +1776,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_artifact_manager', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2460,7 +1787,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_error_diagnostics', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2471,7 +1798,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_model', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2482,7 +1809,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_plugin_registry', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2493,7 +1820,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_profile', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2504,7 +1831,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_project', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2515,7 +1842,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_repository_metadata', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2526,7 +1853,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_maven_settings', - 'version': 'version:2.2.1-cr0', + 'version': 'version:2@2.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2537,7 +1864,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_file', - 'version': 'version:1.0-beta-6-cr0', + 'version': 'version:2@1.0-beta-6.cr0', }, ], 'condition': 'checkout_android', @@ -2548,7 +1875,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_lightweight', - 'version': 'version:1.0-beta-6-cr0', + 'version': 'version:2@1.0-beta-6.cr0', }, ], 'condition': 'checkout_android', @@ -2559,7 +1886,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_http_shared', - 'version': 'version:1.0-beta-6-cr0', + 'version': 'version:2@1.0-beta-6.cr0', }, ], 'condition': 'checkout_android', @@ -2570,7 +1897,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_apache_maven_wagon_wagon_provider_api', - 'version': 'version:1.0-beta-6-cr0', + 'version': 'version:2@1.0-beta-6.cr0', }, ], 'condition': 'checkout_android', @@ -2581,7 +1908,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ccil_cowan_tagsoup_tagsoup', - 'version': 'version:1.2.1-cr0', + 'version': 'version:2@1.2.1.cr0', }, ], 'condition': 'checkout_android', @@ -2592,7 +1919,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_checkerframework_checker_compat_qual', - 'version': 'version:2.5.3-cr0', + 'version': 'version:2@2.5.5.cr0', }, ], 'condition': 'checkout_android', @@ -2603,7 +1930,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_checkerframework_checker_qual', - 'version': 'version:2.10.0-cr0', + 'version': 'version:2@3.8.0.cr0', }, ], 'condition': 'checkout_android', @@ -2614,7 +1941,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_checkerframework_dataflow_shaded', - 'version': 'version:3.1.2-cr0', + 'version': 'version:2@3.11.0.cr0', }, ], 'condition': 'checkout_android', @@ -2625,7 +1952,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_codehaus_mojo_animal_sniffer_annotations', - 'version': 'version:1.17-cr0', + 'version': 'version:2@1.17.cr0', }, ], 'condition': 'checkout_android', @@ -2636,7 +1963,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_container_default', - 'version': 'version:1.0-alpha-9-stable-1-cr0', + 'version': 'version:2@1.0-alpha-9-stable-1.cr0', }, ], 'condition': 'checkout_android', @@ -2647,7 +1974,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_interpolation', - 'version': 'version:1.11-cr0', + 'version': 'version:2@1.11.cr0', }, ], 'condition': 'checkout_android', @@ -2658,18 +1985,18 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_codehaus_plexus_plexus_utils', - 'version': 'version:1.5.15-cr0', + 'version': 'version:2@1.5.15.cr0', }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/org_jdom_jdom2': { + 'src/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit': { 'packages': [ { - 'package': 'chromium/third_party/android_deps/libs/org_jdom_jdom2', - 'version': 'version:2.0.6-cr0', + 'package': 'chromium/third_party/android_deps/libs/org_eclipse_jgit_org_eclipse_jgit', + 'version': 'version:2@4.4.1.201607150455-r.cr0', }, ], 'condition': 'checkout_android', @@ -2680,7 +2007,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_annotations', - 'version': 'version:13.0-cr0', + 'version': 'version:2@13.0.cr0', }, ], 'condition': 'checkout_android', @@ -2691,7 +2018,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib', - 'version': 'version:1.3.50-cr0', + 'version': 'version:2@1.5.10.cr0', }, ], 'condition': 'checkout_android', @@ -2702,7 +2029,51 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common', - 'version': 'version:1.3.50-cr0', + 'version': 'version:2@1.5.10.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk7', + 'version': 'version:2@1.5.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_jdk8', + 'version': 'version:2@1.5.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_android', + 'version': 'version:2@1.5.0.cr0', + }, + ], + 'condition': 'checkout_android', + 'dep_type': 'cipd', + }, + + 'src/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm': { + 'packages': [ + { + 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_coroutines_core_jvm', + 'version': 'version:2@1.5.0.cr0', }, ], 'condition': 'checkout_android', @@ -2713,7 +2084,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlinx_kotlinx_metadata_jvm', - 'version': 'version:0.1.0-cr0', + 'version': 'version:2@0.1.0.cr0', }, ], 'condition': 'checkout_android', @@ -2724,7 +2095,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm', - 'version': 'version:7.0-cr0', + 'version': 'version:2@7.0.cr0', }, ], 'condition': 'checkout_android', @@ -2735,7 +2106,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_analysis', - 'version': 'version:7.0-cr0', + 'version': 'version:2@7.0.cr0', }, ], 'condition': 'checkout_android', @@ -2746,7 +2117,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_commons', - 'version': 'version:7.0-cr0', + 'version': 'version:2@7.0.cr0', }, ], 'condition': 'checkout_android', @@ -2757,7 +2128,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_tree', - 'version': 'version:7.0-cr0', + 'version': 'version:2@7.0.cr0', }, ], 'condition': 'checkout_android', @@ -2768,7 +2139,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_ow2_asm_asm_util', - 'version': 'version:7.0-cr0', + 'version': 'version:2@7.0.cr0', }, ], 'condition': 'checkout_android', @@ -2779,7 +2150,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_pcollections_pcollections', - 'version': 'version:2.1.2-cr0', + 'version': 'version:2@2.1.2.cr0', }, ], 'condition': 'checkout_android', @@ -2790,7 +2161,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_annotations', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2801,7 +2172,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_junit', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2812,7 +2183,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_pluginapi', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2823,7 +2194,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_plugins_maven_dependency_resolver', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2834,7 +2205,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_resources', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2845,7 +2216,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_robolectric', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2856,7 +2227,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_sandbox', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2867,7 +2238,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadowapi', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2878,18 +2249,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadows_framework', - 'version': 'version:4.3.1-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/org_robolectric_shadows_multidex': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadows_multidex', - 'version': 'version:4.3.1-cr1', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2900,7 +2260,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_shadows_playservices', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2911,7 +2271,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_utils', - 'version': 'version:4.3.1-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2922,18 +2282,7 @@ deps = { 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_robolectric_utils_reflector', - 'version': 'version:4.3.1-cr0', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/org_threeten_threeten_extra': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/org_threeten_threeten_extra', - 'version': 'version:1.5.0-cr0', + 'version': 'version:2@4.3.1.cr0', }, ], 'condition': 'checkout_android', @@ -2943,9 +2292,6 @@ deps = { # === ANDROID_DEPS Generated Code End === } -# Define rules for which include paths are allowed in our source. -include_rules = [ '+gflags' ] - pre_deps_hooks = [ { # Remove any symlinks from before 177567c518b121731e507e9b9c4049c4dc96e4c8. @@ -3141,6 +2487,16 @@ hooks = [ '--root', 'src', ], }, + { + 'name': 'Generate component metadata for tests', + 'pattern': '.', + 'action': [ + 'vpython', + 'src/testing/generate_location_tags.py', + '--out', + 'src/testing/location_tags.json', + ], + }, ] recursedeps = [] diff --git a/third-party/libyuv/third_party/libyuv/DIR_METADATA b/third-party/libyuv/third_party/libyuv/DIR_METADATA new file mode 100644 index 0000000000..8bc04f159c --- /dev/null +++ b/third-party/libyuv/third_party/libyuv/DIR_METADATA @@ -0,0 +1,3 @@ +monorail { + component: "Internals>Images>Codecs" +} diff --git a/third-party/webrtc/dependencies/third_party/libyuv/LICENSE b/third-party/libyuv/third_party/libyuv/LICENSE similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/LICENSE rename to third-party/libyuv/third_party/libyuv/LICENSE diff --git a/third-party/webrtc/dependencies/third_party/libyuv/OWNERS b/third-party/libyuv/third_party/libyuv/OWNERS similarity index 85% rename from third-party/webrtc/dependencies/third_party/libyuv/OWNERS rename to third-party/libyuv/third_party/libyuv/OWNERS index 755c220be4..a96669f9ae 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/OWNERS +++ b/third-party/libyuv/third_party/libyuv/OWNERS @@ -8,5 +8,3 @@ per-file .gitignore=* per-file AUTHORS=* per-file DEPS=* per-file PRESUBMIT.py=mbonadei@chromium.org - -# COMPONENT: Internals>Images>Codecs diff --git a/third-party/webrtc/dependencies/third_party/libyuv/PATENTS b/third-party/libyuv/third_party/libyuv/PATENTS similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/PATENTS rename to third-party/libyuv/third_party/libyuv/PATENTS diff --git a/third-party/webrtc/dependencies/third_party/libyuv/PRESUBMIT.py b/third-party/libyuv/third_party/libyuv/PRESUBMIT.py similarity index 55% rename from third-party/webrtc/dependencies/third_party/libyuv/PRESUBMIT.py rename to third-party/libyuv/third_party/libyuv/PRESUBMIT.py index 2cf1542ff1..b867239a10 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/PRESUBMIT.py +++ b/third-party/libyuv/third_party/libyuv/PRESUBMIT.py @@ -6,50 +6,27 @@ # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. -import os - - -def _RunPythonTests(input_api, output_api): - def join(*args): - return input_api.os_path.join(input_api.PresubmitLocalPath(), *args) - - test_directories = [ - root for root, _, files in os.walk(join('tools_libyuv')) - if any(f.endswith('_test.py') for f in files) - ] - - tests = [] - for directory in test_directories: - tests.extend( - input_api.canned_checks.GetUnitTestsInDirectory( - input_api, - output_api, - directory, - whitelist=[r'.+_test\.py$'])) - return input_api.RunTests(tests, parallel=True) - def _CommonChecks(input_api, output_api): """Checks common to both upload and commit.""" results = [] results.extend(input_api.canned_checks.RunPylint(input_api, output_api, - black_list=(r'^base[\\\/].*\.py$', - r'^build[\\\/].*\.py$', - r'^buildtools[\\\/].*\.py$', - r'^ios[\\\/].*\.py$', - r'^out.*[\\\/].*\.py$', - r'^testing[\\\/].*\.py$', - r'^third_party[\\\/].*\.py$', - r'^tools[\\\/].*\.py$', - # TODO(kjellander): should arguably be checked. - r'^tools_libyuv[\\\/]valgrind[\\\/].*\.py$', - r'^xcodebuild.*[\\\/].*\.py$',), + files_to_skip=(r'^base[\\\/].*\.py$', + r'^build[\\\/].*\.py$', + r'^buildtools[\\\/].*\.py$', + r'^ios[\\\/].*\.py$', + r'^out.*[\\\/].*\.py$', + r'^testing[\\\/].*\.py$', + r'^third_party[\\\/].*\.py$', + r'^tools[\\\/].*\.py$', + # TODO(kjellander): should arguably be checked. + r'^tools_libyuv[\\\/]valgrind[\\\/].*\.py$', + r'^xcodebuild.*[\\\/].*\.py$',), disabled_warnings=['F0401', # Failed to import x 'E0611', # No package y in x 'W0232', # Class has no __init__ method ], pylintrc='pylintrc')) - results.extend(_RunPythonTests(input_api, output_api)) return results diff --git a/third-party/webrtc/dependencies/third_party/libyuv/README.chromium b/third-party/libyuv/third_party/libyuv/README.chromium similarity index 93% rename from third-party/webrtc/dependencies/third_party/libyuv/README.chromium rename to third-party/libyuv/third_party/libyuv/README.chromium index 4a7e30b087..b60adf7c75 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/README.chromium +++ b/third-party/libyuv/third_party/libyuv/README.chromium @@ -1,6 +1,6 @@ Name: libyuv URL: http://code.google.com/p/libyuv/ -Version: 1768 +Version: 1789 License: BSD License File: LICENSE diff --git a/third-party/webrtc/dependencies/third_party/libyuv/README.md b/third-party/libyuv/third_party/libyuv/README.md similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/README.md rename to third-party/libyuv/third_party/libyuv/README.md diff --git a/third-party/webrtc/dependencies/third_party/libyuv/build_overrides/build.gni b/third-party/libyuv/third_party/libyuv/build_overrides/build.gni similarity index 87% rename from third-party/webrtc/dependencies/third_party/libyuv/build_overrides/build.gni rename to third-party/libyuv/third_party/libyuv/build_overrides/build.gni index a83860a8eb..c849031338 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/build_overrides/build.gni +++ b/third-party/libyuv/third_party/libyuv/build_overrides/build.gni @@ -6,9 +6,6 @@ # in the file PATENTS. All contributing project authors may # be found in the AUTHORS file in the root of the source tree. -# Some non-Chromium builds don't use Chromium's third_party/binutils. -linux_use_bundled_binutils_override = true - # Variable that can be used to support multiple build scenarios, like having # Chromium specific targets in a client project's GN file etc. build_with_chromium = false @@ -50,6 +47,13 @@ declare_args() { enable_base_tracing = false use_perfetto_client_library = false + # Limits the defined //third_party/android_deps targets to only "buildCompile" + # and "buildCompileNoDeps" targets. This is useful for third-party + # repositories which do not use JUnit tests. For instance, + # limit_android_deps == true removes "gn gen" requirement for + # //third_party/robolectric . + limit_android_deps = false + # Allows googletest to pretty-print various absl types. # Defined here rather than in gtest.gni to match chromium. gtest_enable_absl_printers = true diff --git a/third-party/webrtc/dependencies/third_party/libyuv/build_overrides/gtest.gni b/third-party/libyuv/third_party/libyuv/build_overrides/gtest.gni similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/build_overrides/gtest.gni rename to third-party/libyuv/third_party/libyuv/build_overrides/gtest.gni diff --git a/third-party/webrtc/dependencies/third_party/libyuv/cleanup_links.py b/third-party/libyuv/third_party/libyuv/cleanup_links.py similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/cleanup_links.py rename to third-party/libyuv/third_party/libyuv/cleanup_links.py diff --git a/third-party/webrtc/dependencies/third_party/libyuv/codereview.settings b/third-party/libyuv/third_party/libyuv/codereview.settings similarity index 60% rename from third-party/webrtc/dependencies/third_party/libyuv/codereview.settings rename to third-party/libyuv/third_party/libyuv/codereview.settings index 00ba1d37d0..b226fae57a 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/codereview.settings +++ b/third-party/libyuv/third_party/libyuv/codereview.settings @@ -1,6 +1,5 @@ -# This file is used by git cl to get repository specific information. +# This file is used by `git cl` to get repository specific information. CODE_REVIEW_SERVER: codereview.chromium.org GERRIT_HOST: True PROJECT: libyuv -TRY_ON_UPLOAD: False VIEW_VC: https://chromium.googlesource.com/libyuv/libyuv/+/ diff --git a/third-party/webrtc/dependencies/third_party/libyuv/docs/deprecated_builds.md b/third-party/libyuv/third_party/libyuv/docs/deprecated_builds.md similarity index 99% rename from third-party/webrtc/dependencies/third_party/libyuv/docs/deprecated_builds.md rename to third-party/libyuv/third_party/libyuv/docs/deprecated_builds.md index 29e0bf9bc3..ba42966cc2 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/docs/deprecated_builds.md +++ b/third-party/libyuv/third_party/libyuv/docs/deprecated_builds.md @@ -239,6 +239,7 @@ If you get a compile error for atlthunk.lib on Windows, read http://www.chromium ninja -C out/Debug libyuv_unittest ninja -C out/Debug compare ninja -C out/Debug yuvconvert + ninja -C out/Debug yuvconstants ninja -C out/Debug psnr ninja -C out/Debug cpuid diff --git a/third-party/webrtc/dependencies/third_party/libyuv/docs/environment_variables.md b/third-party/libyuv/third_party/libyuv/docs/environment_variables.md similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/docs/environment_variables.md rename to third-party/libyuv/third_party/libyuv/docs/environment_variables.md diff --git a/third-party/webrtc/dependencies/third_party/libyuv/docs/filtering.md b/third-party/libyuv/third_party/libyuv/docs/filtering.md similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/docs/filtering.md rename to third-party/libyuv/third_party/libyuv/docs/filtering.md diff --git a/third-party/webrtc/dependencies/third_party/libyuv/docs/formats.md b/third-party/libyuv/third_party/libyuv/docs/formats.md similarity index 80% rename from third-party/webrtc/dependencies/third_party/libyuv/docs/formats.md rename to third-party/libyuv/third_party/libyuv/docs/formats.md index a29ed5c304..12ea9465e4 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/docs/formats.md +++ b/third-party/libyuv/third_party/libyuv/docs/formats.md @@ -4,7 +4,9 @@ Formats (FOURCC) supported by libyuv are detailed here. # Core Formats -There are 2 core formats supported by libyuv - I420 and ARGB. All YUV formats can be converted to/from I420. All RGB formats can be converted to/from ARGB. +There are 2 core formats supported by libyuv - I420 and ARGB. + All YUV formats can be converted to/from I420. + All RGB formats can be converted to/from ARGB. Filtering functions such as scaling and planar functions work on I420 and/or ARGB. @@ -52,12 +54,14 @@ The following is extracted from video_common.h as a complete list of formats sup // 1 Secondary YUV format: row biplanar. FOURCC_M420 = FOURCC('M', '4', '2', '0'), // deprecated. - // 11 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp, 1 10 bpc + // 13 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp, 1 10 bpc, 2 64 bpp FOURCC_ARGB = FOURCC('A', 'R', 'G', 'B'), FOURCC_BGRA = FOURCC('B', 'G', 'R', 'A'), FOURCC_ABGR = FOURCC('A', 'B', 'G', 'R'), FOURCC_AR30 = FOURCC('A', 'R', '3', '0'), // 10 bit per channel. 2101010. FOURCC_AB30 = FOURCC('A', 'B', '3', '0'), // ABGR version of 10 bit + FOURCC_AR64 = FOURCC('A', 'R', '6', '4'), // 16 bit per channel. + FOURCC_AB64 = FOURCC('A', 'B', '6', '4'), // ABGR version of 16 bit FOURCC_24BG = FOURCC('2', '4', 'B', 'G'), FOURCC_RAW = FOURCC('r', 'a', 'w', ' '), FOURCC_RGBA = FOURCC('R', 'G', 'B', 'A'), @@ -109,6 +113,27 @@ The following is extracted from video_common.h as a complete list of formats sup I444, NV24 and NV42 are full width, full height I400 and J400 have no chroma channel. +# Color space + The YUV formats start with a letter to specify the color space. e.g. I420 + I = BT.601 limited range + J = BT.601 full range (J = JPEG that uses this) + H = BT.709 limited range (H for HD) + F = BT.709 full range (F for Full range) + U = BT.2020 limited range (U for UHD) + V = BT.2020 full range + For YUV to RGB conversions, a matrix can be passed. See also convert_argh.h + +# HDR formats + Planar formats with 10 or 12 bits use the following fourcc: + I010, I012, P010, P012 are half width, half height + I210, I212, P210, P212 are half width, full height + I410, I412, P410, P412 are full width, full height + where + I is the color space (see above) and 3 planes: Y, U and V. + P is a biplanar format, similar to NV12 but 16 bits, with the valid bits in the high bits. There is a Y plane and a UV plane. + 0, 2 or 4 is the last digit of subsampling: 4:2:0, 4:2:2, or 4:4:4 + 10 or 12 is the bits per channel. The bits are in the low bits of a 16 bit channel. + # The ARGB FOURCC There are 4 ARGB layouts - ARGB, BGRA, ABGR and RGBA. ARGB is most common by far, used for screen formats, and windows webcam drivers. @@ -157,6 +182,13 @@ The 2 bit alpha has 4 values. Here are the comparable 8 bit alpha values. The 10 bit RGB values range from 0 to 1023. XR30 is the same as AR30 but with no alpha channel. +# AB64 and AR64 + +AB64 is similar to ABGR, with 16 bit (2 bytes) per channel. Each channel stores an unsigned short. +In memory R is the lowest and A is the highest. +Each channel has value ranges from 0 to 65535. +AR64 is similar to ARGB. + # NV12 and NV21 NV12 is a biplanar format with a full sized Y plane followed by a single @@ -167,3 +199,10 @@ height chroma channel, and therefore is a 420 subsampling. NV16 is 16 bits per pixel, with half width and full height. aka 422. NV24 is 24 bits per pixel with full sized chroma channel. aka 444. Most NV12 functions allow the destination Y pointer to be NULL. + +# YUY2 and UYVY + +YUY2 is a packed YUV format with half width, full height. + +YUY2 is YUYV in memory +UYVY is UYVY in memory diff --git a/third-party/webrtc/dependencies/third_party/libyuv/docs/getting_started.md b/third-party/libyuv/third_party/libyuv/docs/getting_started.md similarity index 99% rename from third-party/webrtc/dependencies/third_party/libyuv/docs/getting_started.md rename to third-party/libyuv/third_party/libyuv/docs/getting_started.md index 3e339712e1..e363c4ef09 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/docs/getting_started.md +++ b/third-party/libyuv/third_party/libyuv/docs/getting_started.md @@ -165,6 +165,7 @@ Running test with C code: ninja -C out/Debug libyuv_unittest ninja -C out/Debug compare ninja -C out/Debug yuvconvert + ninja -C out/Debug yuvconstants ninja -C out/Debug psnr ninja -C out/Debug cpuid diff --git a/third-party/webrtc/dependencies/third_party/libyuv/docs/rotation.md b/third-party/libyuv/third_party/libyuv/docs/rotation.md similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/docs/rotation.md rename to third-party/libyuv/third_party/libyuv/docs/rotation.md diff --git a/third-party/webrtc/dependencies/third_party/libyuv/download_vs_toolchain.py b/third-party/libyuv/third_party/libyuv/download_vs_toolchain.py similarity index 94% rename from third-party/webrtc/dependencies/third_party/libyuv/download_vs_toolchain.py rename to third-party/libyuv/third_party/libyuv/download_vs_toolchain.py index 4b3457899f..49d069305d 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/download_vs_toolchain.py +++ b/third-party/libyuv/third_party/libyuv/download_vs_toolchain.py @@ -22,7 +22,7 @@ sys.path.insert(0, os.path.join(checkout_root, 'build')) sys.path.insert(0, os.path.join(checkout_root, 'tools', 'find_depot_tools')) -import vs_toolchain +import vs_toolchain # pylint: disable=wrong-import-position if __name__ == '__main__': diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv.h b/third-party/libyuv/third_party/libyuv/include/libyuv.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv.h rename to third-party/libyuv/third_party/libyuv/include/libyuv.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/basic_types.h b/third-party/libyuv/third_party/libyuv/include/libyuv/basic_types.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/basic_types.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/basic_types.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/compare.h b/third-party/libyuv/third_party/libyuv/include/libyuv/compare.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/compare.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/compare.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/compare_row.h b/third-party/libyuv/third_party/libyuv/include/libyuv/compare_row.h similarity index 93% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/compare_row.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/compare_row.h index e95b9d93eb..64115b3a3f 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/compare_row.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/compare_row.h @@ -55,20 +55,20 @@ extern "C" { // The following are available for Visual C and clangcl 32 bit: #if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) && \ + !defined(__clang__) && \ (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2)) #define HAS_HASHDJB2_AVX2 #define HAS_SUMSQUAREERROR_AVX2 #endif -// The following are available for GCC and clangcl 64 bit: -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +// The following are available for GCC and clangcl: +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) #define HAS_HAMMINGDISTANCE_SSSE3 #endif -// The following are available for GCC and clangcl 64 bit: +// The following are available for GCC and clangcl: #if !defined(LIBYUV_DISABLE_X86) && defined(CLANG_HAS_AVX2) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) + (defined(__x86_64__) || defined(__i386__)) #define HAS_HAMMINGDISTANCE_AVX2 #endif diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert.h b/third-party/libyuv/third_party/libyuv/include/libyuv/convert.h similarity index 62% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/convert.h index 026b153cef..93e7550be8 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/convert.h @@ -89,6 +89,23 @@ int I422ToI420(const uint8_t* src_y, int width, int height); +// Convert I422 to I444. +LIBYUV_API +int I422ToI444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + // Convert I422 to NV21. LIBYUV_API int I422ToNV21(const uint8_t* src_y, @@ -122,6 +139,23 @@ int I420Copy(const uint8_t* src_y, int width, int height); +// Convert I420 to I444. +LIBYUV_API +int I420ToI444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + // Copy I010 to I010 #define I010ToI010 I010Copy #define H010ToH010 I010Copy @@ -159,6 +193,229 @@ int I010ToI420(const uint16_t* src_y, int width, int height); +#define H210ToH422 I210ToI422 +LIBYUV_API +int I210ToI422(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H410ToH444 I410ToI444 +LIBYUV_API +int I410ToI444(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H012ToH420 I012ToI420 +LIBYUV_API +int I012ToI420(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H212ToH422 I212ToI422 +LIBYUV_API +int I212ToI422(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define H412ToH444 I412ToI444 +LIBYUV_API +int I412ToI444(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define I412ToI012 I410ToI010 +#define H410ToH010 I410ToI010 +#define H412ToH012 I410ToI010 +LIBYUV_API +int I410ToI010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +#define I212ToI012 I210ToI010 +#define H210ToH010 I210ToI010 +#define H212ToH012 I210ToI010 +LIBYUV_API +int I210ToI010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I010 to I410 +LIBYUV_API +int I010ToI410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I012 to I412 +#define I012ToI412 I010ToI410 + +// Convert I210 to I410 +LIBYUV_API +int I210ToI410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + +// Convert I212 to I412 +#define I212ToI412 I210ToI410 + +// Convert I010 to P010 +LIBYUV_API +int I010ToP010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert I210 to P210 +LIBYUV_API +int I210ToP210(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert I012 to P012 +LIBYUV_API +int I012ToP012(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert I212 to P212 +LIBYUV_API +int I212ToP212(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + // Convert I400 (grey) to I420. LIBYUV_API int I400ToI420(const uint8_t* src_y, @@ -215,6 +472,70 @@ int NV21ToI420(const uint8_t* src_y, int width, int height); +// Convert NV12 to NV24. +LIBYUV_API +int NV12ToNV24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert NV16 to NV24. +LIBYUV_API +int NV16ToNV24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert P010 to P410. +LIBYUV_API +int P010ToP410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert P012 to P412. +#define P012ToP412 P010ToP410 + +// Convert P016 to P416. +#define P016ToP416 P010ToP410 + +// Convert P210 to P410. +LIBYUV_API +int P210ToP410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height); + +// Convert P212 to P412. +#define P212ToP412 P210ToP410 + +// Convert P216 to P416. +#define P216ToP416 P210ToP410 + // Convert YUY2 to I420. LIBYUV_API int YUY2ToI420(const uint8_t* src_yuy2, @@ -372,6 +693,19 @@ int RAWToI420(const uint8_t* src_raw, int width, int height); +// RGB big endian (rgb in memory) to J420. +LIBYUV_API +int RAWToJ420(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height); + // RGB16 (RGBP fourcc) little endian to I420. LIBYUV_API int RGB565ToI420(const uint8_t* src_rgb565, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_argb.h b/third-party/libyuv/third_party/libyuv/include/libyuv/convert_argb.h similarity index 78% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_argb.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/convert_argb.h index 715a3dad97..eb4ebd54a8 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_argb.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/convert_argb.h @@ -21,16 +21,20 @@ extern "C" { #endif // Conversion matrix for YUV to RGB -LIBYUV_API extern const struct YuvConstants kYuvI601Constants; // BT.601 -LIBYUV_API extern const struct YuvConstants kYuvJPEGConstants; // JPeg -LIBYUV_API extern const struct YuvConstants kYuvH709Constants; // BT.709 -LIBYUV_API extern const struct YuvConstants kYuv2020Constants; // BT.2020 +LIBYUV_API extern const struct YuvConstants kYuvI601Constants; // BT.601 +LIBYUV_API extern const struct YuvConstants kYuvJPEGConstants; // BT.601 full +LIBYUV_API extern const struct YuvConstants kYuvH709Constants; // BT.709 +LIBYUV_API extern const struct YuvConstants kYuvF709Constants; // BT.709 full +LIBYUV_API extern const struct YuvConstants kYuv2020Constants; // BT.2020 +LIBYUV_API extern const struct YuvConstants kYuvV2020Constants; // BT.2020 full // Conversion matrix for YVU to BGR -LIBYUV_API extern const struct YuvConstants kYvuI601Constants; // BT.601 -LIBYUV_API extern const struct YuvConstants kYvuJPEGConstants; // JPeg -LIBYUV_API extern const struct YuvConstants kYvuH709Constants; // BT.709 -LIBYUV_API extern const struct YuvConstants kYvu2020Constants; // BT.2020 +LIBYUV_API extern const struct YuvConstants kYvuI601Constants; // BT.601 +LIBYUV_API extern const struct YuvConstants kYvuJPEGConstants; // BT.601 full +LIBYUV_API extern const struct YuvConstants kYvuH709Constants; // BT.709 +LIBYUV_API extern const struct YuvConstants kYvuF709Constants; // BT.709 full +LIBYUV_API extern const struct YuvConstants kYvu2020Constants; // BT.2020 +LIBYUV_API extern const struct YuvConstants kYvuV2020Constants; // BT.2020 full // Macros for end swapped destination Matrix conversions. // Swap UV and pass mirrored kYvuJPEGConstants matrix. @@ -38,7 +42,10 @@ LIBYUV_API extern const struct YuvConstants kYvu2020Constants; // BT.2020 #define kYuvI601ConstantsVU kYvuI601Constants #define kYuvJPEGConstantsVU kYvuJPEGConstants #define kYuvH709ConstantsVU kYvuH709Constants +#define kYuvF709ConstantsVU kYvuF709Constants #define kYuv2020ConstantsVU kYvu2020Constants +#define kYuvV2020ConstantsVU kYvuV2020Constants + #define NV12ToABGRMatrix(a, b, c, d, e, f, g, h, i) \ NV21ToARGBMatrix(a, b, c, d, e, f, g##VU, h, i) #define NV21ToABGRMatrix(a, b, c, d, e, f, g, h, i) \ @@ -47,8 +54,30 @@ LIBYUV_API extern const struct YuvConstants kYvu2020Constants; // BT.2020 NV21ToRGB24Matrix(a, b, c, d, e, f, g##VU, h, i) #define NV21ToRAWMatrix(a, b, c, d, e, f, g, h, i) \ NV12ToRGB24Matrix(a, b, c, d, e, f, g##VU, h, i) +#define I010ToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k) \ + I010ToARGBMatrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I210ToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k) \ + I210ToARGBMatrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I410ToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k) \ + I410ToARGBMatrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I010ToAB30Matrix(a, b, c, d, e, f, g, h, i, j, k) \ + I010ToAR30Matrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I210ToAB30Matrix(a, b, c, d, e, f, g, h, i, j, k) \ + I210ToAR30Matrix(a, b, e, f, c, d, g, h, i##VU, j, k) +#define I410ToAB30Matrix(a, b, c, d, e, f, g, h, i, j, k) \ + I410ToAR30Matrix(a, b, e, f, c, d, g, h, i##VU, j, k) #define I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ I420AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I422AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I444AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I010AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I210AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) +#define I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, k, l, m, n) \ + I410AlphaToARGBMatrix(a, b, e, f, c, d, g, h, i, j, k##VU, l, m, n) // Alias. #define ARGBToARGB ARGBCopy @@ -562,6 +591,70 @@ int I420AlphaToABGR(const uint8_t* src_y, int height, int attenuate); +// Convert I422 with Alpha to preattenuated ARGB. +LIBYUV_API +int I422AlphaToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int attenuate); + +// Convert I422 with Alpha to preattenuated ABGR. +LIBYUV_API +int I422AlphaToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height, + int attenuate); + +// Convert I444 with Alpha to preattenuated ARGB. +LIBYUV_API +int I444AlphaToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int attenuate); + +// Convert I444 with Alpha to preattenuated ABGR. +LIBYUV_API +int I444AlphaToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height, + int attenuate); + // Convert I400 (grey) to ARGB. Reverse of ARGBToI400. LIBYUV_API int I400ToARGB(const uint8_t* src_y, @@ -713,19 +806,6 @@ int I010ToAR30(const uint16_t* src_y, int width, int height); -// Convert I010 to AB30. -LIBYUV_API -int I010ToAB30(const uint16_t* src_y, - int src_stride_y, - const uint16_t* src_u, - int src_stride_u, - const uint16_t* src_v, - int src_stride_v, - uint8_t* dst_ab30, - int dst_stride_ab30, - int width, - int height); - // Convert H010 to AR30. LIBYUV_API int H010ToAR30(const uint16_t* src_y, @@ -739,6 +819,19 @@ int H010ToAR30(const uint16_t* src_y, int width, int height); +// Convert I010 to AB30. +LIBYUV_API +int I010ToAB30(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + // Convert H010 to AB30. LIBYUV_API int H010ToAB30(const uint16_t* src_y, @@ -972,6 +1065,42 @@ int AR30ToAB30(const uint8_t* src_ar30, int width, int height); +// Convert AR64 to ARGB. +LIBYUV_API +int AR64ToARGB(const uint16_t* src_ar64, + int src_stride_ar64, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert AB64 to ABGR. +#define AB64ToABGR AR64ToARGB + +// Convert AB64 to ARGB. +LIBYUV_API +int AB64ToARGB(const uint16_t* src_ab64, + int src_stride_ab64, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Convert AR64 to ABGR. +#define AR64ToABGR AB64ToARGB + +// Convert AR64 To AB64. +LIBYUV_API +int AR64ToAB64(const uint16_t* src_ar64, + int src_stride_ar64, + uint16_t* dst_ab64, + int dst_stride_ab64, + int width, + int height); + +// Convert AB64 To AR64. +#define AB64ToAR64 AR64ToAB64 + // src_width/height provided by capture // dst_width/height for clipping determine final size. LIBYUV_API @@ -1284,6 +1413,19 @@ int I420ToAR30(const uint8_t* src_y, int width, int height); +// Convert I420 to AB30. +LIBYUV_API +int I420ToAB30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + // Convert H420 to AR30. LIBYUV_API int H420ToAR30(const uint8_t* src_y, @@ -1297,6 +1439,19 @@ int H420ToAR30(const uint8_t* src_y, int width, int height); +// Convert H420 to AB30. +LIBYUV_API +int H420ToAB30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height); + // Convert I420 to ARGB with matrix. LIBYUV_API int I420ToARGBMatrix(const uint8_t* src_y, @@ -1339,7 +1494,7 @@ int I444ToARGBMatrix(const uint8_t* src_y, int width, int height); -// multiply 10 bit yuv into high bits to allow any number of bits. +// Convert 10 bit 420 YUV to ARGB with matrix. LIBYUV_API int I010ToAR30Matrix(const uint16_t* src_y, int src_stride_y, @@ -1353,7 +1508,7 @@ int I010ToAR30Matrix(const uint16_t* src_y, int width, int height); -// multiply 10 bit yuv into high bits to allow any number of bits. +// Convert 10 bit 420 YUV to ARGB with matrix. LIBYUV_API int I210ToAR30Matrix(const uint16_t* src_y, int src_stride_y, @@ -1367,6 +1522,20 @@ int I210ToAR30Matrix(const uint16_t* src_y, int width, int height); +// Convert 10 bit 444 YUV to ARGB with matrix. +LIBYUV_API +int I410ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + // Convert 10 bit YUV to ARGB with matrix. LIBYUV_API int I010ToARGBMatrix(const uint16_t* src_y, @@ -1381,6 +1550,34 @@ int I010ToARGBMatrix(const uint16_t* src_y, int width, int height); +// multiply 12 bit yuv into high bits to allow any number of bits. +LIBYUV_API +int I012ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert 12 bit YUV to ARGB with matrix. +LIBYUV_API +int I012ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + // Convert 10 bit 422 YUV to ARGB with matrix. LIBYUV_API int I210ToARGBMatrix(const uint16_t* src_y, @@ -1395,6 +1592,87 @@ int I210ToARGBMatrix(const uint16_t* src_y, int width, int height); +// Convert 10 bit 444 YUV to ARGB with matrix. +LIBYUV_API +int I410ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert P010 to ARGB with matrix. +LIBYUV_API +int P010ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert P210 to ARGB with matrix. +LIBYUV_API +int P210ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert P010 to AR30 with matrix. +LIBYUV_API +int P010ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// Convert P210 to AR30 with matrix. +LIBYUV_API +int P210ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height); + +// P012 and P010 use most significant bits so the conversion is the same. +// Convert P012 to ARGB with matrix. +#define P012ToARGBMatrix P010ToARGBMatrix +// Convert P012 to AR30 with matrix. +#define P012ToAR30Matrix P010ToAR30Matrix +// Convert P212 to ARGB with matrix. +#define P212ToARGBMatrix P210ToARGBMatrix +// Convert P212 to AR30 with matrix. +#define P212ToAR30Matrix P210ToAR30Matrix + +// Convert P016 to ARGB with matrix. +#define P016ToARGBMatrix P010ToARGBMatrix +// Convert P016 to AR30 with matrix. +#define P016ToAR30Matrix P010ToAR30Matrix +// Convert P216 to ARGB with matrix. +#define P216ToARGBMatrix P210ToARGBMatrix +// Convert P216 to AR30 with matrix. +#define P216ToAR30Matrix P210ToAR30Matrix + // Convert I420 with Alpha to preattenuated ARGB with matrix. LIBYUV_API int I420AlphaToARGBMatrix(const uint8_t* src_y, @@ -1412,6 +1690,91 @@ int I420AlphaToARGBMatrix(const uint8_t* src_y, int height, int attenuate); +// Convert I422 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I422AlphaToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I444 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I444AlphaToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I010 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I010AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I210 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I210AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + +// Convert I410 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I410AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate); + // Convert NV12 to ARGB with matrix. LIBYUV_API int NV12ToARGBMatrix(const uint8_t* src_y, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_from.h b/third-party/libyuv/third_party/libyuv/include/libyuv/convert_from.h similarity index 91% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_from.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/convert_from.h index 5140ed4f3e..32f42a6330 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_from.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/convert_from.h @@ -39,6 +39,24 @@ int I420ToI010(const uint8_t* src_y, int width, int height); +// Convert 8 bit YUV to 12 bit. +#define H420ToH012 I420ToI012 +LIBYUV_API +int I420ToI012(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height); + LIBYUV_API int I420ToI422(const uint8_t* src_y, int src_stride_y, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_from_argb.h b/third-party/libyuv/third_party/libyuv/include/libyuv/convert_from_argb.h similarity index 93% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_from_argb.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/convert_from_argb.h index d992363ceb..bf48786041 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/convert_from_argb.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/convert_from_argb.h @@ -153,6 +153,30 @@ int ARGBToI444(const uint8_t* src_argb, int width, int height); +// Convert ARGB to AR64. +LIBYUV_API +int ARGBToAR64(const uint8_t* src_argb, + int src_stride_argb, + uint16_t* dst_ar64, + int dst_stride_ar64, + int width, + int height); + +// Convert ABGR to AB64. +#define ABGRToAB64 ARGBToAR64 + +// Convert ARGB to AB64. +LIBYUV_API +int ARGBToAB64(const uint8_t* src_argb, + int src_stride_argb, + uint16_t* dst_ab64, + int dst_stride_ab64, + int width, + int height); + +// Convert ABGR to AR64. +#define ABGRToAR64 ARGBToAB64 + // Convert ARGB To I422. LIBYUV_API int ARGBToI422(const uint8_t* src_argb, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/cpu_id.h b/third-party/libyuv/third_party/libyuv/include/libyuv/cpu_id.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/cpu_id.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/cpu_id.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/macros_msa.h b/third-party/libyuv/third_party/libyuv/include/libyuv/macros_msa.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/macros_msa.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/macros_msa.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/mjpeg_decoder.h b/third-party/libyuv/third_party/libyuv/include/libyuv/mjpeg_decoder.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/mjpeg_decoder.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/mjpeg_decoder.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/planar_functions.h b/third-party/libyuv/third_party/libyuv/include/libyuv/planar_functions.h similarity index 83% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/planar_functions.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/planar_functions.h index 8d868b9542..def773cb44 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/planar_functions.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/planar_functions.h @@ -105,6 +105,50 @@ void MergeUVPlane(const uint8_t* src_u, int width, int height); +// Split interleaved msb UV plane into separate lsb U and V planes. +LIBYUV_API +void SplitUVPlane_16(const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height, + int depth); + +// Merge separate lsb U and V planes into one interleaved msb UV plane. +LIBYUV_API +void MergeUVPlane_16(const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height, + int depth); + +// Convert lsb plane to msb plane +LIBYUV_API +void ConvertToMSBPlane_16(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int width, + int height, + int depth); + +// Convert msb plane to lsb plane +LIBYUV_API +void ConvertToLSBPlane_16(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int width, + int height, + int depth); + // Scale U and V to half width and height and merge into interleaved UV plane. // width and height are source size, allowing odd sizes. // Use for converting I444 or I422 to NV12. @@ -153,6 +197,92 @@ void MergeRGBPlane(const uint8_t* src_r, int width, int height); +// Split interleaved ARGB plane into separate R, G, B and A planes. +// dst_a can be NULL to discard alpha plane. +LIBYUV_API +void SplitARGBPlane(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_r, + int dst_stride_r, + uint8_t* dst_g, + int dst_stride_g, + uint8_t* dst_b, + int dst_stride_b, + uint8_t* dst_a, + int dst_stride_a, + int width, + int height); + +// Merge separate R, G, B and A planes into one interleaved ARGB plane. +// src_a can be NULL to fill opaque value to alpha. +LIBYUV_API +void MergeARGBPlane(const uint8_t* src_r, + int src_stride_r, + const uint8_t* src_g, + int src_stride_g, + const uint8_t* src_b, + int src_stride_b, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height); + +// Merge separate 'depth' bit R, G and B planes stored in lsb +// into one interleaved XR30 plane. +// depth should in range [10, 16] +LIBYUV_API +void MergeXR30Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height, + int depth); + +// Merge separate 'depth' bit R, G, B and A planes stored in lsb +// into one interleaved AR64 plane. +// src_a can be NULL to fill opaque value to alpha. +// depth should in range [1, 16] +LIBYUV_API +void MergeAR64Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + const uint16_t* src_a, + int src_stride_a, + uint16_t* dst_ar64, + int dst_stride_ar64, + int width, + int height, + int depth); + +// Merge separate 'depth' bit R, G, B and A planes stored in lsb +// into one interleaved ARGB plane. +// src_a can be NULL to fill opaque value to alpha. +// depth should in range [8, 16] +LIBYUV_API +void MergeARGB16To8Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int depth); + // Copy I400. Supports inverting. LIBYUV_API int I400ToI400(const uint8_t* src_y, @@ -201,14 +331,28 @@ int I444Copy(const uint8_t* src_y, int height); // Copy NV12. Supports inverting. -int NV12Copy(const uint8_t* src_y, int src_stride_y, const uint8_t* src_uv, - int src_stride_uv, uint8_t* dst_y, int dst_stride_y, - uint8_t* dst_uv, int dst_stride_uv, int width, int height); +int NV12Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height); // Copy NV21. Supports inverting. -int NV21Copy(const uint8_t* src_y, int src_stride_y, const uint8_t* src_vu, - int src_stride_vu, uint8_t* dst_y, int dst_stride_y, - uint8_t* dst_vu, int dst_stride_vu, int width, int height); +int NV21Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height); // Convert YUY2 to I422. LIBYUV_API @@ -855,7 +999,7 @@ void ARGBAffineRow_SSE2(const uint8_t* src_argb, int width); // Shuffle ARGB channel order. e.g. BGRA to ARGB. -// shuffler is 16 bytes and must be aligned. +// shuffler is 16 bytes. LIBYUV_API int ARGBShuffle(const uint8_t* src_bgra, int src_stride_bgra, @@ -865,6 +1009,17 @@ int ARGBShuffle(const uint8_t* src_bgra, int width, int height); +// Shuffle AR64 channel order. e.g. AR64 to AB64. +// shuffler is 16 bytes. +LIBYUV_API +int AR64Shuffle(const uint16_t* src_ar64, + int src_stride_ar64, + uint16_t* dst_ar64, + int dst_stride_ar64, + const uint8_t* shuffler, + int width, + int height); + // Sobel ARGB effect with planar output. LIBYUV_API int ARGBSobelToPlane(const uint8_t* src_argb, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/rotate.h b/third-party/libyuv/third_party/libyuv/include/libyuv/rotate.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/rotate.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/rotate.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/rotate_argb.h b/third-party/libyuv/third_party/libyuv/include/libyuv/rotate_argb.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/rotate_argb.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/rotate_argb.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/rotate_row.h b/third-party/libyuv/third_party/libyuv/include/libyuv/rotate_row.h similarity index 98% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/rotate_row.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/rotate_row.h index 022293eef2..f4c701fb4f 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/rotate_row.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/rotate_row.h @@ -32,8 +32,9 @@ extern "C" { #define LIBYUV_DISABLE_X86 #endif #endif -// The following are available for Visual C and clangcl 32 bit: -#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) +// The following are available for Visual C 32 bit: +#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) && \ + !defined(__clang__) #define HAS_TRANSPOSEWX8_SSSE3 #define HAS_TRANSPOSEUVWX8_SSE2 #endif diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/row.h b/third-party/libyuv/third_party/libyuv/include/libyuv/row.h similarity index 79% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/row.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/row.h index a27788c1f6..1444a04786 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/row.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/row.h @@ -176,6 +176,7 @@ extern "C" { // TODO(fbarchard): fix build error on android_full_debug=1 // https://code.google.com/p/libyuv/issues/detail?id=517 #define HAS_I422ALPHATOARGBROW_SSSE3 +#define HAS_I444ALPHATOARGBROW_SSSE3 #endif #endif @@ -240,13 +241,14 @@ extern "C" { // TODO(fbarchard): fix build error on android_full_debug=1 // https://code.google.com/p/libyuv/issues/detail?id=517 #define HAS_I422ALPHATOARGBROW_AVX2 +#define HAS_I444ALPHATOARGBROW_AVX2 #endif #endif -// The following are available for AVX2 Visual C and clangcl 32 bit: +// The following are available for AVX2 Visual C 32 bit: // TODO(fbarchard): Port to gcc. #if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) && \ - (defined(VISUALC_HAS_AVX2) || defined(CLANG_HAS_AVX2)) + !defined(__clang__) && defined(VISUALC_HAS_AVX2) #define HAS_ARGB1555TOARGBROW_AVX2 #define HAS_ARGB4444TOARGBROW_AVX2 #define HAS_ARGBTOARGB1555ROW_AVX2 @@ -259,37 +261,62 @@ extern "C" { // The following are also available on x64 Visual C. #if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && defined(_M_X64) && \ (!defined(__clang__) || defined(__SSSE3__)) +#define HAS_I444ALPHATOARGBROW_SSSE3 +#define HAS_I444TOARGBROW_SSSE3 #define HAS_I422ALPHATOARGBROW_SSSE3 #define HAS_I422TOARGBROW_SSSE3 #endif // The following are available for gcc/clang x86 platforms: // TODO(fbarchard): Port to Visual C -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) #define HAS_ABGRTOAR30ROW_SSSE3 #define HAS_ARGBTOAR30ROW_SSSE3 +#define HAS_ARGBTOAR64ROW_SSSE3 +#define HAS_ARGBTOAB64ROW_SSSE3 +#define HAS_AR64TOARGBROW_SSSE3 +#define HAS_AB64TOARGBROW_SSSE3 #define HAS_CONVERT16TO8ROW_SSSE3 #define HAS_CONVERT8TO16ROW_SSE2 #define HAS_HALFMERGEUVROW_SSSE3 #define HAS_I210TOAR30ROW_SSSE3 #define HAS_I210TOARGBROW_SSSE3 +#define HAS_I212TOAR30ROW_SSSE3 +#define HAS_I212TOARGBROW_SSSE3 #define HAS_I400TOARGBROW_SSE2 #define HAS_I422TOAR30ROW_SSSE3 +#define HAS_I410TOAR30ROW_SSSE3 +#define HAS_I410TOARGBROW_SSSE3 +#define HAS_MERGEARGBROW_SSE2 +#define HAS_MERGEXRGBROW_SSE2 #define HAS_MERGERGBROW_SSSE3 -#define HAS_MIRRORUVROW_AVX2 #define HAS_MIRRORUVROW_SSSE3 +#define HAS_P210TOAR30ROW_SSSE3 +#define HAS_P210TOARGBROW_SSSE3 +#define HAS_P410TOAR30ROW_SSSE3 +#define HAS_P410TOARGBROW_SSSE3 #define HAS_RAWTORGBAROW_SSSE3 #define HAS_RGB24MIRRORROW_SSSE3 #define HAS_RGBATOYJROW_SSSE3 +#define HAS_SPLITARGBROW_SSE2 +#define HAS_SPLITARGBROW_SSSE3 +#define HAS_SPLITXRGBROW_SSE2 +#define HAS_SPLITXRGBROW_SSSE3 #define HAS_SPLITRGBROW_SSSE3 #define HAS_SWAPUVROW_SSSE3 + +#if defined(__x86_64__) || !defined(__pic__) +// TODO(fbarchard): fix build error on android_full_debug=1 +// https://code.google.com/p/libyuv/issues/detail?id=517 +#define HAS_I210ALPHATOARGBROW_SSSE3 +#define HAS_I410ALPHATOARGBROW_SSSE3 +#endif #endif // The following are available for AVX2 gcc/clang x86 platforms: // TODO(fbarchard): Port to Visual C -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) && \ +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || defined(__i386__)) && \ (defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) #define HAS_ABGRTOAR30ROW_AVX2 #define HAS_ABGRTOUVROW_AVX2 @@ -297,29 +324,59 @@ extern "C" { #define HAS_ARGBTOAR30ROW_AVX2 #define HAS_ARGBTORAWROW_AVX2 #define HAS_ARGBTORGB24ROW_AVX2 +#define HAS_ARGBTOAR64ROW_AVX2 +#define HAS_ARGBTOAB64ROW_AVX2 +#define HAS_AR64TOARGBROW_AVX2 +#define HAS_AB64TOARGBROW_AVX2 #define HAS_CONVERT16TO8ROW_AVX2 #define HAS_CONVERT8TO16ROW_AVX2 +#define HAS_DIVIDEROW_16_AVX2 #define HAS_HALFMERGEUVROW_AVX2 +#define HAS_MERGEAR64ROW_AVX2 +#define HAS_MERGEARGB16TO8ROW_AVX2 +#define HAS_MERGEARGBROW_AVX2 +#define HAS_MERGEXR30ROW_AVX2 +#define HAS_MERGEXR64ROW_AVX2 +#define HAS_MERGEXRGB16TO8ROW_AVX2 +#define HAS_MERGEXRGBROW_AVX2 #define HAS_I210TOAR30ROW_AVX2 #define HAS_I210TOARGBROW_AVX2 +#define HAS_I212TOAR30ROW_AVX2 +#define HAS_I212TOARGBROW_AVX2 #define HAS_I400TOARGBROW_AVX2 +#define HAS_I410TOAR30ROW_AVX2 +#define HAS_I410TOARGBROW_AVX2 +#define HAS_P210TOAR30ROW_AVX2 +#define HAS_P210TOARGBROW_AVX2 +#define HAS_P410TOAR30ROW_AVX2 +#define HAS_P410TOARGBROW_AVX2 #define HAS_I422TOAR30ROW_AVX2 #define HAS_I422TOUYVYROW_AVX2 #define HAS_I422TOYUY2ROW_AVX2 #define HAS_MERGEUVROW_16_AVX2 +#define HAS_MIRRORUVROW_AVX2 #define HAS_MULTIPLYROW_16_AVX2 #define HAS_RGBATOYJROW_AVX2 +#define HAS_SPLITARGBROW_AVX2 +#define HAS_SPLITXRGBROW_AVX2 +#define HAS_SPLITUVROW_16_AVX2 #define HAS_SWAPUVROW_AVX2 // TODO(fbarchard): Fix AVX2 version of YUV24 // #define HAS_NV21TOYUV24ROW_AVX2 + +#if defined(__x86_64__) || !defined(__pic__) +// TODO(fbarchard): fix build error on android_full_debug=1 +// https://code.google.com/p/libyuv/issues/detail?id=517 +#define HAS_I210ALPHATOARGBROW_AVX2 +#define HAS_I410ALPHATOARGBROW_AVX2 +#endif #endif // The following are available for AVX512 clang x86 platforms: // TODO(fbarchard): Port to GCC and Visual C // TODO(fbarchard): re-enable HAS_ARGBTORGB24ROW_AVX512VBMI. Issue libyuv:789 -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) && \ - (defined(CLANG_HAS_AVX512)) +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || defined(__i386__)) && (defined(CLANG_HAS_AVX512)) #define HAS_ARGBTORGB24ROW_AVX512VBMI #endif @@ -342,6 +399,10 @@ extern "C" { #define HAS_ARGBTORGB24ROW_NEON #define HAS_ARGBTORGB565DITHERROW_NEON #define HAS_ARGBTORGB565ROW_NEON +#define HAS_ARGBTOAR64ROW_NEON +#define HAS_ARGBTOAB64ROW_NEON +#define HAS_AR64TOARGBROW_NEON +#define HAS_AB64TOARGBROW_NEON #define HAS_ARGBTOUV444ROW_NEON #define HAS_ARGBTOUVJROW_NEON #define HAS_ARGBTOUVROW_NEON @@ -354,9 +415,11 @@ extern "C" { #define HAS_BGRATOYROW_NEON #define HAS_BYTETOFLOATROW_NEON #define HAS_COPYROW_NEON +#define HAS_DIVIDEROW_16_NEON #define HAS_HALFFLOATROW_NEON #define HAS_HALFMERGEUVROW_NEON #define HAS_I400TOARGBROW_NEON +#define HAS_I444ALPHATOARGBROW_NEON #define HAS_I422ALPHATOARGBROW_NEON #define HAS_I422TOARGB1555ROW_NEON #define HAS_I422TOARGB4444ROW_NEON @@ -368,10 +431,19 @@ extern "C" { #define HAS_I422TOYUY2ROW_NEON #define HAS_I444TOARGBROW_NEON #define HAS_J400TOARGBROW_NEON +#define HAS_MERGEAR64ROW_NEON +#define HAS_MERGEARGB16TO8ROW_NEON +#define HAS_MERGEARGBROW_NEON +#define HAS_MERGEXR30ROW_NEON +#define HAS_MERGEXR64ROW_NEON +#define HAS_MERGEXRGB16TO8ROW_NEON +#define HAS_MERGEXRGBROW_NEON #define HAS_MERGEUVROW_NEON +#define HAS_MERGEUVROW_16_NEON #define HAS_MIRRORROW_NEON #define HAS_MIRRORUVROW_NEON #define HAS_MIRRORSPLITUVROW_NEON +#define HAS_MULTIPLYROW_16_NEON #define HAS_NV12TOARGBROW_NEON #define HAS_NV12TORGB24ROW_NEON #define HAS_NV12TORGB565ROW_NEON @@ -395,8 +467,11 @@ extern "C" { #define HAS_RGBATOYJROW_NEON #define HAS_RGBATOYROW_NEON #define HAS_SETROW_NEON +#define HAS_SPLITARGBROW_NEON +#define HAS_SPLITXRGBROW_NEON #define HAS_SPLITRGBROW_NEON #define HAS_SPLITUVROW_NEON +#define HAS_SPLITUVROW_16_NEON #define HAS_SWAPUVROW_NEON #define HAS_UYVYTOARGBROW_NEON #define HAS_UYVYTOUV422ROW_NEON @@ -472,24 +547,14 @@ extern "C" { #define HAS_BGRATOYROW_MSA #define HAS_HALFFLOATROW_MSA #define HAS_I400TOARGBROW_MSA -#define HAS_I422ALPHATOARGBROW_MSA -#define HAS_I422TOARGBROW_MSA -#define HAS_I422TORGB24ROW_MSA -#define HAS_I422TORGBAROW_MSA #define HAS_I422TOUYVYROW_MSA #define HAS_I422TOYUY2ROW_MSA -#define HAS_I444TOARGBROW_MSA -#define HAS_I422TOARGB1555ROW_MSA -#define HAS_I422TORGB565ROW_MSA #define HAS_INTERPOLATEROW_MSA #define HAS_J400TOARGBROW_MSA #define HAS_MERGEUVROW_MSA #define HAS_MIRRORROW_MSA #define HAS_MIRRORUVROW_MSA #define HAS_MIRRORSPLITUVROW_MSA -#define HAS_NV12TOARGBROW_MSA -#define HAS_NV12TORGB565ROW_MSA -#define HAS_NV21TOARGBROW_MSA #define HAS_RAWTOARGBROW_MSA #define HAS_RAWTORGB24ROW_MSA #define HAS_RAWTOUVROW_MSA @@ -509,10 +574,8 @@ extern "C" { #define HAS_SOBELXYROW_MSA #define HAS_SOBELYROW_MSA #define HAS_SPLITUVROW_MSA -#define HAS_UYVYTOARGBROW_MSA #define HAS_UYVYTOUVROW_MSA #define HAS_UYVYTOYROW_MSA -#define HAS_YUY2TOARGBROW_MSA #define HAS_YUY2TOUV422ROW_MSA #define HAS_YUY2TOUVROW_MSA #define HAS_YUY2TOYROW_MSA @@ -562,8 +625,6 @@ extern "C" { #define HAS_I400TOARGBROW_MMI #define HAS_I422TOUYVYROW_MMI #define HAS_I422TOYUY2ROW_MMI -#define HAS_I422TOARGBROW_MMI -#define HAS_I444TOARGBROW_MMI #define HAS_INTERPOLATEROW_MMI #define HAS_J400TOARGBROW_MMI #define HAS_MERGERGBROW_MMI @@ -594,20 +655,6 @@ extern "C" { #define HAS_YUY2TOUV422ROW_MMI #define HAS_YUY2TOUVROW_MMI #define HAS_YUY2TOYROW_MMI -#define HAS_I210TOARGBROW_MMI -#define HAS_I422TOARGB4444ROW_MMI -#define HAS_I422TOARGB1555ROW_MMI -#define HAS_I422TORGB565ROW_MMI -#define HAS_NV21TORGB24ROW_MMI -#define HAS_NV12TORGB24ROW_MMI -#define HAS_I422ALPHATOARGBROW_MMI -#define HAS_I422TORGB24ROW_MMI -#define HAS_NV12TOARGBROW_MMI -#define HAS_NV21TOARGBROW_MMI -#define HAS_NV12TORGB565ROW_MMI -#define HAS_YUY2TOARGBROW_MMI -#define HAS_UYVYTOARGBROW_MMI -#define HAS_I422TORGBAROW_MMI #endif #if defined(_MSC_VER) && !defined(__CLR_VER) && !defined(__clang__) @@ -616,6 +663,7 @@ extern "C" { #else #define SIMD_ALIGNED(var) __declspec(align(16)) var #endif +#define LIBYUV_NOINLINE __declspec(noinline) typedef __declspec(align(16)) int16_t vec16[8]; typedef __declspec(align(16)) int32_t vec32[4]; typedef __declspec(align(16)) float vecf32[4]; @@ -636,6 +684,7 @@ typedef __declspec(align(32)) uint8_t ulvec8[32]; #else #define SIMD_ALIGNED(var) var __attribute__((aligned(16))) #endif +#define LIBYUV_NOINLINE __attribute__((noinline)) typedef int16_t __attribute__((vector_size(16))) vec16; typedef int32_t __attribute__((vector_size(16))) vec32; typedef float __attribute__((vector_size(16))) vecf32; @@ -651,6 +700,7 @@ typedef uint32_t __attribute__((vector_size(32))) ulvec32; typedef uint8_t __attribute__((vector_size(32))) ulvec8; #else #define SIMD_ALIGNED(var) var +#define LIBYUV_NOINLINE typedef int16_t vec16[8]; typedef int32_t vec32[4]; typedef float vecf32[4]; @@ -666,33 +716,18 @@ typedef uint32_t ulvec32[8]; typedef uint8_t ulvec8[32]; #endif -#if defined(__aarch64__) -// This struct is for Arm64 color conversion. +#if defined(__aarch64__) || defined(__arm__) +// This struct is for ARM color conversion. struct YuvConstants { - uvec16 kUVToRB; - uvec16 kUVToRB2; - uvec16 kUVToG; - uvec16 kUVToG2; - vec16 kUVBiasBGR; - vec32 kYToRgb; -}; -#elif defined(__arm__) -// This struct is for ArmV7 color conversion. -struct YuvConstants { - uvec8 kUVToRB; - uvec8 kUVToG; - vec16 kUVBiasBGR; - vec32 kYToRgb; + uvec8 kUVCoeff; + vec16 kRGBCoeffBias; }; #else // This struct is for Intel color conversion. struct YuvConstants { - int8_t kUVToB[32]; - int8_t kUVToG[32]; - int8_t kUVToR[32]; - int16_t kUVBiasB[16]; - int16_t kUVBiasG[16]; - int16_t kUVBiasR[16]; + uint8_t kUVToB[32]; + uint8_t kUVToG[32]; + uint8_t kUVToR[32]; int16_t kYToRgb[16]; int16_t kYBiasToRgb[16]; }; @@ -701,11 +736,8 @@ struct YuvConstants { #define KUVTOB 0 #define KUVTOG 32 #define KUVTOR 64 -#define KUVBIASB 96 -#define KUVBIASG 128 -#define KUVBIASR 160 -#define KYTORGB 192 -#define KYBIASTORGB 224 +#define KYTORGB 96 +#define KYBIASTORGB 128 #endif @@ -795,6 +827,13 @@ void I422ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); +void I444AlphaToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); void I422AlphaToARGBRow_NEON(const uint8_t* src_y, const uint8_t* src_u, const uint8_t* src_v, @@ -802,12 +841,6 @@ void I422AlphaToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I422ToARGBRow_NEON(const uint8_t* src_y, - const uint8_t* src_u, - const uint8_t* src_v, - uint8_t* dst_argb, - const struct YuvConstants* yuvconstants, - int width); void I422ToRGBARow_NEON(const uint8_t* src_y, const uint8_t* src_u, const uint8_t* src_v, @@ -976,11 +1009,11 @@ void BGRAToYRow_SSSE3(const uint8_t* src_bgra, uint8_t* dst_y, int width); void ABGRToYRow_SSSE3(const uint8_t* src_abgr, uint8_t* dst_y, int width); void RGBAToYRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width); void RGB24ToYRow_SSSE3(const uint8_t* src_rgb24, uint8_t* dst_y, int width); -void RGB24ToYJRow_SSSE3(const uint8_t* src_rgb24, uint8_t* dst_y, int width); +void RGB24ToYJRow_SSSE3(const uint8_t* src_rgb24, uint8_t* dst_yj, int width); void RAWToYRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_y, int width); -void RAWToYJRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_y, int width); -void RGB24ToYJRow_AVX2(const uint8_t* src_rgb24, uint8_t* dst_y, int width); -void RAWToYJRow_AVX2(const uint8_t* src_raw, uint8_t* dst_y, int width); +void RAWToYJRow_SSSE3(const uint8_t* src_raw, uint8_t* dst_yj, int width); +void RGB24ToYJRow_AVX2(const uint8_t* src_rgb24, uint8_t* dst_yj, int width); +void RAWToYJRow_AVX2(const uint8_t* src_raw, uint8_t* dst_yj, int width); void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width); void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width); void RGBAToYJRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width); @@ -1175,16 +1208,16 @@ void RGB565ToYRow_MMI(const uint8_t* src_rgb565, uint8_t* dst_y, int width); void ARGB1555ToYRow_MMI(const uint8_t* src_argb1555, uint8_t* dst_y, int width); void ARGB4444ToYRow_MMI(const uint8_t* src_argb4444, uint8_t* dst_y, int width); -void ARGBToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); -void ARGBToYJRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); -void RGBAToYJRow_C(const uint8_t* src_argb0, uint8_t* dst_y, int width); -void BGRAToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); -void ABGRToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); -void RGBAToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); -void RGB24ToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); -void RGB24ToYJRow_C(const uint8_t* src_argb, uint8_t* dst_yj, int width); -void RAWToYRow_C(const uint8_t* src_argb, uint8_t* dst_y, int width); -void RAWToYJRow_C(const uint8_t* src_argb, uint8_t* dst_yj, int width); +void ARGBToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void ARGBToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGBAToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void BGRAToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void ABGRToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGBAToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGB24ToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RGB24ToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RAWToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); +void RAWToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width); void RGB565ToYRow_C(const uint8_t* src_rgb565, uint8_t* dst_y, int width); void ARGB1555ToYRow_C(const uint8_t* src_argb1555, uint8_t* dst_y, int width); void ARGB4444ToYRow_C(const uint8_t* src_argb4444, uint8_t* dst_y, int width); @@ -1286,42 +1319,42 @@ void RGBAToUVRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_v, int width); void ARGBToUVRow_Any_AVX2(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void ABGRToUVRow_Any_AVX2(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void ARGBToUVJRow_Any_AVX2(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void ARGBToUVRow_Any_SSSE3(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void ARGBToUVJRow_Any_SSSE3(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void BGRAToUVRow_Any_SSSE3(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void ABGRToUVRow_Any_SSSE3(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void RGBAToUVRow_Any_SSSE3(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -1330,7 +1363,7 @@ void ARGBToUV444Row_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_v, int width); void ARGBToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -1353,47 +1386,47 @@ void ARGBToUVRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_v, int width); void ARGBToUVJRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void BGRAToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void ABGRToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void RGBAToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void RGB24ToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void RAWToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void RGB565ToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void ARGB1555ToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); void ARGB4444ToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -1602,7 +1635,7 @@ void MirrorSplitUVRow_C(const uint8_t* src_uv, void ARGBMirrorRow_AVX2(const uint8_t* src, uint8_t* dst, int width); void ARGBMirrorRow_SSE2(const uint8_t* src, uint8_t* dst, int width); -void ARGBMirrorRow_NEON(const uint8_t* src, uint8_t* dst, int width); +void ARGBMirrorRow_NEON(const uint8_t* src_argb, uint8_t* dst_argb, int width); void ARGBMirrorRow_MSA(const uint8_t* src, uint8_t* dst, int width); void ARGBMirrorRow_MMI(const uint8_t* src, uint8_t* dst, int width); void ARGBMirrorRow_C(const uint8_t* src, uint8_t* dst, int width); @@ -1618,9 +1651,13 @@ void ARGBMirrorRow_Any_NEON(const uint8_t* src_ptr, void ARGBMirrorRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); void ARGBMirrorRow_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); -void RGB24MirrorRow_SSSE3(const uint8_t* src, uint8_t* dst, int width); -void RGB24MirrorRow_NEON(const uint8_t* src, uint8_t* dst, int width); -void RGB24MirrorRow_C(const uint8_t* src, uint8_t* dst, int width); +void RGB24MirrorRow_SSSE3(const uint8_t* src_rgb24, + uint8_t* dst_rgb24, + int width); +void RGB24MirrorRow_NEON(const uint8_t* src_rgb24, + uint8_t* dst_rgb24, + int width); +void RGB24MirrorRow_C(const uint8_t* src_rgb24, uint8_t* dst_rgb24, int width); void RGB24MirrorRow_Any_SSSE3(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); @@ -1817,26 +1854,449 @@ void MergeRGBRow_Any_MMI(const uint8_t* src_r, const uint8_t* src_b, uint8_t* dst_rgb, int width); +void MergeARGBRow_C(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width); +void MergeARGBRow_SSE2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width); +void MergeARGBRow_AVX2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width); +void MergeARGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width); +void MergeARGBRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + int width); +void MergeARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + int width); +void MergeARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + int width); +void SplitARGBRow_C(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_NEON(const uint8_t* src_rgba, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void SplitARGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width); +void MergeXRGBRow_C(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width); +void MergeXRGBRow_SSE2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width); +void MergeXRGBRow_AVX2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width); +void MergeXRGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width); +void MergeXRGBRow_Any_SSE2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void MergeXRGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void MergeXRGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_ptr, + int width); +void SplitXRGBRow_C(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_NEON(const uint8_t* src_rgba, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); +void SplitXRGBRow_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width); + +void MergeXR30Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width); +void MergeAR64Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width); +void MergeARGB16To8Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR64Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width); +void MergeXRGB16To8Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR30Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width); +void MergeAR64Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width); +void MergeARGB16To8Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR64Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width); +void MergeXRGB16To8Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR30Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width); +void MergeXR30Row_10_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int /* depth */, + int width); +void MergeAR64Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width); +void MergeARGB16To8Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR64Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width); +void MergeXRGB16To8Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width); +void MergeXR30Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeAR64Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + const uint16_t* a_buf, + uint16_t* dst_ptr, + int depth, + int width); +void MergeXR64Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint16_t* dst_ptr, + int depth, + int width); +void MergeARGB16To8Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeXRGB16To8Row_Any_AVX2(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeXR30Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeXR30Row_10_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeAR64Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + const uint16_t* a_buf, + uint16_t* dst_ptr, + int depth, + int width); +void MergeARGB16To8Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + int depth, + int width); +void MergeXR64Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint16_t* dst_ptr, + int depth, + int width); +void MergeXRGB16To8Row_Any_NEON(const uint16_t* r_buf, + const uint16_t* g_buf, + const uint16_t* b_buf, + uint8_t* dst_ptr, + int depth, + int width); void MergeUVRow_16_C(const uint16_t* src_u, const uint16_t* src_v, uint16_t* dst_uv, - int scale, /* 64 for 10 bit */ + int depth, int width); void MergeUVRow_16_AVX2(const uint16_t* src_u, const uint16_t* src_v, uint16_t* dst_uv, - int scale, + int depth, int width); +void MergeUVRow_16_Any_AVX2(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width); +void MergeUVRow_16_NEON(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width); +void MergeUVRow_16_Any_NEON(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width); + +void SplitUVRow_16_C(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); +void SplitUVRow_16_AVX2(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); +void SplitUVRow_16_Any_AVX2(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); +void SplitUVRow_16_NEON(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); +void SplitUVRow_16_Any_NEON(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width); -void MultiplyRow_16_AVX2(const uint16_t* src_y, - uint16_t* dst_y, - int scale, - int width); void MultiplyRow_16_C(const uint16_t* src_y, uint16_t* dst_y, int scale, int width); +void MultiplyRow_16_AVX2(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void MultiplyRow_16_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); +void MultiplyRow_16_NEON(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void MultiplyRow_16_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); + +void DivideRow_16_C(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void DivideRow_16_AVX2(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void DivideRow_16_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); +void DivideRow_16_NEON(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width); +void DivideRow_16_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int scale, + int width); void Convert8To16Row_C(const uint8_t* src_y, uint16_t* dst_y, @@ -2258,6 +2718,71 @@ void ARGBToARGB4444Row_C(const uint8_t* src_argb, uint8_t* dst_rgb, int width); void ABGRToAR30Row_C(const uint8_t* src_abgr, uint8_t* dst_ar30, int width); void ARGBToAR30Row_C(const uint8_t* src_argb, uint8_t* dst_ar30, int width); +void ARGBToAR64Row_C(const uint8_t* src_argb, uint16_t* dst_ar64, int width); +void ARGBToAB64Row_C(const uint8_t* src_argb, uint16_t* dst_ab64, int width); +void AR64ToARGBRow_C(const uint16_t* src_ar64, uint8_t* dst_argb, int width); +void AB64ToARGBRow_C(const uint16_t* src_ab64, uint8_t* dst_argb, int width); +void AR64ShuffleRow_C(const uint8_t* src_ar64, + uint8_t* dst_ar64, + const uint8_t* shuffler, + int width); +void ARGBToAR64Row_SSSE3(const uint8_t* src_argb, + uint16_t* dst_ar64, + int width); +void ARGBToAB64Row_SSSE3(const uint8_t* src_argb, + uint16_t* dst_ab64, + int width); +void AR64ToARGBRow_SSSE3(const uint16_t* src_ar64, + uint8_t* dst_argb, + int width); +void AB64ToARGBRow_SSSE3(const uint16_t* src_ab64, + uint8_t* dst_argb, + int width); +void ARGBToAR64Row_AVX2(const uint8_t* src_argb, uint16_t* dst_ar64, int width); +void ARGBToAB64Row_AVX2(const uint8_t* src_argb, uint16_t* dst_ab64, int width); +void AR64ToARGBRow_AVX2(const uint16_t* src_ar64, uint8_t* dst_argb, int width); +void AB64ToARGBRow_AVX2(const uint16_t* src_ab64, uint8_t* dst_argb, int width); +void ARGBToAR64Row_NEON(const uint8_t* src_argb, uint16_t* dst_ar64, int width); +void ARGBToAB64Row_NEON(const uint8_t* src_argb, uint16_t* dst_ab64, int width); +void AR64ToARGBRow_NEON(const uint16_t* src_ar64, uint8_t* dst_argb, int width); +void AB64ToARGBRow_NEON(const uint16_t* src_ab64, uint8_t* dst_argb, int width); +void ARGBToAR64Row_Any_SSSE3(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void ARGBToAB64Row_Any_SSSE3(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void AR64ToARGBRow_Any_SSSE3(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void AB64ToARGBRow_Any_SSSE3(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToAR64Row_Any_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void ARGBToAB64Row_Any_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void AR64ToARGBRow_Any_AVX2(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void AB64ToARGBRow_Any_AVX2(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void ARGBToAR64Row_Any_NEON(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void ARGBToAB64Row_Any_NEON(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int width); +void AR64ToARGBRow_Any_NEON(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); +void AB64ToARGBRow_Any_NEON(const uint16_t* src_ptr, + uint8_t* dst_ptr, + int width); + void J400ToARGBRow_SSE2(const uint8_t* src_y, uint8_t* dst_argb, int width); void J400ToARGBRow_AVX2(const uint8_t* src_y, uint8_t* dst_argb, int width); void J400ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, int width); @@ -2306,6 +2831,51 @@ void I210ToARGBRow_C(const uint16_t* src_y, uint8_t* rgb_buf, const struct YuvConstants* yuvconstants, int width); +void I212ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I212ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + const uint16_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + const uint16_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width); void I422AlphaToARGBRow_C(const uint8_t* src_y, const uint8_t* src_u, const uint8_t* src_v, @@ -2350,6 +2920,27 @@ void UYVYToARGBRow_C(const uint8_t* src_uyvy, uint8_t* rgb_buf, const struct YuvConstants* yuvconstants, int width); +void P210ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); + void I422ToRGBARow_C(const uint8_t* src_y, const uint8_t* src_u, const uint8_t* src_v, @@ -2404,18 +2995,6 @@ void I444ToARGBRow_AVX2(const uint8_t* y_buf, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); -void I444ToARGBRow_SSSE3(const uint8_t* y_buf, - const uint8_t* u_buf, - const uint8_t* v_buf, - uint8_t* dst_argb, - const struct YuvConstants* yuvconstants, - int width); -void I444ToARGBRow_AVX2(const uint8_t* y_buf, - const uint8_t* u_buf, - const uint8_t* v_buf, - uint8_t* dst_argb, - const struct YuvConstants* yuvconstants, - int width); void I422ToARGBRow_SSSE3(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2441,6 +3020,44 @@ void I210ToARGBRow_SSSE3(const uint16_t* y_buf, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); +void I212ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I212ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); void I422ToAR30Row_AVX2(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2459,6 +3076,58 @@ void I210ToAR30Row_AVX2(const uint16_t* y_buf, uint8_t* dst_ar30, const struct YuvConstants* yuvconstants, int width); +void I212ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I212ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); void I422AlphaToARGBRow_SSSE3(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2543,6 +3212,48 @@ void UYVYToARGBRow_AVX2(const uint8_t* uyvy_buf, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width); + +void P210ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P210ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); + void I422ToRGBARow_SSSE3(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2645,6 +3356,44 @@ void I210ToARGBRow_Any_SSSE3(const uint16_t* y_buf, uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); +void I212ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I212ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); void I422ToAR30Row_Any_AVX2(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2663,6 +3412,58 @@ void I210ToAR30Row_Any_AVX2(const uint16_t* y_buf, uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); +void I212ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I212ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I210AlphaToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I410AlphaToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_Any_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void I444AlphaToARGBRow_Any_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); void I422AlphaToARGBRow_Any_SSSE3(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2747,6 +3548,46 @@ void UYVYToARGBRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); +void P210ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_Any_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P210ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_Any_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_Any_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); void I422ToRGBARow_Any_SSSE3(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2828,15 +3669,15 @@ void I400ToARGBRow_MMI(const uint8_t* src_y, int width); void I400ToARGBRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, - const struct YuvConstants* yuvconstants, + const struct YuvConstants* param, int width); void I400ToARGBRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, - const struct YuvConstants* yuvconstants, + const struct YuvConstants* param, int width); void I400ToARGBRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, - const struct YuvConstants* yuvconstants, + const struct YuvConstants* param, int width); void I400ToARGBRow_Any_MSA(const uint8_t* src_ptr, uint8_t* dst_ptr, @@ -2848,11 +3689,11 @@ void I400ToARGBRow_Any_MMI(const uint8_t* src_ptr, int width); // ARGB preattenuated alpha blend. -void ARGBBlendRow_SSSE3(const uint8_t* src_argb0, +void ARGBBlendRow_SSSE3(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); -void ARGBBlendRow_NEON(const uint8_t* src_argb0, +void ARGBBlendRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -2864,7 +3705,7 @@ void ARGBBlendRow_MMI(const uint8_t* src_argb0, const uint8_t* src_argb1, uint8_t* dst_argb, int width); -void ARGBBlendRow_C(const uint8_t* src_argb0, +void ARGBBlendRow_C(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -2908,11 +3749,11 @@ void BlendPlaneRow_C(const uint8_t* src0, // ARGB multiply images. Same API as Blend, but these require // pointer and width alignment for SSE2. -void ARGBMultiplyRow_C(const uint8_t* src_argb0, +void ARGBMultiplyRow_C(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); -void ARGBMultiplyRow_SSE2(const uint8_t* src_argb0, +void ARGBMultiplyRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -2920,7 +3761,7 @@ void ARGBMultiplyRow_Any_SSE2(const uint8_t* y_buf, const uint8_t* uv_buf, uint8_t* dst_ptr, int width); -void ARGBMultiplyRow_AVX2(const uint8_t* src_argb0, +void ARGBMultiplyRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -2928,7 +3769,7 @@ void ARGBMultiplyRow_Any_AVX2(const uint8_t* y_buf, const uint8_t* uv_buf, uint8_t* dst_ptr, int width); -void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, +void ARGBMultiplyRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -2954,11 +3795,11 @@ void ARGBMultiplyRow_Any_MMI(const uint8_t* y_buf, int width); // ARGB add images. -void ARGBAddRow_C(const uint8_t* src_argb0, +void ARGBAddRow_C(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); -void ARGBAddRow_SSE2(const uint8_t* src_argb0, +void ARGBAddRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -2966,7 +3807,7 @@ void ARGBAddRow_Any_SSE2(const uint8_t* y_buf, const uint8_t* uv_buf, uint8_t* dst_ptr, int width); -void ARGBAddRow_AVX2(const uint8_t* src_argb0, +void ARGBAddRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -2974,7 +3815,7 @@ void ARGBAddRow_Any_AVX2(const uint8_t* y_buf, const uint8_t* uv_buf, uint8_t* dst_ptr, int width); -void ARGBAddRow_NEON(const uint8_t* src_argb0, +void ARGBAddRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -3001,11 +3842,11 @@ void ARGBAddRow_Any_MMI(const uint8_t* y_buf, // ARGB subtract images. Same API as Blend, but these require // pointer and width alignment for SSE2. -void ARGBSubtractRow_C(const uint8_t* src_argb0, +void ARGBSubtractRow_C(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); -void ARGBSubtractRow_SSE2(const uint8_t* src_argb0, +void ARGBSubtractRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -3013,7 +3854,7 @@ void ARGBSubtractRow_Any_SSE2(const uint8_t* y_buf, const uint8_t* uv_buf, uint8_t* dst_ptr, int width); -void ARGBSubtractRow_AVX2(const uint8_t* src_argb0, +void ARGBSubtractRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -3021,7 +3862,7 @@ void ARGBSubtractRow_Any_AVX2(const uint8_t* y_buf, const uint8_t* uv_buf, uint8_t* dst_ptr, int width); -void ARGBSubtractRow_NEON(const uint8_t* src_argb0, +void ARGBSubtractRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width); @@ -3164,6 +4005,13 @@ void I422ToARGBRow_Any_NEON(const uint8_t* y_buf, uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); +void I444AlphaToARGBRow_Any_NEON(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_ptr, + const struct YuvConstants* yuvconstants, + int width); void I422AlphaToARGBRow_Any_NEON(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -3221,9 +4069,9 @@ void NV21ToRGB24Row_Any_NEON(const uint8_t* y_buf, uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); -void NV21ToYUV24Row_Any_NEON(const uint8_t* src_y, - const uint8_t* src_vu, - uint8_t* dst_yuv24, +void NV21ToYUV24Row_Any_NEON(const uint8_t* y_buf, + const uint8_t* uv_buf, + uint8_t* dst_ptr, int width); void NV12ToRGB565Row_Any_NEON(const uint8_t* y_buf, const uint8_t* uv_buf, @@ -3238,6 +4086,46 @@ void UYVYToARGBRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, int width); +void P210ToARGBRow_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P210ToARGBRow_Any_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P410ToARGBRow_Any_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width); +void P210ToAR30Row_Any_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); +void P410ToAR30Row_Any_NEON(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width); void I444ToARGBRow_Any_MSA(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -3385,7 +4273,7 @@ void YUY2ToUV422Row_C(const uint8_t* src_yuy2, int width); void YUY2ToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); void YUY2ToUVRow_Any_AVX2(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -3395,7 +4283,7 @@ void YUY2ToUV422Row_Any_AVX2(const uint8_t* src_ptr, int width); void YUY2ToYRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); void YUY2ToUVRow_Any_SSE2(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -3405,7 +4293,7 @@ void YUY2ToUV422Row_Any_SSE2(const uint8_t* src_ptr, int width); void YUY2ToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); void YUY2ToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -3506,7 +4394,7 @@ void UYVYToUV422Row_C(const uint8_t* src_uyvy, int width); void UYVYToYRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); void UYVYToUVRow_Any_AVX2(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -3516,7 +4404,7 @@ void UYVYToUV422Row_Any_AVX2(const uint8_t* src_ptr, int width); void UYVYToYRow_Any_SSE2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); void UYVYToUVRow_Any_SSE2(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -3526,7 +4414,7 @@ void UYVYToUV422Row_Any_SSE2(const uint8_t* src_ptr, int width); void UYVYToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); void UYVYToUVRow_Any_NEON(const uint8_t* src_ptr, - int src_stride_ptr, + int src_stride, uint8_t* dst_u, uint8_t* dst_v, int width); @@ -3563,29 +4451,29 @@ void SwapUVRow_AVX2(const uint8_t* src_uv, uint8_t* dst_vu, int width); void SwapUVRow_Any_AVX2(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); void AYUVToYRow_C(const uint8_t* src_ayuv, uint8_t* dst_y, int width); void AYUVToUVRow_C(const uint8_t* src_ayuv, - int stride_ayuv, + int src_stride_ayuv, uint8_t* dst_uv, int width); void AYUVToVURow_C(const uint8_t* src_ayuv, - int stride_ayuv, + int src_stride_ayuv, uint8_t* dst_vu, int width); void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width); void AYUVToUVRow_NEON(const uint8_t* src_ayuv, - int stride_ayuv, + int src_stride_ayuv, uint8_t* dst_uv, int width); void AYUVToVURow_NEON(const uint8_t* src_ayuv, - int stride_ayuv, + int src_stride_ayuv, uint8_t* dst_vu, int width); -void AYUVToYRow_Any_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width); -void AYUVToUVRow_Any_NEON(const uint8_t* src_ayuv, - int stride_ayuv, - uint8_t* dst_uv, +void AYUVToYRow_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int width); +void AYUVToUVRow_Any_NEON(const uint8_t* src_ptr, + int src_stride, + uint8_t* dst_vu, int width); -void AYUVToVURow_Any_NEON(const uint8_t* src_ayuv, - int stride_ayuv, +void AYUVToVURow_Any_NEON(const uint8_t* src_ptr, + int src_stride, uint8_t* dst_vu, int width); diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale.h b/third-party/libyuv/third_party/libyuv/include/libyuv/scale.h similarity index 80% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/scale.h index add5a9eb62..3d4b60052d 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/scale.h @@ -49,6 +49,18 @@ void ScalePlane_16(const uint16_t* src, int dst_height, enum FilterMode filtering); +// Sample is expected to be in the low 12 bits. +LIBYUV_API +void ScalePlane_12(const uint16_t* src, + int src_stride, + int src_width, + int src_height, + uint16_t* dst, + int dst_stride, + int dst_width, + int dst_height, + enum FilterMode filtering); + // Scales a YUV 4:2:0 image from the src width and height to the // dst width and height. // If filtering is kFilterNone, a simple nearest-neighbor algorithm is @@ -97,6 +109,25 @@ int I420Scale_16(const uint16_t* src_y, int dst_height, enum FilterMode filtering); +LIBYUV_API +int I420Scale_12(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + // Scales a YUV 4:4:4 image from the src width and height to the // dst width and height. // If filtering is kFilterNone, a simple nearest-neighbor algorithm is @@ -145,6 +176,25 @@ int I444Scale_16(const uint16_t* src_y, int dst_height, enum FilterMode filtering); +LIBYUV_API +int I444Scale_12(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering); + // Scales an NV12 image from the src width and height to the // dst width and height. // If filtering is kFilterNone, a simple nearest-neighbor algorithm is diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale_argb.h b/third-party/libyuv/third_party/libyuv/include/libyuv/scale_argb.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale_argb.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/scale_argb.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale_row.h b/third-party/libyuv/third_party/libyuv/include/libyuv/scale_row.h similarity index 76% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale_row.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/scale_row.h index a386d49989..461ac36f33 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale_row.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/scale_row.h @@ -74,18 +74,39 @@ extern "C" { // The following are available for gcc/clang x86 platforms: // TODO(fbarchard): Port to Visual C -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) #define HAS_SCALEUVROWDOWN2BOX_SSSE3 +#define HAS_SCALEROWUP2LINEAR_SSE2 +#define HAS_SCALEROWUP2LINEAR_SSSE3 +#define HAS_SCALEROWUP2BILINEAR_SSE2 +#define HAS_SCALEROWUP2BILINEAR_SSSE3 +#define HAS_SCALEROWUP2LINEAR_12_SSSE3 +#define HAS_SCALEROWUP2BILINEAR_12_SSSE3 +#define HAS_SCALEROWUP2LINEAR_16_SSE2 +#define HAS_SCALEROWUP2BILINEAR_16_SSE2 +#define HAS_SCALEUVROWUP2LINEAR_SSSE3 +#define HAS_SCALEUVROWUP2BILINEAR_SSSE3 +#define HAS_SCALEUVROWUP2LINEAR_16_SSE2 +#define HAS_SCALEUVROWUP2BILINEAR_16_SSE2 #endif // The following are available for gcc/clang x86 platforms, but // require clang 3.4 or gcc 4.7. // TODO(fbarchard): Port to Visual C -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || defined(__i386__)) && !defined(_MSC_VER) && \ +#if !defined(LIBYUV_DISABLE_X86) && \ + (defined(__x86_64__) || defined(__i386__)) && \ (defined(CLANG_HAS_AVX2) || defined(GCC_HAS_AVX2)) #define HAS_SCALEUVROWDOWN2BOX_AVX2 +#define HAS_SCALEROWUP2LINEAR_AVX2 +#define HAS_SCALEROWUP2BILINEAR_AVX2 +#define HAS_SCALEROWUP2LINEAR_12_AVX2 +#define HAS_SCALEROWUP2BILINEAR_12_AVX2 +#define HAS_SCALEROWUP2LINEAR_16_AVX2 +#define HAS_SCALEROWUP2BILINEAR_16_AVX2 +#define HAS_SCALEUVROWUP2LINEAR_AVX2 +#define HAS_SCALEUVROWUP2BILINEAR_AVX2 +#define HAS_SCALEUVROWUP2LINEAR_16_AVX2 +#define HAS_SCALEUVROWUP2BILINEAR_16_AVX2 #endif // The following are available on all x86 platforms, but @@ -114,6 +135,16 @@ extern "C" { #define HAS_SCALEROWDOWN4_NEON #define HAS_SCALEUVROWDOWN2BOX_NEON #define HAS_SCALEUVROWDOWNEVEN_NEON +#define HAS_SCALEROWUP2LINEAR_NEON +#define HAS_SCALEROWUP2BILINEAR_NEON +#define HAS_SCALEROWUP2LINEAR_12_NEON +#define HAS_SCALEROWUP2BILINEAR_12_NEON +#define HAS_SCALEROWUP2LINEAR_16_NEON +#define HAS_SCALEROWUP2BILINEAR_16_NEON +#define HAS_SCALEUVROWUP2LINEAR_NEON +#define HAS_SCALEUVROWUP2BILINEAR_NEON +#define HAS_SCALEUVROWUP2LINEAR_16_NEON +#define HAS_SCALEUVROWUP2BILINEAR_16_NEON #endif #if !defined(LIBYUV_DISABLE_MSA) && defined(__mips_msa) @@ -279,6 +310,40 @@ void ScaleRowDown34_1_Box_16_C(const uint16_t* src_ptr, ptrdiff_t src_stride, uint16_t* d, int dst_width); + +void ScaleRowUp2_Linear_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_Any_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_Any_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + void ScaleCols_C(uint8_t* dst_ptr, const uint8_t* src_ptr, int dst_width, @@ -416,6 +481,40 @@ void ScaleUVRowDownEvenBox_C(const uint8_t* src_uv, int src_stepx, uint8_t* dst_uv, int dst_width); + +void ScaleUVRowUp2_Linear_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_Any_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_Any_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_Any_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_Any_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + void ScaleUVCols_C(uint8_t* dst_uv, const uint8_t* src_uv, int dst_width, @@ -508,6 +607,120 @@ void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, uint8_t* dst_ptr, int dst_width); + +void ScaleRowUp2_Linear_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_SSSE3(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_SSSE3(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_SSE2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_Any_SSSE3(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_Any_SSSE3(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_Any_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_Any_SSSE3(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_Any_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_Any_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + void ScaleRowDown2_Any_SSSE3(const uint8_t* src_ptr, ptrdiff_t src_stride, uint8_t* dst_ptr, @@ -1033,6 +1246,103 @@ void ScaleUVRowDownEvenBox_Any_MMI(const uint8_t* src_ptr, uint8_t* dst_ptr, int dst_width); +void ScaleUVRowUp2_Linear_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_Any_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_Any_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_Any_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_Any_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_SSE2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_Any_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_Any_SSE2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_Any_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_Any_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleUVRowUp2_Linear_16_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleUVRowUp2_Bilinear_16_Any_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + // ScaleRowDown2Box also used by planar functions // NEON downscalers with interpolation. @@ -1143,6 +1453,55 @@ void ScaleRowDown38_2_Box_Any_NEON(const uint8_t* src_ptr, uint8_t* dst_ptr, int dst_width); +void ScaleRowUp2_Linear_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_Any_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_Any_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_12_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_12_Any_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); +void ScaleRowUp2_Linear_16_Any_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width); +void ScaleRowUp2_Bilinear_16_Any_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width); + void ScaleAddRow_NEON(const uint8_t* src_ptr, uint16_t* dst_ptr, int src_width); void ScaleAddRow_Any_NEON(const uint8_t* src_ptr, uint16_t* dst_ptr, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale_uv.h b/third-party/libyuv/third_party/libyuv/include/libyuv/scale_uv.h similarity index 70% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale_uv.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/scale_uv.h index 1b6327aaed..8e74e3195b 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/scale_uv.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/scale_uv.h @@ -30,6 +30,19 @@ int UVScale(const uint8_t* src_uv, int dst_height, enum FilterMode filtering); +// Scale a 16 bit UV image. +// This function is currently incomplete, it can't handle all cases. +LIBYUV_API +int UVScale_16(const uint16_t* src_uv, + int src_stride_uv, + int src_width, + int src_height, + uint16_t* dst_uv, + int dst_stride_uv, + int dst_width, + int dst_height, + enum FilterMode filtering); + #ifdef __cplusplus } // extern "C" } // namespace libyuv diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/version.h b/third-party/libyuv/third_party/libyuv/include/libyuv/version.h similarity index 94% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/version.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/version.h index efaac73e3a..8b06777fcb 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/version.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/version.h @@ -11,6 +11,6 @@ #ifndef INCLUDE_LIBYUV_VERSION_H_ #define INCLUDE_LIBYUV_VERSION_H_ -#define LIBYUV_VERSION 1768 +#define LIBYUV_VERSION 1789 #endif // INCLUDE_LIBYUV_VERSION_H_ diff --git a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/video_common.h b/third-party/libyuv/third_party/libyuv/include/libyuv/video_common.h similarity index 87% rename from third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/video_common.h rename to third-party/libyuv/third_party/libyuv/include/libyuv/video_common.h index b9823d71d0..32b8a5210b 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/include/libyuv/video_common.h +++ b/third-party/libyuv/third_party/libyuv/include/libyuv/video_common.h @@ -60,17 +60,19 @@ enum FourCC { FOURCC_YUY2 = FOURCC('Y', 'U', 'Y', '2'), FOURCC_UYVY = FOURCC('U', 'Y', 'V', 'Y'), FOURCC_I010 = FOURCC('I', '0', '1', '0'), // bt.601 10 bit 420 - FOURCC_I210 = FOURCC('I', '0', '1', '0'), // bt.601 10 bit 422 + FOURCC_I210 = FOURCC('I', '2', '1', '0'), // bt.601 10 bit 422 // 1 Secondary YUV format: row biplanar. deprecated. FOURCC_M420 = FOURCC('M', '4', '2', '0'), - // 11 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp, 1 10 bpc + // 13 Primary RGB formats: 4 32 bpp, 2 24 bpp, 3 16 bpp, 1 10 bpc 2 64 bpp FOURCC_ARGB = FOURCC('A', 'R', 'G', 'B'), FOURCC_BGRA = FOURCC('B', 'G', 'R', 'A'), FOURCC_ABGR = FOURCC('A', 'B', 'G', 'R'), FOURCC_AR30 = FOURCC('A', 'R', '3', '0'), // 10 bit per channel. 2101010. FOURCC_AB30 = FOURCC('A', 'B', '3', '0'), // ABGR version of 10 bit + FOURCC_AR64 = FOURCC('A', 'R', '6', '4'), // 16 bit per channel. + FOURCC_AB64 = FOURCC('A', 'B', '6', '4'), // ABGR version of 16 bit FOURCC_24BG = FOURCC('2', '4', 'B', 'G'), FOURCC_RAW = FOURCC('r', 'a', 'w', ' '), FOURCC_RGBA = FOURCC('R', 'G', 'B', 'A'), @@ -94,16 +96,23 @@ enum FourCC { FOURCC('J', '4', '4', '4'), // jpeg (bt.601 full), unofficial fourcc FOURCC_J400 = FOURCC('J', '4', '0', '0'), // jpeg (bt.601 full), unofficial fourcc + FOURCC_F420 = FOURCC('F', '4', '2', '0'), // bt.709 full, unofficial fourcc + FOURCC_F422 = FOURCC('F', '4', '2', '2'), // bt.709 full, unofficial fourcc + FOURCC_F444 = FOURCC('F', '4', '4', '4'), // bt.709 full, unofficial fourcc FOURCC_H420 = FOURCC('H', '4', '2', '0'), // bt.709, unofficial fourcc FOURCC_H422 = FOURCC('H', '4', '2', '2'), // bt.709, unofficial fourcc FOURCC_H444 = FOURCC('H', '4', '4', '4'), // bt.709, unofficial fourcc FOURCC_U420 = FOURCC('U', '4', '2', '0'), // bt.2020, unofficial fourcc FOURCC_U422 = FOURCC('U', '4', '2', '2'), // bt.2020, unofficial fourcc FOURCC_U444 = FOURCC('U', '4', '4', '4'), // bt.2020, unofficial fourcc + FOURCC_F010 = FOURCC('F', '0', '1', '0'), // bt.709 full range 10 bit 420 FOURCC_H010 = FOURCC('H', '0', '1', '0'), // bt.709 10 bit 420 FOURCC_U010 = FOURCC('U', '0', '1', '0'), // bt.2020 10 bit 420 - FOURCC_H210 = FOURCC('H', '0', '1', '0'), // bt.709 10 bit 422 - FOURCC_U210 = FOURCC('U', '0', '1', '0'), // bt.2020 10 bit 422 + FOURCC_F210 = FOURCC('F', '2', '1', '0'), // bt.709 full range 10 bit 422 + FOURCC_H210 = FOURCC('H', '2', '1', '0'), // bt.709 10 bit 422 + FOURCC_U210 = FOURCC('U', '2', '1', '0'), // bt.2020 10 bit 422 + FOURCC_P010 = FOURCC('P', '0', '1', '0'), + FOURCC_P210 = FOURCC('P', '2', '1', '0'), // 14 Auxiliary aliases. CanonicalFourCC() maps these to canonical fourcc. FOURCC_IYUV = FOURCC('I', 'Y', 'U', 'V'), // Alias for I420. @@ -156,6 +165,8 @@ enum FourCCBpp { FOURCC_BPP_RGBA = 32, FOURCC_BPP_AR30 = 32, FOURCC_BPP_AB30 = 32, + FOURCC_BPP_AR64 = 64, + FOURCC_BPP_AB64 = 64, FOURCC_BPP_24BG = 24, FOURCC_BPP_RAW = 24, FOURCC_BPP_RGBP = 16, @@ -173,7 +184,12 @@ enum FourCCBpp { FOURCC_BPP_J400 = 8, FOURCC_BPP_H420 = 12, FOURCC_BPP_H422 = 16, - FOURCC_BPP_H010 = 24, + FOURCC_BPP_I010 = 15, + FOURCC_BPP_I210 = 20, + FOURCC_BPP_H010 = 15, + FOURCC_BPP_H210 = 20, + FOURCC_BPP_P010 = 15, + FOURCC_BPP_P210 = 20, FOURCC_BPP_MJPG = 0, // 0 means unknown. FOURCC_BPP_H264 = 0, FOURCC_BPP_IYUV = 12, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/libyuv.gni b/third-party/libyuv/third_party/libyuv/libyuv.gni similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/libyuv.gni rename to third-party/libyuv/third_party/libyuv/libyuv.gni diff --git a/third-party/webrtc/dependencies/third_party/libyuv/linux.mk b/third-party/libyuv/third_party/libyuv/linux.mk similarity index 88% rename from third-party/webrtc/dependencies/third_party/libyuv/linux.mk rename to third-party/libyuv/third_party/libyuv/linux.mk index 3e93b710d4..f5e73ea497 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/linux.mk +++ b/third-party/libyuv/third_party/libyuv/linux.mk @@ -66,7 +66,7 @@ LOCAL_OBJ_FILES := \ .c.o: $(CC) -c $(CFLAGS) $*.c -o $*.o -all: libyuv.a i444tonv12_eg yuvconvert cpuid psnr +all: libyuv.a i444tonv12_eg yuvconvert yuvconstants cpuid psnr libyuv.a: $(LOCAL_OBJ_FILES) $(AR) $(ARFLAGS) $@ $(LOCAL_OBJ_FILES) @@ -75,13 +75,17 @@ libyuv.a: $(LOCAL_OBJ_FILES) yuvconvert: util/yuvconvert.cc libyuv.a $(CXX) $(CXXFLAGS) -Iutil/ -o $@ util/yuvconvert.cc libyuv.a +# A C test utility that generates yuvconstants for yuv to rgb. +yuvconstants: util/yuvconstants.c libyuv.a + $(CXX) $(CXXFLAGS) -Iutil/ -lm -o $@ util/yuvconstants.c libyuv.a + # A standalone test utility psnr: util/psnr.cc $(CXX) $(CXXFLAGS) -Iutil/ -o $@ util/psnr.cc util/psnr_main.cc util/ssim.cc # A simple conversion example. i444tonv12_eg: util/i444tonv12_eg.cc libyuv.a - $(CC) $(CFLAGS) -o $@ util/i444tonv12_eg.cc libyuv.a + $(CXX) $(CXXFLAGS) -o $@ util/i444tonv12_eg.cc libyuv.a # A C test utility that uses libyuv conversion from C. # gcc 4.4 and older require -fno-exceptions to avoid link error on __gxx_personality_v0 @@ -90,4 +94,4 @@ cpuid: util/cpuid.c libyuv.a $(CC) $(CFLAGS) -o $@ util/cpuid.c libyuv.a clean: - /bin/rm -f source/*.o *.ii *.s libyuv.a i444tonv12_eg yuvconvert cpuid psnr + /bin/rm -f source/*.o *.ii *.s libyuv.a i444tonv12_eg yuvconvert yuvconstants cpuid psnr diff --git a/third-party/webrtc/dependencies/third_party/libyuv/public.mk b/third-party/libyuv/third_party/libyuv/public.mk similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/public.mk rename to third-party/libyuv/third_party/libyuv/public.mk diff --git a/third-party/webrtc/dependencies/third_party/libyuv/pylintrc b/third-party/libyuv/third_party/libyuv/pylintrc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/pylintrc rename to third-party/libyuv/third_party/libyuv/pylintrc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/compare.cc b/third-party/libyuv/third_party/libyuv/source/compare.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/compare.cc rename to third-party/libyuv/third_party/libyuv/source/compare.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_common.cc b/third-party/libyuv/third_party/libyuv/source/compare_common.cc similarity index 78% rename from third-party/webrtc/dependencies/third_party/libyuv/source/compare_common.cc rename to third-party/libyuv/third_party/libyuv/source/compare_common.cc index d4b170ad98..d1cab8d2b4 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_common.cc +++ b/third-party/libyuv/third_party/libyuv/source/compare_common.cc @@ -17,36 +17,6 @@ namespace libyuv { extern "C" { #endif -#if ORIGINAL_OPT -uint32_t HammingDistance_C1(const uint8_t* src_a, - const uint8_t* src_b, - int count) { - uint32_t diff = 0u; - - int i; - for (i = 0; i < count; ++i) { - int x = src_a[i] ^ src_b[i]; - if (x & 1) - ++diff; - if (x & 2) - ++diff; - if (x & 4) - ++diff; - if (x & 8) - ++diff; - if (x & 16) - ++diff; - if (x & 32) - ++diff; - if (x & 64) - ++diff; - if (x & 128) - ++diff; - } - return diff; -} -#endif - // Hakmem method for hamming distance. uint32_t HammingDistance_C(const uint8_t* src_a, const uint8_t* src_b, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_gcc.cc b/third-party/libyuv/third_party/libyuv/source/compare_gcc.cc similarity index 99% rename from third-party/webrtc/dependencies/third_party/libyuv/source/compare_gcc.cc rename to third-party/libyuv/third_party/libyuv/source/compare_gcc.cc index 6700f9697e..b834b42ac4 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_gcc.cc +++ b/third-party/libyuv/third_party/libyuv/source/compare_gcc.cc @@ -19,8 +19,7 @@ extern "C" { #endif // This module is for GCC x86 and x64. -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) #if defined(__x86_64__) uint32_t HammingDistance_SSE42(const uint8_t* src_a, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_mmi.cc b/third-party/libyuv/third_party/libyuv/source/compare_mmi.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/compare_mmi.cc rename to third-party/libyuv/third_party/libyuv/source/compare_mmi.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_msa.cc b/third-party/libyuv/third_party/libyuv/source/compare_msa.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/compare_msa.cc rename to third-party/libyuv/third_party/libyuv/source/compare_msa.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_neon.cc b/third-party/libyuv/third_party/libyuv/source/compare_neon.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/compare_neon.cc rename to third-party/libyuv/third_party/libyuv/source/compare_neon.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_neon64.cc b/third-party/libyuv/third_party/libyuv/source/compare_neon64.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/compare_neon64.cc rename to third-party/libyuv/third_party/libyuv/source/compare_neon64.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_win.cc b/third-party/libyuv/third_party/libyuv/source/compare_win.cc similarity index 96% rename from third-party/webrtc/dependencies/third_party/libyuv/source/compare_win.cc rename to third-party/libyuv/third_party/libyuv/source/compare_win.cc index d57d3d9d1c..9bb27f1dd1 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/compare_win.cc +++ b/third-party/libyuv/third_party/libyuv/source/compare_win.cc @@ -22,8 +22,9 @@ namespace libyuv { extern "C" { #endif -// This module is for 32 bit Visual C x86 and clangcl -#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) +// This module is for 32 bit Visual C x86 +#if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && \ + !defined(__clang__) && defined(_M_IX86) uint32_t HammingDistance_SSE42(const uint8_t* src_a, const uint8_t* src_b, @@ -77,8 +78,7 @@ __declspec(naked) uint32_t } } -// Visual C 2012 required for AVX2. -#if _MSC_VER >= 1700 +#ifdef HAS_SUMSQUAREERROR_AVX2 // C4752: found Intel(R) Advanced Vector Extensions; consider using /arch:AVX. #pragma warning(disable : 4752) __declspec(naked) uint32_t @@ -118,7 +118,7 @@ __declspec(naked) uint32_t ret } } -#endif // _MSC_VER >= 1700 +#endif // HAS_SUMSQUAREERROR_AVX2 uvec32 kHash16x33 = {0x92d9e201, 0, 0, 0}; // 33 ^ 16 uvec32 kHashMul0 = { @@ -196,7 +196,7 @@ __declspec(naked) uint32_t } // Visual C 2012 required for AVX2. -#if _MSC_VER >= 1700 +#ifdef HAS_HASHDJB2_AVX2 __declspec(naked) uint32_t HashDjb2_AVX2(const uint8_t* src, int count, uint32_t seed) { __asm { @@ -231,7 +231,7 @@ __declspec(naked) uint32_t ret } } -#endif // _MSC_VER >= 1700 +#endif // HAS_HASHDJB2_AVX2 #endif // !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/convert.cc b/third-party/libyuv/third_party/libyuv/source/convert.cc similarity index 77% rename from third-party/webrtc/dependencies/third_party/libyuv/source/convert.cc rename to third-party/libyuv/third_party/libyuv/source/convert.cc index 98258b9bc9..69f7fb6e01 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/convert.cc +++ b/third-party/libyuv/third_party/libyuv/source/convert.cc @@ -15,7 +15,8 @@ #include "libyuv/planar_functions.h" #include "libyuv/rotate.h" #include "libyuv/row.h" -#include "libyuv/scale.h" // For ScalePlane() +#include "libyuv/scale.h" // For ScalePlane() +#include "libyuv/scale_uv.h" // For UVScale() #ifdef __cplusplus namespace libyuv { @@ -48,7 +49,7 @@ static int I4xxToI420(const uint8_t* src_y, const int dst_y_height = Abs(src_y_height); const int dst_uv_width = SUBSAMPLE(dst_y_width, 1, 1); const int dst_uv_height = SUBSAMPLE(dst_y_height, 1, 1); - if (src_uv_width == 0 || src_uv_height == 0) { + if (src_uv_width <= 0 || src_uv_height == 0) { return -1; } if (dst_y) { @@ -148,6 +149,52 @@ int I010Copy(const uint16_t* src_y, return 0; } +static int Planar16bitTo8bit(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height, + int subsample_x, + int subsample_y, + int depth) { + int uv_width = SUBSAMPLE(width, subsample_x, subsample_x); + int uv_height = SUBSAMPLE(height, subsample_y, subsample_y); + int scale = 1 << (24 - depth); + if (!src_u || !src_v || !dst_u || !dst_v || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + uv_height = -uv_height; + src_y = src_y + (height - 1) * src_stride_y; + src_u = src_u + (uv_height - 1) * src_stride_u; + src_v = src_v + (uv_height - 1) * src_stride_v; + src_stride_y = -src_stride_y; + src_stride_u = -src_stride_u; + src_stride_v = -src_stride_v; + } + + // Convert Y plane. + Convert16To8Plane(src_y, src_stride_y, dst_y, dst_stride_y, scale, width, + height); + // Convert UV planes. + Convert16To8Plane(src_u, src_stride_u, dst_u, dst_stride_u, scale, uv_width, + uv_height); + Convert16To8Plane(src_v, src_stride_v, dst_v, dst_stride_v, scale, uv_width, + uv_height); + return 0; +} + // Convert 10 bit YUV to 8 bit. LIBYUV_API int I010ToI420(const uint16_t* src_y, @@ -164,34 +211,295 @@ int I010ToI420(const uint16_t* src_y, int dst_stride_v, int width, int height) { - int halfwidth = (width + 1) >> 1; - int halfheight = (height + 1) >> 1; - if (!src_u || !src_v || !dst_u || !dst_v || width <= 0 || height == 0) { + return Planar16bitTo8bit(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_u, + dst_stride_u, dst_v, dst_stride_v, width, height, 1, + 1, 10); +} + +LIBYUV_API +int I210ToI422(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height) { + return Planar16bitTo8bit(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_u, + dst_stride_u, dst_v, dst_stride_v, width, height, 1, + 0, 10); +} + +LIBYUV_API +int I410ToI444(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height) { + return Planar16bitTo8bit(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_u, + dst_stride_u, dst_v, dst_stride_v, width, height, 0, + 0, 10); +} + +LIBYUV_API +int I012ToI420(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height) { + return Planar16bitTo8bit(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_u, + dst_stride_u, dst_v, dst_stride_v, width, height, 1, + 1, 12); +} + +LIBYUV_API +int I212ToI422(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height) { + return Planar16bitTo8bit(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_u, + dst_stride_u, dst_v, dst_stride_v, width, height, 1, + 0, 12); +} + +LIBYUV_API +int I412ToI444(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height) { + return Planar16bitTo8bit(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_u, + dst_stride_u, dst_v, dst_stride_v, width, height, 0, + 0, 12); +} + +// Any Ix10 To I010 format with mirroring. +static int Ix10ToI010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height, + int subsample_x, + int subsample_y) { + const int dst_y_width = Abs(width); + const int dst_y_height = Abs(height); + const int src_uv_width = SUBSAMPLE(width, subsample_x, subsample_x); + const int src_uv_height = SUBSAMPLE(height, subsample_y, subsample_y); + const int dst_uv_width = SUBSAMPLE(dst_y_width, 1, 1); + const int dst_uv_height = SUBSAMPLE(dst_y_height, 1, 1); + if (width <= 0 || height == 0) { return -1; } - // Negative height means invert the image. - if (height < 0) { - height = -height; - halfheight = (height + 1) >> 1; - src_y = src_y + (height - 1) * src_stride_y; - src_u = src_u + (halfheight - 1) * src_stride_u; - src_v = src_v + (halfheight - 1) * src_stride_v; - src_stride_y = -src_stride_y; - src_stride_u = -src_stride_u; - src_stride_v = -src_stride_v; + if (dst_y) { + ScalePlane_12(src_y, src_stride_y, width, height, dst_y, dst_stride_y, + dst_y_width, dst_y_height, kFilterBilinear); + } + ScalePlane_12(src_u, src_stride_u, src_uv_width, src_uv_height, dst_u, + dst_stride_u, dst_uv_width, dst_uv_height, kFilterBilinear); + ScalePlane_12(src_v, src_stride_v, src_uv_width, src_uv_height, dst_v, + dst_stride_v, dst_uv_width, dst_uv_height, kFilterBilinear); + return 0; +} + +LIBYUV_API +int I410ToI010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height) { + return Ix10ToI010(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_u, dst_stride_u, + dst_v, dst_stride_v, width, height, 0, 0); +} + +LIBYUV_API +int I210ToI010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height) { + return Ix10ToI010(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_u, dst_stride_u, + dst_v, dst_stride_v, width, height, 1, 0); +} + +// Any I[420]1[02] to P[420]1[02] format with mirroring. +static int IxxxToPxxx(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height, + int subsample_x, + int subsample_y, + int depth) { + const int uv_width = SUBSAMPLE(width, subsample_x, subsample_x); + const int uv_height = SUBSAMPLE(height, subsample_y, subsample_y); + if (width <= 0 || height == 0) { + return -1; } - // Convert Y plane. - Convert16To8Plane(src_y, src_stride_y, dst_y, dst_stride_y, 16384, width, - height); - // Convert UV planes. - Convert16To8Plane(src_u, src_stride_u, dst_u, dst_stride_u, 16384, halfwidth, - halfheight); - Convert16To8Plane(src_v, src_stride_v, dst_v, dst_stride_v, 16384, halfwidth, - halfheight); + ConvertToMSBPlane_16(src_y, src_stride_y, dst_y, dst_stride_y, width, height, + depth); + MergeUVPlane_16(src_u, src_stride_u, src_v, src_stride_v, dst_uv, + dst_stride_uv, uv_width, uv_height, depth); return 0; } +LIBYUV_API +int I010ToP010(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height) { + return IxxxToPxxx(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_uv, dst_stride_uv, + width, height, 1, 1, 10); +} + +LIBYUV_API +int I210ToP210(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height) { + return IxxxToPxxx(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_uv, dst_stride_uv, + width, height, 1, 0, 10); +} + +LIBYUV_API +int I012ToP012(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height) { + return IxxxToPxxx(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_uv, dst_stride_uv, + width, height, 1, 1, 12); +} + +LIBYUV_API +int I212ToP212(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height) { + return IxxxToPxxx(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, dst_y, dst_stride_y, dst_uv, dst_stride_uv, + width, height, 1, 0, 12); +} + // 422 chroma is 1/2 width, 1x height // 420 chroma is 1/2 width, 1/2 height LIBYUV_API @@ -613,6 +921,104 @@ int NV21ToI420(const uint8_t* src_y, width, height); } +LIBYUV_API +int NV12ToNV24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height) { + if (width <= 0 || height == 0) { + return -1; + } + + if (dst_y) { + ScalePlane(src_y, src_stride_y, width, height, dst_y, dst_stride_y, + Abs(width), Abs(height), kFilterBilinear); + } + UVScale(src_uv, src_stride_uv, SUBSAMPLE(width, 1, 1), + SUBSAMPLE(height, 1, 1), dst_uv, dst_stride_uv, Abs(width), + Abs(height), kFilterBilinear); + return 0; +} + +LIBYUV_API +int NV16ToNV24(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height) { + if (width <= 0 || height == 0) { + return -1; + } + + if (dst_y) { + ScalePlane(src_y, src_stride_y, width, height, dst_y, dst_stride_y, + Abs(width), Abs(height), kFilterBilinear); + } + UVScale(src_uv, src_stride_uv, SUBSAMPLE(width, 1, 1), height, dst_uv, + dst_stride_uv, Abs(width), Abs(height), kFilterBilinear); + return 0; +} + +LIBYUV_API +int P010ToP410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height) { + if (width <= 0 || height == 0) { + return -1; + } + + if (dst_y) { + ScalePlane_16(src_y, src_stride_y, width, height, dst_y, dst_stride_y, + Abs(width), Abs(height), kFilterBilinear); + } + UVScale_16(src_uv, src_stride_uv, SUBSAMPLE(width, 1, 1), + SUBSAMPLE(height, 1, 1), dst_uv, dst_stride_uv, Abs(width), + Abs(height), kFilterBilinear); + return 0; +} + +LIBYUV_API +int P210ToP410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height) { + if (width <= 0 || height == 0) { + return -1; + } + + if (dst_y) { + ScalePlane_16(src_y, src_stride_y, width, height, dst_y, dst_stride_y, + Abs(width), Abs(height), kFilterBilinear); + } + UVScale_16(src_uv, src_stride_uv, SUBSAMPLE(width, 1, 1), height, dst_uv, + dst_stride_uv, Abs(width), Abs(height), kFilterBilinear); + return 0; +} + // Convert YUY2 to I420. LIBYUV_API int YUY2ToI420(const uint8_t* src_yuy2, @@ -962,6 +1368,18 @@ int ARGBToI420(const uint8_t* src_argb, src_argb = src_argb + (height - 1) * src_stride_argb; src_stride_argb = -src_stride_argb; } +#if defined(HAS_ARGBTOYROW_NEON) && defined(HAS_ARGBTOUVROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToYRow = ARGBToYRow_Any_NEON; + ARGBToUVRow = ARGBToUVRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBToYRow = ARGBToYRow_NEON; + if (IS_ALIGNED(width, 16)) { + ARGBToUVRow = ARGBToUVRow_NEON; + } + } + } +#endif #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { ARGBToUVRow = ARGBToUVRow_Any_SSSE3; @@ -982,22 +1400,6 @@ int ARGBToI420(const uint8_t* src_argb, } } #endif -#if defined(HAS_ARGBTOYROW_NEON) - if (TestCpuFlag(kCpuHasNEON)) { - ARGBToYRow = ARGBToYRow_Any_NEON; - if (IS_ALIGNED(width, 8)) { - ARGBToYRow = ARGBToYRow_NEON; - } - } -#endif -#if defined(HAS_ARGBTOUVROW_NEON) - if (TestCpuFlag(kCpuHasNEON)) { - ARGBToUVRow = ARGBToUVRow_Any_NEON; - if (IS_ALIGNED(width, 16)) { - ARGBToUVRow = ARGBToUVRow_NEON; - } - } -#endif #if defined(HAS_ARGBTOYROW_MMI) && defined(HAS_ARGBTOUVROW_MMI) if (TestCpuFlag(kCpuHasMMI)) { ARGBToYRow = ARGBToYRow_Any_MMI; @@ -1365,7 +1767,7 @@ int RGB24ToI420(const uint8_t* src_rgb24, } // Neon version does direct RGB24 to YUV. -#if defined(HAS_RGB24TOYROW_NEON) +#if defined(HAS_RGB24TOYROW_NEON) && defined(HAS_RGB24TOUVROW_NEON) if (TestCpuFlag(kCpuHasNEON)) { RGB24ToUVRow = RGB24ToUVRow_Any_NEON; RGB24ToYRow = RGB24ToYRow_Any_NEON; @@ -1402,6 +1804,14 @@ int RGB24ToI420(const uint8_t* src_rgb24, #endif // Other platforms do intermediate conversion from RGB24 to ARGB. #else +#if defined(HAS_RGB24TOARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RGB24ToARGBRow = RGB24ToARGBRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + RGB24ToARGBRow = RGB24ToARGBRow_NEON; + } + } +#endif #if defined(HAS_RGB24TOARGBROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { RGB24ToARGBRow = RGB24ToARGBRow_Any_SSSE3; @@ -1410,6 +1820,18 @@ int RGB24ToI420(const uint8_t* src_rgb24, } } #endif +#if defined(HAS_ARGBTOYROW_NEON) && defined(HAS_ARGBTOUVROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToUVRow = ARGBToUVRow_Any_NEON; + ARGBToYRow = ARGBToYRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBToYRow = ARGBToYRow_NEON; + if (IS_ALIGNED(width, 16)) { + ARGBToUVRow = ARGBToUVRow_NEON; + } + } + } +#endif #if defined(HAS_ARGBTOYROW_SSSE3) && defined(HAS_ARGBTOUVROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { ARGBToUVRow = ARGBToUVRow_Any_SSSE3; @@ -1554,6 +1976,14 @@ int RGB24ToJ420(const uint8_t* src_rgb24, } #endif #else +#if defined(HAS_RGB24TOARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RGB24ToARGBRow = RGB24ToARGBRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + RGB24ToARGBRow = RGB24ToARGBRow_NEON; + } + } +#endif #if defined(HAS_RGB24TOARGBROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { RGB24ToARGBRow = RGB24ToARGBRow_Any_SSSE3; @@ -1562,6 +1992,18 @@ int RGB24ToJ420(const uint8_t* src_rgb24, } } #endif +#if defined(HAS_ARGBTOYJROW_NEON) && defined(HAS_ARGBTOUVJROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToUVJRow = ARGBToUVJRow_Any_NEON; + ARGBToYJRow = ARGBToYJRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBToYJRow = ARGBToYJRow_NEON; + if (IS_ALIGNED(width, 16)) { + ARGBToUVJRow = ARGBToUVJRow_NEON; + } + } + } +#endif #if defined(HAS_ARGBTOYJROW_SSSE3) && defined(HAS_ARGBTOUVJROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3; @@ -1705,6 +2147,26 @@ int RAWToI420(const uint8_t* src_raw, #endif // Other platforms do intermediate conversion from RAW to ARGB. #else +#if defined(HAS_RAWTOARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RAWToARGBRow = RAWToARGBRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + RAWToARGBRow = RAWToARGBRow_NEON; + } + } +#endif +#if defined(HAS_ARGBTOYROW_NEON) && defined(HAS_ARGBTOUVROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToUVRow = ARGBToUVRow_Any_NEON; + ARGBToYRow = ARGBToYRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBToYRow = ARGBToYRow_NEON; + if (IS_ALIGNED(width, 16)) { + ARGBToUVRow = ARGBToUVRow_NEON; + } + } + } +#endif #if defined(HAS_RAWTOARGBROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { RAWToARGBRow = RAWToARGBRow_Any_SSSE3; @@ -1780,6 +2242,178 @@ int RAWToI420(const uint8_t* src_raw, return 0; } +// TODO(fbarchard): Use Matrix version to implement I420 and J420. +// Convert RAW to J420. +LIBYUV_API +int RAWToJ420(const uint8_t* src_raw, + int src_stride_raw, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height) { + int y; +#if (defined(HAS_RAWTOYJROW_NEON) && defined(HAS_RAWTOUVJROW_NEON)) || \ + defined(HAS_RAWTOYJROW_MSA) || defined(HAS_RAWTOYJROW_MMI) + void (*RAWToUVJRow)(const uint8_t* src_raw, int src_stride_raw, + uint8_t* dst_u, uint8_t* dst_v, int width) = + RAWToUVJRow_C; + void (*RAWToYJRow)(const uint8_t* src_raw, uint8_t* dst_y, int width) = + RAWToYJRow_C; +#else + void (*RAWToARGBRow)(const uint8_t* src_rgb, uint8_t* dst_argb, int width) = + RAWToARGBRow_C; + void (*ARGBToUVJRow)(const uint8_t* src_argb0, int src_stride_argb, + uint8_t* dst_u, uint8_t* dst_v, int width) = + ARGBToUVJRow_C; + void (*ARGBToYJRow)(const uint8_t* src_argb, uint8_t* dst_y, int width) = + ARGBToYJRow_C; +#endif + if (!src_raw || !dst_y || !dst_u || !dst_v || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_raw = src_raw + (height - 1) * src_stride_raw; + src_stride_raw = -src_stride_raw; + } + +// Neon version does direct RAW to YUV. +#if defined(HAS_RAWTOYJROW_NEON) && defined(HAS_RAWTOUVJROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RAWToUVJRow = RAWToUVJRow_Any_NEON; + RAWToYJRow = RAWToYJRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + RAWToYJRow = RAWToYJRow_NEON; + if (IS_ALIGNED(width, 16)) { + RAWToUVJRow = RAWToUVJRow_NEON; + } + } + } +// MMI and MSA version does direct RAW to YUV. +#elif (defined(HAS_RAWTOYJROW_MMI) || defined(HAS_RAWTOYJROW_MSA)) +#if defined(HAS_RAWTOYJROW_MMI) && defined(HAS_RAWTOUVJROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + RAWToUVJRow = RAWToUVJRow_Any_MMI; + RAWToYJRow = RAWToYJRow_Any_MMI; + if (IS_ALIGNED(width, 8)) { + RAWToYJRow = RAWToYJRow_MMI; + if (IS_ALIGNED(width, 16)) { + RAWToUVJRow = RAWToUVJRow_MMI; + } + } + } +#endif +#if defined(HAS_RAWTOYJROW_MSA) && defined(HAS_RAWTOUVJROW_MSA) + if (TestCpuFlag(kCpuHasMSA)) { + RAWToUVJRow = RAWToUVJRow_Any_MSA; + RAWToYJRow = RAWToYJRow_Any_MSA; + if (IS_ALIGNED(width, 16)) { + RAWToYJRow = RAWToYJRow_MSA; + RAWToUVJRow = RAWToUVJRow_MSA; + } + } +#endif +#else +#if defined(HAS_RAWTOARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + RAWToARGBRow = RAWToARGBRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + RAWToARGBRow = RAWToARGBRow_NEON; + } + } +#endif +#if defined(HAS_ARGBTOYJROW_NEON) && defined(HAS_ARGBTOUVJROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToUVJRow = ARGBToUVJRow_Any_NEON; + ARGBToYJRow = ARGBToYJRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBToYJRow = ARGBToYJRow_NEON; + if (IS_ALIGNED(width, 16)) { + ARGBToUVJRow = ARGBToUVJRow_NEON; + } + } + } +#endif +#if defined(HAS_RAWTOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + RAWToARGBRow = RAWToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 16)) { + RAWToARGBRow = RAWToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBTOYJROW_SSSE3) && defined(HAS_ARGBTOUVJROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBToUVJRow = ARGBToUVJRow_Any_SSSE3; + ARGBToYJRow = ARGBToYJRow_Any_SSSE3; + if (IS_ALIGNED(width, 16)) { + ARGBToUVJRow = ARGBToUVJRow_SSSE3; + ARGBToYJRow = ARGBToYJRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBTOYJROW_AVX2) && defined(HAS_ARGBTOUVJROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBToUVJRow = ARGBToUVJRow_Any_AVX2; + ARGBToYJRow = ARGBToYJRow_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + ARGBToUVJRow = ARGBToUVJRow_AVX2; + ARGBToYJRow = ARGBToYJRow_AVX2; + } + } +#endif +#endif + + { +#if !((defined(HAS_RAWTOYJROW_NEON) && defined(HAS_RAWTOUVJROW_NEON)) || \ + defined(HAS_RAWTOYJROW_MSA) || defined(HAS_RAWTOYJROW_MMI)) + // Allocate 2 rows of ARGB. + const int kRowSize = (width * 4 + 31) & ~31; + align_buffer_64(row, kRowSize * 2); +#endif + + for (y = 0; y < height - 1; y += 2) { +#if ((defined(HAS_RAWTOYJROW_NEON) && defined(HAS_RAWTOUVJROW_NEON)) || \ + defined(HAS_RAWTOYJROW_MSA) || defined(HAS_RAWTOYJROW_MMI)) + RAWToUVJRow(src_raw, src_stride_raw, dst_u, dst_v, width); + RAWToYJRow(src_raw, dst_y, width); + RAWToYJRow(src_raw + src_stride_raw, dst_y + dst_stride_y, width); +#else + RAWToARGBRow(src_raw, row, width); + RAWToARGBRow(src_raw + src_stride_raw, row + kRowSize, width); + ARGBToUVJRow(row, kRowSize, dst_u, dst_v, width); + ARGBToYJRow(row, dst_y, width); + ARGBToYJRow(row + kRowSize, dst_y + dst_stride_y, width); +#endif + src_raw += src_stride_raw * 2; + dst_y += dst_stride_y * 2; + dst_u += dst_stride_u; + dst_v += dst_stride_v; + } + if (height & 1) { +#if ((defined(HAS_RAWTOYJROW_NEON) && defined(HAS_RAWTOUVJROW_NEON)) || \ + defined(HAS_RAWTOYJROW_MSA) || defined(HAS_RAWTOYJROW_MMI)) + RAWToUVJRow(src_raw, 0, dst_u, dst_v, width); + RAWToYJRow(src_raw, dst_y, width); +#else + RAWToARGBRow(src_raw, row, width); + ARGBToUVJRow(row, 0, dst_u, dst_v, width); + ARGBToYJRow(row, dst_y, width); +#endif + } +#if !((defined(HAS_RAWTOYJROW_NEON) && defined(HAS_RAWTOUVJROW_NEON)) || \ + defined(HAS_RAWTOYJROW_MSA) || defined(HAS_RAWTOYJROW_MMI)) + free_aligned_buffer_64(row); +#endif + } + return 0; +} + // Convert RGB565 to I420. LIBYUV_API int RGB565ToI420(const uint8_t* src_rgb565, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_argb.cc b/third-party/libyuv/third_party/libyuv/source/convert_argb.cc similarity index 76% rename from third-party/webrtc/dependencies/third_party/libyuv/source/convert_argb.cc rename to third-party/libyuv/third_party/libyuv/source/convert_argb.cc index 5e7225faf2..d8f7b27738 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_argb.cc +++ b/third-party/libyuv/third_party/libyuv/source/convert_argb.cc @@ -888,6 +888,63 @@ int U010ToAB30(const uint16_t* src_y, &kYuv2020Constants, width, height); } +// Convert 12 bit YUV to ARGB with matrix. +// TODO(fbarchard): Consider passing scale multiplier to I212ToARGB to +// multiply 12 bit yuv into high bits to allow any number of bits. +LIBYUV_API +int I012ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height) { + int y; + void (*I212ToAR30Row)(const uint16_t* y_buf, const uint16_t* u_buf, + const uint16_t* v_buf, uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, int width) = + I212ToAR30Row_C; + if (!src_y || !src_u || !src_v || !dst_ar30 || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_ar30 = dst_ar30 + (height - 1) * dst_stride_ar30; + dst_stride_ar30 = -dst_stride_ar30; + } +#if defined(HAS_I212TOAR30ROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I212ToAR30Row = I212ToAR30Row_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I212ToAR30Row = I212ToAR30Row_SSSE3; + } + } +#endif +#if defined(HAS_I212TOAR30ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I212ToAR30Row = I212ToAR30Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I212ToAR30Row = I212ToAR30Row_AVX2; + } + } +#endif + for (y = 0; y < height; ++y) { + I212ToAR30Row(src_y, src_u, src_v, dst_ar30, yuvconstants, width); + dst_ar30 += dst_stride_ar30; + src_y += src_stride_y; + if (y & 1) { + src_u += src_stride_u; + src_v += src_stride_v; + } + } + return 0; +} + // Convert 10 bit YUV to ARGB with matrix. // TODO(fbarchard): Consider passing scale multiplier to I210ToARGB to // multiply 10 bit yuv into high bits to allow any number of bits. @@ -1045,6 +1102,58 @@ int U210ToAB30(const uint16_t* src_y, &kYuv2020Constants, width, height); } +LIBYUV_API +int I410ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height) { + int y; + void (*I410ToAR30Row)(const uint16_t* y_buf, const uint16_t* u_buf, + const uint16_t* v_buf, uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, int width) = + I410ToAR30Row_C; + if (!src_y || !src_u || !src_v || !dst_ar30 || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_ar30 = dst_ar30 + (height - 1) * dst_stride_ar30; + dst_stride_ar30 = -dst_stride_ar30; + } +#if defined(HAS_I410TOAR30ROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I410ToAR30Row = I410ToAR30Row_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I410ToAR30Row = I410ToAR30Row_SSSE3; + } + } +#endif +#if defined(HAS_I410TOAR30ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I410ToAR30Row = I410ToAR30Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I410ToAR30Row = I410ToAR30Row_AVX2; + } + } +#endif + for (y = 0; y < height; ++y) { + I410ToAR30Row(src_y, src_u, src_v, dst_ar30, yuvconstants, width); + dst_ar30 += dst_stride_ar30; + src_y += src_stride_y; + src_u += src_stride_u; + src_v += src_stride_v; + } + return 0; +} + // Convert 10 bit YUV to ARGB with matrix. LIBYUV_API int I010ToARGBMatrix(const uint16_t* src_y, @@ -1087,14 +1196,6 @@ int I010ToARGBMatrix(const uint16_t* src_y, I210ToARGBRow = I210ToARGBRow_AVX2; } } -#endif -#if defined(HAS_I210TOARGBROW_MMI) - if (TestCpuFlag(kCpuHasMMI)) { - I210ToARGBRow = I210ToARGBRow_Any_MMI; - if (IS_ALIGNED(width, 4)) { - I210ToARGBRow = I210ToARGBRow_MMI; - } - } #endif for (y = 0; y < height; ++y) { I210ToARGBRow(src_y, src_u, src_v, dst_argb, yuvconstants, width); @@ -1216,6 +1317,61 @@ int U010ToABGR(const uint16_t* src_y, width, height); } +// Convert 12 bit YUV to ARGB with matrix. +LIBYUV_API +int I012ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height) { + int y; + void (*I212ToARGBRow)(const uint16_t* y_buf, const uint16_t* u_buf, + const uint16_t* v_buf, uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, int width) = + I212ToARGBRow_C; + if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_I212TOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I212ToARGBRow = I212ToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I212ToARGBRow = I212ToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_I212TOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I212ToARGBRow = I212ToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I212ToARGBRow = I212ToARGBRow_AVX2; + } + } +#endif + for (y = 0; y < height; ++y) { + I212ToARGBRow(src_y, src_u, src_v, dst_argb, yuvconstants, width); + dst_argb += dst_stride_argb; + src_y += src_stride_y; + if (y & 1) { + src_u += src_stride_u; + src_v += src_stride_v; + } + } + return 0; +} + // Convert 10 bit 422 YUV to ARGB with matrix. LIBYUV_API int I210ToARGBMatrix(const uint16_t* src_y, @@ -1258,14 +1414,6 @@ int I210ToARGBMatrix(const uint16_t* src_y, I210ToARGBRow = I210ToARGBRow_AVX2; } } -#endif -#if defined(HAS_I210TOARGBROW_MMI) - if (TestCpuFlag(kCpuHasMMI)) { - I210ToARGBRow = I210ToARGBRow_Any_MMI; - if (IS_ALIGNED(width, 4)) { - I210ToARGBRow = I210ToARGBRow_MMI; - } - } #endif for (y = 0; y < height; ++y) { I210ToARGBRow(src_y, src_u, src_v, dst_argb, yuvconstants, width); @@ -1385,6 +1533,254 @@ int U210ToABGR(const uint16_t* src_y, width, height); } +LIBYUV_API +int I410ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height) { + int y; + void (*I410ToARGBRow)(const uint16_t* y_buf, const uint16_t* u_buf, + const uint16_t* v_buf, uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, int width) = + I410ToARGBRow_C; + if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_I410TOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I410ToARGBRow = I410ToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I410ToARGBRow = I410ToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_I410TOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I410ToARGBRow = I410ToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I410ToARGBRow = I410ToARGBRow_AVX2; + } + } +#endif + for (y = 0; y < height; ++y) { + I410ToARGBRow(src_y, src_u, src_v, dst_argb, yuvconstants, width); + dst_argb += dst_stride_argb; + src_y += src_stride_y; + src_u += src_stride_u; + src_v += src_stride_v; + } + return 0; +} + +LIBYUV_API +int P010ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height) { + int y; + void (*P210ToARGBRow)( + const uint16_t* y_buf, const uint16_t* uv_buf, uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, int width) = P210ToARGBRow_C; + if (!src_y || !src_uv || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_P210TOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + P210ToARGBRow = P210ToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + P210ToARGBRow = P210ToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_P210TOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + P210ToARGBRow = P210ToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + P210ToARGBRow = P210ToARGBRow_AVX2; + } + } +#endif + for (y = 0; y < height; ++y) { + P210ToARGBRow(src_y, src_uv, dst_argb, yuvconstants, width); + dst_argb += dst_stride_argb; + src_y += src_stride_y; + if (y & 1) { + src_uv += src_stride_uv; + } + } + return 0; +} + +LIBYUV_API +int P210ToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height) { + int y; + void (*P210ToARGBRow)( + const uint16_t* y_buf, const uint16_t* uv_buf, uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, int width) = P210ToARGBRow_C; + if (!src_y || !src_uv || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_P210TOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + P210ToARGBRow = P210ToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + P210ToARGBRow = P210ToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_P210TOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + P210ToARGBRow = P210ToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + P210ToARGBRow = P210ToARGBRow_AVX2; + } + } +#endif + for (y = 0; y < height; ++y) { + P210ToARGBRow(src_y, src_uv, dst_argb, yuvconstants, width); + dst_argb += dst_stride_argb; + src_y += src_stride_y; + src_uv += src_stride_uv; + } + return 0; +} + +LIBYUV_API +int P010ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height) { + int y; + void (*P210ToAR30Row)( + const uint16_t* y_buf, const uint16_t* uv_buf, uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, int width) = P210ToAR30Row_C; + if (!src_y || !src_uv || !dst_ar30 || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_ar30 = dst_ar30 + (height - 1) * dst_stride_ar30; + dst_stride_ar30 = -dst_stride_ar30; + } +#if defined(HAS_P210TOAR30ROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + P210ToAR30Row = P210ToAR30Row_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + P210ToAR30Row = P210ToAR30Row_SSSE3; + } + } +#endif +#if defined(HAS_P210TOAR30ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + P210ToAR30Row = P210ToAR30Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + P210ToAR30Row = P210ToAR30Row_AVX2; + } + } +#endif + for (y = 0; y < height; ++y) { + P210ToAR30Row(src_y, src_uv, dst_ar30, yuvconstants, width); + dst_ar30 += dst_stride_ar30; + src_y += src_stride_y; + if (y & 1) { + src_uv += src_stride_uv; + } + } + return 0; +} + +LIBYUV_API +int P210ToAR30Matrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_uv, + int src_stride_uv, + uint8_t* dst_ar30, + int dst_stride_ar30, + const struct YuvConstants* yuvconstants, + int width, + int height) { + int y; + void (*P210ToAR30Row)( + const uint16_t* y_buf, const uint16_t* uv_buf, uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, int width) = P210ToAR30Row_C; + if (!src_y || !src_uv || !dst_ar30 || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_ar30 = dst_ar30 + (height - 1) * dst_stride_ar30; + dst_stride_ar30 = -dst_stride_ar30; + } +#if defined(HAS_P210TOAR30ROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + P210ToAR30Row = P210ToAR30Row_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + P210ToAR30Row = P210ToAR30Row_SSSE3; + } + } +#endif +#if defined(HAS_P210TOAR30ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + P210ToAR30Row = P210ToAR30Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + P210ToAR30Row = P210ToAR30Row_AVX2; + } + } +#endif + for (y = 0; y < height; ++y) { + P210ToAR30Row(src_y, src_uv, dst_ar30, yuvconstants, width); + dst_ar30 += dst_stride_ar30; + src_y += src_stride_y; + src_uv += src_stride_uv; + } + return 0; +} + // Convert I420 with Alpha to preattenuated ARGB with matrix. LIBYUV_API int I420AlphaToARGBMatrix(const uint8_t* src_y, @@ -1516,6 +1912,264 @@ int I420AlphaToARGBMatrix(const uint8_t* src_y, return 0; } +// Convert I422 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I422AlphaToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate) { + int y; + void (*I422AlphaToARGBRow)(const uint8_t* y_buf, const uint8_t* u_buf, + const uint8_t* v_buf, const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) = I422AlphaToARGBRow_C; + void (*ARGBAttenuateRow)(const uint8_t* src_argb, uint8_t* dst_argb, + int width) = ARGBAttenuateRow_C; + if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_I422ALPHATOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_I422ALPHATOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_AVX2; + } + } +#endif +#if defined(HAS_I422ALPHATOARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_NEON; + } + } +#endif +#if defined(HAS_I422ALPHATOARGBROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_Any_MMI; + if (IS_ALIGNED(width, 4)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_MMI; + } + } +#endif +#if defined(HAS_I422ALPHATOARGBROW_MSA) + if (TestCpuFlag(kCpuHasMSA)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_Any_MSA; + if (IS_ALIGNED(width, 8)) { + I422AlphaToARGBRow = I422AlphaToARGBRow_MSA; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + ARGBAttenuateRow = ARGBAttenuateRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_NEON; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MMI; + if (IS_ALIGNED(width, 2)) { + ARGBAttenuateRow = ARGBAttenuateRow_MMI; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MSA) + if (TestCpuFlag(kCpuHasMSA)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MSA; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_MSA; + } + } +#endif + + for (y = 0; y < height; ++y) { + I422AlphaToARGBRow(src_y, src_u, src_v, src_a, dst_argb, yuvconstants, + width); + if (attenuate) { + ARGBAttenuateRow(dst_argb, dst_argb, width); + } + dst_argb += dst_stride_argb; + src_a += src_stride_a; + src_y += src_stride_y; + src_u += src_stride_u; + src_v += src_stride_v; + } + return 0; +} + +// Convert I444 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I444AlphaToARGBMatrix(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate) { + int y; + void (*I444AlphaToARGBRow)(const uint8_t* y_buf, const uint8_t* u_buf, + const uint8_t* v_buf, const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) = I444AlphaToARGBRow_C; + void (*ARGBAttenuateRow)(const uint8_t* src_argb, uint8_t* dst_argb, + int width) = ARGBAttenuateRow_C; + if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_I444ALPHATOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_I444ALPHATOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_AVX2; + } + } +#endif +#if defined(HAS_I444ALPHATOARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_NEON; + } + } +#endif +#if defined(HAS_I444ALPHATOARGBROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_Any_MMI; + if (IS_ALIGNED(width, 4)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_MMI; + } + } +#endif +#if defined(HAS_I444ALPHATOARGBROW_MSA) + if (TestCpuFlag(kCpuHasMSA)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_Any_MSA; + if (IS_ALIGNED(width, 8)) { + I444AlphaToARGBRow = I444AlphaToARGBRow_MSA; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + ARGBAttenuateRow = ARGBAttenuateRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_NEON; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MMI; + if (IS_ALIGNED(width, 2)) { + ARGBAttenuateRow = ARGBAttenuateRow_MMI; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MSA) + if (TestCpuFlag(kCpuHasMSA)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MSA; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_MSA; + } + } +#endif + + for (y = 0; y < height; ++y) { + I444AlphaToARGBRow(src_y, src_u, src_v, src_a, dst_argb, yuvconstants, + width); + if (attenuate) { + ARGBAttenuateRow(dst_argb, dst_argb, width); + } + dst_argb += dst_stride_argb; + src_a += src_stride_a; + src_y += src_stride_y; + src_u += src_stride_u; + src_v += src_stride_v; + } + return 0; +} + // Convert I420 with Alpha to ARGB. LIBYUV_API int I420AlphaToARGB(const uint8_t* src_y, @@ -1559,6 +2213,409 @@ int I420AlphaToABGR(const uint8_t* src_y, width, height, attenuate); } +// Convert I422 with Alpha to ARGB. +LIBYUV_API +int I422AlphaToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int attenuate) { + return I422AlphaToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, src_a, src_stride_a, dst_argb, + dst_stride_argb, &kYuvI601Constants, width, + height, attenuate); +} + +// Convert I422 with Alpha to ABGR. +LIBYUV_API +int I422AlphaToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height, + int attenuate) { + return I422AlphaToARGBMatrix( + src_y, src_stride_y, src_v, src_stride_v, // Swap U and V + src_u, src_stride_u, src_a, src_stride_a, dst_abgr, dst_stride_abgr, + &kYvuI601Constants, // Use Yvu matrix + width, height, attenuate); +} + +// Convert I444 with Alpha to ARGB. +LIBYUV_API +int I444AlphaToARGB(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int attenuate) { + return I444AlphaToARGBMatrix(src_y, src_stride_y, src_u, src_stride_u, src_v, + src_stride_v, src_a, src_stride_a, dst_argb, + dst_stride_argb, &kYuvI601Constants, width, + height, attenuate); +} + +// Convert I444 with Alpha to ABGR. +LIBYUV_API +int I444AlphaToABGR(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_abgr, + int dst_stride_abgr, + int width, + int height, + int attenuate) { + return I444AlphaToARGBMatrix( + src_y, src_stride_y, src_v, src_stride_v, // Swap U and V + src_u, src_stride_u, src_a, src_stride_a, dst_abgr, dst_stride_abgr, + &kYvuI601Constants, // Use Yvu matrix + width, height, attenuate); +} + +// Convert I010 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I010AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate) { + int y; + void (*I210AlphaToARGBRow)(const uint16_t* y_buf, const uint16_t* u_buf, + const uint16_t* v_buf, const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) = I210AlphaToARGBRow_C; + void (*ARGBAttenuateRow)(const uint8_t* src_argb, uint8_t* dst_argb, + int width) = ARGBAttenuateRow_C; + if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_I210ALPHATOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I210AlphaToARGBRow = I210AlphaToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I210AlphaToARGBRow = I210AlphaToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_I210ALPHATOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I210AlphaToARGBRow = I210AlphaToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I210AlphaToARGBRow = I210AlphaToARGBRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + ARGBAttenuateRow = ARGBAttenuateRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_NEON; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MMI; + if (IS_ALIGNED(width, 2)) { + ARGBAttenuateRow = ARGBAttenuateRow_MMI; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MSA) + if (TestCpuFlag(kCpuHasMSA)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MSA; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_MSA; + } + } +#endif + + for (y = 0; y < height; ++y) { + I210AlphaToARGBRow(src_y, src_u, src_v, src_a, dst_argb, yuvconstants, + width); + if (attenuate) { + ARGBAttenuateRow(dst_argb, dst_argb, width); + } + dst_argb += dst_stride_argb; + src_a += src_stride_a; + src_y += src_stride_y; + if (y & 1) { + src_u += src_stride_u; + src_v += src_stride_v; + } + } + return 0; +} + +// Convert I210 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I210AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate) { + int y; + void (*I210AlphaToARGBRow)(const uint16_t* y_buf, const uint16_t* u_buf, + const uint16_t* v_buf, const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) = I210AlphaToARGBRow_C; + void (*ARGBAttenuateRow)(const uint8_t* src_argb, uint8_t* dst_argb, + int width) = ARGBAttenuateRow_C; + if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_I210ALPHATOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I210AlphaToARGBRow = I210AlphaToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I210AlphaToARGBRow = I210AlphaToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_I210ALPHATOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I210AlphaToARGBRow = I210AlphaToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I210AlphaToARGBRow = I210AlphaToARGBRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + ARGBAttenuateRow = ARGBAttenuateRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_NEON; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MMI; + if (IS_ALIGNED(width, 2)) { + ARGBAttenuateRow = ARGBAttenuateRow_MMI; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MSA) + if (TestCpuFlag(kCpuHasMSA)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MSA; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_MSA; + } + } +#endif + + for (y = 0; y < height; ++y) { + I210AlphaToARGBRow(src_y, src_u, src_v, src_a, dst_argb, yuvconstants, + width); + if (attenuate) { + ARGBAttenuateRow(dst_argb, dst_argb, width); + } + dst_argb += dst_stride_argb; + src_a += src_stride_a; + src_y += src_stride_y; + src_u += src_stride_u; + src_v += src_stride_v; + } + return 0; +} + +// Convert I410 with Alpha to preattenuated ARGB with matrix. +LIBYUV_API +int I410AlphaToARGBMatrix(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + const struct YuvConstants* yuvconstants, + int width, + int height, + int attenuate) { + int y; + void (*I410AlphaToARGBRow)(const uint16_t* y_buf, const uint16_t* u_buf, + const uint16_t* v_buf, const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) = I410AlphaToARGBRow_C; + void (*ARGBAttenuateRow)(const uint8_t* src_argb, uint8_t* dst_argb, + int width) = ARGBAttenuateRow_C; + if (!src_y || !src_u || !src_v || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } +#if defined(HAS_I410ALPHATOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + I410AlphaToARGBRow = I410AlphaToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + I410AlphaToARGBRow = I410AlphaToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_I410ALPHATOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + I410AlphaToARGBRow = I410AlphaToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + I410AlphaToARGBRow = I410AlphaToARGBRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + ARGBAttenuateRow = ARGBAttenuateRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_NEON; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MMI; + if (IS_ALIGNED(width, 2)) { + ARGBAttenuateRow = ARGBAttenuateRow_MMI; + } + } +#endif +#if defined(HAS_ARGBATTENUATEROW_MSA) + if (TestCpuFlag(kCpuHasMSA)) { + ARGBAttenuateRow = ARGBAttenuateRow_Any_MSA; + if (IS_ALIGNED(width, 8)) { + ARGBAttenuateRow = ARGBAttenuateRow_MSA; + } + } +#endif + + for (y = 0; y < height; ++y) { + I410AlphaToARGBRow(src_y, src_u, src_v, src_a, dst_argb, yuvconstants, + width); + if (attenuate) { + ARGBAttenuateRow(dst_argb, dst_argb, width); + } + dst_argb += dst_stride_argb; + src_a += src_stride_a; + src_y += src_stride_y; + src_u += src_stride_u; + src_v += src_stride_v; + } + return 0; +} + // Convert I400 to ARGB with matrix. LIBYUV_API int I400ToARGBMatrix(const uint8_t* src_y, @@ -1734,6 +2791,10 @@ static const uvec8 kShuffleMaskABGRToARGB = { static const uvec8 kShuffleMaskRGBAToARGB = { 1u, 2u, 3u, 0u, 5u, 6u, 7u, 4u, 9u, 10u, 11u, 8u, 13u, 14u, 15u, 12u}; +// Shuffle table for converting AR64 to AB64. +static const uvec8 kShuffleMaskAR64ToAB64 = { + 4u, 5u, 2u, 3u, 0u, 1u, 6u, 7u, 12u, 13u, 10u, 11u, 8u, 9u, 14u, 15u}; + // Convert BGRA to ARGB. LIBYUV_API int BGRAToARGB(const uint8_t* src_bgra, @@ -1743,7 +2804,7 @@ int BGRAToARGB(const uint8_t* src_bgra, int width, int height) { return ARGBShuffle(src_bgra, src_stride_bgra, dst_argb, dst_stride_argb, - (const uint8_t*)(&kShuffleMaskBGRAToARGB), width, height); + (const uint8_t*)&kShuffleMaskBGRAToARGB, width, height); } // Convert ARGB to BGRA (same as BGRAToARGB). @@ -1755,7 +2816,7 @@ int ARGBToBGRA(const uint8_t* src_bgra, int width, int height) { return ARGBShuffle(src_bgra, src_stride_bgra, dst_argb, dst_stride_argb, - (const uint8_t*)(&kShuffleMaskBGRAToARGB), width, height); + (const uint8_t*)&kShuffleMaskBGRAToARGB, width, height); } // Convert ABGR to ARGB. @@ -1767,7 +2828,7 @@ int ABGRToARGB(const uint8_t* src_abgr, int width, int height) { return ARGBShuffle(src_abgr, src_stride_abgr, dst_argb, dst_stride_argb, - (const uint8_t*)(&kShuffleMaskABGRToARGB), width, height); + (const uint8_t*)&kShuffleMaskABGRToARGB, width, height); } // Convert ARGB to ABGR to (same as ABGRToARGB). @@ -1779,7 +2840,7 @@ int ARGBToABGR(const uint8_t* src_abgr, int width, int height) { return ARGBShuffle(src_abgr, src_stride_abgr, dst_argb, dst_stride_argb, - (const uint8_t*)(&kShuffleMaskABGRToARGB), width, height); + (const uint8_t*)&kShuffleMaskABGRToARGB, width, height); } // Convert RGBA to ARGB. @@ -1791,7 +2852,19 @@ int RGBAToARGB(const uint8_t* src_rgba, int width, int height) { return ARGBShuffle(src_rgba, src_stride_rgba, dst_argb, dst_stride_argb, - (const uint8_t*)(&kShuffleMaskRGBAToARGB), width, height); + (const uint8_t*)&kShuffleMaskRGBAToARGB, width, height); +} + +// Convert AR64 To AB64. +LIBYUV_API +int AR64ToAB64(const uint16_t* src_ar64, + int src_stride_ar64, + uint16_t* dst_ab64, + int dst_stride_ab64, + int width, + int height) { + return AR64Shuffle(src_ar64, src_stride_ar64, dst_ab64, dst_stride_ab64, + (const uint8_t*)&kShuffleMaskAR64ToAB64, width, height); } // Convert RGB24 to ARGB. @@ -2300,6 +3373,124 @@ int AR30ToAB30(const uint8_t* src_ar30, return 0; } +// Convert AR64 to ARGB. +LIBYUV_API +int AR64ToARGB(const uint16_t* src_ar64, + int src_stride_ar64, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height) { + int y; + void (*AR64ToARGBRow)(const uint16_t* src_ar64, uint8_t* dst_argb, + int width) = AR64ToARGBRow_C; + if (!src_ar64 || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_ar64 = src_ar64 + (height - 1) * src_stride_ar64; + src_stride_ar64 = -src_stride_ar64; + } + // Coalesce rows. + if (src_stride_ar64 == width * 4 && dst_stride_argb == width * 4) { + width *= height; + height = 1; + src_stride_ar64 = dst_stride_argb = 0; + } +#if defined(HAS_AR64TOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + AR64ToARGBRow = AR64ToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + AR64ToARGBRow = AR64ToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_AR64TOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + AR64ToARGBRow = AR64ToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + AR64ToARGBRow = AR64ToARGBRow_AVX2; + } + } +#endif +#if defined(HAS_AR64TOARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + AR64ToARGBRow = AR64ToARGBRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + AR64ToARGBRow = AR64ToARGBRow_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + AR64ToARGBRow(src_ar64, dst_argb, width); + src_ar64 += src_stride_ar64; + dst_argb += dst_stride_argb; + } + return 0; +} + +// Convert AB64 to ARGB. +LIBYUV_API +int AB64ToARGB(const uint16_t* src_ab64, + int src_stride_ab64, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height) { + int y; + void (*AB64ToARGBRow)(const uint16_t* src_ar64, uint8_t* dst_argb, + int width) = AB64ToARGBRow_C; + if (!src_ab64 || !dst_argb || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_ab64 = src_ab64 + (height - 1) * src_stride_ab64; + src_stride_ab64 = -src_stride_ab64; + } + // Coalesce rows. + if (src_stride_ab64 == width * 4 && dst_stride_argb == width * 4) { + width *= height; + height = 1; + src_stride_ab64 = dst_stride_argb = 0; + } +#if defined(HAS_AB64TOARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + AB64ToARGBRow = AB64ToARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + AB64ToARGBRow = AB64ToARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_AB64TOARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + AB64ToARGBRow = AB64ToARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + AB64ToARGBRow = AB64ToARGBRow_AVX2; + } + } +#endif +#if defined(HAS_AB64TOARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + AB64ToARGBRow = AB64ToARGBRow_Any_NEON; + if (IS_ALIGNED(width, 8)) { + AB64ToARGBRow = AB64ToARGBRow_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + AB64ToARGBRow(src_ab64, dst_argb, width); + src_ab64 += src_stride_ab64; + dst_argb += dst_stride_argb; + } + return 0; +} + // Convert NV12 to ARGB with matrix. LIBYUV_API int NV12ToARGBMatrix(const uint8_t* src_y, @@ -4119,6 +5310,40 @@ int H420ToAR30(const uint8_t* src_y, &kYvuH709Constants, width, height); } +// Convert I420 to AB30. +LIBYUV_API +int I420ToAB30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height) { + return I420ToAR30Matrix(src_y, src_stride_y, src_v, src_stride_v, src_u, + src_stride_u, dst_ab30, dst_stride_ab30, + &kYvuI601Constants, width, height); +} + +// Convert H420 to AB30. +LIBYUV_API +int H420ToAB30(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_ab30, + int dst_stride_ab30, + int width, + int height) { + return I420ToAR30Matrix(src_y, src_stride_y, src_v, src_stride_v, src_u, + src_stride_u, dst_ab30, dst_stride_ab30, + &kYvuH709Constants, width, height); +} + #ifdef __cplusplus } // extern "C" } // namespace libyuv diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_from.cc b/third-party/libyuv/third_party/libyuv/source/convert_from.cc similarity index 83% rename from third-party/webrtc/dependencies/third_party/libyuv/source/convert_from.cc rename to third-party/libyuv/third_party/libyuv/source/convert_from.cc index f2cfc1d8f5..687f0a72c2 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_from.cc +++ b/third-party/libyuv/third_party/libyuv/source/convert_from.cc @@ -30,6 +30,8 @@ static __inline int Abs(int v) { } // I420 To any I4xx YUV format with mirroring. +// TODO(fbarchard): Consider kFilterNone for Y, or CopyPlane + static int I420ToI4xx(const uint8_t* src_y, int src_stride_y, const uint8_t* src_u, @@ -109,6 +111,50 @@ int I420ToI010(const uint8_t* src_y, return 0; } +// Convert 8 bit YUV to 12 bit. +LIBYUV_API +int I420ToI012(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height) { + int halfwidth = (width + 1) >> 1; + int halfheight = (height + 1) >> 1; + if (!src_u || !src_v || !dst_u || !dst_v || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + halfheight = (height + 1) >> 1; + src_y = src_y + (height - 1) * src_stride_y; + src_u = src_u + (halfheight - 1) * src_stride_u; + src_v = src_v + (halfheight - 1) * src_stride_v; + src_stride_y = -src_stride_y; + src_stride_u = -src_stride_u; + src_stride_v = -src_stride_v; + } + + // Convert Y plane. + Convert8To16Plane(src_y, src_stride_y, dst_y, dst_stride_y, 4096, width, + height); + // Convert UV planes. + Convert8To16Plane(src_u, src_stride_u, dst_u, dst_stride_u, 4096, halfwidth, + halfheight); + Convert8To16Plane(src_v, src_stride_v, dst_v, dst_stride_v, 4096, halfwidth, + halfheight); + return 0; +} + // 420 chroma is 1/2 width, 1/2 height // 422 chroma is 1/2 width, 1x height LIBYUV_API @@ -159,6 +205,102 @@ int I420ToI444(const uint8_t* src_y, dst_uv_height); } +// 420 chroma to 444 chroma, 10/12 bit version +LIBYUV_API +int I010ToI410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height) { + if (width == 0 || height == 0) { + return -1; + } + + if (dst_y) { + ScalePlane_12(src_y, src_stride_y, width, height, dst_y, dst_stride_y, + Abs(width), Abs(height), kFilterBilinear); + } + ScalePlane_12(src_u, src_stride_u, SUBSAMPLE(width, 1, 1), + SUBSAMPLE(height, 1, 1), dst_u, dst_stride_u, Abs(width), + Abs(height), kFilterBilinear); + ScalePlane_12(src_v, src_stride_v, SUBSAMPLE(width, 1, 1), + SUBSAMPLE(height, 1, 1), dst_v, dst_stride_v, Abs(width), + Abs(height), kFilterBilinear); + return 0; +} + +// 422 chroma to 444 chroma, 10/12 bit version +LIBYUV_API +int I210ToI410(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height) { + if (width == 0 || height == 0) { + return -1; + } + + if (dst_y) { + ScalePlane_12(src_y, src_stride_y, width, height, dst_y, dst_stride_y, + Abs(width), Abs(height), kFilterBilinear); + } + ScalePlane_12(src_u, src_stride_u, SUBSAMPLE(width, 1, 1), height, dst_u, + dst_stride_u, Abs(width), Abs(height), kFilterBilinear); + ScalePlane_12(src_v, src_stride_v, SUBSAMPLE(width, 1, 1), height, dst_v, + dst_stride_v, Abs(width), Abs(height), kFilterBilinear); + return 0; +} + +// 422 chroma is 1/2 width, 1x height +// 444 chroma is 1x width, 1x height +LIBYUV_API +int I422ToI444(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_u, + int src_stride_u, + const uint8_t* src_v, + int src_stride_v, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_u, + int dst_stride_u, + uint8_t* dst_v, + int dst_stride_v, + int width, + int height) { + if (width == 0 || height == 0) { + return -1; + } + + if (dst_y) { + ScalePlane(src_y, src_stride_y, width, height, dst_y, dst_stride_y, + Abs(width), Abs(height), kFilterBilinear); + } + ScalePlane(src_u, src_stride_u, SUBSAMPLE(width, 1, 1), height, dst_u, + dst_stride_u, Abs(width), Abs(height), kFilterBilinear); + ScalePlane(src_v, src_stride_v, SUBSAMPLE(width, 1, 1), height, dst_v, + dst_stride_v, Abs(width), Abs(height), kFilterBilinear); + return 0; +} + // Copy to I400. Source can be I420,422,444,400,NV12,NV21 LIBYUV_API int I400Copy(const uint8_t* src_y, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_from_argb.cc b/third-party/libyuv/third_party/libyuv/source/convert_from_argb.cc similarity index 95% rename from third-party/webrtc/dependencies/third_party/libyuv/source/convert_from_argb.cc rename to third-party/libyuv/third_party/libyuv/source/convert_from_argb.cc index 4ba4bb5e0f..e14615847d 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_from_argb.cc +++ b/third-party/libyuv/third_party/libyuv/source/convert_from_argb.cc @@ -2009,6 +2009,124 @@ int ARGBToJ422(const uint8_t* src_argb, return 0; } +// Convert ARGB to AR64. +LIBYUV_API +int ARGBToAR64(const uint8_t* src_argb, + int src_stride_argb, + uint16_t* dst_ar64, + int dst_stride_ar64, + int width, + int height) { + int y; + void (*ARGBToAR64Row)(const uint8_t* src_argb, uint16_t* dst_ar64, + int width) = ARGBToAR64Row_C; + if (!src_argb || !dst_ar64 || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_argb = src_argb + (height - 1) * src_stride_argb; + src_stride_argb = -src_stride_argb; + } + // Coalesce rows. + if (src_stride_argb == width * 4 && dst_stride_ar64 == width * 4) { + width *= height; + height = 1; + src_stride_argb = dst_stride_ar64 = 0; + } +#if defined(HAS_ARGBTOAR64ROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBToAR64Row = ARGBToAR64Row_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + ARGBToAR64Row = ARGBToAR64Row_SSSE3; + } + } +#endif +#if defined(HAS_ARGBTOAR64ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBToAR64Row = ARGBToAR64Row_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + ARGBToAR64Row = ARGBToAR64Row_AVX2; + } + } +#endif +#if defined(HAS_ARGBTOAR64ROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToAR64Row = ARGBToAR64Row_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBToAR64Row = ARGBToAR64Row_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + ARGBToAR64Row(src_argb, dst_ar64, width); + src_argb += src_stride_argb; + dst_ar64 += dst_stride_ar64; + } + return 0; +} + +// Convert ARGB to AB64. +LIBYUV_API +int ARGBToAB64(const uint8_t* src_argb, + int src_stride_argb, + uint16_t* dst_ab64, + int dst_stride_ab64, + int width, + int height) { + int y; + void (*ARGBToAB64Row)(const uint8_t* src_argb, uint16_t* dst_ar64, + int width) = ARGBToAB64Row_C; + if (!src_argb || !dst_ab64 || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_argb = src_argb + (height - 1) * src_stride_argb; + src_stride_argb = -src_stride_argb; + } + // Coalesce rows. + if (src_stride_argb == width * 4 && dst_stride_ab64 == width * 4) { + width *= height; + height = 1; + src_stride_argb = dst_stride_ab64 = 0; + } +#if defined(HAS_ARGBTOAB64ROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + ARGBToAB64Row = ARGBToAB64Row_Any_SSSE3; + if (IS_ALIGNED(width, 4)) { + ARGBToAB64Row = ARGBToAB64Row_SSSE3; + } + } +#endif +#if defined(HAS_ARGBTOAB64ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + ARGBToAB64Row = ARGBToAB64Row_Any_AVX2; + if (IS_ALIGNED(width, 8)) { + ARGBToAB64Row = ARGBToAB64Row_AVX2; + } + } +#endif +#if defined(HAS_ARGBTOAB64ROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + ARGBToAB64Row = ARGBToAB64Row_Any_NEON; + if (IS_ALIGNED(width, 8)) { + ARGBToAB64Row = ARGBToAB64Row_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + ARGBToAB64Row(src_argb, dst_ab64, width); + src_argb += src_stride_argb; + dst_ab64 += dst_stride_ab64; + } + return 0; +} + // Convert ARGB to J400. LIBYUV_API int ARGBToJ400(const uint8_t* src_argb, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_jpeg.cc b/third-party/libyuv/third_party/libyuv/source/convert_jpeg.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/convert_jpeg.cc rename to third-party/libyuv/third_party/libyuv/source/convert_jpeg.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_to_argb.cc b/third-party/libyuv/third_party/libyuv/source/convert_to_argb.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/convert_to_argb.cc rename to third-party/libyuv/third_party/libyuv/source/convert_to_argb.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_to_i420.cc b/third-party/libyuv/third_party/libyuv/source/convert_to_i420.cc similarity index 93% rename from third-party/webrtc/dependencies/third_party/libyuv/source/convert_to_i420.cc rename to third-party/libyuv/third_party/libyuv/source/convert_to_i420.cc index ac6eeab24e..5869ecd7b9 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/convert_to_i420.cc +++ b/third-party/libyuv/third_party/libyuv/source/convert_to_i420.cc @@ -89,18 +89,26 @@ int ConvertToI420(const uint8_t* sample, switch (format) { // Single plane formats - case FOURCC_YUY2: + case FOURCC_YUY2: { // TODO(fbarchard): Find better odd crop fix. + uint8_t* u = (crop_x & 1) ? dst_v : dst_u; + uint8_t* v = (crop_x & 1) ? dst_u : dst_v; + int stride_u = (crop_x & 1) ? dst_stride_v : dst_stride_u; + int stride_v = (crop_x & 1) ? dst_stride_u : dst_stride_v; src = sample + (aligned_src_width * crop_y + crop_x) * 2; - r = YUY2ToI420(src, aligned_src_width * 2, dst_y, dst_stride_y, dst_u, - dst_stride_u, dst_v, dst_stride_v, crop_width, - inv_crop_height); + r = YUY2ToI420(src, aligned_src_width * 2, dst_y, dst_stride_y, u, + stride_u, v, stride_v, crop_width, inv_crop_height); break; - case FOURCC_UYVY: + } + case FOURCC_UYVY: { + uint8_t* u = (crop_x & 1) ? dst_v : dst_u; + uint8_t* v = (crop_x & 1) ? dst_u : dst_v; + int stride_u = (crop_x & 1) ? dst_stride_v : dst_stride_u; + int stride_v = (crop_x & 1) ? dst_stride_u : dst_stride_v; src = sample + (aligned_src_width * crop_y + crop_x) * 2; - r = UYVYToI420(src, aligned_src_width * 2, dst_y, dst_stride_y, dst_u, - dst_stride_u, dst_v, dst_stride_v, crop_width, - inv_crop_height); + r = UYVYToI420(src, aligned_src_width * 2, dst_y, dst_stride_y, u, + stride_u, v, stride_v, crop_width, inv_crop_height); break; + } case FOURCC_RGBP: src = sample + (src_width * crop_y + crop_x) * 2; r = RGB565ToI420(src, src_width * 2, dst_y, dst_stride_y, dst_u, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/cpu_id.cc b/third-party/libyuv/third_party/libyuv/source/cpu_id.cc similarity index 99% rename from third-party/webrtc/dependencies/third_party/libyuv/source/cpu_id.cc rename to third-party/libyuv/third_party/libyuv/source/cpu_id.cc index fe89452b77..588168d65a 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/cpu_id.cc +++ b/third-party/libyuv/third_party/libyuv/source/cpu_id.cc @@ -133,7 +133,7 @@ int GetXCR0() { #pragma optimize("g", on) #endif -// based on libvpx arm_cpudetect.c +// Based on libvpx arm_cpudetect.c // For Arm, but public to allow testing on any CPU LIBYUV_API SAFEBUFFERS int ArmCpuCaps(const char* cpuinfo_name) { char cpuinfo_line[512]; diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/mjpeg_decoder.cc b/third-party/libyuv/third_party/libyuv/source/mjpeg_decoder.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/mjpeg_decoder.cc rename to third-party/libyuv/third_party/libyuv/source/mjpeg_decoder.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/mjpeg_validate.cc b/third-party/libyuv/third_party/libyuv/source/mjpeg_validate.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/mjpeg_validate.cc rename to third-party/libyuv/third_party/libyuv/source/mjpeg_validate.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/planar_functions.cc b/third-party/libyuv/third_party/libyuv/source/planar_functions.cc similarity index 79% rename from third-party/webrtc/dependencies/third_party/libyuv/source/planar_functions.cc rename to third-party/libyuv/third_party/libyuv/source/planar_functions.cc index 4e8908c2eb..7cea06c8d7 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/planar_functions.cc +++ b/third-party/libyuv/third_party/libyuv/source/planar_functions.cc @@ -10,6 +10,7 @@ #include "libyuv/planar_functions.h" +#include #include // for memset() #include "libyuv/cpu_id.h" @@ -350,9 +351,16 @@ int I420ToI400(const uint8_t* src_y, } // Copy NV12. Supports inverting. -int NV12Copy(const uint8_t* src_y, int src_stride_y, const uint8_t* src_uv, - int src_stride_uv, uint8_t* dst_y, int dst_stride_y, - uint8_t* dst_uv, int dst_stride_uv, int width, int height) { +int NV12Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_uv, + int src_stride_uv, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_uv, + int dst_stride_uv, + int width, + int height) { if (!src_y || !dst_y || !src_uv || !dst_uv || width <= 0 || height == 0) { return -1; } @@ -375,9 +383,16 @@ int NV12Copy(const uint8_t* src_y, int src_stride_y, const uint8_t* src_uv, } // Copy NV21. Supports inverting. -int NV21Copy(const uint8_t* src_y, int src_stride_y, const uint8_t* src_vu, - int src_stride_vu, uint8_t* dst_y, int dst_stride_y, - uint8_t* dst_vu, int dst_stride_vu, int width, int height) { +int NV21Copy(const uint8_t* src_y, + int src_stride_y, + const uint8_t* src_vu, + int src_stride_vu, + uint8_t* dst_y, + int dst_stride_y, + uint8_t* dst_vu, + int dst_stride_vu, + int width, + int height) { return NV12Copy(src_y, src_stride_y, src_vu, src_stride_vu, dst_y, dst_stride_y, dst_vu, dst_stride_vu, width, height); } @@ -536,6 +551,218 @@ void MergeUVPlane(const uint8_t* src_u, } } +// Support function for P010 etc UV channels. +// Width and height are plane sizes (typically half pixel width). +LIBYUV_API +void SplitUVPlane_16(const uint16_t* src_uv, + int src_stride_uv, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int width, + int height, + int depth) { + int y; + void (*SplitUVRow_16)(const uint16_t* src_uv, uint16_t* dst_u, + uint16_t* dst_v, int depth, int width) = + SplitUVRow_16_C; + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_u = dst_u + (height - 1) * dst_stride_u; + dst_v = dst_v + (height - 1) * dst_stride_v; + dst_stride_u = -dst_stride_u; + dst_stride_v = -dst_stride_v; + } + // Coalesce rows. + if (src_stride_uv == width * 2 && dst_stride_u == width && + dst_stride_v == width) { + width *= height; + height = 1; + src_stride_uv = dst_stride_u = dst_stride_v = 0; + } +#if defined(HAS_SPLITUVROW_16_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + SplitUVRow_16 = SplitUVRow_16_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + SplitUVRow_16 = SplitUVRow_16_AVX2; + } + } +#endif +#if defined(HAS_SPLITUVROW_16_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + SplitUVRow_16 = SplitUVRow_16_Any_NEON; + if (IS_ALIGNED(width, 8)) { + SplitUVRow_16 = SplitUVRow_16_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + // Copy a row of UV. + SplitUVRow_16(src_uv, dst_u, dst_v, depth, width); + dst_u += dst_stride_u; + dst_v += dst_stride_v; + src_uv += src_stride_uv; + } +} + +LIBYUV_API +void MergeUVPlane_16(const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + uint16_t* dst_uv, + int dst_stride_uv, + int width, + int height, + int depth) { + int y; + void (*MergeUVRow_16)(const uint16_t* src_u, const uint16_t* src_v, + uint16_t* dst_uv, int depth, int width) = + MergeUVRow_16_C; + assert(depth >= 8); + assert(depth <= 16); + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_uv = dst_uv + (height - 1) * dst_stride_uv; + dst_stride_uv = -dst_stride_uv; + } + // Coalesce rows. + if (src_stride_u == width && src_stride_v == width && + dst_stride_uv == width * 2) { + width *= height; + height = 1; + src_stride_u = src_stride_v = dst_stride_uv = 0; + } +#if defined(HAS_MERGEUVROW_16_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MergeUVRow_16 = MergeUVRow_16_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + MergeUVRow_16 = MergeUVRow_16_AVX2; + } + } +#endif +#if defined(HAS_MERGEUVROW_16_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + MergeUVRow_16 = MergeUVRow_16_Any_NEON; + if (IS_ALIGNED(width, 8)) { + MergeUVRow_16 = MergeUVRow_16_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + // Merge a row of U and V into a row of UV. + MergeUVRow_16(src_u, src_v, dst_uv, depth, width); + src_u += src_stride_u; + src_v += src_stride_v; + dst_uv += dst_stride_uv; + } +} + +// Convert plane from lsb to msb +LIBYUV_API +void ConvertToMSBPlane_16(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int width, + int height, + int depth) { + int y; + int scale = 1 << (16 - depth); + void (*MultiplyRow_16)(const uint16_t* src_y, uint16_t* dst_y, int scale, + int width) = MultiplyRow_16_C; + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_y = dst_y + (height - 1) * dst_stride_y; + dst_stride_y = -dst_stride_y; + } + // Coalesce rows. + if (src_stride_y == width && dst_stride_y == width) { + width *= height; + height = 1; + src_stride_y = dst_stride_y = 0; + } + +#if defined(HAS_MULTIPLYROW_16_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MultiplyRow_16 = MultiplyRow_16_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + MultiplyRow_16 = MultiplyRow_16_AVX2; + } + } +#endif +#if defined(HAS_MULTIPLYROW_16_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + MultiplyRow_16 = MultiplyRow_16_Any_NEON; + if (IS_ALIGNED(width, 16)) { + MultiplyRow_16 = MultiplyRow_16_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + MultiplyRow_16(src_y, dst_y, scale, width); + src_y += src_stride_y; + dst_y += dst_stride_y; + } +} + +// Convert plane from msb to lsb +LIBYUV_API +void ConvertToLSBPlane_16(const uint16_t* src_y, + int src_stride_y, + uint16_t* dst_y, + int dst_stride_y, + int width, + int height, + int depth) { + int y; + int scale = 1 << depth; + void (*DivideRow)(const uint16_t* src_y, uint16_t* dst_y, int scale, + int width) = DivideRow_16_C; + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_y = dst_y + (height - 1) * dst_stride_y; + dst_stride_y = -dst_stride_y; + } + // Coalesce rows. + if (src_stride_y == width && dst_stride_y == width) { + width *= height; + height = 1; + src_stride_y = dst_stride_y = 0; + } + +#if defined(HAS_DIVIDEROW_16_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + DivideRow = DivideRow_16_Any_AVX2; + if (IS_ALIGNED(width, 32)) { + DivideRow = DivideRow_16_AVX2; + } + } +#endif +#if defined(HAS_DIVIDEROW_16_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + DivideRow = DivideRow_16_Any_NEON; + if (IS_ALIGNED(width, 16)) { + DivideRow = DivideRow_16_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + DivideRow(src_y, dst_y, scale, width); + src_y += src_stride_y; + dst_y += dst_stride_y; + } +} + // Swap U and V channels in interleaved UV plane. LIBYUV_API void SwapUVPlane(const uint8_t* src_uv, @@ -758,6 +985,665 @@ void MergeRGBPlane(const uint8_t* src_r, } } +LIBYUV_NOINLINE +void SplitARGBPlaneAlpha(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_r, + int dst_stride_r, + uint8_t* dst_g, + int dst_stride_g, + uint8_t* dst_b, + int dst_stride_b, + uint8_t* dst_a, + int dst_stride_a, + int width, + int height) { + int y; + void (*SplitARGBRow)(const uint8_t* src_rgb, uint8_t* dst_r, uint8_t* dst_g, + uint8_t* dst_b, uint8_t* dst_a, int width) = + SplitARGBRow_C; + + assert(height > 0); + + if (src_stride_argb == width * 4 && dst_stride_r == width && + dst_stride_g == width && dst_stride_b == width && dst_stride_a == width) { + width *= height; + height = 1; + src_stride_argb = dst_stride_r = dst_stride_g = dst_stride_b = + dst_stride_a = 0; + } + +#if defined(HAS_SPLITARGBROW_SSE2) + if (TestCpuFlag(kCpuHasSSE2)) { + SplitARGBRow = SplitARGBRow_Any_SSE2; + if (IS_ALIGNED(width, 8)) { + SplitARGBRow = SplitARGBRow_SSE2; + } + } +#endif +#if defined(HAS_SPLITARGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + SplitARGBRow = SplitARGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + SplitARGBRow = SplitARGBRow_SSSE3; + } + } +#endif +#if defined(HAS_SPLITARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + SplitARGBRow = SplitARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + SplitARGBRow = SplitARGBRow_AVX2; + } + } +#endif +#if defined(HAS_SPLITARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + SplitARGBRow = SplitARGBRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + SplitARGBRow = SplitARGBRow_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + SplitARGBRow(src_argb, dst_r, dst_g, dst_b, dst_a, width); + dst_r += dst_stride_r; + dst_g += dst_stride_g; + dst_b += dst_stride_b; + dst_a += dst_stride_a; + src_argb += src_stride_argb; + } +} + +LIBYUV_NOINLINE +void SplitARGBPlaneOpaque(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_r, + int dst_stride_r, + uint8_t* dst_g, + int dst_stride_g, + uint8_t* dst_b, + int dst_stride_b, + int width, + int height) { + int y; + void (*SplitXRGBRow)(const uint8_t* src_rgb, uint8_t* dst_r, uint8_t* dst_g, + uint8_t* dst_b, int width) = SplitXRGBRow_C; + assert(height > 0); + + if (src_stride_argb == width * 4 && dst_stride_r == width && + dst_stride_g == width && dst_stride_b == width) { + width *= height; + height = 1; + src_stride_argb = dst_stride_r = dst_stride_g = dst_stride_b = 0; + } + +#if defined(HAS_SPLITXRGBROW_SSE2) + if (TestCpuFlag(kCpuHasSSE2)) { + SplitXRGBRow = SplitXRGBRow_Any_SSE2; + if (IS_ALIGNED(width, 8)) { + SplitXRGBRow = SplitXRGBRow_SSE2; + } + } +#endif +#if defined(HAS_SPLITXRGBROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + SplitXRGBRow = SplitXRGBRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + SplitXRGBRow = SplitXRGBRow_SSSE3; + } + } +#endif +#if defined(HAS_SPLITXRGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + SplitXRGBRow = SplitXRGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + SplitXRGBRow = SplitXRGBRow_AVX2; + } + } +#endif +#if defined(HAS_SPLITXRGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + SplitXRGBRow = SplitXRGBRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + SplitXRGBRow = SplitXRGBRow_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + SplitXRGBRow(src_argb, dst_r, dst_g, dst_b, width); + dst_r += dst_stride_r; + dst_g += dst_stride_g; + dst_b += dst_stride_b; + src_argb += src_stride_argb; + } +} + +LIBYUV_API +void SplitARGBPlane(const uint8_t* src_argb, + int src_stride_argb, + uint8_t* dst_r, + int dst_stride_r, + uint8_t* dst_g, + int dst_stride_g, + uint8_t* dst_b, + int dst_stride_b, + uint8_t* dst_a, + int dst_stride_a, + int width, + int height) { + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_r = dst_r + (height - 1) * dst_stride_r; + dst_g = dst_g + (height - 1) * dst_stride_g; + dst_b = dst_b + (height - 1) * dst_stride_b; + dst_a = dst_a + (height - 1) * dst_stride_a; + dst_stride_r = -dst_stride_r; + dst_stride_g = -dst_stride_g; + dst_stride_b = -dst_stride_b; + dst_stride_a = -dst_stride_a; + } + + if (dst_a == NULL) { + SplitARGBPlaneOpaque(src_argb, src_stride_argb, dst_r, dst_stride_r, dst_g, + dst_stride_g, dst_b, dst_stride_b, width, height); + } else { + SplitARGBPlaneAlpha(src_argb, src_stride_argb, dst_r, dst_stride_r, dst_g, + dst_stride_g, dst_b, dst_stride_b, dst_a, dst_stride_a, + width, height); + } +} + +LIBYUV_NOINLINE +void MergeARGBPlaneAlpha(const uint8_t* src_r, + int src_stride_r, + const uint8_t* src_g, + int src_stride_g, + const uint8_t* src_b, + int src_stride_b, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height) { + int y; + void (*MergeARGBRow)(const uint8_t* src_r, const uint8_t* src_g, + const uint8_t* src_b, const uint8_t* src_a, + uint8_t* dst_argb, int width) = MergeARGBRow_C; + + assert(height > 0); + + if (src_stride_r == width && src_stride_g == width && src_stride_b == width && + src_stride_a == width && dst_stride_argb == width * 4) { + width *= height; + height = 1; + src_stride_r = src_stride_g = src_stride_b = src_stride_a = + dst_stride_argb = 0; + } +#if defined(HAS_MERGEARGBROW_SSE2) + if (TestCpuFlag(kCpuHasSSE2)) { + MergeARGBRow = MergeARGBRow_Any_SSE2; + if (IS_ALIGNED(width, 8)) { + MergeARGBRow = MergeARGBRow_SSE2; + } + } +#endif +#if defined(HAS_MERGEARGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MergeARGBRow = MergeARGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + MergeARGBRow = MergeARGBRow_AVX2; + } + } +#endif +#if defined(HAS_MERGEARGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + MergeARGBRow = MergeARGBRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + MergeARGBRow = MergeARGBRow_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + MergeARGBRow(src_r, src_g, src_b, src_a, dst_argb, width); + src_r += src_stride_r; + src_g += src_stride_g; + src_b += src_stride_b; + src_a += src_stride_a; + dst_argb += dst_stride_argb; + } +} + +LIBYUV_NOINLINE +void MergeARGBPlaneOpaque(const uint8_t* src_r, + int src_stride_r, + const uint8_t* src_g, + int src_stride_g, + const uint8_t* src_b, + int src_stride_b, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height) { + int y; + void (*MergeXRGBRow)(const uint8_t* src_r, const uint8_t* src_g, + const uint8_t* src_b, uint8_t* dst_argb, int width) = + MergeXRGBRow_C; + + assert(height > 0); + + if (src_stride_r == width && src_stride_g == width && src_stride_b == width && + dst_stride_argb == width * 4) { + width *= height; + height = 1; + src_stride_r = src_stride_g = src_stride_b = dst_stride_argb = 0; + } +#if defined(HAS_MERGEXRGBROW_SSE2) + if (TestCpuFlag(kCpuHasSSE2)) { + MergeXRGBRow = MergeXRGBRow_Any_SSE2; + if (IS_ALIGNED(width, 8)) { + MergeXRGBRow = MergeXRGBRow_SSE2; + } + } +#endif +#if defined(HAS_MERGEXRGBROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MergeXRGBRow = MergeXRGBRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + MergeXRGBRow = MergeXRGBRow_AVX2; + } + } +#endif +#if defined(HAS_MERGEXRGBROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + MergeXRGBRow = MergeXRGBRow_Any_NEON; + if (IS_ALIGNED(width, 16)) { + MergeXRGBRow = MergeXRGBRow_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + MergeXRGBRow(src_r, src_g, src_b, dst_argb, width); + src_r += src_stride_r; + src_g += src_stride_g; + src_b += src_stride_b; + dst_argb += dst_stride_argb; + } +} + +LIBYUV_API +void MergeARGBPlane(const uint8_t* src_r, + int src_stride_r, + const uint8_t* src_g, + int src_stride_g, + const uint8_t* src_b, + int src_stride_b, + const uint8_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height) { + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } + + if (src_a == NULL) { + MergeARGBPlaneOpaque(src_r, src_stride_r, src_g, src_stride_g, src_b, + src_stride_b, dst_argb, dst_stride_argb, width, + height); + } else { + MergeARGBPlaneAlpha(src_r, src_stride_r, src_g, src_stride_g, src_b, + src_stride_b, src_a, src_stride_a, dst_argb, + dst_stride_argb, width, height); + } +} + +// TODO(yuan): Support 2 bit alpha channel. +LIBYUV_API +void MergeXR30Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + uint8_t* dst_ar30, + int dst_stride_ar30, + int width, + int height, + int depth) { + int y; + void (*MergeXR30Row)(const uint16_t* src_r, const uint16_t* src_g, + const uint16_t* src_b, uint8_t* dst_ar30, int depth, + int width) = MergeXR30Row_C; + + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_ar30 = dst_ar30 + (height - 1) * dst_stride_ar30; + dst_stride_ar30 = -dst_stride_ar30; + } + // Coalesce rows. + if (src_stride_r == width && src_stride_g == width && src_stride_b == width && + dst_stride_ar30 == width * 4) { + width *= height; + height = 1; + src_stride_r = src_stride_g = src_stride_b = dst_stride_ar30 = 0; + } +#if defined(HAS_MERGEXR30ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MergeXR30Row = MergeXR30Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + MergeXR30Row = MergeXR30Row_AVX2; + } + } +#endif +#if defined(HAS_MERGEXR30ROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + if (depth == 10) { + MergeXR30Row = MergeXR30Row_10_Any_NEON; + if (IS_ALIGNED(width, 8)) { + MergeXR30Row = MergeXR30Row_10_NEON; + } + } else { + MergeXR30Row = MergeXR30Row_Any_NEON; + if (IS_ALIGNED(width, 8)) { + MergeXR30Row = MergeXR30Row_NEON; + } + } + } +#endif + + for (y = 0; y < height; ++y) { + MergeXR30Row(src_r, src_g, src_b, dst_ar30, depth, width); + src_r += src_stride_r; + src_g += src_stride_g; + src_b += src_stride_b; + dst_ar30 += dst_stride_ar30; + } +} + +LIBYUV_NOINLINE +static void MergeAR64PlaneAlpha(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + const uint16_t* src_a, + int src_stride_a, + uint16_t* dst_ar64, + int dst_stride_ar64, + int width, + int height, + int depth) { + int y; + void (*MergeAR64Row)(const uint16_t* src_r, const uint16_t* src_g, + const uint16_t* src_b, const uint16_t* src_a, + uint16_t* dst_argb, int depth, int width) = + MergeAR64Row_C; + + if (src_stride_r == width && src_stride_g == width && src_stride_b == width && + src_stride_a == width && dst_stride_ar64 == width * 4) { + width *= height; + height = 1; + src_stride_r = src_stride_g = src_stride_b = src_stride_a = + dst_stride_ar64 = 0; + } +#if defined(HAS_MERGEAR64ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MergeAR64Row = MergeAR64Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + MergeAR64Row = MergeAR64Row_AVX2; + } + } +#endif +#if defined(HAS_MERGEAR64ROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + MergeAR64Row = MergeAR64Row_Any_NEON; + if (IS_ALIGNED(width, 8)) { + MergeAR64Row = MergeAR64Row_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + MergeAR64Row(src_r, src_g, src_b, src_a, dst_ar64, depth, width); + src_r += src_stride_r; + src_g += src_stride_g; + src_b += src_stride_b; + src_a += src_stride_a; + dst_ar64 += dst_stride_ar64; + } +} + +LIBYUV_NOINLINE +static void MergeAR64PlaneOpaque(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + uint16_t* dst_ar64, + int dst_stride_ar64, + int width, + int height, + int depth) { + int y; + void (*MergeXR64Row)(const uint16_t* src_r, const uint16_t* src_g, + const uint16_t* src_b, uint16_t* dst_argb, int depth, + int width) = MergeXR64Row_C; + + // Coalesce rows. + if (src_stride_r == width && src_stride_g == width && src_stride_b == width && + dst_stride_ar64 == width * 4) { + width *= height; + height = 1; + src_stride_r = src_stride_g = src_stride_b = dst_stride_ar64 = 0; + } +#if defined(HAS_MERGEXR64ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MergeXR64Row = MergeXR64Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + MergeXR64Row = MergeXR64Row_AVX2; + } + } +#endif +#if defined(HAS_MERGEXR64ROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + MergeXR64Row = MergeXR64Row_Any_NEON; + if (IS_ALIGNED(width, 8)) { + MergeXR64Row = MergeXR64Row_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + MergeXR64Row(src_r, src_g, src_b, dst_ar64, depth, width); + src_r += src_stride_r; + src_g += src_stride_g; + src_b += src_stride_b; + dst_ar64 += dst_stride_ar64; + } +} + +LIBYUV_API +void MergeAR64Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + const uint16_t* src_a, + int src_stride_a, + uint16_t* dst_ar64, + int dst_stride_ar64, + int width, + int height, + int depth) { + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_ar64 = dst_ar64 + (height - 1) * dst_stride_ar64; + dst_stride_ar64 = -dst_stride_ar64; + } + + if (src_a == NULL) { + MergeAR64PlaneOpaque(src_r, src_stride_r, src_g, src_stride_g, src_b, + src_stride_b, dst_ar64, dst_stride_ar64, width, height, + depth); + } else { + MergeAR64PlaneAlpha(src_r, src_stride_r, src_g, src_stride_g, src_b, + src_stride_b, src_a, src_stride_a, dst_ar64, + dst_stride_ar64, width, height, depth); + } +} + +LIBYUV_NOINLINE +static void MergeARGB16To8PlaneAlpha(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int depth) { + int y; + void (*MergeARGB16To8Row)(const uint16_t* src_r, const uint16_t* src_g, + const uint16_t* src_b, const uint16_t* src_a, + uint8_t* dst_argb, int depth, int width) = + MergeARGB16To8Row_C; + + if (src_stride_r == width && src_stride_g == width && src_stride_b == width && + src_stride_a == width && dst_stride_argb == width * 4) { + width *= height; + height = 1; + src_stride_r = src_stride_g = src_stride_b = src_stride_a = + dst_stride_argb = 0; + } +#if defined(HAS_MERGEARGB16TO8ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MergeARGB16To8Row = MergeARGB16To8Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + MergeARGB16To8Row = MergeARGB16To8Row_AVX2; + } + } +#endif +#if defined(HAS_MERGEARGB16TO8ROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + MergeARGB16To8Row = MergeARGB16To8Row_Any_NEON; + if (IS_ALIGNED(width, 8)) { + MergeARGB16To8Row = MergeARGB16To8Row_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + MergeARGB16To8Row(src_r, src_g, src_b, src_a, dst_argb, depth, width); + src_r += src_stride_r; + src_g += src_stride_g; + src_b += src_stride_b; + src_a += src_stride_a; + dst_argb += dst_stride_argb; + } +} + +LIBYUV_NOINLINE +static void MergeARGB16To8PlaneOpaque(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int depth) { + int y; + void (*MergeXRGB16To8Row)(const uint16_t* src_r, const uint16_t* src_g, + const uint16_t* src_b, uint8_t* dst_argb, int depth, + int width) = MergeXRGB16To8Row_C; + + // Coalesce rows. + if (src_stride_r == width && src_stride_g == width && src_stride_b == width && + dst_stride_argb == width * 4) { + width *= height; + height = 1; + src_stride_r = src_stride_g = src_stride_b = dst_stride_argb = 0; + } +#if defined(HAS_MERGEXRGB16TO8ROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + MergeXRGB16To8Row = MergeXRGB16To8Row_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + MergeXRGB16To8Row = MergeXRGB16To8Row_AVX2; + } + } +#endif +#if defined(HAS_MERGEXRGB16TO8ROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + MergeXRGB16To8Row = MergeXRGB16To8Row_Any_NEON; + if (IS_ALIGNED(width, 8)) { + MergeXRGB16To8Row = MergeXRGB16To8Row_NEON; + } + } +#endif + + for (y = 0; y < height; ++y) { + MergeXRGB16To8Row(src_r, src_g, src_b, dst_argb, depth, width); + src_r += src_stride_r; + src_g += src_stride_g; + src_b += src_stride_b; + dst_argb += dst_stride_argb; + } +} + +LIBYUV_API +void MergeARGB16To8Plane(const uint16_t* src_r, + int src_stride_r, + const uint16_t* src_g, + int src_stride_g, + const uint16_t* src_b, + int src_stride_b, + const uint16_t* src_a, + int src_stride_a, + uint8_t* dst_argb, + int dst_stride_argb, + int width, + int height, + int depth) { + // Negative height means invert the image. + if (height < 0) { + height = -height; + dst_argb = dst_argb + (height - 1) * dst_stride_argb; + dst_stride_argb = -dst_stride_argb; + } + + if (src_a == NULL) { + MergeARGB16To8PlaneOpaque(src_r, src_stride_r, src_g, src_stride_g, src_b, + src_stride_b, dst_argb, dst_stride_argb, width, + height, depth); + } else { + MergeARGB16To8PlaneAlpha(src_r, src_stride_r, src_g, src_stride_g, src_b, + src_stride_b, src_a, src_stride_a, dst_argb, + dst_stride_argb, width, height, depth); + } +} + // Convert YUY2 to I422. LIBYUV_API int YUY2ToI422(const uint8_t* src_yuy2, @@ -1756,12 +2642,12 @@ int ARGBAdd(const uint8_t* src_argb0, height = 1; src_stride_argb0 = src_stride_argb1 = dst_stride_argb = 0; } -#if defined(HAS_ARGBADDROW_SSE2) && (defined(_MSC_VER) && !defined(__clang__)) +#if defined(HAS_ARGBADDROW_SSE2) if (TestCpuFlag(kCpuHasSSE2)) { ARGBAddRow = ARGBAddRow_SSE2; } #endif -#if defined(HAS_ARGBADDROW_SSE2) && !(defined(_MSC_VER) && !defined(__clang__)) +#if defined(HAS_ARGBADDROW_SSE2) if (TestCpuFlag(kCpuHasSSE2)) { ARGBAddRow = ARGBAddRow_Any_SSE2; if (IS_ALIGNED(width, 4)) { @@ -3039,6 +3925,76 @@ int ARGBShuffle(const uint8_t* src_bgra, return 0; } +// Shuffle AR64 channel order. e.g. AR64 to AB64. +LIBYUV_API +int AR64Shuffle(const uint16_t* src_ar64, + int src_stride_ar64, + uint16_t* dst_ar64, + int dst_stride_ar64, + const uint8_t* shuffler, + int width, + int height) { + int y; + void (*AR64ShuffleRow)(const uint8_t* src_ar64, uint8_t* dst_ar64, + const uint8_t* shuffler, int width) = AR64ShuffleRow_C; + if (!src_ar64 || !dst_ar64 || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_ar64 = src_ar64 + (height - 1) * src_stride_ar64; + src_stride_ar64 = -src_stride_ar64; + } + // Coalesce rows. + if (src_stride_ar64 == width * 4 && dst_stride_ar64 == width * 4) { + width *= height; + height = 1; + src_stride_ar64 = dst_stride_ar64 = 0; + } + // Assembly versions can be reused if it's implemented with shuffle. +#if defined(HAS_ARGBSHUFFLEROW_SSSE3) + if (TestCpuFlag(kCpuHasSSSE3)) { + AR64ShuffleRow = ARGBShuffleRow_Any_SSSE3; + if (IS_ALIGNED(width, 8)) { + AR64ShuffleRow = ARGBShuffleRow_SSSE3; + } + } +#endif +#if defined(HAS_ARGBSHUFFLEROW_AVX2) + if (TestCpuFlag(kCpuHasAVX2)) { + AR64ShuffleRow = ARGBShuffleRow_Any_AVX2; + if (IS_ALIGNED(width, 16)) { + AR64ShuffleRow = ARGBShuffleRow_AVX2; + } + } +#endif +#if defined(HAS_ARGBSHUFFLEROW_NEON) + if (TestCpuFlag(kCpuHasNEON)) { + AR64ShuffleRow = ARGBShuffleRow_Any_NEON; + if (IS_ALIGNED(width, 4)) { + AR64ShuffleRow = ARGBShuffleRow_NEON; + } + } +#endif +#if defined(HAS_ARGBSHUFFLEROW_MMI) + if (TestCpuFlag(kCpuHasMMI)) { + AR64ShuffleRow = ARGBShuffleRow_Any_MMI; + if (IS_ALIGNED(width, 2)) { + AR64ShuffleRow = ARGBShuffleRow_MMI; + } + } +#endif + + for (y = 0; y < height; ++y) { + AR64ShuffleRow((uint8_t*)(src_ar64), (uint8_t*)(dst_ar64), shuffler, + width * 2); + src_ar64 += src_stride_ar64; + dst_ar64 += dst_stride_ar64; + } + return 0; +} + // Gauss blur a float plane using Gaussian 5x5 filter with // coefficients of 1, 4, 6, 4, 1. // Each destination pixel is a blur of the 5x5 diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate.cc b/third-party/libyuv/third_party/libyuv/source/rotate.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate.cc rename to third-party/libyuv/third_party/libyuv/source/rotate.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_any.cc b/third-party/libyuv/third_party/libyuv/source/rotate_any.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_any.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_any.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_argb.cc b/third-party/libyuv/third_party/libyuv/source/rotate_argb.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_argb.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_argb.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_common.cc b/third-party/libyuv/third_party/libyuv/source/rotate_common.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_common.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_common.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_gcc.cc b/third-party/libyuv/third_party/libyuv/source/rotate_gcc.cc similarity index 99% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_gcc.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_gcc.cc index fd359d4ae6..1a3f8cbbda 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_gcc.cc +++ b/third-party/libyuv/third_party/libyuv/source/rotate_gcc.cc @@ -17,8 +17,7 @@ extern "C" { #endif // This module is for GCC x86 and x64. -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) // Transpose 8x8. 32 or 64 bit, but not NaCL for 64 bit. #if defined(HAS_TRANSPOSEWX8_SSSE3) diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_mmi.cc b/third-party/libyuv/third_party/libyuv/source/rotate_mmi.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_mmi.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_mmi.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_msa.cc b/third-party/libyuv/third_party/libyuv/source/rotate_msa.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_msa.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_msa.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_neon.cc b/third-party/libyuv/third_party/libyuv/source/rotate_neon.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_neon.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_neon.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_neon64.cc b/third-party/libyuv/third_party/libyuv/source/rotate_neon64.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_neon64.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_neon64.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_win.cc b/third-party/libyuv/third_party/libyuv/source/rotate_win.cc similarity index 98% rename from third-party/webrtc/dependencies/third_party/libyuv/source/rotate_win.cc rename to third-party/libyuv/third_party/libyuv/source/rotate_win.cc index e887dd525c..a78873f843 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/rotate_win.cc +++ b/third-party/libyuv/third_party/libyuv/source/rotate_win.cc @@ -16,8 +16,9 @@ namespace libyuv { extern "C" { #endif -// This module is for 32 bit Visual C x86 and clangcl -#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) +// This module is for 32 bit Visual C x86 +#if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && \ + !defined(__clang__) && defined(_M_IX86) __declspec(naked) void TransposeWx8_SSSE3(const uint8_t* src, int src_stride, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/row_any.cc b/third-party/libyuv/third_party/libyuv/source/row_any.cc similarity index 73% rename from third-party/webrtc/dependencies/third_party/libyuv/source/row_any.cc rename to third-party/libyuv/third_party/libyuv/source/row_any.cc index 7216373bcd..c9a402eda2 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/row_any.cc +++ b/third-party/libyuv/third_party/libyuv/source/row_any.cc @@ -30,6 +30,39 @@ extern "C" { // Subsampled source needs to be increase by 1 of not even. #define SS(width, shift) (((width) + (1 << (shift)) - 1) >> (shift)) +// Any 4 planes to 1 +#define ANY41(NAMEANY, ANY_SIMD, UVSHIFT, DUVSHIFT, BPP, MASK) \ + void NAMEANY(const uint8_t* y_buf, const uint8_t* u_buf, \ + const uint8_t* v_buf, const uint8_t* a_buf, uint8_t* dst_ptr, \ + int width) { \ + SIMD_ALIGNED(uint8_t temp[64 * 5]); \ + memset(temp, 0, 64 * 4); /* for msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(y_buf, u_buf, v_buf, a_buf, dst_ptr, n); \ + } \ + memcpy(temp, y_buf + n, r); \ + memcpy(temp + 64, u_buf + (n >> UVSHIFT), SS(r, UVSHIFT)); \ + memcpy(temp + 128, v_buf + (n >> UVSHIFT), SS(r, UVSHIFT)); \ + memcpy(temp + 192, a_buf + n, r); \ + ANY_SIMD(temp, temp + 64, temp + 128, temp + 192, temp + 256, MASK + 1); \ + memcpy(dst_ptr + (n >> DUVSHIFT) * BPP, temp + 256, \ + SS(r, DUVSHIFT) * BPP); \ + } + +#ifdef HAS_MERGEARGBROW_SSE2 +ANY41(MergeARGBRow_Any_SSE2, MergeARGBRow_SSE2, 0, 0, 4, 7) +#endif +#ifdef HAS_MERGEARGBROW_AVX2 +ANY41(MergeARGBRow_Any_AVX2, MergeARGBRow_AVX2, 0, 0, 4, 15) +#endif +#ifdef HAS_MERGEARGBROW_NEON +ANY41(MergeARGBRow_Any_NEON, MergeARGBRow_NEON, 0, 0, 4, 15) +#endif + +// Note that odd width replication includes 444 due to implementation +// on arm that subsamples 444 to 422 internally. // Any 4 planes to 1 with yuvconstants #define ANY41C(NAMEANY, ANY_SIMD, UVSHIFT, DUVSHIFT, BPP, MASK) \ void NAMEANY(const uint8_t* y_buf, const uint8_t* u_buf, \ @@ -46,29 +79,166 @@ extern "C" { memcpy(temp + 64, u_buf + (n >> UVSHIFT), SS(r, UVSHIFT)); \ memcpy(temp + 128, v_buf + (n >> UVSHIFT), SS(r, UVSHIFT)); \ memcpy(temp + 192, a_buf + n, r); \ + if (width & 1) { \ + temp[64 + SS(r, UVSHIFT)] = temp[64 + SS(r, UVSHIFT) - 1]; \ + temp[128 + SS(r, UVSHIFT)] = temp[128 + SS(r, UVSHIFT) - 1]; \ + } \ ANY_SIMD(temp, temp + 64, temp + 128, temp + 192, temp + 256, \ yuvconstants, MASK + 1); \ memcpy(dst_ptr + (n >> DUVSHIFT) * BPP, temp + 256, \ SS(r, DUVSHIFT) * BPP); \ } +#ifdef HAS_I444ALPHATOARGBROW_SSSE3 +ANY41C(I444AlphaToARGBRow_Any_SSSE3, I444AlphaToARGBRow_SSSE3, 0, 0, 4, 7) +#endif +#ifdef HAS_I444ALPHATOARGBROW_AVX2 +ANY41C(I444AlphaToARGBRow_Any_AVX2, I444AlphaToARGBRow_AVX2, 0, 0, 4, 15) +#endif #ifdef HAS_I422ALPHATOARGBROW_SSSE3 ANY41C(I422AlphaToARGBRow_Any_SSSE3, I422AlphaToARGBRow_SSSE3, 1, 0, 4, 7) #endif #ifdef HAS_I422ALPHATOARGBROW_AVX2 ANY41C(I422AlphaToARGBRow_Any_AVX2, I422AlphaToARGBRow_AVX2, 1, 0, 4, 15) #endif +#ifdef HAS_I444ALPHATOARGBROW_NEON +ANY41C(I444AlphaToARGBRow_Any_NEON, I444AlphaToARGBRow_NEON, 0, 0, 4, 7) +#endif #ifdef HAS_I422ALPHATOARGBROW_NEON ANY41C(I422AlphaToARGBRow_Any_NEON, I422AlphaToARGBRow_NEON, 1, 0, 4, 7) #endif +#ifdef HAS_I444ALPHATOARGBROW_MSA +ANY41C(I444AlphaToARGBRow_Any_MSA, I444AlphaToARGBRow_MSA, 0, 0, 4, 7) +#endif #ifdef HAS_I422ALPHATOARGBROW_MSA ANY41C(I422AlphaToARGBRow_Any_MSA, I422AlphaToARGBRow_MSA, 1, 0, 4, 7) #endif +#ifdef HAS_I444ALPHATOARGBROW_MMI +ANY41C(I444AlphaToARGBRow_Any_MMI, I444AlphaToARGBRow_MMI, 0, 0, 4, 7) +#endif #ifdef HAS_I422ALPHATOARGBROW_MMI ANY41C(I422AlphaToARGBRow_Any_MMI, I422AlphaToARGBRow_MMI, 1, 0, 4, 7) #endif #undef ANY41C +// Any 4 planes to 1 plane of 8 bit with yuvconstants +#define ANY41CT(NAMEANY, ANY_SIMD, UVSHIFT, DUVSHIFT, T, SBPP, BPP, MASK) \ + void NAMEANY(const T* y_buf, const T* u_buf, const T* v_buf, const T* a_buf, \ + uint8_t* dst_ptr, const struct YuvConstants* yuvconstants, \ + int width) { \ + SIMD_ALIGNED(T temp[16 * 4]); \ + SIMD_ALIGNED(uint8_t out[64]); \ + memset(temp, 0, 16 * 4 * SBPP); /* for YUY2 and msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(y_buf, u_buf, v_buf, a_buf, dst_ptr, yuvconstants, n); \ + } \ + memcpy(temp, y_buf + n, r * SBPP); \ + memcpy(temp + 16, u_buf + (n >> UVSHIFT), SS(r, UVSHIFT) * SBPP); \ + memcpy(temp + 32, v_buf + (n >> UVSHIFT), SS(r, UVSHIFT) * SBPP); \ + memcpy(temp + 48, a_buf + n, r * SBPP); \ + ANY_SIMD(temp, temp + 16, temp + 32, temp + 48, out, yuvconstants, \ + MASK + 1); \ + memcpy(dst_ptr + (n >> DUVSHIFT) * BPP, out, SS(r, DUVSHIFT) * BPP); \ + } + +#ifdef HAS_I210ALPHATOARGBROW_SSSE3 +ANY41CT(I210AlphaToARGBRow_Any_SSSE3, + I210AlphaToARGBRow_SSSE3, + 1, + 0, + uint16_t, + 2, + 4, + 7) +#endif + +#ifdef HAS_I210ALPHATOARGBROW_AVX2 +ANY41CT(I210AlphaToARGBRow_Any_AVX2, + I210AlphaToARGBRow_AVX2, + 1, + 0, + uint16_t, + 2, + 4, + 15) +#endif + +#ifdef HAS_I410ALPHATOARGBROW_SSSE3 +ANY41CT(I410AlphaToARGBRow_Any_SSSE3, + I410AlphaToARGBRow_SSSE3, + 0, + 0, + uint16_t, + 2, + 4, + 7) +#endif + +#ifdef HAS_I410ALPHATOARGBROW_AVX2 +ANY41CT(I410AlphaToARGBRow_Any_AVX2, + I410AlphaToARGBRow_AVX2, + 0, + 0, + uint16_t, + 2, + 4, + 15) +#endif + +#undef ANY41CT + +// Any 4 planes to 1 plane with parameter +#define ANY41PT(NAMEANY, ANY_SIMD, STYPE, SBPP, DTYPE, BPP, MASK) \ + void NAMEANY(const STYPE* r_buf, const STYPE* g_buf, const STYPE* b_buf, \ + const STYPE* a_buf, DTYPE* dst_ptr, int depth, int width) { \ + SIMD_ALIGNED(STYPE temp[16 * 4]); \ + SIMD_ALIGNED(DTYPE out[64]); \ + memset(temp, 0, 16 * 4 * SBPP); /* for YUY2 and msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(r_buf, g_buf, b_buf, a_buf, dst_ptr, depth, n); \ + } \ + memcpy(temp, r_buf + n, r * SBPP); \ + memcpy(temp + 16, g_buf + n, r * SBPP); \ + memcpy(temp + 32, b_buf + n, r * SBPP); \ + memcpy(temp + 48, a_buf + n, r * SBPP); \ + ANY_SIMD(temp, temp + 16, temp + 32, temp + 48, out, depth, MASK + 1); \ + memcpy((uint8_t*)dst_ptr + n * BPP, out, r * BPP); \ + } + +#ifdef HAS_MERGEAR64ROW_AVX2 +ANY41PT(MergeAR64Row_Any_AVX2, MergeAR64Row_AVX2, uint16_t, 2, uint16_t, 8, 15) +#endif + +#ifdef HAS_MERGEAR64ROW_NEON +ANY41PT(MergeAR64Row_Any_NEON, MergeAR64Row_NEON, uint16_t, 2, uint16_t, 8, 7) +#endif + +#ifdef HAS_MERGEARGB16TO8ROW_AVX2 +ANY41PT(MergeARGB16To8Row_Any_AVX2, + MergeARGB16To8Row_AVX2, + uint16_t, + 2, + uint8_t, + 4, + 15) +#endif + +#ifdef HAS_MERGEARGB16TO8ROW_NEON +ANY41PT(MergeARGB16To8Row_Any_NEON, + MergeARGB16To8Row_NEON, + uint16_t, + 2, + uint8_t, + 4, + 7) +#endif + +#undef ANY41PT + // Any 3 planes to 1. #define ANY31(NAMEANY, ANY_SIMD, UVSHIFT, DUVSHIFT, BPP, MASK) \ void NAMEANY(const uint8_t* y_buf, const uint8_t* u_buf, \ @@ -98,6 +268,15 @@ ANY31(MergeRGBRow_Any_NEON, MergeRGBRow_NEON, 0, 0, 3, 15) #ifdef HAS_MERGERGBROW_MMI ANY31(MergeRGBRow_Any_MMI, MergeRGBRow_MMI, 0, 0, 3, 7) #endif +#ifdef HAS_MERGEXRGBROW_SSE2 +ANY31(MergeXRGBRow_Any_SSE2, MergeXRGBRow_SSE2, 0, 0, 4, 7) +#endif +#ifdef HAS_MERGEXRGBROW_AVX2 +ANY31(MergeXRGBRow_Any_AVX2, MergeXRGBRow_AVX2, 0, 0, 4, 15) +#endif +#ifdef HAS_MERGEXRGBROW_NEON +ANY31(MergeXRGBRow_Any_NEON, MergeXRGBRow_NEON, 0, 0, 4, 15) +#endif #ifdef HAS_I422TOYUY2ROW_SSE2 ANY31(I422ToYUY2Row_Any_SSE2, I422ToYUY2Row_SSE2, 1, 1, 4, 15) ANY31(I422ToUYVYRow_Any_SSE2, I422ToUYVYRow_SSE2, 1, 1, 4, 15) @@ -165,6 +344,21 @@ ANY31(BlendPlaneRow_Any_MMI, BlendPlaneRow_MMI, 0, 0, 1, 7) #ifdef HAS_I422TOARGBROW_SSSE3 ANY31C(I422ToARGBRow_Any_SSSE3, I422ToARGBRow_SSSE3, 1, 0, 4, 7) #endif +#ifdef HAS_I422TORGBAROW_SSSE3 +ANY31C(I422ToRGBARow_Any_SSSE3, I422ToRGBARow_SSSE3, 1, 0, 4, 7) +#endif +#ifdef HAS_I422TOARGB4444ROW_SSSE3 +ANY31C(I422ToARGB4444Row_Any_SSSE3, I422ToARGB4444Row_SSSE3, 1, 0, 2, 7) +#endif +#ifdef HAS_I422TOARGB1555ROW_SSSE3 +ANY31C(I422ToARGB1555Row_Any_SSSE3, I422ToARGB1555Row_SSSE3, 1, 0, 2, 7) +#endif +#ifdef HAS_I422TORGB565ROW_SSSE3 +ANY31C(I422ToRGB565Row_Any_SSSE3, I422ToRGB565Row_SSSE3, 1, 0, 2, 7) +#endif +#ifdef HAS_I422TORGB24ROW_SSSE3 +ANY31C(I422ToRGB24Row_Any_SSSE3, I422ToRGB24Row_SSSE3, 1, 0, 3, 15) +#endif #ifdef HAS_I422TOAR30ROW_SSSE3 ANY31C(I422ToAR30Row_Any_SSSE3, I422ToAR30Row_SSSE3, 1, 0, 4, 7) #endif @@ -173,12 +367,7 @@ ANY31C(I422ToAR30Row_Any_AVX2, I422ToAR30Row_AVX2, 1, 0, 4, 15) #endif #ifdef HAS_I444TOARGBROW_SSSE3 ANY31C(I444ToARGBRow_Any_SSSE3, I444ToARGBRow_SSSE3, 0, 0, 4, 7) -ANY31C(I422ToRGBARow_Any_SSSE3, I422ToRGBARow_SSSE3, 1, 0, 4, 7) -ANY31C(I422ToARGB4444Row_Any_SSSE3, I422ToARGB4444Row_SSSE3, 1, 0, 2, 7) -ANY31C(I422ToARGB1555Row_Any_SSSE3, I422ToARGB1555Row_SSSE3, 1, 0, 2, 7) -ANY31C(I422ToRGB565Row_Any_SSSE3, I422ToRGB565Row_SSSE3, 1, 0, 2, 7) -ANY31C(I422ToRGB24Row_Any_SSSE3, I422ToRGB24Row_SSSE3, 1, 0, 3, 15) -#endif // HAS_I444TOARGBROW_SSSE3 +#endif #ifdef HAS_I422TORGB24ROW_AVX2 ANY31C(I422ToRGB24Row_Any_AVX2, I422ToRGB24Row_AVX2, 1, 0, 3, 31) #endif @@ -262,11 +451,99 @@ ANY31CT(I210ToARGBRow_Any_AVX2, I210ToARGBRow_AVX2, 1, 0, uint16_t, 2, 4, 15) #ifdef HAS_I210TOAR30ROW_AVX2 ANY31CT(I210ToAR30Row_Any_AVX2, I210ToAR30Row_AVX2, 1, 0, uint16_t, 2, 4, 15) #endif +#ifdef HAS_I410TOAR30ROW_SSSE3 +ANY31CT(I410ToAR30Row_Any_SSSE3, I410ToAR30Row_SSSE3, 0, 0, uint16_t, 2, 4, 7) +#endif +#ifdef HAS_I410TOARGBROW_SSSE3 +ANY31CT(I410ToARGBRow_Any_SSSE3, I410ToARGBRow_SSSE3, 0, 0, uint16_t, 2, 4, 7) +#endif +#ifdef HAS_I410TOARGBROW_AVX2 +ANY31CT(I410ToARGBRow_Any_AVX2, I410ToARGBRow_AVX2, 0, 0, uint16_t, 2, 4, 15) +#endif +#ifdef HAS_I410TOAR30ROW_AVX2 +ANY31CT(I410ToAR30Row_Any_AVX2, I410ToAR30Row_AVX2, 0, 0, uint16_t, 2, 4, 15) +#endif #ifdef HAS_I210TOARGBROW_MMI ANY31CT(I210ToARGBRow_Any_MMI, I210ToARGBRow_MMI, 1, 0, uint16_t, 2, 4, 7) #endif +#ifdef HAS_I212TOAR30ROW_SSSE3 +ANY31CT(I212ToAR30Row_Any_SSSE3, I212ToAR30Row_SSSE3, 1, 0, uint16_t, 2, 4, 7) +#endif +#ifdef HAS_I212TOARGBROW_SSSE3 +ANY31CT(I212ToARGBRow_Any_SSSE3, I212ToARGBRow_SSSE3, 1, 0, uint16_t, 2, 4, 7) +#endif +#ifdef HAS_I212TOARGBROW_AVX2 +ANY31CT(I212ToARGBRow_Any_AVX2, I212ToARGBRow_AVX2, 1, 0, uint16_t, 2, 4, 15) +#endif +#ifdef HAS_I212TOAR30ROW_AVX2 +ANY31CT(I212ToAR30Row_Any_AVX2, I212ToAR30Row_AVX2, 1, 0, uint16_t, 2, 4, 15) +#endif #undef ANY31CT +// Any 3 planes to 1 plane with parameter +#define ANY31PT(NAMEANY, ANY_SIMD, STYPE, SBPP, DTYPE, BPP, MASK) \ + void NAMEANY(const STYPE* r_buf, const STYPE* g_buf, const STYPE* b_buf, \ + DTYPE* dst_ptr, int depth, int width) { \ + SIMD_ALIGNED(STYPE temp[16 * 3]); \ + SIMD_ALIGNED(DTYPE out[64]); \ + memset(temp, 0, 16 * 3 * SBPP); /* for YUY2 and msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(r_buf, g_buf, b_buf, dst_ptr, depth, n); \ + } \ + memcpy(temp, r_buf + n, r * SBPP); \ + memcpy(temp + 16, g_buf + n, r * SBPP); \ + memcpy(temp + 32, b_buf + n, r * SBPP); \ + ANY_SIMD(temp, temp + 16, temp + 32, out, depth, MASK + 1); \ + memcpy((uint8_t*)dst_ptr + n * BPP, out, r * BPP); \ + } + +#ifdef HAS_MERGEXR30ROW_AVX2 +ANY31PT(MergeXR30Row_Any_AVX2, MergeXR30Row_AVX2, uint16_t, 2, uint8_t, 4, 15) +#endif + +#ifdef HAS_MERGEXR30ROW_NEON +ANY31PT(MergeXR30Row_Any_NEON, MergeXR30Row_NEON, uint16_t, 2, uint8_t, 4, 3) +ANY31PT(MergeXR30Row_10_Any_NEON, + MergeXR30Row_10_NEON, + uint16_t, + 2, + uint8_t, + 4, + 3) +#endif + +#ifdef HAS_MERGEXR64ROW_AVX2 +ANY31PT(MergeXR64Row_Any_AVX2, MergeXR64Row_AVX2, uint16_t, 2, uint16_t, 8, 15) +#endif + +#ifdef HAS_MERGEXR64ROW_NEON +ANY31PT(MergeXR64Row_Any_NEON, MergeXR64Row_NEON, uint16_t, 2, uint16_t, 8, 7) +#endif + +#ifdef HAS_MERGEXRGB16TO8ROW_AVX2 +ANY31PT(MergeXRGB16To8Row_Any_AVX2, + MergeXRGB16To8Row_AVX2, + uint16_t, + 2, + uint8_t, + 4, + 15) +#endif + +#ifdef HAS_MERGEXRGB16TO8ROW_NEON +ANY31PT(MergeXRGB16To8Row_Any_NEON, + MergeXRGB16To8Row_NEON, + uint16_t, + 2, + uint8_t, + 4, + 7) +#endif + +#undef ANY31PT + // Any 2 planes to 1. #define ANY21(NAMEANY, ANY_SIMD, UVSHIFT, SBPP, SBPP2, BPP, MASK) \ void NAMEANY(const uint8_t* y_buf, const uint8_t* uv_buf, uint8_t* dst_ptr, \ @@ -481,6 +758,77 @@ ANY21C(NV12ToRGB565Row_Any_MMI, NV12ToRGB565Row_MMI, 1, 1, 2, 2, 7) #endif #undef ANY21C +// Any 2 planes of 16 bit to 1 with yuvconstants +#define ANY21CT(NAMEANY, ANY_SIMD, UVSHIFT, DUVSHIFT, T, SBPP, BPP, MASK) \ + void NAMEANY(const T* y_buf, const T* uv_buf, uint8_t* dst_ptr, \ + const struct YuvConstants* yuvconstants, int width) { \ + SIMD_ALIGNED(T temp[16 * 3]); \ + SIMD_ALIGNED(uint8_t out[64]); \ + memset(temp, 0, 16 * 3 * SBPP); /* for YUY2 and msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(y_buf, uv_buf, dst_ptr, yuvconstants, n); \ + } \ + memcpy(temp, y_buf + n, r * SBPP); \ + memcpy(temp + 16, uv_buf + 2 * (n >> UVSHIFT), SS(r, UVSHIFT) * SBPP * 2); \ + ANY_SIMD(temp, temp + 16, out, yuvconstants, MASK + 1); \ + memcpy(dst_ptr + (n >> DUVSHIFT) * BPP, out, SS(r, DUVSHIFT) * BPP); \ + } + +#ifdef HAS_P210TOAR30ROW_SSSE3 +ANY21CT(P210ToAR30Row_Any_SSSE3, P210ToAR30Row_SSSE3, 1, 0, uint16_t, 2, 4, 7) +#endif +#ifdef HAS_P210TOARGBROW_SSSE3 +ANY21CT(P210ToARGBRow_Any_SSSE3, P210ToARGBRow_SSSE3, 1, 0, uint16_t, 2, 4, 7) +#endif +#ifdef HAS_P210TOARGBROW_AVX2 +ANY21CT(P210ToARGBRow_Any_AVX2, P210ToARGBRow_AVX2, 1, 0, uint16_t, 2, 4, 15) +#endif +#ifdef HAS_P210TOAR30ROW_AVX2 +ANY21CT(P210ToAR30Row_Any_AVX2, P210ToAR30Row_AVX2, 1, 0, uint16_t, 2, 4, 15) +#endif +#ifdef HAS_P410TOAR30ROW_SSSE3 +ANY21CT(P410ToAR30Row_Any_SSSE3, P410ToAR30Row_SSSE3, 0, 0, uint16_t, 2, 4, 7) +#endif +#ifdef HAS_P410TOARGBROW_SSSE3 +ANY21CT(P410ToARGBRow_Any_SSSE3, P410ToARGBRow_SSSE3, 0, 0, uint16_t, 2, 4, 7) +#endif +#ifdef HAS_P410TOARGBROW_AVX2 +ANY21CT(P410ToARGBRow_Any_AVX2, P410ToARGBRow_AVX2, 0, 0, uint16_t, 2, 4, 15) +#endif +#ifdef HAS_P410TOAR30ROW_AVX2 +ANY21CT(P410ToAR30Row_Any_AVX2, P410ToAR30Row_AVX2, 0, 0, uint16_t, 2, 4, 15) +#endif + +#undef ANY21CT + +// Any 2 16 bit planes with parameter to 1 +#define ANY21PT(NAMEANY, ANY_SIMD, T, BPP, MASK) \ + void NAMEANY(const T* src_u, const T* src_v, T* dst_uv, int depth, \ + int width) { \ + SIMD_ALIGNED(T temp[16 * 4]); \ + memset(temp, 0, 16 * 4 * BPP); /* for msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(src_u, src_v, dst_uv, depth, n); \ + } \ + memcpy(temp, src_u + n, r * BPP); \ + memcpy(temp + 16, src_v + n, r * BPP); \ + ANY_SIMD(temp, temp + 16, temp + 32, depth, MASK + 1); \ + memcpy(dst_uv + n * 2, temp + 32, r * BPP * 2); \ + } + +#ifdef HAS_MERGEUVROW_16_AVX2 +ANY21PT(MergeUVRow_16_Any_AVX2, MergeUVRow_16_AVX2, uint16_t, 2, 15) +#endif +#ifdef HAS_MERGEUVROW_16_NEON +ANY21PT(MergeUVRow_16_Any_NEON, MergeUVRow_16_NEON, uint16_t, 2, 7) +#endif + +#undef ANY21CT + // Any 1 to 1. #define ANY11(NAMEANY, ANY_SIMD, UVSHIFT, SBPP, BPP, MASK) \ void NAMEANY(const uint8_t* src_ptr, uint8_t* dst_ptr, int width) { \ @@ -1009,6 +1357,72 @@ ANY11P(ARGBShuffleRow_Any_MMI, ARGBShuffleRow_MMI, const uint8_t*, 4, 4, 1) #undef ANY11P #undef ANY11P +// Any 1 to 1 with type +#define ANY11T(NAMEANY, ANY_SIMD, SBPP, BPP, STYPE, DTYPE, MASK) \ + void NAMEANY(const STYPE* src_ptr, DTYPE* dst_ptr, int width) { \ + SIMD_ALIGNED(uint8_t temp[(MASK + 1) * SBPP]); \ + SIMD_ALIGNED(uint8_t out[(MASK + 1) * BPP]); \ + memset(temp, 0, (MASK + 1) * SBPP); /* for msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(src_ptr, dst_ptr, n); \ + } \ + memcpy(temp, (uint8_t*)(src_ptr) + n * SBPP, r * SBPP); \ + ANY_SIMD((STYPE*)temp, (DTYPE*)out, MASK + 1); \ + memcpy((uint8_t*)(dst_ptr) + n * BPP, out, r * BPP); \ + } + +#ifdef HAS_ARGBTOAR64ROW_SSSE3 +ANY11T(ARGBToAR64Row_Any_SSSE3, ARGBToAR64Row_SSSE3, 4, 8, uint8_t, uint16_t, 3) +#endif + +#ifdef HAS_ARGBTOAB64ROW_SSSE3 +ANY11T(ARGBToAB64Row_Any_SSSE3, ARGBToAB64Row_SSSE3, 4, 8, uint8_t, uint16_t, 3) +#endif + +#ifdef HAS_AR64TOARGBROW_SSSE3 +ANY11T(AR64ToARGBRow_Any_SSSE3, AR64ToARGBRow_SSSE3, 8, 4, uint16_t, uint8_t, 3) +#endif + +#ifdef HAS_ARGBTOAR64ROW_SSSE3 +ANY11T(AB64ToARGBRow_Any_SSSE3, AB64ToARGBRow_SSSE3, 8, 4, uint16_t, uint8_t, 3) +#endif + +#ifdef HAS_ARGBTOAR64ROW_AVX2 +ANY11T(ARGBToAR64Row_Any_AVX2, ARGBToAR64Row_AVX2, 4, 8, uint8_t, uint16_t, 7) +#endif + +#ifdef HAS_ARGBTOAB64ROW_AVX2 +ANY11T(ARGBToAB64Row_Any_AVX2, ARGBToAB64Row_AVX2, 4, 8, uint8_t, uint16_t, 7) +#endif + +#ifdef HAS_AR64TOARGBROW_AVX2 +ANY11T(AR64ToARGBRow_Any_AVX2, AR64ToARGBRow_AVX2, 8, 4, uint16_t, uint8_t, 7) +#endif + +#ifdef HAS_ARGBTOAR64ROW_AVX2 +ANY11T(AB64ToARGBRow_Any_AVX2, AB64ToARGBRow_AVX2, 8, 4, uint16_t, uint8_t, 7) +#endif + +#ifdef HAS_ARGBTOAR64ROW_NEON +ANY11T(ARGBToAR64Row_Any_NEON, ARGBToAR64Row_NEON, 4, 8, uint8_t, uint16_t, 7) +#endif + +#ifdef HAS_ARGBTOAB64ROW_NEON +ANY11T(ARGBToAB64Row_Any_NEON, ARGBToAB64Row_NEON, 4, 8, uint8_t, uint16_t, 7) +#endif + +#ifdef HAS_AR64TOARGBROW_NEON +ANY11T(AR64ToARGBRow_Any_NEON, AR64ToARGBRow_NEON, 8, 4, uint16_t, uint8_t, 7) +#endif + +#ifdef HAS_ARGBTOAR64ROW_NEON +ANY11T(AB64ToARGBRow_Any_NEON, AB64ToARGBRow_NEON, 8, 4, uint16_t, uint8_t, 7) +#endif + +#undef ANY11T + // Any 1 to 1 with parameter and shorts. BPP measures in shorts. #define ANY11C(NAMEANY, ANY_SIMD, SBPP, BPP, STYPE, DTYPE, MASK) \ void NAMEANY(const STYPE* src_ptr, DTYPE* dst_ptr, int scale, int width) { \ @@ -1061,6 +1475,30 @@ ANY11C(Convert8To16Row_Any_AVX2, uint16_t, 31) #endif +#ifdef HAS_MULTIPLYROW_16_AVX2 +ANY11C(MultiplyRow_16_Any_AVX2, + MultiplyRow_16_AVX2, + 2, + 2, + uint16_t, + uint16_t, + 31) +#endif +#ifdef HAS_MULTIPLYROW_16_NEON +ANY11C(MultiplyRow_16_Any_NEON, + MultiplyRow_16_NEON, + 2, + 2, + uint16_t, + uint16_t, + 15) +#endif +#ifdef HAS_DIVIDEROW_16_AVX2 +ANY11C(DivideRow_16_Any_AVX2, DivideRow_16_AVX2, 2, 2, uint16_t, uint16_t, 31) +#endif +#ifdef HAS_DIVIDEROW_16_NEON +ANY11C(DivideRow_16_Any_NEON, DivideRow_16_NEON, 2, 2, uint16_t, uint16_t, 15) +#endif #undef ANY11C // Any 1 to 1 with parameter and shorts to byte. BPP measures in shorts. @@ -1151,38 +1589,38 @@ ANY11C(UYVYToARGBRow_Any_MMI, UYVYToARGBRow_MMI, 1, 4, 4, 7) #undef ANY11C // Any 1 to 1 interpolate. Takes 2 rows of source via stride. -#define ANY11T(NAMEANY, ANY_SIMD, SBPP, BPP, MASK) \ - void NAMEANY(uint8_t* dst_ptr, const uint8_t* src_ptr, \ - ptrdiff_t src_stride_ptr, int width, int source_y_fraction) { \ - SIMD_ALIGNED(uint8_t temp[64 * 3]); \ - memset(temp, 0, 64 * 2); /* for msan */ \ - int r = width & MASK; \ - int n = width & ~MASK; \ - if (n > 0) { \ - ANY_SIMD(dst_ptr, src_ptr, src_stride_ptr, n, source_y_fraction); \ - } \ - memcpy(temp, src_ptr + n * SBPP, r * SBPP); \ - memcpy(temp + 64, src_ptr + src_stride_ptr + n * SBPP, r * SBPP); \ - ANY_SIMD(temp + 128, temp, 64, MASK + 1, source_y_fraction); \ - memcpy(dst_ptr + n * BPP, temp + 128, r * BPP); \ +#define ANY11I(NAMEANY, ANY_SIMD, SBPP, BPP, MASK) \ + void NAMEANY(uint8_t* dst_ptr, const uint8_t* src_ptr, ptrdiff_t src_stride, \ + int width, int source_y_fraction) { \ + SIMD_ALIGNED(uint8_t temp[64 * 3]); \ + memset(temp, 0, 64 * 2); /* for msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(dst_ptr, src_ptr, src_stride, n, source_y_fraction); \ + } \ + memcpy(temp, src_ptr + n * SBPP, r * SBPP); \ + memcpy(temp + 64, src_ptr + src_stride + n * SBPP, r * SBPP); \ + ANY_SIMD(temp + 128, temp, 64, MASK + 1, source_y_fraction); \ + memcpy(dst_ptr + n * BPP, temp + 128, r * BPP); \ } #ifdef HAS_INTERPOLATEROW_AVX2 -ANY11T(InterpolateRow_Any_AVX2, InterpolateRow_AVX2, 1, 1, 31) +ANY11I(InterpolateRow_Any_AVX2, InterpolateRow_AVX2, 1, 1, 31) #endif #ifdef HAS_INTERPOLATEROW_SSSE3 -ANY11T(InterpolateRow_Any_SSSE3, InterpolateRow_SSSE3, 1, 1, 15) +ANY11I(InterpolateRow_Any_SSSE3, InterpolateRow_SSSE3, 1, 1, 15) #endif #ifdef HAS_INTERPOLATEROW_NEON -ANY11T(InterpolateRow_Any_NEON, InterpolateRow_NEON, 1, 1, 15) +ANY11I(InterpolateRow_Any_NEON, InterpolateRow_NEON, 1, 1, 15) #endif #ifdef HAS_INTERPOLATEROW_MSA -ANY11T(InterpolateRow_Any_MSA, InterpolateRow_MSA, 1, 1, 31) +ANY11I(InterpolateRow_Any_MSA, InterpolateRow_MSA, 1, 1, 31) #endif #ifdef HAS_INTERPOLATEROW_MMI -ANY11T(InterpolateRow_Any_MMI, InterpolateRow_MMI, 1, 1, 7) +ANY11I(InterpolateRow_Any_MMI, InterpolateRow_MMI, 1, 1, 7) #endif -#undef ANY11T +#undef ANY11I // Any 1 to 1 mirror. #define ANY11M(NAMEANY, ANY_SIMD, BPP, MASK) \ @@ -1340,6 +1778,32 @@ ANY12(YUY2ToUV422Row_Any_MMI, YUY2ToUV422Row_MMI, 1, 4, 1, 15) #endif #undef ANY12 +// Any 2 16 bit planes with parameter to 1 +#define ANY12PT(NAMEANY, ANY_SIMD, T, BPP, MASK) \ + void NAMEANY(const T* src_uv, T* dst_u, T* dst_v, int depth, int width) { \ + SIMD_ALIGNED(T temp[16 * 4]); \ + memset(temp, 0, 16 * 4 * BPP); /* for msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(src_uv, dst_u, dst_v, depth, n); \ + } \ + memcpy(temp, src_uv + n * 2, r * BPP * 2); \ + ANY_SIMD(temp, temp + 32, temp + 48, depth, MASK + 1); \ + memcpy(dst_u + n, temp + 32, r * BPP); \ + memcpy(dst_v + n, temp + 48, r * BPP); \ + } + +#ifdef HAS_SPLITUVROW_16_AVX2 +ANY12PT(SplitUVRow_16_Any_AVX2, SplitUVRow_16_AVX2, uint16_t, 2, 15) +#endif + +#ifdef HAS_SPLITUVROW_16_NEON +ANY12PT(SplitUVRow_16_Any_NEON, SplitUVRow_16_NEON, uint16_t, 2, 7) +#endif + +#undef ANY21CT + // Any 1 to 3. Outputs RGB planes. #define ANY13(NAMEANY, ANY_SIMD, BPP, MASK) \ void NAMEANY(const uint8_t* src_ptr, uint8_t* dst_r, uint8_t* dst_g, \ @@ -1367,21 +1831,66 @@ ANY13(SplitRGBRow_Any_NEON, SplitRGBRow_NEON, 3, 15) #ifdef HAS_SPLITRGBROW_MMI ANY13(SplitRGBRow_Any_MMI, SplitRGBRow_MMI, 3, 3) #endif +#ifdef HAS_SPLITXRGBROW_SSE2 +ANY13(SplitXRGBRow_Any_SSE2, SplitXRGBRow_SSE2, 4, 7) +#endif +#ifdef HAS_SPLITXRGBROW_SSSE3 +ANY13(SplitXRGBRow_Any_SSSE3, SplitXRGBRow_SSSE3, 4, 7) +#endif +#ifdef HAS_SPLITXRGBROW_AVX2 +ANY13(SplitXRGBRow_Any_AVX2, SplitXRGBRow_AVX2, 4, 15) +#endif +#ifdef HAS_SPLITXRGBROW_NEON +ANY13(SplitXRGBRow_Any_NEON, SplitXRGBRow_NEON, 4, 15) +#endif + +// Any 1 to 4. Outputs ARGB planes. +#define ANY14(NAMEANY, ANY_SIMD, BPP, MASK) \ + void NAMEANY(const uint8_t* src_ptr, uint8_t* dst_r, uint8_t* dst_g, \ + uint8_t* dst_b, uint8_t* dst_a, int width) { \ + SIMD_ALIGNED(uint8_t temp[16 * 8]); \ + memset(temp, 0, 16 * 4); /* for msan */ \ + int r = width & MASK; \ + int n = width & ~MASK; \ + if (n > 0) { \ + ANY_SIMD(src_ptr, dst_r, dst_g, dst_b, dst_a, n); \ + } \ + memcpy(temp, src_ptr + n * BPP, r * BPP); \ + ANY_SIMD(temp, temp + 16 * 4, temp + 16 * 5, temp + 16 * 6, temp + 16 * 7, \ + MASK + 1); \ + memcpy(dst_r + n, temp + 16 * 4, r); \ + memcpy(dst_g + n, temp + 16 * 5, r); \ + memcpy(dst_b + n, temp + 16 * 6, r); \ + memcpy(dst_a + n, temp + 16 * 7, r); \ + } + +#ifdef HAS_SPLITARGBROW_SSE2 +ANY14(SplitARGBRow_Any_SSE2, SplitARGBRow_SSE2, 4, 7) +#endif +#ifdef HAS_SPLITARGBROW_SSSE3 +ANY14(SplitARGBRow_Any_SSSE3, SplitARGBRow_SSSE3, 4, 7) +#endif +#ifdef HAS_SPLITARGBROW_AVX2 +ANY14(SplitARGBRow_Any_AVX2, SplitARGBRow_AVX2, 4, 15) +#endif +#ifdef HAS_SPLITARGBROW_NEON +ANY14(SplitARGBRow_Any_NEON, SplitARGBRow_NEON, 4, 15) +#endif // Any 1 to 2 with source stride (2 rows of source). Outputs UV planes. // 128 byte row allows for 32 avx ARGB pixels. #define ANY12S(NAMEANY, ANY_SIMD, UVSHIFT, BPP, MASK) \ - void NAMEANY(const uint8_t* src_ptr, int src_stride_ptr, uint8_t* dst_u, \ + void NAMEANY(const uint8_t* src_ptr, int src_stride, uint8_t* dst_u, \ uint8_t* dst_v, int width) { \ SIMD_ALIGNED(uint8_t temp[128 * 4]); \ memset(temp, 0, 128 * 2); /* for msan */ \ int r = width & MASK; \ int n = width & ~MASK; \ if (n > 0) { \ - ANY_SIMD(src_ptr, src_stride_ptr, dst_u, dst_v, n); \ + ANY_SIMD(src_ptr, src_stride, dst_u, dst_v, n); \ } \ memcpy(temp, src_ptr + (n >> UVSHIFT) * BPP, SS(r, UVSHIFT) * BPP); \ - memcpy(temp + 128, src_ptr + src_stride_ptr + (n >> UVSHIFT) * BPP, \ + memcpy(temp + 128, src_ptr + src_stride + (n >> UVSHIFT) * BPP, \ SS(r, UVSHIFT) * BPP); \ if ((width & 1) && UVSHIFT == 0) { /* repeat last pixel for subsample */ \ memcpy(temp + SS(r, UVSHIFT) * BPP, temp + SS(r, UVSHIFT) * BPP - BPP, \ @@ -1528,17 +2037,17 @@ ANY12S(UYVYToUVRow_Any_MMI, UYVYToUVRow_MMI, 1, 4, 15) // Any 1 to 1 with source stride (2 rows of source). Outputs UV plane. // 128 byte row allows for 32 avx ARGB pixels. #define ANY11S(NAMEANY, ANY_SIMD, UVSHIFT, BPP, MASK) \ - void NAMEANY(const uint8_t* src_ptr, int src_stride_ptr, uint8_t* dst_vu, \ + void NAMEANY(const uint8_t* src_ptr, int src_stride, uint8_t* dst_vu, \ int width) { \ SIMD_ALIGNED(uint8_t temp[128 * 3]); \ memset(temp, 0, 128 * 2); /* for msan */ \ int r = width & MASK; \ int n = width & ~MASK; \ if (n > 0) { \ - ANY_SIMD(src_ptr, src_stride_ptr, dst_vu, n); \ + ANY_SIMD(src_ptr, src_stride, dst_vu, n); \ } \ memcpy(temp, src_ptr + (n >> UVSHIFT) * BPP, SS(r, UVSHIFT) * BPP); \ - memcpy(temp + 128, src_ptr + src_stride_ptr + (n >> UVSHIFT) * BPP, \ + memcpy(temp + 128, src_ptr + src_stride + (n >> UVSHIFT) * BPP, \ SS(r, UVSHIFT) * BPP); \ if ((width & 1) && UVSHIFT == 0) { /* repeat last pixel for subsample */ \ memcpy(temp + SS(r, UVSHIFT) * BPP, temp + SS(r, UVSHIFT) * BPP - BPP, \ diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/row_common.cc b/third-party/libyuv/third_party/libyuv/source/row_common.cc similarity index 75% rename from third-party/webrtc/dependencies/third_party/libyuv/source/row_common.cc rename to third-party/libyuv/third_party/libyuv/source/row_common.cc index 79aed5c787..517b70562f 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/row_common.cc +++ b/third-party/libyuv/third_party/libyuv/source/row_common.cc @@ -10,6 +10,7 @@ #include "libyuv/row.h" +#include #include #include // For memcpy and memset. @@ -21,10 +22,14 @@ namespace libyuv { extern "C" { #endif -// The following ifdef from row_win makes the C code match the row_win code, -// which is 7 bit fixed point. +// This macro control YUV to RGB using unsigned math to extend range of +// YUV to RGB coefficients to 0 to 4 instead of 0 to 2 for more accuracy on B: +// LIBYUV_UNLIMITED_DATA + +// The following macro from row_win makes the C code match the row_win code, +// which is 7 bit fixed point for ARGBToI420: #if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && \ - (defined(_M_IX86) || (defined(_M_X64) && !defined(__clang__))) + !defined(__clang__) && (defined(_M_IX86) || defined(_M_X64)) #define LIBYUV_RGB7 1 #endif @@ -50,6 +55,11 @@ static __inline int32_t clamp1023(int32_t v) { return (-(v >= 1023) | v) & 1023; } +// clamp to max +static __inline int32_t ClampMax(int32_t v, int32_t max) { + return (-(v >= max) | v) & max; +} + static __inline uint32_t Abs(int32_t v) { int m = -(v < 0); return (v + m) ^ m; @@ -67,6 +77,10 @@ static __inline int32_t clamp1023(int32_t v) { return (v > 1023) ? 1023 : v; } +static __inline int32_t ClampMax(int32_t v, int32_t max) { + return (v > max) ? max : v; +} + static __inline uint32_t Abs(int32_t v) { return (v < 0) ? -v : v; } @@ -413,6 +427,82 @@ void ARGBToAR30Row_C(const uint8_t* src_argb, uint8_t* dst_ar30, int width) { } } +void ARGBToAR64Row_C(const uint8_t* src_argb, uint16_t* dst_ar64, int width) { + int x; + for (x = 0; x < width; ++x) { + dst_ar64[0] = src_argb[0] * 0x0101; + dst_ar64[1] = src_argb[1] * 0x0101; + dst_ar64[2] = src_argb[2] * 0x0101; + dst_ar64[3] = src_argb[3] * 0x0101; + dst_ar64 += 4; + src_argb += 4; + } +} + +void ARGBToAB64Row_C(const uint8_t* src_argb, uint16_t* dst_ab64, int width) { + int x; + for (x = 0; x < width; ++x) { + dst_ab64[0] = src_argb[2] * 0x0101; + dst_ab64[1] = src_argb[1] * 0x0101; + dst_ab64[2] = src_argb[0] * 0x0101; + dst_ab64[3] = src_argb[3] * 0x0101; + dst_ab64 += 4; + src_argb += 4; + } +} + +void AR64ToARGBRow_C(const uint16_t* src_ar64, uint8_t* dst_argb, int width) { + int x; + for (x = 0; x < width; ++x) { + dst_argb[0] = src_ar64[0] >> 8; + dst_argb[1] = src_ar64[1] >> 8; + dst_argb[2] = src_ar64[2] >> 8; + dst_argb[3] = src_ar64[3] >> 8; + dst_argb += 4; + src_ar64 += 4; + } +} + +void AB64ToARGBRow_C(const uint16_t* src_ab64, uint8_t* dst_argb, int width) { + int x; + for (x = 0; x < width; ++x) { + dst_argb[0] = src_ab64[2] >> 8; + dst_argb[1] = src_ab64[1] >> 8; + dst_argb[2] = src_ab64[0] >> 8; + dst_argb[3] = src_ab64[3] >> 8; + dst_argb += 4; + src_ab64 += 4; + } +} + +// TODO(fbarchard): Make shuffle compatible with SIMD versions +void AR64ShuffleRow_C(const uint8_t* src_ar64, + uint8_t* dst_ar64, + const uint8_t* shuffler, + int width) { + const uint16_t* src_ar64_16 = (const uint16_t*)src_ar64; + uint16_t* dst_ar64_16 = (uint16_t*)dst_ar64; + int index0 = shuffler[0] / 2; + int index1 = shuffler[2] / 2; + int index2 = shuffler[4] / 2; + int index3 = shuffler[6] / 2; + // Shuffle a row of AR64. + int x; + for (x = 0; x < width / 2; ++x) { + // To support in-place conversion. + uint16_t b = src_ar64_16[index0]; + uint16_t g = src_ar64_16[index1]; + uint16_t r = src_ar64_16[index2]; + uint16_t a = src_ar64_16[index3]; + dst_ar64_16[0] = b; + dst_ar64_16[1] = g; + dst_ar64_16[2] = r; + dst_ar64_16[3] = a; + src_ar64_16 += 4; + dst_ar64_16 += 4; + } +} + #ifdef LIBYUV_RGB7 // Old 7 bit math for compatibility on unsupported platforms. static __inline int RGBToY(uint8_t r, uint8_t g, uint8_t b) { @@ -462,80 +552,80 @@ static __inline int RGB2xToV(uint16_t r, uint16_t g, uint16_t b) { // Intel version mimic SSE/AVX which does 2 pavgb #if LIBYUV_ARGBTOUV_PAVGB -#define MAKEROWY(NAME, R, G, B, BPP) \ - void NAME##ToYRow_C(const uint8_t* src_argb0, uint8_t* dst_y, int width) { \ - int x; \ - for (x = 0; x < width; ++x) { \ - dst_y[0] = RGBToY(src_argb0[R], src_argb0[G], src_argb0[B]); \ - src_argb0 += BPP; \ - dst_y += 1; \ - } \ - } \ - void NAME##ToUVRow_C(const uint8_t* src_rgb0, int src_stride_rgb, \ - uint8_t* dst_u, uint8_t* dst_v, int width) { \ - const uint8_t* src_rgb1 = src_rgb0 + src_stride_rgb; \ - int x; \ - for (x = 0; x < width - 1; x += 2) { \ - uint8_t ab = AVGB(AVGB(src_rgb0[B], src_rgb1[B]), \ - AVGB(src_rgb0[B + BPP], src_rgb1[B + BPP])); \ - uint8_t ag = AVGB(AVGB(src_rgb0[G], src_rgb1[G]), \ - AVGB(src_rgb0[G + BPP], src_rgb1[G + BPP])); \ - uint8_t ar = AVGB(AVGB(src_rgb0[R], src_rgb1[R]), \ - AVGB(src_rgb0[R + BPP], src_rgb1[R + BPP])); \ - dst_u[0] = RGBToU(ar, ag, ab); \ - dst_v[0] = RGBToV(ar, ag, ab); \ - src_rgb0 += BPP * 2; \ - src_rgb1 += BPP * 2; \ - dst_u += 1; \ - dst_v += 1; \ - } \ - if (width & 1) { \ - uint8_t ab = AVGB(src_rgb0[B], src_rgb1[B]); \ - uint8_t ag = AVGB(src_rgb0[G], src_rgb1[G]); \ - uint8_t ar = AVGB(src_rgb0[R], src_rgb1[R]); \ - dst_u[0] = RGBToU(ar, ag, ab); \ - dst_v[0] = RGBToV(ar, ag, ab); \ - } \ +#define MAKEROWY(NAME, R, G, B, BPP) \ + void NAME##ToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width) { \ + int x; \ + for (x = 0; x < width; ++x) { \ + dst_y[0] = RGBToY(src_rgb[R], src_rgb[G], src_rgb[B]); \ + src_rgb += BPP; \ + dst_y += 1; \ + } \ + } \ + void NAME##ToUVRow_C(const uint8_t* src_rgb, int src_stride_rgb, \ + uint8_t* dst_u, uint8_t* dst_v, int width) { \ + const uint8_t* src_rgb1 = src_rgb + src_stride_rgb; \ + int x; \ + for (x = 0; x < width - 1; x += 2) { \ + uint8_t ab = AVGB(AVGB(src_rgb[B], src_rgb1[B]), \ + AVGB(src_rgb[B + BPP], src_rgb1[B + BPP])); \ + uint8_t ag = AVGB(AVGB(src_rgb[G], src_rgb1[G]), \ + AVGB(src_rgb[G + BPP], src_rgb1[G + BPP])); \ + uint8_t ar = AVGB(AVGB(src_rgb[R], src_rgb1[R]), \ + AVGB(src_rgb[R + BPP], src_rgb1[R + BPP])); \ + dst_u[0] = RGBToU(ar, ag, ab); \ + dst_v[0] = RGBToV(ar, ag, ab); \ + src_rgb += BPP * 2; \ + src_rgb1 += BPP * 2; \ + dst_u += 1; \ + dst_v += 1; \ + } \ + if (width & 1) { \ + uint8_t ab = AVGB(src_rgb[B], src_rgb1[B]); \ + uint8_t ag = AVGB(src_rgb[G], src_rgb1[G]); \ + uint8_t ar = AVGB(src_rgb[R], src_rgb1[R]); \ + dst_u[0] = RGBToU(ar, ag, ab); \ + dst_v[0] = RGBToV(ar, ag, ab); \ + } \ } #else // ARM version does sum / 2 then multiply by 2x smaller coefficients -#define MAKEROWY(NAME, R, G, B, BPP) \ - void NAME##ToYRow_C(const uint8_t* src_argb0, uint8_t* dst_y, int width) { \ - int x; \ - for (x = 0; x < width; ++x) { \ - dst_y[0] = RGBToY(src_argb0[R], src_argb0[G], src_argb0[B]); \ - src_argb0 += BPP; \ - dst_y += 1; \ - } \ - } \ - void NAME##ToUVRow_C(const uint8_t* src_rgb0, int src_stride_rgb, \ - uint8_t* dst_u, uint8_t* dst_v, int width) { \ - const uint8_t* src_rgb1 = src_rgb0 + src_stride_rgb; \ - int x; \ - for (x = 0; x < width - 1; x += 2) { \ - uint16_t ab = (src_rgb0[B] + src_rgb0[B + BPP] + src_rgb1[B] + \ - src_rgb1[B + BPP] + 1) >> \ - 1; \ - uint16_t ag = (src_rgb0[G] + src_rgb0[G + BPP] + src_rgb1[G] + \ - src_rgb1[G + BPP] + 1) >> \ - 1; \ - uint16_t ar = (src_rgb0[R] + src_rgb0[R + BPP] + src_rgb1[R] + \ - src_rgb1[R + BPP] + 1) >> \ - 1; \ - dst_u[0] = RGB2xToU(ar, ag, ab); \ - dst_v[0] = RGB2xToV(ar, ag, ab); \ - src_rgb0 += BPP * 2; \ - src_rgb1 += BPP * 2; \ - dst_u += 1; \ - dst_v += 1; \ - } \ - if (width & 1) { \ - uint16_t ab = src_rgb0[B] + src_rgb1[B]; \ - uint16_t ag = src_rgb0[G] + src_rgb1[G]; \ - uint16_t ar = src_rgb0[R] + src_rgb1[R]; \ - dst_u[0] = RGB2xToU(ar, ag, ab); \ - dst_v[0] = RGB2xToV(ar, ag, ab); \ - } \ +#define MAKEROWY(NAME, R, G, B, BPP) \ + void NAME##ToYRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width) { \ + int x; \ + for (x = 0; x < width; ++x) { \ + dst_y[0] = RGBToY(src_rgb[R], src_rgb[G], src_rgb[B]); \ + src_rgb += BPP; \ + dst_y += 1; \ + } \ + } \ + void NAME##ToUVRow_C(const uint8_t* src_rgb, int src_stride_rgb, \ + uint8_t* dst_u, uint8_t* dst_v, int width) { \ + const uint8_t* src_rgb1 = src_rgb + src_stride_rgb; \ + int x; \ + for (x = 0; x < width - 1; x += 2) { \ + uint16_t ab = (src_rgb[B] + src_rgb[B + BPP] + src_rgb1[B] + \ + src_rgb1[B + BPP] + 1) >> \ + 1; \ + uint16_t ag = (src_rgb[G] + src_rgb[G + BPP] + src_rgb1[G] + \ + src_rgb1[G + BPP] + 1) >> \ + 1; \ + uint16_t ar = (src_rgb[R] + src_rgb[R + BPP] + src_rgb1[R] + \ + src_rgb1[R + BPP] + 1) >> \ + 1; \ + dst_u[0] = RGB2xToU(ar, ag, ab); \ + dst_v[0] = RGB2xToV(ar, ag, ab); \ + src_rgb += BPP * 2; \ + src_rgb1 += BPP * 2; \ + dst_u += 1; \ + dst_v += 1; \ + } \ + if (width & 1) { \ + uint16_t ab = src_rgb[B] + src_rgb1[B]; \ + uint16_t ag = src_rgb[G] + src_rgb1[G]; \ + uint16_t ar = src_rgb[R] + src_rgb1[R]; \ + dst_u[0] = RGB2xToU(ar, ag, ab); \ + dst_v[0] = RGB2xToV(ar, ag, ab); \ + } \ } #endif @@ -603,80 +693,80 @@ static __inline int RGB2xToVJ(uint16_t r, uint16_t g, uint16_t b) { // ARGBToYJ_C and ARGBToUVJ_C // Intel version mimic SSE/AVX which does 2 pavgb #if LIBYUV_ARGBTOUV_PAVGB -#define MAKEROWYJ(NAME, R, G, B, BPP) \ - void NAME##ToYJRow_C(const uint8_t* src_argb0, uint8_t* dst_y, int width) { \ - int x; \ - for (x = 0; x < width; ++x) { \ - dst_y[0] = RGBToYJ(src_argb0[R], src_argb0[G], src_argb0[B]); \ - src_argb0 += BPP; \ - dst_y += 1; \ - } \ - } \ - void NAME##ToUVJRow_C(const uint8_t* src_rgb0, int src_stride_rgb, \ - uint8_t* dst_u, uint8_t* dst_v, int width) { \ - const uint8_t* src_rgb1 = src_rgb0 + src_stride_rgb; \ - int x; \ - for (x = 0; x < width - 1; x += 2) { \ - uint8_t ab = AVGB(AVGB(src_rgb0[B], src_rgb1[B]), \ - AVGB(src_rgb0[B + BPP], src_rgb1[B + BPP])); \ - uint8_t ag = AVGB(AVGB(src_rgb0[G], src_rgb1[G]), \ - AVGB(src_rgb0[G + BPP], src_rgb1[G + BPP])); \ - uint8_t ar = AVGB(AVGB(src_rgb0[R], src_rgb1[R]), \ - AVGB(src_rgb0[R + BPP], src_rgb1[R + BPP])); \ - dst_u[0] = RGBToUJ(ar, ag, ab); \ - dst_v[0] = RGBToVJ(ar, ag, ab); \ - src_rgb0 += BPP * 2; \ - src_rgb1 += BPP * 2; \ - dst_u += 1; \ - dst_v += 1; \ - } \ - if (width & 1) { \ - uint8_t ab = AVGB(src_rgb0[B], src_rgb1[B]); \ - uint8_t ag = AVGB(src_rgb0[G], src_rgb1[G]); \ - uint8_t ar = AVGB(src_rgb0[R], src_rgb1[R]); \ - dst_u[0] = RGBToUJ(ar, ag, ab); \ - dst_v[0] = RGBToVJ(ar, ag, ab); \ - } \ +#define MAKEROWYJ(NAME, R, G, B, BPP) \ + void NAME##ToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width) { \ + int x; \ + for (x = 0; x < width; ++x) { \ + dst_y[0] = RGBToYJ(src_rgb[R], src_rgb[G], src_rgb[B]); \ + src_rgb += BPP; \ + dst_y += 1; \ + } \ + } \ + void NAME##ToUVJRow_C(const uint8_t* src_rgb, int src_stride_rgb, \ + uint8_t* dst_u, uint8_t* dst_v, int width) { \ + const uint8_t* src_rgb1 = src_rgb + src_stride_rgb; \ + int x; \ + for (x = 0; x < width - 1; x += 2) { \ + uint8_t ab = AVGB(AVGB(src_rgb[B], src_rgb1[B]), \ + AVGB(src_rgb[B + BPP], src_rgb1[B + BPP])); \ + uint8_t ag = AVGB(AVGB(src_rgb[G], src_rgb1[G]), \ + AVGB(src_rgb[G + BPP], src_rgb1[G + BPP])); \ + uint8_t ar = AVGB(AVGB(src_rgb[R], src_rgb1[R]), \ + AVGB(src_rgb[R + BPP], src_rgb1[R + BPP])); \ + dst_u[0] = RGBToUJ(ar, ag, ab); \ + dst_v[0] = RGBToVJ(ar, ag, ab); \ + src_rgb += BPP * 2; \ + src_rgb1 += BPP * 2; \ + dst_u += 1; \ + dst_v += 1; \ + } \ + if (width & 1) { \ + uint8_t ab = AVGB(src_rgb[B], src_rgb1[B]); \ + uint8_t ag = AVGB(src_rgb[G], src_rgb1[G]); \ + uint8_t ar = AVGB(src_rgb[R], src_rgb1[R]); \ + dst_u[0] = RGBToUJ(ar, ag, ab); \ + dst_v[0] = RGBToVJ(ar, ag, ab); \ + } \ } #else // ARM version does sum / 2 then multiply by 2x smaller coefficients -#define MAKEROWYJ(NAME, R, G, B, BPP) \ - void NAME##ToYJRow_C(const uint8_t* src_argb0, uint8_t* dst_y, int width) { \ - int x; \ - for (x = 0; x < width; ++x) { \ - dst_y[0] = RGBToYJ(src_argb0[R], src_argb0[G], src_argb0[B]); \ - src_argb0 += BPP; \ - dst_y += 1; \ - } \ - } \ - void NAME##ToUVJRow_C(const uint8_t* src_rgb0, int src_stride_rgb, \ - uint8_t* dst_u, uint8_t* dst_v, int width) { \ - const uint8_t* src_rgb1 = src_rgb0 + src_stride_rgb; \ - int x; \ - for (x = 0; x < width - 1; x += 2) { \ - uint16_t ab = (src_rgb0[B] + src_rgb0[B + BPP] + src_rgb1[B] + \ - src_rgb1[B + BPP] + 1) >> \ - 1; \ - uint16_t ag = (src_rgb0[G] + src_rgb0[G + BPP] + src_rgb1[G] + \ - src_rgb1[G + BPP] + 1) >> \ - 1; \ - uint16_t ar = (src_rgb0[R] + src_rgb0[R + BPP] + src_rgb1[R] + \ - src_rgb1[R + BPP] + 1) >> \ - 1; \ - dst_u[0] = RGB2xToUJ(ar, ag, ab); \ - dst_v[0] = RGB2xToVJ(ar, ag, ab); \ - src_rgb0 += BPP * 2; \ - src_rgb1 += BPP * 2; \ - dst_u += 1; \ - dst_v += 1; \ - } \ - if (width & 1) { \ - uint16_t ab = (src_rgb0[B] + src_rgb1[B]); \ - uint16_t ag = (src_rgb0[G] + src_rgb1[G]); \ - uint16_t ar = (src_rgb0[R] + src_rgb1[R]); \ - dst_u[0] = RGB2xToUJ(ar, ag, ab); \ - dst_v[0] = RGB2xToVJ(ar, ag, ab); \ - } \ +#define MAKEROWYJ(NAME, R, G, B, BPP) \ + void NAME##ToYJRow_C(const uint8_t* src_rgb, uint8_t* dst_y, int width) { \ + int x; \ + for (x = 0; x < width; ++x) { \ + dst_y[0] = RGBToYJ(src_rgb[R], src_rgb[G], src_rgb[B]); \ + src_rgb += BPP; \ + dst_y += 1; \ + } \ + } \ + void NAME##ToUVJRow_C(const uint8_t* src_rgb, int src_stride_rgb, \ + uint8_t* dst_u, uint8_t* dst_v, int width) { \ + const uint8_t* src_rgb1 = src_rgb + src_stride_rgb; \ + int x; \ + for (x = 0; x < width - 1; x += 2) { \ + uint16_t ab = (src_rgb[B] + src_rgb[B + BPP] + src_rgb1[B] + \ + src_rgb1[B + BPP] + 1) >> \ + 1; \ + uint16_t ag = (src_rgb[G] + src_rgb[G + BPP] + src_rgb1[G] + \ + src_rgb1[G + BPP] + 1) >> \ + 1; \ + uint16_t ar = (src_rgb[R] + src_rgb[R + BPP] + src_rgb1[R] + \ + src_rgb1[R + BPP] + 1) >> \ + 1; \ + dst_u[0] = RGB2xToUJ(ar, ag, ab); \ + dst_v[0] = RGB2xToVJ(ar, ag, ab); \ + src_rgb += BPP * 2; \ + src_rgb1 += BPP * 2; \ + dst_u += 1; \ + dst_v += 1; \ + } \ + if (width & 1) { \ + uint16_t ab = (src_rgb[B] + src_rgb1[B]); \ + uint16_t ag = (src_rgb[G] + src_rgb1[G]); \ + uint16_t ar = (src_rgb[R] + src_rgb1[R]); \ + dst_u[0] = RGB2xToUJ(ar, ag, ab); \ + dst_v[0] = RGB2xToVJ(ar, ag, ab); \ + } \ } #endif @@ -875,7 +965,7 @@ void ARGB1555ToUVRow_C(const uint8_t* src_argb1555, uint8_t r0 = (src_argb1555[1] & 0x7c) >> 2; uint8_t b2 = next_argb1555[0] & 0x1f; uint8_t g2 = (next_argb1555[0] >> 5) | ((next_argb1555[1] & 0x03) << 3); - uint8_t r2 = next_argb1555[1] >> 3; + uint8_t r2 = (next_argb1555[1] & 0x7c) >> 2; b0 = (b0 << 3) | (b0 >> 2); g0 = (g0 << 3) | (g0 >> 2); @@ -1146,16 +1236,16 @@ void ARGBShadeRow_C(const uint8_t* src_argb, #define REPEAT8(v) (v) | ((v) << 8) #define SHADE(f, v) v* f >> 16 -void ARGBMultiplyRow_C(const uint8_t* src_argb0, +void ARGBMultiplyRow_C(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { int i; for (i = 0; i < width; ++i) { - const uint32_t b = REPEAT8(src_argb0[0]); - const uint32_t g = REPEAT8(src_argb0[1]); - const uint32_t r = REPEAT8(src_argb0[2]); - const uint32_t a = REPEAT8(src_argb0[3]); + const uint32_t b = REPEAT8(src_argb[0]); + const uint32_t g = REPEAT8(src_argb[1]); + const uint32_t r = REPEAT8(src_argb[2]); + const uint32_t a = REPEAT8(src_argb[3]); const uint32_t b_scale = src_argb1[0]; const uint32_t g_scale = src_argb1[1]; const uint32_t r_scale = src_argb1[2]; @@ -1164,7 +1254,7 @@ void ARGBMultiplyRow_C(const uint8_t* src_argb0, dst_argb[1] = SHADE(g, g_scale); dst_argb[2] = SHADE(r, r_scale); dst_argb[3] = SHADE(a, a_scale); - src_argb0 += 4; + src_argb += 4; src_argb1 += 4; dst_argb += 4; } @@ -1174,16 +1264,16 @@ void ARGBMultiplyRow_C(const uint8_t* src_argb0, #define SHADE(f, v) clamp255(v + f) -void ARGBAddRow_C(const uint8_t* src_argb0, +void ARGBAddRow_C(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { int i; for (i = 0; i < width; ++i) { - const int b = src_argb0[0]; - const int g = src_argb0[1]; - const int r = src_argb0[2]; - const int a = src_argb0[3]; + const int b = src_argb[0]; + const int g = src_argb[1]; + const int r = src_argb[2]; + const int a = src_argb[3]; const int b_add = src_argb1[0]; const int g_add = src_argb1[1]; const int r_add = src_argb1[2]; @@ -1192,7 +1282,7 @@ void ARGBAddRow_C(const uint8_t* src_argb0, dst_argb[1] = SHADE(g, g_add); dst_argb[2] = SHADE(r, r_add); dst_argb[3] = SHADE(a, a_add); - src_argb0 += 4; + src_argb += 4; src_argb1 += 4; dst_argb += 4; } @@ -1201,16 +1291,16 @@ void ARGBAddRow_C(const uint8_t* src_argb0, #define SHADE(f, v) clamp0(f - v) -void ARGBSubtractRow_C(const uint8_t* src_argb0, +void ARGBSubtractRow_C(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { int i; for (i = 0; i < width; ++i) { - const int b = src_argb0[0]; - const int g = src_argb0[1]; - const int r = src_argb0[2]; - const int a = src_argb0[3]; + const int b = src_argb[0]; + const int g = src_argb[1]; + const int r = src_argb[2]; + const int a = src_argb[3]; const int b_sub = src_argb1[0]; const int g_sub = src_argb1[1]; const int r_sub = src_argb1[2]; @@ -1219,7 +1309,7 @@ void ARGBSubtractRow_C(const uint8_t* src_argb0, dst_argb[1] = SHADE(g, g_sub); dst_argb[2] = SHADE(r, r_sub); dst_argb[3] = SHADE(a, a_sub); - src_argb0 += 4; + src_argb += 4; src_argb1 += 4; dst_argb += 4; } @@ -1327,351 +1417,241 @@ void J400ToARGBRow_C(const uint8_t* src_y, uint8_t* dst_argb, int width) { } } -// TODO(fbarchard): Unify these structures to be platform independent. -// TODO(fbarchard): Generate SIMD structures from float matrix. +// Macros to create SIMD specific yuv to rgb conversion constants. -// BT.601 YUV to RGB reference -// R = (Y - 16) * 1.164 - V * -1.596 -// G = (Y - 16) * 1.164 - U * 0.391 - V * 0.813 -// B = (Y - 16) * 1.164 - U * -2.018 +// clang-format off -// Y contribution to R,G,B. Scale and bias. -#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ -#define YGB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ - -// U and V contributions to R,G,B. -#define UB -128 /* max(-128, round(-2.018 * 64)) */ -#define UG 25 /* round(0.391 * 64) */ -#define VG 52 /* round(0.813 * 64) */ -#define VR -102 /* round(-1.596 * 64) */ - -// Bias values to subtract 16 from Y and 128 from U and V. -#define BB (UB * 128 + YGB) -#define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) - -#if defined(__aarch64__) // 64 bit arm -const struct YuvConstants SIMD_ALIGNED(kYuvI601Constants) = { - {-UB, -VR, -UB, -VR, -UB, -VR, -UB, -VR}, - {-UB, -VR, -UB, -VR, -UB, -VR, -UB, -VR}, - {UG, VG, UG, VG, UG, VG, UG, VG}, - {UG, VG, UG, VG, UG, VG, UG, VG}, - {BB, BG, BR, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -const struct YuvConstants SIMD_ALIGNED(kYvuI601Constants) = { - {-VR, -UB, -VR, -UB, -VR, -UB, -VR, -UB}, - {-VR, -UB, -VR, -UB, -VR, -UB, -VR, -UB}, - {VG, UG, VG, UG, VG, UG, VG, UG}, - {VG, UG, VG, UG, VG, UG, VG, UG}, - {BR, BG, BB, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -#elif defined(__arm__) // 32 bit arm -const struct YuvConstants SIMD_ALIGNED(kYuvI601Constants) = { - {-UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0}, - {UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0}, - {BB, BG, BR, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -const struct YuvConstants SIMD_ALIGNED(kYvuI601Constants) = { - {-VR, -VR, -VR, -VR, -UB, -UB, -UB, -UB, 0, 0, 0, 0, 0, 0, 0, 0}, - {VG, VG, VG, VG, UG, UG, UG, UG, 0, 0, 0, 0, 0, 0, 0, 0}, - {BR, BG, BB, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; +#if defined(__aarch64__) || defined(__arm__) +// Bias values include subtract 128 from U and V, bias from Y and rounding. +// For B and R bias is negative. For G bias is positive. +#define YUVCONSTANTSBODY(YG, YB, UB, UG, VG, VR) \ + {{UB, VR, UG, VG, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, \ + {YG, (UB * 128 - YB), (UG * 128 + VG * 128 + YB), (VR * 128 - YB), YB, 0, \ + 0, 0}} #else -const struct YuvConstants SIMD_ALIGNED(kYuvI601Constants) = { - {UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, - UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0}, - {UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, - UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG}, - {0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, - 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR}, - {BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB}, - {BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG}, - {BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR}, - {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, - {YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, - YGB}}; -const struct YuvConstants SIMD_ALIGNED(kYvuI601Constants) = { - {VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, - VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0}, - {VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, - VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG}, - {0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, - 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB}, - {BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR}, - {BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG}, - {BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB}, - {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, - {YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, - YGB}}; +#define YUVCONSTANTSBODY(YG, YB, UB, UG, VG, VR) \ + {{UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, \ + UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0}, \ + {UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, \ + UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG}, \ + {0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, \ + 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR}, \ + {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, \ + {YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB, YB}} #endif -#undef BB -#undef BG -#undef BR -#undef YGB +// clang-format on + +#define MAKEYUVCONSTANTS(name, YG, YB, UB, UG, VG, VR) \ + const struct YuvConstants SIMD_ALIGNED(kYuv##name##Constants) = \ + YUVCONSTANTSBODY(YG, YB, UB, UG, VG, VR); \ + const struct YuvConstants SIMD_ALIGNED(kYvu##name##Constants) = \ + YUVCONSTANTSBODY(YG, YB, VR, VG, UG, UB); + +// TODO(fbarchard): Generate SIMD structures from float matrix. + +// BT.601 limited range YUV to RGB reference +// R = (Y - 16) * 1.164 + V * 1.596 +// G = (Y - 16) * 1.164 - U * 0.391 - V * 0.813 +// B = (Y - 16) * 1.164 + U * 2.018 +// KR = 0.299; KB = 0.114 + +// U and V contributions to R,G,B. +#ifdef LIBYUV_UNLIMITED_DATA +#define UB 129 /* round(2.018 * 64) */ +#else +#define UB 128 /* max(128, round(2.018 * 64)) */ +#endif +#define UG 25 /* round(0.391 * 64) */ +#define VG 52 /* round(0.813 * 64) */ +#define VR 102 /* round(1.596 * 64) */ + +// Y contribution to R,G,B. Scale and bias. +#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ +#define YB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ + +MAKEYUVCONSTANTS(I601, YG, YB, UB, UG, VG, VR) + +#undef YG +#undef YB #undef UB #undef UG #undef VG #undef VR -#undef YG -// JPEG YUV to RGB reference -// * R = Y - V * -1.40200 -// * G = Y - U * 0.34414 - V * 0.71414 -// * B = Y - U * -1.77200 +// BT.601 full range YUV to RGB reference (aka JPEG) +// * R = Y + V * 1.40200 +// * G = Y - U * 0.34414 - V * 0.71414 +// * B = Y + U * 1.77200 +// KR = 0.299; KB = 0.114 + +// U and V contributions to R,G,B. +#define UB 113 /* round(1.77200 * 64) */ +#define UG 22 /* round(0.34414 * 64) */ +#define VG 46 /* round(0.71414 * 64) */ +#define VR 90 /* round(1.40200 * 64) */ // Y contribution to R,G,B. Scale and bias. #define YG 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ -#define YGB 32 /* 64 / 2 */ +#define YB 32 /* 64 / 2 */ -// U and V contributions to R,G,B. -#define UB -113 /* round(-1.77200 * 64) */ -#define UG 22 /* round(0.34414 * 64) */ -#define VG 46 /* round(0.71414 * 64) */ -#define VR -90 /* round(-1.40200 * 64) */ +MAKEYUVCONSTANTS(JPEG, YG, YB, UB, UG, VG, VR) -// Bias values to round, and subtract 128 from U and V. -#define BB (UB * 128 + YGB) -#define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) - -#if defined(__aarch64__) -const struct YuvConstants SIMD_ALIGNED(kYuvJPEGConstants) = { - {-UB, -VR, -UB, -VR, -UB, -VR, -UB, -VR}, - {-UB, -VR, -UB, -VR, -UB, -VR, -UB, -VR}, - {UG, VG, UG, VG, UG, VG, UG, VG}, - {UG, VG, UG, VG, UG, VG, UG, VG}, - {BB, BG, BR, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -const struct YuvConstants SIMD_ALIGNED(kYvuJPEGConstants) = { - {-VR, -UB, -VR, -UB, -VR, -UB, -VR, -UB}, - {-VR, -UB, -VR, -UB, -VR, -UB, -VR, -UB}, - {VG, UG, VG, UG, VG, UG, VG, UG}, - {VG, UG, VG, UG, VG, UG, VG, UG}, - {BR, BG, BB, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -#elif defined(__arm__) -const struct YuvConstants SIMD_ALIGNED(kYuvJPEGConstants) = { - {-UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0}, - {UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0}, - {BB, BG, BR, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -const struct YuvConstants SIMD_ALIGNED(kYvuJPEGConstants) = { - {-VR, -VR, -VR, -VR, -UB, -UB, -UB, -UB, 0, 0, 0, 0, 0, 0, 0, 0}, - {VG, VG, VG, VG, UG, UG, UG, UG, 0, 0, 0, 0, 0, 0, 0, 0}, - {BR, BG, BB, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -#else -const struct YuvConstants SIMD_ALIGNED(kYuvJPEGConstants) = { - {UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, - UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0}, - {UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, - UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG}, - {0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, - 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR}, - {BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB}, - {BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG}, - {BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR}, - {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, - {YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, - YGB}}; -const struct YuvConstants SIMD_ALIGNED(kYvuJPEGConstants) = { - {VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, - VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0}, - {VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, - VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG}, - {0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, - 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB}, - {BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR}, - {BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG}, - {BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB}, - {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, - {YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, - YGB}}; -#endif - -#undef BB -#undef BG -#undef BR -#undef YGB +#undef YG +#undef YB #undef UB #undef UG #undef VG #undef VR -#undef YG -// BT.709 YUV to RGB reference -// R = (Y - 16) * 1.164 - V * -1.793 -// G = (Y - 16) * 1.164 - U * 0.213 - V * 0.533 -// B = (Y - 16) * 1.164 - U * -2.112 -// See also http://www.equasys.de/colorconversion.html +// BT.709 limited range YUV to RGB reference +// R = (Y - 16) * 1.164 + V * 1.793 +// G = (Y - 16) * 1.164 - U * 0.213 - V * 0.533 +// B = (Y - 16) * 1.164 + U * 2.112 +// KR = 0.2126, KB = 0.0722 + +// U and V contributions to R,G,B. +#ifdef LIBYUV_UNLIMITED_DATA +#define UB 135 /* round(2.112 * 64) */ +#else +#define UB 128 /* max(128, round(2.112 * 64)) */ +#endif +#define UG 14 /* round(0.213 * 64) */ +#define VG 34 /* round(0.533 * 64) */ +#define VR 115 /* round(1.793 * 64) */ // Y contribution to R,G,B. Scale and bias. -#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ -#define YGB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ +#define YG 18997 /* round(1.164 * 64 * 256 * 256 / 257) */ +#define YB -1160 /* 1.164 * 64 * -16 + 64 / 2 */ -// TODO(fbarchard): Find way to express 2.112 instead of 2.0. -// U and V contributions to R,G,B. -#define UB -128 /* max(-128, round(-2.112 * 64)) */ -#define UG 14 /* round(0.213 * 64) */ -#define VG 34 /* round(0.533 * 64) */ -#define VR -115 /* round(-1.793 * 64) */ +MAKEYUVCONSTANTS(H709, YG, YB, UB, UG, VG, VR) -// Bias values to round, and subtract 128 from U and V. -#define BB (UB * 128 + YGB) -#define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) - -#if defined(__aarch64__) -const struct YuvConstants SIMD_ALIGNED(kYuvH709Constants) = { - {-UB, -VR, -UB, -VR, -UB, -VR, -UB, -VR}, - {-UB, -VR, -UB, -VR, -UB, -VR, -UB, -VR}, - {UG, VG, UG, VG, UG, VG, UG, VG}, - {UG, VG, UG, VG, UG, VG, UG, VG}, - {BB, BG, BR, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -const struct YuvConstants SIMD_ALIGNED(kYvuH709Constants) = { - {-VR, -UB, -VR, -UB, -VR, -UB, -VR, -UB}, - {-VR, -UB, -VR, -UB, -VR, -UB, -VR, -UB}, - {VG, UG, VG, UG, VG, UG, VG, UG}, - {VG, UG, VG, UG, VG, UG, VG, UG}, - {BR, BG, BB, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -#elif defined(__arm__) -const struct YuvConstants SIMD_ALIGNED(kYuvH709Constants) = { - {-UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0}, - {UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0}, - {BB, BG, BR, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -const struct YuvConstants SIMD_ALIGNED(kYvuH709Constants) = { - {-VR, -VR, -VR, -VR, -UB, -UB, -UB, -UB, 0, 0, 0, 0, 0, 0, 0, 0}, - {VG, VG, VG, VG, UG, UG, UG, UG, 0, 0, 0, 0, 0, 0, 0, 0}, - {BR, BG, BB, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -#else -const struct YuvConstants SIMD_ALIGNED(kYuvH709Constants) = { - {UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, - UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0}, - {UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, - UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG}, - {0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, - 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR}, - {BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB}, - {BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG}, - {BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR}, - {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, - {YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, - YGB}}; -const struct YuvConstants SIMD_ALIGNED(kYvuH709Constants) = { - {VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, - VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0}, - {VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, - VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG}, - {0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, - 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB}, - {BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR}, - {BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG}, - {BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB}, - {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, - {YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, - YGB}}; -#endif - -#undef BB -#undef BG -#undef BR -#undef YGB +#undef YG +#undef YB #undef UB #undef UG #undef VG #undef VR -#undef YG -// BT.2020 YUV to RGB reference -// R = (Y - 16) * 1.164384 - V * -1.67867 -// G = (Y - 16) * 1.164384 - U * 0.187326 - V * 0.65042 -// B = (Y - 16) * 1.164384 - U * -2.14177 +// BT.709 full range YUV to RGB reference +// R = Y + V * 1.5748 +// G = Y - U * 0.18732 - V * 0.46812 +// B = Y + U * 1.8556 +// KR = 0.2126, KB = 0.0722 + +// U and V contributions to R,G,B. +#define UB 119 /* round(1.8556 * 64) */ +#define UG 12 /* round(0.18732 * 64) */ +#define VG 30 /* round(0.46812 * 64) */ +#define VR 101 /* round(1.5748 * 64) */ + +// Y contribution to R,G,B. Scale and bias. (same as jpeg) +#define YG 16320 /* round(1 * 64 * 256 * 256 / 257) */ +#define YB 32 /* 64 / 2 */ + +MAKEYUVCONSTANTS(F709, YG, YB, UB, UG, VG, VR) + +#undef YG +#undef YB +#undef UB +#undef UG +#undef VG +#undef VR + +// BT.2020 limited range YUV to RGB reference +// R = (Y - 16) * 1.164384 + V * 1.67867 +// G = (Y - 16) * 1.164384 - U * 0.187326 - V * 0.65042 +// B = (Y - 16) * 1.164384 + U * 2.14177 +// KR = 0.2627; KB = 0.0593 + +// U and V contributions to R,G,B. +#ifdef LIBYUV_UNLIMITED_DATA +#define UB 137 /* round(2.142 * 64) */ +#else +#define UB 128 /* max(128, round(2.142 * 64)) */ +#endif +#define UG 12 /* round(0.187326 * 64) */ +#define VG 42 /* round(0.65042 * 64) */ +#define VR 107 /* round(1.67867 * 64) */ // Y contribution to R,G,B. Scale and bias. -#define YG 19003 /* round(1.164384 * 64 * 256 * 256 / 257) */ -#define YGB -1160 /* 1.164384 * 64 * -16 + 64 / 2 */ +#define YG 19003 /* round(1.164384 * 64 * 256 * 256 / 257) */ +#define YB -1160 /* 1.164384 * 64 * -16 + 64 / 2 */ -// TODO(fbarchard): Improve accuracy; the B channel is off by 7%. -// U and V contributions to R,G,B. -#define UB -128 /* max(-128, round(-2.142 * 64)) */ -#define UG 12 /* round(0.187326 * 64) */ -#define VG 42 /* round(0.65042 * 64) */ -#define VR -107 /* round(-1.67867 * 64) */ +MAKEYUVCONSTANTS(2020, YG, YB, UB, UG, VG, VR) -// Bias values to round, and subtract 128 from U and V. -#define BB (UB * 128 + YGB) -#define BG (UG * 128 + VG * 128 + YGB) -#define BR (VR * 128 + YGB) - -#if defined(__aarch64__) -const struct YuvConstants SIMD_ALIGNED(kYuv2020Constants) = { - {-UB, -VR, -UB, -VR, -UB, -VR, -UB, -VR}, - {-UB, -VR, -UB, -VR, -UB, -VR, -UB, -VR}, - {UG, VG, UG, VG, UG, VG, UG, VG}, - {UG, VG, UG, VG, UG, VG, UG, VG}, - {BB, BG, BR, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -const struct YuvConstants SIMD_ALIGNED(kYvu2020Constants) = { - {-VR, -UB, -VR, -UB, -VR, -UB, -VR, -UB}, - {-VR, -UB, -VR, -UB, -VR, -UB, -VR, -UB}, - {VG, UG, VG, UG, VG, UG, VG, UG}, - {VG, UG, VG, UG, VG, UG, VG, UG}, - {BR, BG, BB, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -#elif defined(__arm__) -const struct YuvConstants SIMD_ALIGNED(kYuv2020Constants) = { - {-UB, -UB, -UB, -UB, -VR, -VR, -VR, -VR, 0, 0, 0, 0, 0, 0, 0, 0}, - {UG, UG, UG, UG, VG, VG, VG, VG, 0, 0, 0, 0, 0, 0, 0, 0}, - {BB, BG, BR, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -const struct YuvConstants SIMD_ALIGNED(kYvu2020Constants) = { - {-VR, -VR, -VR, -VR, -UB, -UB, -UB, -UB, 0, 0, 0, 0, 0, 0, 0, 0}, - {VG, VG, VG, VG, UG, UG, UG, UG, 0, 0, 0, 0, 0, 0, 0, 0}, - {BR, BG, BB, YGB, 0, 0, 0, 0}, - {0x0101 * YG, YG, 0, 0}}; -#else -const struct YuvConstants SIMD_ALIGNED(kYuv2020Constants) = { - {UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, - UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0}, - {UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, - UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG}, - {0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, - 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR}, - {BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB}, - {BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG}, - {BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR}, - {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, - {YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, - YGB}}; -const struct YuvConstants SIMD_ALIGNED(kYvu2020Constants) = { - {VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, - VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0, VR, 0}, - {VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, - VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG, VG, UG}, - {0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, - 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB, 0, UB}, - {BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR, BR}, - {BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG, BG}, - {BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB, BB}, - {YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG, YG}, - {YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, YGB, - YGB}}; -#endif - -#undef BB -#undef BG -#undef BR -#undef YGB +#undef YG +#undef YB #undef UB #undef UG #undef VG #undef VR + +// BT.2020 full range YUV to RGB reference +// R = Y + V * 1.474600 +// G = Y - U * 0.164553 - V * 0.571353 +// B = Y + U * 1.881400 +// KR = 0.2627; KB = 0.0593 + +#define UB 120 /* round(1.881400 * 64) */ +#define UG 11 /* round(0.164553 * 64) */ +#define VG 37 /* round(0.571353 * 64) */ +#define VR 94 /* round(1.474600 * 64) */ + +// Y contribution to R,G,B. Scale and bias. (same as jpeg) +#define YG 16320 /* round(1 * 64 * 256 * 256 / 257) */ +#define YB 32 /* 64 / 2 */ + +MAKEYUVCONSTANTS(V2020, YG, YB, UB, UG, VG, VR) + #undef YG +#undef YB +#undef UB +#undef UG +#undef VG +#undef VR + +#undef BB +#undef BG +#undef BR + +#undef MAKEYUVCONSTANTS + +#if defined(__aarch64__) || defined(__arm__) +#define LOAD_YUV_CONSTANTS \ + int ub = yuvconstants->kUVCoeff[0]; \ + int vr = yuvconstants->kUVCoeff[1]; \ + int ug = yuvconstants->kUVCoeff[2]; \ + int vg = yuvconstants->kUVCoeff[3]; \ + int yg = yuvconstants->kRGBCoeffBias[0]; \ + int bb = yuvconstants->kRGBCoeffBias[1]; \ + int bg = yuvconstants->kRGBCoeffBias[2]; \ + int br = yuvconstants->kRGBCoeffBias[3] + +#define CALC_RGB16 \ + int32_t y1 = (uint32_t)(y32 * yg) >> 16; \ + int b16 = y1 + (u * ub) - bb; \ + int g16 = y1 + bg - (u * ug + v * vg); \ + int r16 = y1 + (v * vr) - br +#else +#define LOAD_YUV_CONSTANTS \ + int ub = yuvconstants->kUVToB[0]; \ + int ug = yuvconstants->kUVToG[0]; \ + int vg = yuvconstants->kUVToG[1]; \ + int vr = yuvconstants->kUVToR[1]; \ + int yg = yuvconstants->kYToRgb[0]; \ + int yb = yuvconstants->kYBiasToRgb[0] + +#define CALC_RGB16 \ + int32_t y1 = ((uint32_t)(y32 * yg) >> 16) + yb; \ + int8_t ui = u; \ + int8_t vi = v; \ + ui -= 0x80; \ + vi -= 0x80; \ + int b16 = y1 + (ui * ub); \ + int g16 = y1 - (ui * ug + vi * vg); \ + int r16 = y1 + (vi * vr) +#endif // C reference code that mimics the YUV assembly. // Reads 8 bit YUV and leaves result as 16 bit. @@ -1682,39 +1662,12 @@ static __inline void YuvPixel(uint8_t y, uint8_t* g, uint8_t* r, const struct YuvConstants* yuvconstants) { -#if defined(__aarch64__) - int ub = -yuvconstants->kUVToRB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[1]; - int vr = -yuvconstants->kUVToRB[1]; - int bb = yuvconstants->kUVBiasBGR[0]; - int bg = yuvconstants->kUVBiasBGR[1]; - int br = yuvconstants->kUVBiasBGR[2]; - int yg = yuvconstants->kYToRgb[1]; -#elif defined(__arm__) - int ub = -yuvconstants->kUVToRB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[4]; - int vr = -yuvconstants->kUVToRB[4]; - int bb = yuvconstants->kUVBiasBGR[0]; - int bg = yuvconstants->kUVBiasBGR[1]; - int br = yuvconstants->kUVBiasBGR[2]; - int yg = yuvconstants->kYToRgb[1]; -#else - int ub = yuvconstants->kUVToB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[1]; - int vr = yuvconstants->kUVToR[1]; - int bb = yuvconstants->kUVBiasB[0]; - int bg = yuvconstants->kUVBiasG[0]; - int br = yuvconstants->kUVBiasR[0]; - int yg = yuvconstants->kYToRgb[0]; -#endif - - uint32_t y1 = (uint32_t)(y * 0x0101 * yg) >> 16; - *b = Clamp((int32_t)(-(u * ub) + y1 + bb) >> 6); - *g = Clamp((int32_t)(-(u * ug + v * vg) + y1 + bg) >> 6); - *r = Clamp((int32_t)(-(v * vr) + y1 + br) >> 6); + LOAD_YUV_CONSTANTS; + uint32_t y32 = y * 0x0101; + CALC_RGB16; + *b = Clamp((int32_t)(b16) >> 6); + *g = Clamp((int32_t)(g16) >> 6); + *r = Clamp((int32_t)(r16) >> 6); } // Reads 8 bit YUV and leaves result as 16 bit. @@ -1725,85 +1678,50 @@ static __inline void YuvPixel8_16(uint8_t y, int* g, int* r, const struct YuvConstants* yuvconstants) { -#if defined(__aarch64__) - int ub = -yuvconstants->kUVToRB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[1]; - int vr = -yuvconstants->kUVToRB[1]; - int bb = yuvconstants->kUVBiasBGR[0]; - int bg = yuvconstants->kUVBiasBGR[1]; - int br = yuvconstants->kUVBiasBGR[2]; - int yg = yuvconstants->kYToRgb[1]; -#elif defined(__arm__) - int ub = -yuvconstants->kUVToRB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[4]; - int vr = -yuvconstants->kUVToRB[4]; - int bb = yuvconstants->kUVBiasBGR[0]; - int bg = yuvconstants->kUVBiasBGR[1]; - int br = yuvconstants->kUVBiasBGR[2]; - int yg = yuvconstants->kYToRgb[1]; -#else - int ub = yuvconstants->kUVToB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[1]; - int vr = yuvconstants->kUVToR[1]; - int bb = yuvconstants->kUVBiasB[0]; - int bg = yuvconstants->kUVBiasG[0]; - int br = yuvconstants->kUVBiasR[0]; - int yg = yuvconstants->kYToRgb[0]; -#endif - - uint32_t y1 = (uint32_t)(y * 0x0101 * yg) >> 16; - *b = (int)(-(u * ub) + y1 + bb); - *g = (int)(-(u * ug + v * vg) + y1 + bg); - *r = (int)(-(v * vr) + y1 + br); + LOAD_YUV_CONSTANTS; + uint32_t y32 = y * 0x0101; + CALC_RGB16; + *b = b16; + *g = g16; + *r = r16; } // C reference code that mimics the YUV 16 bit assembly. // Reads 10 bit YUV and leaves result as 16 bit. -static __inline void YuvPixel16(int16_t y, - int16_t u, - int16_t v, - int* b, - int* g, - int* r, - const struct YuvConstants* yuvconstants) { -#if defined(__aarch64__) - int ub = -yuvconstants->kUVToRB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[1]; - int vr = -yuvconstants->kUVToRB[1]; - int bb = yuvconstants->kUVBiasBGR[0]; - int bg = yuvconstants->kUVBiasBGR[1]; - int br = yuvconstants->kUVBiasBGR[2]; - int yg = yuvconstants->kYToRgb[1]; -#elif defined(__arm__) - int ub = -yuvconstants->kUVToRB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[4]; - int vr = -yuvconstants->kUVToRB[4]; - int bb = yuvconstants->kUVBiasBGR[0]; - int bg = yuvconstants->kUVBiasBGR[1]; - int br = yuvconstants->kUVBiasBGR[2]; - int yg = yuvconstants->kYToRgb[1]; -#else - int ub = yuvconstants->kUVToB[0]; - int ug = yuvconstants->kUVToG[0]; - int vg = yuvconstants->kUVToG[1]; - int vr = yuvconstants->kUVToR[1]; - int bb = yuvconstants->kUVBiasB[0]; - int bg = yuvconstants->kUVBiasG[0]; - int br = yuvconstants->kUVBiasR[0]; - int yg = yuvconstants->kYToRgb[0]; -#endif - - uint32_t y1 = (uint32_t)((y << 6) * yg) >> 16; +static __inline void YuvPixel10_16(uint16_t y, + uint16_t u, + uint16_t v, + int* b, + int* g, + int* r, + const struct YuvConstants* yuvconstants) { + LOAD_YUV_CONSTANTS; + uint32_t y32 = y << 6; u = clamp255(u >> 2); v = clamp255(v >> 2); - *b = (int)(-(u * ub) + y1 + bb); - *g = (int)(-(u * ug + v * vg) + y1 + bg); - *r = (int)(-(v * vr) + y1 + br); + CALC_RGB16; + *b = b16; + *g = g16; + *r = r16; +} + +// C reference code that mimics the YUV 16 bit assembly. +// Reads 12 bit YUV and leaves result as 16 bit. +static __inline void YuvPixel12_16(int16_t y, + int16_t u, + int16_t v, + int* b, + int* g, + int* r, + const struct YuvConstants* yuvconstants) { + LOAD_YUV_CONSTANTS; + uint32_t y32 = y << 4; + u = clamp255(u >> 4); + v = clamp255(v >> 4); + CALC_RGB16; + *b = b16; + *g = g16; + *r = r16; } // C reference code that mimics the YUV 10 bit assembly. @@ -1818,22 +1736,78 @@ static __inline void YuvPixel10(uint16_t y, int b16; int g16; int r16; - YuvPixel16(y, u, v, &b16, &g16, &r16, yuvconstants); + YuvPixel10_16(y, u, v, &b16, &g16, &r16, yuvconstants); *b = Clamp(b16 >> 6); *g = Clamp(g16 >> 6); *r = Clamp(r16 >> 6); } +// C reference code that mimics the YUV 12 bit assembly. +// Reads 12 bit YUV and clamps down to 8 bit RGB. +static __inline void YuvPixel12(uint16_t y, + uint16_t u, + uint16_t v, + uint8_t* b, + uint8_t* g, + uint8_t* r, + const struct YuvConstants* yuvconstants) { + int b16; + int g16; + int r16; + YuvPixel12_16(y, u, v, &b16, &g16, &r16, yuvconstants); + *b = Clamp(b16 >> 6); + *g = Clamp(g16 >> 6); + *r = Clamp(r16 >> 6); +} + +// C reference code that mimics the YUV 16 bit assembly. +// Reads 16 bit YUV and leaves result as 8 bit. +static __inline void YuvPixel16_8(uint16_t y, + uint16_t u, + uint16_t v, + uint8_t* b, + uint8_t* g, + uint8_t* r, + const struct YuvConstants* yuvconstants) { + LOAD_YUV_CONSTANTS; + uint32_t y32 = y; + u = clamp255(u >> 8); + v = clamp255(v >> 8); + CALC_RGB16; + *b = Clamp((int32_t)(b16) >> 6); + *g = Clamp((int32_t)(g16) >> 6); + *r = Clamp((int32_t)(r16) >> 6); +} + +// C reference code that mimics the YUV 16 bit assembly. +// Reads 16 bit YUV and leaves result as 16 bit. +static __inline void YuvPixel16_16(uint16_t y, + uint16_t u, + uint16_t v, + int* b, + int* g, + int* r, + const struct YuvConstants* yuvconstants) { + LOAD_YUV_CONSTANTS; + uint32_t y32 = y; + u = clamp255(u >> 8); + v = clamp255(v >> 8); + CALC_RGB16; + *b = b16; + *g = g16; + *r = r16; +} + // C reference code that mimics the YUV assembly. -// Reads 8 bit YUV and leaves result as 16 bit. +// Reads 8 bit YUV and leaves result as 8 bit. static __inline void YPixel(uint8_t y, uint8_t* b, uint8_t* g, uint8_t* r, const struct YuvConstants* yuvconstants) { #if defined(__aarch64__) || defined(__arm__) - int ygb = yuvconstants->kUVBiasBGR[3]; - int yg = yuvconstants->kYToRgb[1]; + int yg = yuvconstants->kRGBCoeffBias[0]; + int ygb = yuvconstants->kRGBCoeffBias[4]; #else int ygb = yuvconstants->kYBiasToRgb[0]; int yg = yuvconstants->kYToRgb[0]; @@ -1844,38 +1818,6 @@ static __inline void YPixel(uint8_t y, *r = Clamp(((int32_t)(y1) + ygb) >> 6); } -#if !defined(LIBYUV_DISABLE_NEON) && \ - (defined(__ARM_NEON__) || defined(__aarch64__) || defined(LIBYUV_NEON)) -// C mimic assembly. -// TODO(fbarchard): Remove subsampling from Neon. -void I444ToARGBRow_C(const uint8_t* src_y, - const uint8_t* src_u, - const uint8_t* src_v, - uint8_t* rgb_buf, - const struct YuvConstants* yuvconstants, - int width) { - int x; - for (x = 0; x < width - 1; x += 2) { - uint8_t u = (src_u[0] + src_u[1] + 1) >> 1; - uint8_t v = (src_v[0] + src_v[1] + 1) >> 1; - YuvPixel(src_y[0], u, v, rgb_buf + 0, rgb_buf + 1, rgb_buf + 2, - yuvconstants); - rgb_buf[3] = 255; - YuvPixel(src_y[1], u, v, rgb_buf + 4, rgb_buf + 5, rgb_buf + 6, - yuvconstants); - rgb_buf[7] = 255; - src_y += 2; - src_u += 2; - src_v += 2; - rgb_buf += 8; // Advance 2 pixels. - } - if (width & 1) { - YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1, - rgb_buf + 2, yuvconstants); - rgb_buf[3] = 255; - } -} -#else void I444ToARGBRow_C(const uint8_t* src_y, const uint8_t* src_u, const uint8_t* src_v, @@ -1893,7 +1835,6 @@ void I444ToARGBRow_C(const uint8_t* src_y, rgb_buf += 4; // Advance 1 pixel. } } -#endif // Also used for 420 void I422ToARGBRow_C(const uint8_t* src_y, @@ -1949,9 +1890,102 @@ void I210ToARGBRow_C(const uint16_t* src_y, } } +void I410ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width) { + int x; + for (x = 0; x < width; ++x) { + YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1, + rgb_buf + 2, yuvconstants); + rgb_buf[3] = 255; + src_y += 1; + src_u += 1; + src_v += 1; + rgb_buf += 4; // Advance 1 pixels. + } +} + +void I210AlphaToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + const uint16_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width) { + int x; + for (x = 0; x < width - 1; x += 2) { + YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1, + rgb_buf + 2, yuvconstants); + rgb_buf[3] = clamp255(src_a[0] >> 2); + YuvPixel10(src_y[1], src_u[0], src_v[0], rgb_buf + 4, rgb_buf + 5, + rgb_buf + 6, yuvconstants); + rgb_buf[7] = clamp255(src_a[1] >> 2); + src_y += 2; + src_u += 1; + src_v += 1; + src_a += 2; + rgb_buf += 8; // Advance 2 pixels. + } + if (width & 1) { + YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1, + rgb_buf + 2, yuvconstants); + rgb_buf[3] = clamp255(src_a[0] >> 2); + } +} + +void I410AlphaToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + const uint16_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width) { + int x; + for (x = 0; x < width; ++x) { + YuvPixel10(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1, + rgb_buf + 2, yuvconstants); + rgb_buf[3] = clamp255(src_a[0] >> 2); + src_y += 1; + src_u += 1; + src_v += 1; + src_a += 1; + rgb_buf += 4; // Advance 1 pixels. + } +} + +// 12 bit YUV to ARGB +void I212ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width) { + int x; + for (x = 0; x < width - 1; x += 2) { + YuvPixel12(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1, + rgb_buf + 2, yuvconstants); + rgb_buf[3] = 255; + YuvPixel12(src_y[1], src_u[0], src_v[0], rgb_buf + 4, rgb_buf + 5, + rgb_buf + 6, yuvconstants); + rgb_buf[7] = 255; + src_y += 2; + src_u += 1; + src_v += 1; + rgb_buf += 8; // Advance 2 pixels. + } + if (width & 1) { + YuvPixel12(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1, + rgb_buf + 2, yuvconstants); + rgb_buf[3] = 255; + } +} + static void StoreAR30(uint8_t* rgb_buf, int b, int g, int r) { uint32_t ar30; - b = b >> 4; // convert 10.6 to 10 bit. + b = b >> 4; // convert 8 bit 10.6 to 10 bit. g = g >> 4; r = r >> 4; b = Clamp10(b); @@ -1973,9 +2007,9 @@ void I210ToAR30Row_C(const uint16_t* src_y, int g; int r; for (x = 0; x < width - 1; x += 2) { - YuvPixel16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants); + YuvPixel10_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants); StoreAR30(rgb_buf, b, g, r); - YuvPixel16(src_y[1], src_u[0], src_v[0], &b, &g, &r, yuvconstants); + YuvPixel10_16(src_y[1], src_u[0], src_v[0], &b, &g, &r, yuvconstants); StoreAR30(rgb_buf + 4, b, g, r); src_y += 2; src_u += 1; @@ -1983,11 +2017,141 @@ void I210ToAR30Row_C(const uint16_t* src_y, rgb_buf += 8; // Advance 2 pixels. } if (width & 1) { - YuvPixel16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants); + YuvPixel10_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants); StoreAR30(rgb_buf, b, g, r); } } +// 12 bit YUV to 10 bit AR30 +void I212ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width) { + int x; + int b; + int g; + int r; + for (x = 0; x < width - 1; x += 2) { + YuvPixel12_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants); + StoreAR30(rgb_buf, b, g, r); + YuvPixel12_16(src_y[1], src_u[0], src_v[0], &b, &g, &r, yuvconstants); + StoreAR30(rgb_buf + 4, b, g, r); + src_y += 2; + src_u += 1; + src_v += 1; + rgb_buf += 8; // Advance 2 pixels. + } + if (width & 1) { + YuvPixel12_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants); + StoreAR30(rgb_buf, b, g, r); + } +} + +void I410ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_u, + const uint16_t* src_v, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width) { + int x; + int b; + int g; + int r; + for (x = 0; x < width; ++x) { + YuvPixel10_16(src_y[0], src_u[0], src_v[0], &b, &g, &r, yuvconstants); + StoreAR30(rgb_buf, b, g, r); + src_y += 1; + src_u += 1; + src_v += 1; + rgb_buf += 4; // Advance 1 pixel. + } +} + +// P210 has 10 bits in msb of 16 bit NV12 style layout. +void P210ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + int x; + for (x = 0; x < width - 1; x += 2) { + YuvPixel16_8(src_y[0], src_uv[0], src_uv[1], dst_argb + 0, dst_argb + 1, + dst_argb + 2, yuvconstants); + dst_argb[3] = 255; + YuvPixel16_8(src_y[1], src_uv[0], src_uv[1], dst_argb + 4, dst_argb + 5, + dst_argb + 6, yuvconstants); + dst_argb[7] = 255; + src_y += 2; + src_uv += 2; + dst_argb += 8; // Advance 2 pixels. + } + if (width & 1) { + YuvPixel16_8(src_y[0], src_uv[0], src_uv[1], dst_argb + 0, dst_argb + 1, + dst_argb + 2, yuvconstants); + dst_argb[3] = 255; + } +} + +void P410ToARGBRow_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + int x; + for (x = 0; x < width; ++x) { + YuvPixel16_8(src_y[0], src_uv[0], src_uv[1], dst_argb + 0, dst_argb + 1, + dst_argb + 2, yuvconstants); + dst_argb[3] = 255; + src_y += 1; + src_uv += 2; + dst_argb += 4; // Advance 1 pixels. + } +} + +void P210ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + int x; + int b; + int g; + int r; + for (x = 0; x < width - 1; x += 2) { + YuvPixel16_16(src_y[0], src_uv[0], src_uv[1], &b, &g, &r, yuvconstants); + StoreAR30(dst_ar30, b, g, r); + YuvPixel16_16(src_y[1], src_uv[0], src_uv[1], &b, &g, &r, yuvconstants); + StoreAR30(dst_ar30 + 4, b, g, r); + src_y += 2; + src_uv += 2; + dst_ar30 += 8; // Advance 2 pixels. + } + if (width & 1) { + YuvPixel16_16(src_y[0], src_uv[0], src_uv[1], &b, &g, &r, yuvconstants); + StoreAR30(dst_ar30, b, g, r); + } +} + +void P410ToAR30Row_C(const uint16_t* src_y, + const uint16_t* src_uv, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + int x; + int b; + int g; + int r; + for (x = 0; x < width; ++x) { + YuvPixel16_16(src_y[0], src_uv[0], src_uv[1], &b, &g, &r, yuvconstants); + StoreAR30(dst_ar30, b, g, r); + src_y += 1; + src_uv += 2; + dst_ar30 += 4; // Advance 1 pixel. + } +} + // 8 bit YUV to 10 bit AR30 // Uses same code as 10 bit YUV bit shifts the 8 bit values up to 10 bits. void I422ToAR30Row_C(const uint8_t* src_y, @@ -2016,6 +2180,26 @@ void I422ToAR30Row_C(const uint8_t* src_y, } } +void I444AlphaToARGBRow_C(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* rgb_buf, + const struct YuvConstants* yuvconstants, + int width) { + int x; + for (x = 0; x < width; ++x) { + YuvPixel(src_y[0], src_u[0], src_v[0], rgb_buf + 0, rgb_buf + 1, + rgb_buf + 2, yuvconstants); + rgb_buf[3] = src_a[0]; + src_y += 1; + src_u += 1; + src_v += 1; + src_a += 1; + rgb_buf += 4; // Advance 1 pixel. + } +} + void I422AlphaToARGBRow_C(const uint8_t* src_y, const uint8_t* src_u, const uint8_t* src_v, @@ -2533,27 +2717,197 @@ void MergeRGBRow_C(const uint8_t* src_r, } } -// Use scale to convert lsb formats to msb, depending how many bits there are: -// 128 = 9 bits -// 64 = 10 bits -// 16 = 12 bits -// 1 = 16 bits +void SplitARGBRow_C(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width) { + int x; + for (x = 0; x < width; ++x) { + dst_b[x] = src_argb[0]; + dst_g[x] = src_argb[1]; + dst_r[x] = src_argb[2]; + dst_a[x] = src_argb[3]; + src_argb += 4; + } +} + +void MergeARGBRow_C(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width) { + int x; + for (x = 0; x < width; ++x) { + dst_argb[0] = src_b[x]; + dst_argb[1] = src_g[x]; + dst_argb[2] = src_r[x]; + dst_argb[3] = src_a[x]; + dst_argb += 4; + } +} + +void MergeXR30Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width) { + assert(depth >= 10); + assert(depth <= 16); + int x; + int shift = depth - 10; + uint32_t* dst_ar30_32 = (uint32_t*)dst_ar30; + for (x = 0; x < width; ++x) { + uint32_t r = clamp1023(src_r[x] >> shift); + uint32_t g = clamp1023(src_g[x] >> shift); + uint32_t b = clamp1023(src_b[x] >> shift); + dst_ar30_32[x] = b | (g << 10) | (r << 20) | 0xc0000000; + } +} + +void MergeAR64Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width) { + assert(depth >= 1); + assert(depth <= 16); + int x; + int shift = 16 - depth; + int max = (1 << depth) - 1; + for (x = 0; x < width; ++x) { + dst_ar64[0] = ClampMax(src_b[x], max) << shift; + dst_ar64[1] = ClampMax(src_g[x], max) << shift; + dst_ar64[2] = ClampMax(src_r[x], max) << shift; + dst_ar64[3] = ClampMax(src_a[x], max) << shift; + dst_ar64 += 4; + } +} + +void MergeARGB16To8Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width) { + assert(depth >= 8); + assert(depth <= 16); + int x; + int shift = depth - 8; + for (x = 0; x < width; ++x) { + dst_argb[0] = clamp255(src_b[x] >> shift); + dst_argb[1] = clamp255(src_g[x] >> shift); + dst_argb[2] = clamp255(src_r[x] >> shift); + dst_argb[3] = clamp255(src_a[x] >> shift); + dst_argb += 4; + } +} + +void MergeXR64Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width) { + assert(depth >= 1); + assert(depth <= 16); + int x; + int shift = 16 - depth; + int max = (1 << depth) - 1; + for (x = 0; x < width; ++x) { + dst_ar64[0] = ClampMax(src_b[x], max) << shift; + dst_ar64[1] = ClampMax(src_g[x], max) << shift; + dst_ar64[2] = ClampMax(src_r[x], max) << shift; + dst_ar64[3] = 0xffff; + dst_ar64 += 4; + } +} + +void MergeXRGB16To8Row_C(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width) { + assert(depth >= 8); + assert(depth <= 16); + int x; + int shift = depth - 8; + for (x = 0; x < width; ++x) { + dst_argb[0] = clamp255(src_b[x] >> shift); + dst_argb[1] = clamp255(src_g[x] >> shift); + dst_argb[2] = clamp255(src_r[x] >> shift); + dst_argb[3] = 0xff; + dst_argb += 4; + } +} + +void SplitXRGBRow_C(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width) { + int x; + for (x = 0; x < width; ++x) { + dst_b[x] = src_argb[0]; + dst_g[x] = src_argb[1]; + dst_r[x] = src_argb[2]; + src_argb += 4; + } +} + +void MergeXRGBRow_C(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width) { + int x; + for (x = 0; x < width; ++x) { + dst_argb[0] = src_b[x]; + dst_argb[1] = src_g[x]; + dst_argb[2] = src_r[x]; + dst_argb[3] = 255; + dst_argb += 4; + } +} + +// Convert lsb formats to msb, depending on sample depth. void MergeUVRow_16_C(const uint16_t* src_u, const uint16_t* src_v, uint16_t* dst_uv, - int scale, + int depth, int width) { + int shift = 16 - depth; + assert(depth >= 8); + assert(depth <= 16); int x; - for (x = 0; x < width - 1; x += 2) { - dst_uv[0] = src_u[x] * scale; - dst_uv[1] = src_v[x] * scale; - dst_uv[2] = src_u[x + 1] * scale; - dst_uv[3] = src_v[x + 1] * scale; - dst_uv += 4; + for (x = 0; x < width; ++x) { + dst_uv[0] = src_u[x] << shift; + dst_uv[1] = src_v[x] << shift; + dst_uv += 2; } - if (width & 1) { - dst_uv[0] = src_u[width - 1] * scale; - dst_uv[1] = src_v[width - 1] * scale; +} + +// Convert msb formats to lsb, depending on sample depth. +void SplitUVRow_16_C(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width) { + int shift = 16 - depth; + int x; + assert(depth >= 8); + assert(depth <= 16); + for (x = 0; x < width; ++x) { + dst_u[x] = src_uv[0] >> shift; + dst_v[x] = src_uv[1] >> shift; + src_uv += 2; } } @@ -2567,6 +2921,16 @@ void MultiplyRow_16_C(const uint16_t* src_y, } } +void DivideRow_16_C(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width) { + int x; + for (x = 0; x < width; ++x) { + dst_y[x] = (src_y[x] * scale) >> 16; + } +} + // Use scale to convert lsb formats to msb, depending how many bits there are: // 32768 = 9 bits // 16384 = 10 bits @@ -2577,6 +2941,9 @@ void Convert16To8Row_C(const uint16_t* src_y, int scale, int width) { int x; + assert(scale >= 256); + assert(scale <= 32768); + for (x = 0; x < width; ++x) { dst_y[x] = clamp255((src_y[x] * scale) >> 16); } @@ -2710,19 +3077,19 @@ void UYVYToYRow_C(const uint8_t* src_uyvy, uint8_t* dst_y, int width) { #define BLEND(f, b, a) clamp255((((256 - a) * b) >> 8) + f) -// Blend src_argb0 over src_argb1 and store to dst_argb. -// dst_argb may be src_argb0 or src_argb1. +// Blend src_argb over src_argb1 and store to dst_argb. +// dst_argb may be src_argb or src_argb1. // This code mimics the SSSE3 version for better testability. -void ARGBBlendRow_C(const uint8_t* src_argb0, +void ARGBBlendRow_C(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { int x; for (x = 0; x < width - 1; x += 2) { - uint32_t fb = src_argb0[0]; - uint32_t fg = src_argb0[1]; - uint32_t fr = src_argb0[2]; - uint32_t a = src_argb0[3]; + uint32_t fb = src_argb[0]; + uint32_t fg = src_argb[1]; + uint32_t fr = src_argb[2]; + uint32_t a = src_argb[3]; uint32_t bb = src_argb1[0]; uint32_t bg = src_argb1[1]; uint32_t br = src_argb1[2]; @@ -2731,10 +3098,10 @@ void ARGBBlendRow_C(const uint8_t* src_argb0, dst_argb[2] = BLEND(fr, br, a); dst_argb[3] = 255u; - fb = src_argb0[4 + 0]; - fg = src_argb0[4 + 1]; - fr = src_argb0[4 + 2]; - a = src_argb0[4 + 3]; + fb = src_argb[4 + 0]; + fg = src_argb[4 + 1]; + fr = src_argb[4 + 2]; + a = src_argb[4 + 3]; bb = src_argb1[4 + 0]; bg = src_argb1[4 + 1]; br = src_argb1[4 + 2]; @@ -2742,16 +3109,16 @@ void ARGBBlendRow_C(const uint8_t* src_argb0, dst_argb[4 + 1] = BLEND(fg, bg, a); dst_argb[4 + 2] = BLEND(fr, br, a); dst_argb[4 + 3] = 255u; - src_argb0 += 8; + src_argb += 8; src_argb1 += 8; dst_argb += 8; } if (width & 1) { - uint32_t fb = src_argb0[0]; - uint32_t fg = src_argb0[1]; - uint32_t fr = src_argb0[2]; - uint32_t a = src_argb0[3]; + uint32_t fb = src_argb[0]; + uint32_t fg = src_argb[1]; + uint32_t fr = src_argb[2]; + uint32_t a = src_argb[3]; uint32_t bb = src_argb1[0]; uint32_t bg = src_argb1[1]; uint32_t br = src_argb1[2]; @@ -3276,7 +3643,7 @@ void ARGBCopyYToAlphaRow_C(const uint8_t* src, uint8_t* dst, int width) { // Maximum temporary width for wrappers to process at a time, in pixels. #define MAXTWIDTH 2048 -#if !(defined(_MSC_VER) && defined(_M_IX86)) && \ +#if !(defined(_MSC_VER) && !defined(__clang__) && defined(_M_IX86)) && \ defined(HAS_I422TORGB565ROW_SSSE3) // row_win.cc has asm version, but GCC uses 2 step wrapper. void I422ToRGB565Row_SSSE3(const uint8_t* src_y, @@ -3743,13 +4110,14 @@ void NV21ToYUV24Row_C(const uint8_t* src_y, } // Filter 2 rows of AYUV UV's (444) into UV (420). +// AYUV is VUYA in memory. UV for NV12 is UV order in memory. void AYUVToUVRow_C(const uint8_t* src_ayuv, int src_stride_ayuv, uint8_t* dst_uv, int width) { // Output a row of UV values, filtering 2x2 rows of AYUV. int x; - for (x = 0; x < width; x += 2) { + for (x = 0; x < width - 1; x += 2) { dst_uv[0] = (src_ayuv[1] + src_ayuv[5] + src_ayuv[src_stride_ayuv + 1] + src_ayuv[src_stride_ayuv + 5] + 2) >> 2; @@ -3760,12 +4128,8 @@ void AYUVToUVRow_C(const uint8_t* src_ayuv, dst_uv += 2; } if (width & 1) { - dst_uv[0] = (src_ayuv[0] + src_ayuv[0] + src_ayuv[src_stride_ayuv + 0] + - src_ayuv[src_stride_ayuv + 0] + 2) >> - 2; - dst_uv[1] = (src_ayuv[1] + src_ayuv[1] + src_ayuv[src_stride_ayuv + 1] + - src_ayuv[src_stride_ayuv + 1] + 2) >> - 2; + dst_uv[0] = (src_ayuv[1] + src_ayuv[src_stride_ayuv + 1] + 1) >> 1; + dst_uv[1] = (src_ayuv[0] + src_ayuv[src_stride_ayuv + 0] + 1) >> 1; } } @@ -3776,7 +4140,7 @@ void AYUVToVURow_C(const uint8_t* src_ayuv, int width) { // Output a row of VU values, filtering 2x2 rows of AYUV. int x; - for (x = 0; x < width; x += 2) { + for (x = 0; x < width - 1; x += 2) { dst_vu[0] = (src_ayuv[0] + src_ayuv[4] + src_ayuv[src_stride_ayuv + 0] + src_ayuv[src_stride_ayuv + 4] + 2) >> 2; @@ -3787,12 +4151,8 @@ void AYUVToVURow_C(const uint8_t* src_ayuv, dst_vu += 2; } if (width & 1) { - dst_vu[0] = (src_ayuv[0] + src_ayuv[0] + src_ayuv[src_stride_ayuv + 0] + - src_ayuv[src_stride_ayuv + 0] + 2) >> - 2; - dst_vu[1] = (src_ayuv[1] + src_ayuv[1] + src_ayuv[src_stride_ayuv + 1] + - src_ayuv[src_stride_ayuv + 1] + 2) >> - 2; + dst_vu[0] = (src_ayuv[0] + src_ayuv[src_stride_ayuv + 0] + 1) >> 1; + dst_vu[1] = (src_ayuv[1] + src_ayuv[src_stride_ayuv + 1] + 1) >> 1; } } diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/row_gcc.cc b/third-party/libyuv/third_party/libyuv/source/row_gcc.cc similarity index 76% rename from third-party/webrtc/dependencies/third_party/libyuv/source/row_gcc.cc rename to third-party/libyuv/third_party/libyuv/source/row_gcc.cc index a107c30e76..001c353dbe 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/row_gcc.cc +++ b/third-party/libyuv/third_party/libyuv/source/row_gcc.cc @@ -16,8 +16,7 @@ extern "C" { #endif // This module is for GCC x86 and x64. -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) #if defined(HAS_ARGBTOYROW_SSSE3) || defined(HAS_ARGBGRAYROW_SSSE3) @@ -1078,6 +1077,222 @@ void ABGRToAR30Row_AVX2(const uint8_t* src, uint8_t* dst, int width) { } #endif +static const uvec8 kShuffleARGBToABGR = {2, 1, 0, 3, 6, 5, 4, 7, + 10, 9, 8, 11, 14, 13, 12, 15}; + +static const uvec8 kShuffleARGBToAB64Lo = {2, 2, 1, 1, 0, 0, 3, 3, + 6, 6, 5, 5, 4, 4, 7, 7}; +static const uvec8 kShuffleARGBToAB64Hi = {10, 10, 9, 9, 8, 8, 11, 11, + 14, 14, 13, 13, 12, 12, 15, 15}; + +void ARGBToAR64Row_SSSE3(const uint8_t* src_argb, + uint16_t* dst_ar64, + int width) { + asm volatile( + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqa %%xmm0,%%xmm1 \n" + "punpcklbw %%xmm0,%%xmm0 \n" + "punpckhbw %%xmm1,%%xmm1 \n" + "movdqu %%xmm0,(%1) \n" + "movdqu %%xmm1,0x10(%1) \n" + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_ar64), // %1 + "+r"(width) // %2 + : + : "memory", "cc", "xmm0", "xmm1"); +} + +void ARGBToAB64Row_SSSE3(const uint8_t* src_argb, + uint16_t* dst_ab64, + int width) { + asm volatile( + + "movdqa %3,%%xmm2 \n" + "movdqa %4,%%xmm3 \n" LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqa %%xmm0,%%xmm1 \n" + "pshufb %%xmm2,%%xmm0 \n" + "pshufb %%xmm3,%%xmm1 \n" + "movdqu %%xmm0,(%1) \n" + "movdqu %%xmm1,0x10(%1) \n" + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_ab64), // %1 + "+r"(width) // %2 + : "m"(kShuffleARGBToAB64Lo), // %3 + "m"(kShuffleARGBToAB64Hi) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} + +void AR64ToARGBRow_SSSE3(const uint16_t* src_ar64, + uint8_t* dst_argb, + int width) { + asm volatile( + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "psrlw $8,%%xmm0 \n" + "psrlw $8,%%xmm1 \n" + "packuswb %%xmm1,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + "lea 0x20(%0),%0 \n" + "lea 0x10(%1),%1 \n" + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_ar64), // %0 + "+r"(dst_argb), // %1 + "+r"(width) // %2 + : + : "memory", "cc", "xmm0", "xmm1"); +} + +void AB64ToARGBRow_SSSE3(const uint16_t* src_ab64, + uint8_t* dst_argb, + int width) { + asm volatile( + + "movdqa %3,%%xmm2 \n" LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "psrlw $8,%%xmm0 \n" + "psrlw $8,%%xmm1 \n" + "packuswb %%xmm1,%%xmm0 \n" + "pshufb %%xmm2,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + "lea 0x20(%0),%0 \n" + "lea 0x10(%1),%1 \n" + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_ab64), // %0 + "+r"(dst_argb), // %1 + "+r"(width) // %2 + : "m"(kShuffleARGBToABGR) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} + +#ifdef HAS_ARGBTOAR64ROW_AVX2 +void ARGBToAR64Row_AVX2(const uint8_t* src_argb, + uint16_t* dst_ar64, + int width) { + asm volatile( + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpunpckhbw %%ymm0,%%ymm0,%%ymm1 \n" + "vpunpcklbw %%ymm0,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + "vmovdqu %%ymm1,0x20(%1) \n" + "lea 0x20(%0),%0 \n" + "lea 0x40(%1),%1 \n" + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_ar64), // %1 + "+r"(width) // %2 + : + : "memory", "cc", "xmm0", "xmm1"); +} +#endif + +#ifdef HAS_ARGBTOAB64ROW_AVX2 +void ARGBToAB64Row_AVX2(const uint8_t* src_argb, + uint16_t* dst_ab64, + int width) { + asm volatile( + + "vbroadcastf128 %3,%%ymm2 \n" + "vbroadcastf128 %4,%%ymm3 \n" LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpshufb %%ymm3,%%ymm0,%%ymm1 \n" + "vpshufb %%ymm2,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + "vmovdqu %%ymm1,0x20(%1) \n" + "lea 0x20(%0),%0 \n" + "lea 0x40(%1),%1 \n" + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_ab64), // %1 + "+r"(width) // %2 + : "m"(kShuffleARGBToAB64Lo), // %3 + "m"(kShuffleARGBToAB64Hi) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} +#endif + +#ifdef HAS_AR64TOARGBROW_AVX2 +void AR64ToARGBRow_AVX2(const uint16_t* src_ar64, + uint8_t* dst_argb, + int width) { + asm volatile( + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "vpsrlw $8,%%ymm0,%%ymm0 \n" + "vpsrlw $8,%%ymm1,%%ymm1 \n" + "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + "lea 0x40(%0),%0 \n" + "lea 0x20(%1),%1 \n" + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_ar64), // %0 + "+r"(dst_argb), // %1 + "+r"(width) // %2 + : + : "memory", "cc", "xmm0", "xmm1"); +} +#endif + +#ifdef HAS_AB64TOARGBROW_AVX2 +void AB64ToARGBRow_AVX2(const uint16_t* src_ab64, + uint8_t* dst_argb, + int width) { + asm volatile( + + "vbroadcastf128 %3,%%ymm2 \n" LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "vpsrlw $8,%%ymm0,%%ymm0 \n" + "vpsrlw $8,%%ymm1,%%ymm1 \n" + "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpshufb %%ymm2,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + "lea 0x40(%0),%0 \n" + "lea 0x20(%1),%1 \n" + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_ab64), // %0 + "+r"(dst_argb), // %1 + "+r"(width) // %2 + : "m"(kShuffleARGBToABGR) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} +#endif + // clang-format off // TODO(mraptis): Consider passing R, G, B multipliers as parameter. @@ -1278,7 +1493,7 @@ void RGBAToYJRow_AVX2(const uint8_t* src_rgba, uint8_t* dst_y, int width) { "vmovdqu %5,%%ymm6 \n" LABELALIGN RGBTOY_AVX2( - ymm5) "vzeroupper \n" + ymm5) "vzeroupper \n" : "+r"(src_rgba), // %0 "+r"(dst_y), // %1 "+r"(width) // %2 @@ -1290,7 +1505,7 @@ void RGBAToYJRow_AVX2(const uint8_t* src_rgba, uint8_t* dst_y, int width) { #endif // HAS_RGBATOYJROW_AVX2 #ifdef HAS_ARGBTOUVROW_SSSE3 -void ARGBToUVRow_SSSE3(const uint8_t* src_argb0, +void ARGBToUVRow_SSSE3(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1342,7 +1557,7 @@ void ARGBToUVRow_SSSE3(const uint8_t* src_argb0, "lea 0x8(%1),%1 \n" "sub $0x10,%3 \n" "jg 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(dst_u), // %1 "+r"(dst_v), // %2 "+rm"(width) // %3 @@ -1359,7 +1574,7 @@ void ARGBToUVRow_SSSE3(const uint8_t* src_argb0, static const lvec8 kShufARGBToUV_AVX = { 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15, 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15}; -void ARGBToUVRow_AVX2(const uint8_t* src_argb0, +void ARGBToUVRow_AVX2(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1407,7 +1622,7 @@ void ARGBToUVRow_AVX2(const uint8_t* src_argb0, "sub $0x20,%3 \n" "jg 1b \n" "vzeroupper \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(dst_u), // %1 "+r"(dst_v), // %2 "+rm"(width) // %3 @@ -1422,7 +1637,7 @@ void ARGBToUVRow_AVX2(const uint8_t* src_argb0, #endif // HAS_ARGBTOUVROW_AVX2 #ifdef HAS_ABGRTOUVROW_AVX2 -void ABGRToUVRow_AVX2(const uint8_t* src_abgr0, +void ABGRToUVRow_AVX2(const uint8_t* src_abgr, int src_stride_abgr, uint8_t* dst_u, uint8_t* dst_v, @@ -1470,7 +1685,7 @@ void ABGRToUVRow_AVX2(const uint8_t* src_abgr0, "sub $0x20,%3 \n" "jg 1b \n" "vzeroupper \n" - : "+r"(src_abgr0), // %0 + : "+r"(src_abgr), // %0 "+r"(dst_u), // %1 "+r"(dst_v), // %2 "+rm"(width) // %3 @@ -1485,7 +1700,7 @@ void ABGRToUVRow_AVX2(const uint8_t* src_abgr0, #endif // HAS_ABGRTOUVROW_AVX2 #ifdef HAS_ARGBTOUVJROW_AVX2 -void ARGBToUVJRow_AVX2(const uint8_t* src_argb0, +void ARGBToUVJRow_AVX2(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1534,7 +1749,7 @@ void ARGBToUVJRow_AVX2(const uint8_t* src_argb0, "sub $0x20,%3 \n" "jg 1b \n" "vzeroupper \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(dst_u), // %1 "+r"(dst_v), // %2 "+rm"(width) // %3 @@ -1549,7 +1764,7 @@ void ARGBToUVJRow_AVX2(const uint8_t* src_argb0, #endif // HAS_ARGBTOUVJROW_AVX2 #ifdef HAS_ARGBTOUVJROW_SSSE3 -void ARGBToUVJRow_SSSE3(const uint8_t* src_argb0, +void ARGBToUVJRow_SSSE3(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1602,7 +1817,7 @@ void ARGBToUVJRow_SSSE3(const uint8_t* src_argb0, "lea 0x8(%1),%1 \n" "sub $0x10,%3 \n" "jg 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(dst_u), // %1 "+r"(dst_v), // %2 "+rm"(width) // %3 @@ -1689,7 +1904,7 @@ void BGRAToYRow_SSSE3(const uint8_t* src_bgra, uint8_t* dst_y, int width) { "xmm7"); } -void BGRAToUVRow_SSSE3(const uint8_t* src_bgra0, +void BGRAToUVRow_SSSE3(const uint8_t* src_bgra, int src_stride_bgra, uint8_t* dst_u, uint8_t* dst_v, @@ -1741,7 +1956,7 @@ void BGRAToUVRow_SSSE3(const uint8_t* src_bgra0, "lea 0x8(%1),%1 \n" "sub $0x10,%3 \n" "jg 1b \n" - : "+r"(src_bgra0), // %0 + : "+r"(src_bgra), // %0 "+r"(dst_u), // %1 "+r"(dst_v), // %2 "+rm"(width) // %3 @@ -1786,7 +2001,7 @@ void RGBAToYRow_SSSE3(const uint8_t* src_rgba, uint8_t* dst_y, int width) { "xmm7"); } -void ABGRToUVRow_SSSE3(const uint8_t* src_abgr0, +void ABGRToUVRow_SSSE3(const uint8_t* src_abgr, int src_stride_abgr, uint8_t* dst_u, uint8_t* dst_v, @@ -1838,7 +2053,7 @@ void ABGRToUVRow_SSSE3(const uint8_t* src_abgr0, "lea 0x8(%1),%1 \n" "sub $0x10,%3 \n" "jg 1b \n" - : "+r"(src_abgr0), // %0 + : "+r"(src_abgr), // %0 "+r"(dst_u), // %1 "+r"(dst_v), // %2 "+rm"(width) // %3 @@ -1849,7 +2064,7 @@ void ABGRToUVRow_SSSE3(const uint8_t* src_abgr0, : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm6", "xmm7"); } -void RGBAToUVRow_SSSE3(const uint8_t* src_rgba0, +void RGBAToUVRow_SSSE3(const uint8_t* src_rgba, int src_stride_rgba, uint8_t* dst_u, uint8_t* dst_v, @@ -1901,7 +2116,7 @@ void RGBAToUVRow_SSSE3(const uint8_t* src_rgba0, "lea 0x8(%1),%1 \n" "sub $0x10,%3 \n" "jg 1b \n" - : "+r"(src_rgba0), // %0 + : "+r"(src_rgba), // %0 "+r"(dst_u), // %1 "+r"(dst_v), // %2 "+rm"(width) // %3 @@ -1916,21 +2131,21 @@ void RGBAToUVRow_SSSE3(const uint8_t* src_rgba0, // Read 8 UV from 444 #define READYUV444 \ - "movq (%[u_buf]),%%xmm0 \n" \ + "movq (%[u_buf]),%%xmm3 \n" \ "movq 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ "lea 0x8(%[u_buf]),%[u_buf] \n" \ - "punpcklbw %%xmm1,%%xmm0 \n" \ + "punpcklbw %%xmm1,%%xmm3 \n" \ "movq (%[y_buf]),%%xmm4 \n" \ "punpcklbw %%xmm4,%%xmm4 \n" \ "lea 0x8(%[y_buf]),%[y_buf] \n" // Read 4 UV from 422, upsample to 8 UV #define READYUV422 \ - "movd (%[u_buf]),%%xmm0 \n" \ + "movd (%[u_buf]),%%xmm3 \n" \ "movd 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ "lea 0x4(%[u_buf]),%[u_buf] \n" \ - "punpcklbw %%xmm1,%%xmm0 \n" \ - "punpcklwd %%xmm0,%%xmm0 \n" \ + "punpcklbw %%xmm1,%%xmm3 \n" \ + "punpcklwd %%xmm3,%%xmm3 \n" \ "movq (%[y_buf]),%%xmm4 \n" \ "punpcklbw %%xmm4,%%xmm4 \n" \ "lea 0x8(%[y_buf]),%[y_buf] \n" @@ -1940,24 +2155,99 @@ void RGBAToUVRow_SSSE3(const uint8_t* src_rgba0, // TODO(fbarchard): Consider pmulhuw to replace psraw // TODO(fbarchard): Consider pmullw to replace psllw and allow different bits. #define READYUV210 \ - "movq (%[u_buf]),%%xmm0 \n" \ + "movq (%[u_buf]),%%xmm3 \n" \ "movq 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ "lea 0x8(%[u_buf]),%[u_buf] \n" \ - "punpcklwd %%xmm1,%%xmm0 \n" \ - "psraw $0x2,%%xmm0 \n" \ - "packuswb %%xmm0,%%xmm0 \n" \ - "punpcklwd %%xmm0,%%xmm0 \n" \ + "punpcklwd %%xmm1,%%xmm3 \n" \ + "psraw $2,%%xmm3 \n" \ + "packuswb %%xmm3,%%xmm3 \n" \ + "punpcklwd %%xmm3,%%xmm3 \n" \ + "movdqu (%[y_buf]),%%xmm4 \n" \ + "psllw $6,%%xmm4 \n" \ + "lea 0x10(%[y_buf]),%[y_buf] \n" + +#define READYUVA210 \ + "movq (%[u_buf]),%%xmm3 \n" \ + "movq 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ + "lea 0x8(%[u_buf]),%[u_buf] \n" \ + "punpcklwd %%xmm1,%%xmm3 \n" \ + "psraw $2,%%xmm3 \n" \ + "packuswb %%xmm3,%%xmm3 \n" \ + "punpcklwd %%xmm3,%%xmm3 \n" \ + "movdqu (%[y_buf]),%%xmm4 \n" \ + "psllw $6,%%xmm4 \n" \ + "lea 0x10(%[y_buf]),%[y_buf] \n" \ + "movdqu (%[a_buf]),%%xmm5 \n" \ + "psraw $2,%%xmm5 \n" \ + "packuswb %%xmm5,%%xmm5 \n" \ + "lea 0x10(%[a_buf]),%[a_buf] \n" + +// Read 8 UV from 444 10 bit +#define READYUV410 \ + "movdqu (%[u_buf]),%%xmm3 \n" \ + "movdqu 0x00(%[u_buf],%[v_buf],1),%%xmm2 \n" \ + "lea 0x10(%[u_buf]),%[u_buf] \n" \ + "psraw $2,%%xmm3 \n" \ + "psraw $2,%%xmm2 \n" \ + "movdqa %%xmm3,%%xmm1 \n" \ + "punpcklwd %%xmm2,%%xmm3 \n" \ + "punpckhwd %%xmm2,%%xmm1 \n" \ + "packuswb %%xmm1,%%xmm3 \n" \ + "movdqu (%[y_buf]),%%xmm4 \n" \ + "psllw $6,%%xmm4 \n" \ + "lea 0x10(%[y_buf]),%[y_buf] \n" + +// Read 8 UV from 444 10 bit. With 8 Alpha. +#define READYUVA410 \ + "movdqu (%[u_buf]),%%xmm3 \n" \ + "movdqu 0x00(%[u_buf],%[v_buf],1),%%xmm2 \n" \ + "lea 0x10(%[u_buf]),%[u_buf] \n" \ + "psraw $2,%%xmm3 \n" \ + "psraw $2,%%xmm2 \n" \ + "movdqa %%xmm3,%%xmm1 \n" \ + "punpcklwd %%xmm2,%%xmm3 \n" \ + "punpckhwd %%xmm2,%%xmm1 \n" \ + "packuswb %%xmm1,%%xmm3 \n" \ "movdqu (%[y_buf]),%%xmm4 \n" \ "psllw $0x6,%%xmm4 \n" \ + "lea 0x10(%[y_buf]),%[y_buf] \n" \ + "movdqu (%[a_buf]),%%xmm5 \n" \ + "psraw $2,%%xmm5 \n" \ + "packuswb %%xmm5,%%xmm5 \n" \ + "lea 0x10(%[a_buf]),%[a_buf] \n" + +// Read 4 UV from 422 12 bit, upsample to 8 UV +#define READYUV212 \ + "movq (%[u_buf]),%%xmm3 \n" \ + "movq 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ + "lea 0x8(%[u_buf]),%[u_buf] \n" \ + "punpcklwd %%xmm1,%%xmm3 \n" \ + "psraw $0x4,%%xmm3 \n" \ + "packuswb %%xmm3,%%xmm3 \n" \ + "punpcklwd %%xmm3,%%xmm3 \n" \ + "movdqu (%[y_buf]),%%xmm4 \n" \ + "psllw $0x4,%%xmm4 \n" \ "lea 0x10(%[y_buf]),%[y_buf] \n" // Read 4 UV from 422, upsample to 8 UV. With 8 Alpha. #define READYUVA422 \ - "movd (%[u_buf]),%%xmm0 \n" \ + "movd (%[u_buf]),%%xmm3 \n" \ "movd 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ "lea 0x4(%[u_buf]),%[u_buf] \n" \ - "punpcklbw %%xmm1,%%xmm0 \n" \ - "punpcklwd %%xmm0,%%xmm0 \n" \ + "punpcklbw %%xmm1,%%xmm3 \n" \ + "punpcklwd %%xmm3,%%xmm3 \n" \ + "movq (%[y_buf]),%%xmm4 \n" \ + "punpcklbw %%xmm4,%%xmm4 \n" \ + "lea 0x8(%[y_buf]),%[y_buf] \n" \ + "movq (%[a_buf]),%%xmm5 \n" \ + "lea 0x8(%[a_buf]),%[a_buf] \n" + +// Read 8 UV from 444. With 8 Alpha. +#define READYUVA444 \ + "movq (%[u_buf]),%%xmm3 \n" \ + "movq 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ + "lea 0x8(%[u_buf]),%[u_buf] \n" \ + "punpcklbw %%xmm1,%%xmm3 \n" \ "movq (%[y_buf]),%%xmm4 \n" \ "punpcklbw %%xmm4,%%xmm4 \n" \ "lea 0x8(%[y_buf]),%[y_buf] \n" \ @@ -1966,18 +2256,18 @@ void RGBAToUVRow_SSSE3(const uint8_t* src_rgba0, // Read 4 UV from NV12, upsample to 8 UV #define READNV12 \ - "movq (%[uv_buf]),%%xmm0 \n" \ + "movq (%[uv_buf]),%%xmm3 \n" \ "lea 0x8(%[uv_buf]),%[uv_buf] \n" \ - "punpcklwd %%xmm0,%%xmm0 \n" \ + "punpcklwd %%xmm3,%%xmm3 \n" \ "movq (%[y_buf]),%%xmm4 \n" \ "punpcklbw %%xmm4,%%xmm4 \n" \ "lea 0x8(%[y_buf]),%[y_buf] \n" // Read 4 VU from NV21, upsample to 8 UV #define READNV21 \ - "movq (%[vu_buf]),%%xmm0 \n" \ + "movq (%[vu_buf]),%%xmm3 \n" \ "lea 0x8(%[vu_buf]),%[vu_buf] \n" \ - "pshufb %[kShuffleNV21], %%xmm0 \n" \ + "pshufb %[kShuffleNV21], %%xmm3 \n" \ "movq (%[y_buf]),%%xmm4 \n" \ "punpcklbw %%xmm4,%%xmm4 \n" \ "lea 0x8(%[y_buf]),%[y_buf] \n" @@ -1986,68 +2276,92 @@ void RGBAToUVRow_SSSE3(const uint8_t* src_rgba0, #define READYUY2 \ "movdqu (%[yuy2_buf]),%%xmm4 \n" \ "pshufb %[kShuffleYUY2Y], %%xmm4 \n" \ - "movdqu (%[yuy2_buf]),%%xmm0 \n" \ - "pshufb %[kShuffleYUY2UV], %%xmm0 \n" \ + "movdqu (%[yuy2_buf]),%%xmm3 \n" \ + "pshufb %[kShuffleYUY2UV], %%xmm3 \n" \ "lea 0x10(%[yuy2_buf]),%[yuy2_buf] \n" // Read 4 UYVY with 8 Y and update 4 UV to 8 UV. #define READUYVY \ "movdqu (%[uyvy_buf]),%%xmm4 \n" \ "pshufb %[kShuffleUYVYY], %%xmm4 \n" \ - "movdqu (%[uyvy_buf]),%%xmm0 \n" \ - "pshufb %[kShuffleUYVYUV], %%xmm0 \n" \ + "movdqu (%[uyvy_buf]),%%xmm3 \n" \ + "pshufb %[kShuffleUYVYUV], %%xmm3 \n" \ "lea 0x10(%[uyvy_buf]),%[uyvy_buf] \n" +// Read 4 UV from P210, upsample to 8 UV +#define READP210 \ + "movdqu (%[uv_buf]),%%xmm3 \n" \ + "lea 0x10(%[uv_buf]),%[uv_buf] \n" \ + "psrlw $0x8,%%xmm3 \n" \ + "packuswb %%xmm3,%%xmm3 \n" \ + "punpcklwd %%xmm3,%%xmm3 \n" \ + "movdqu (%[y_buf]),%%xmm4 \n" \ + "lea 0x10(%[y_buf]),%[y_buf] \n" + +// Read 8 UV from P410 +#define READP410 \ + "movdqu (%[uv_buf]),%%xmm3 \n" \ + "movdqu 0x10(%[uv_buf]),%%xmm1 \n" \ + "lea 0x20(%[uv_buf]),%[uv_buf] \n" \ + "psrlw $0x8,%%xmm3 \n" \ + "psrlw $0x8,%%xmm1 \n" \ + "packuswb %%xmm1,%%xmm3 \n" \ + "movdqu (%[y_buf]),%%xmm4 \n" \ + "lea 0x10(%[y_buf]),%[y_buf] \n" + #if defined(__x86_64__) #define YUVTORGB_SETUP(yuvconstants) \ + "pcmpeqb %%xmm13,%%xmm13 \n" \ "movdqa (%[yuvconstants]),%%xmm8 \n" \ + "pxor %%xmm12,%%xmm12 \n" \ "movdqa 32(%[yuvconstants]),%%xmm9 \n" \ + "psllw $7,%%xmm13 \n" \ "movdqa 64(%[yuvconstants]),%%xmm10 \n" \ + "pshufb %%xmm12,%%xmm13 \n" \ "movdqa 96(%[yuvconstants]),%%xmm11 \n" \ - "movdqa 128(%[yuvconstants]),%%xmm12 \n" \ - "movdqa 160(%[yuvconstants]),%%xmm13 \n" \ - "movdqa 192(%[yuvconstants]),%%xmm14 \n" + "movdqa 128(%[yuvconstants]),%%xmm12 \n" + // Convert 8 pixels: 8 UV and 8 Y #define YUVTORGB16(yuvconstants) \ - "movdqa %%xmm0,%%xmm1 \n" \ - "movdqa %%xmm0,%%xmm2 \n" \ - "movdqa %%xmm0,%%xmm3 \n" \ - "movdqa %%xmm11,%%xmm0 \n" \ - "pmaddubsw %%xmm8,%%xmm1 \n" \ - "psubw %%xmm1,%%xmm0 \n" \ - "movdqa %%xmm12,%%xmm1 \n" \ - "pmaddubsw %%xmm9,%%xmm2 \n" \ - "psubw %%xmm2,%%xmm1 \n" \ - "movdqa %%xmm13,%%xmm2 \n" \ - "pmaddubsw %%xmm10,%%xmm3 \n" \ - "psubw %%xmm3,%%xmm2 \n" \ - "pmulhuw %%xmm14,%%xmm4 \n" \ + "psubb %%xmm13,%%xmm3 \n" \ + "pmulhuw %%xmm11,%%xmm4 \n" \ + "movdqa %%xmm8,%%xmm0 \n" \ + "movdqa %%xmm9,%%xmm1 \n" \ + "movdqa %%xmm10,%%xmm2 \n" \ + "paddw %%xmm12,%%xmm4 \n" \ + "pmaddubsw %%xmm3,%%xmm0 \n" \ + "pmaddubsw %%xmm3,%%xmm1 \n" \ + "pmaddubsw %%xmm3,%%xmm2 \n" \ "paddsw %%xmm4,%%xmm0 \n" \ - "paddsw %%xmm4,%%xmm1 \n" \ - "paddsw %%xmm4,%%xmm2 \n" -#define YUVTORGB_REGS \ - "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", + "paddsw %%xmm4,%%xmm2 \n" \ + "psubsw %%xmm1,%%xmm4 \n" \ + "movdqa %%xmm4,%%xmm1 \n" + +#define YUVTORGB_REGS "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", #else #define YUVTORGB_SETUP(yuvconstants) // Convert 8 pixels: 8 UV and 8 Y #define YUVTORGB16(yuvconstants) \ - "movdqa %%xmm0,%%xmm1 \n" \ - "movdqa %%xmm0,%%xmm2 \n" \ - "movdqa %%xmm0,%%xmm3 \n" \ - "movdqa 96(%[yuvconstants]),%%xmm0 \n" \ - "pmaddubsw (%[yuvconstants]),%%xmm1 \n" \ - "psubw %%xmm1,%%xmm0 \n" \ - "movdqa 128(%[yuvconstants]),%%xmm1 \n" \ - "pmaddubsw 32(%[yuvconstants]),%%xmm2 \n" \ - "psubw %%xmm2,%%xmm1 \n" \ - "movdqa 160(%[yuvconstants]),%%xmm2 \n" \ - "pmaddubsw 64(%[yuvconstants]),%%xmm3 \n" \ - "psubw %%xmm3,%%xmm2 \n" \ - "pmulhuw 192(%[yuvconstants]),%%xmm4 \n" \ + "pcmpeqb %%xmm0,%%xmm0 \n" \ + "pxor %%xmm1,%%xmm1 \n" \ + "psllw $7,%%xmm0 \n" \ + "pshufb %%xmm1,%%xmm0 \n" \ + "psubb %%xmm0,%%xmm3 \n" \ + "pmulhuw 96(%[yuvconstants]),%%xmm4 \n" \ + "movdqa (%[yuvconstants]),%%xmm0 \n" \ + "movdqa 32(%[yuvconstants]),%%xmm1 \n" \ + "movdqa 64(%[yuvconstants]),%%xmm2 \n" \ + "pmaddubsw %%xmm3,%%xmm0 \n" \ + "pmaddubsw %%xmm3,%%xmm1 \n" \ + "pmaddubsw %%xmm3,%%xmm2 \n" \ + "movdqa 128(%[yuvconstants]),%%xmm3 \n" \ + "paddw %%xmm3,%%xmm4 \n" \ "paddsw %%xmm4,%%xmm0 \n" \ - "paddsw %%xmm4,%%xmm1 \n" \ - "paddsw %%xmm4,%%xmm2 \n" + "paddsw %%xmm4,%%xmm2 \n" \ + "psubsw %%xmm1,%%xmm4 \n" \ + "movdqa %%xmm4,%%xmm1 \n" + #define YUVTORGB_REGS #endif @@ -2138,6 +2452,44 @@ void OMITFP I444ToARGBRow_SSSE3(const uint8_t* y_buf, ); } +#ifdef HAS_I444ALPHATOARGBROW_SSSE3 +void OMITFP I444AlphaToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + // clang-format off + asm volatile ( + YUVTORGB_SETUP(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + + LABELALIGN + "1: \n" + READYUVA444 + YUVTORGB(yuvconstants) + STOREARGB + "subl $0x8,%[width] \n" + "jg 1b \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [a_buf]"+r"(a_buf), // %[a_buf] + [dst_argb]"+r"(dst_argb), // %[dst_argb] +#if defined(__i386__) + [width]"+m"(width) // %[width] +#else + [width]"+rm"(width) // %[width] +#endif + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + ); + // clang-format on +} +#endif // HAS_I444ALPHATOARGBROW_SSSE3 + void OMITFP I422ToRGB24Row_SSSE3(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2225,8 +2577,8 @@ void OMITFP I422ToAR30Row_SSSE3(const uint8_t* y_buf, "pcmpeqb %%xmm5,%%xmm5 \n" // AR30 constants "psrlw $14,%%xmm5 \n" "psllw $4,%%xmm5 \n" // 2 alpha bits - "pxor %%xmm6,%%xmm6 \n" - "pcmpeqb %%xmm7,%%xmm7 \n" // 0 for min + "pxor %%xmm6,%%xmm6 \n" // 0 for min + "pcmpeqb %%xmm7,%%xmm7 \n" "psrlw $6,%%xmm7 \n" // 1023 for max LABELALIGN @@ -2277,6 +2629,36 @@ void OMITFP I210ToARGBRow_SSSE3(const uint16_t* y_buf, ); } +// 12 bit YUV to ARGB +void OMITFP I212ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + "pcmpeqb %%xmm5,%%xmm5 \n" + + LABELALIGN + "1: \n" + READYUV212 + YUVTORGB(yuvconstants) + STOREARGB + "sub $0x8,%[width] \n" + "jg 1b \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [dst_argb]"+r"(dst_argb), // %[dst_argb] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + ); +} + // 10 bit YUV to AR30 void OMITFP I210ToAR30Row_SSSE3(const uint16_t* y_buf, const uint16_t* u_buf, @@ -2290,8 +2672,8 @@ void OMITFP I210ToAR30Row_SSSE3(const uint16_t* y_buf, "pcmpeqb %%xmm5,%%xmm5 \n" "psrlw $14,%%xmm5 \n" "psllw $4,%%xmm5 \n" // 2 alpha bits - "pxor %%xmm6,%%xmm6 \n" - "pcmpeqb %%xmm7,%%xmm7 \n" // 0 for min + "pxor %%xmm6,%%xmm6 \n" // 0 for min + "pcmpeqb %%xmm7,%%xmm7 \n" "psrlw $6,%%xmm7 \n" // 1023 for max LABELALIGN @@ -2312,6 +2694,176 @@ void OMITFP I210ToAR30Row_SSSE3(const uint16_t* y_buf, ); } +// 12 bit YUV to AR30 +void OMITFP I212ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + "pcmpeqb %%xmm5,%%xmm5 \n" + "psrlw $14,%%xmm5 \n" + "psllw $4,%%xmm5 \n" // 2 alpha bits + "pxor %%xmm6,%%xmm6 \n" // 0 for min + "pcmpeqb %%xmm7,%%xmm7 \n" + "psrlw $6,%%xmm7 \n" // 1023 for max + + LABELALIGN + "1: \n" + READYUV212 + YUVTORGB16(yuvconstants) + STOREAR30 + "sub $0x8,%[width] \n" + "jg 1b \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [dst_ar30]"+r"(dst_ar30), // %[dst_ar30] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" + ); +} + +// 10 bit YUV to ARGB +void OMITFP I410ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + "pcmpeqb %%xmm5,%%xmm5 \n" + + LABELALIGN + "1: \n" + READYUV410 + YUVTORGB(yuvconstants) + STOREARGB + "sub $0x8,%[width] \n" + "jg 1b \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [dst_argb]"+r"(dst_argb), // %[dst_argb] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + ); +} + +#ifdef HAS_I210ALPHATOARGBROW_SSSE3 +// 10 bit YUVA to ARGB +void OMITFP I210AlphaToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile( + YUVTORGB_SETUP( + yuvconstants) "sub %[u_buf],%[v_buf] \n" + + LABELALIGN "1: \n" READYUVA210 + YUVTORGB(yuvconstants) STOREARGB + "subl $0x8,%[width] \n" + "jg 1b \n" + : [y_buf] "+r"(y_buf), // %[y_buf] + [u_buf] "+r"(u_buf), // %[u_buf] + [v_buf] "+r"(v_buf), // %[v_buf] + [a_buf] "+r"(a_buf), + [dst_argb] "+r"(dst_argb), // %[dst_argb] +#if defined(__i386__) + [width] "+m"(width) // %[width] +#else + [width] "+rm"(width) // %[width] +#endif + : [yuvconstants] "r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", + "xmm5"); +} +#endif + +#ifdef HAS_I410ALPHATOARGBROW_SSSE3 +// 10 bit YUVA to ARGB +void OMITFP I410AlphaToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + // clang-format off + asm volatile( + YUVTORGB_SETUP(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + + LABELALIGN + "1: \n" + READYUVA410 + YUVTORGB(yuvconstants) + STOREARGB + "subl $0x8,%[width] \n" + "jg 1b \n" + : [y_buf] "+r"(y_buf), // %[y_buf] + [u_buf] "+r"(u_buf), // %[u_buf] + [v_buf] "+r"(v_buf), // %[v_buf] + [a_buf] "+r"(a_buf), + [dst_argb] "+r"(dst_argb), // %[dst_argb] +#if defined(__i386__) + [width] "+m"(width) // %[width] +#else + [width] "+rm"(width) // %[width] +#endif + : [yuvconstants] "r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", + "xmm5"); + // clang-format on +} +#endif + +// 10 bit YUV to AR30 +void OMITFP I410ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + "pcmpeqb %%xmm5,%%xmm5 \n" + "psrlw $14,%%xmm5 \n" + "psllw $4,%%xmm5 \n" // 2 alpha bits + "pxor %%xmm6,%%xmm6 \n" // 0 for min + "pcmpeqb %%xmm7,%%xmm7 \n" + "psrlw $6,%%xmm7 \n" // 1023 for max + + LABELALIGN + "1: \n" + READYUV410 + YUVTORGB16(yuvconstants) + STOREAR30 + "sub $0x8,%[width] \n" + "jg 1b \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [dst_ar30]"+r"(dst_ar30), // %[dst_ar30] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" + ); +} + #ifdef HAS_I422ALPHATOARGBROW_SSSE3 void OMITFP I422AlphaToARGBRow_SSSE3(const uint8_t* y_buf, const uint8_t* u_buf, @@ -2463,6 +3015,112 @@ void OMITFP UYVYToARGBRow_SSSE3(const uint8_t* uyvy_buf, // clang-format on } +void OMITFP P210ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile( + YUVTORGB_SETUP( + yuvconstants) "pcmpeqb %%xmm5,%%xmm5 \n" + + LABELALIGN "1: \n" READP210 + YUVTORGB(yuvconstants) STOREARGB + "sub $0x8,%[width] \n" + "jg 1b \n" + : [y_buf] "+r"(y_buf), // %[y_buf] + [uv_buf] "+r"(uv_buf), // %[u_buf] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+rm"(width) // %[width] + : [yuvconstants] "r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", + "xmm5"); +} + +void OMITFP P410ToARGBRow_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile( + YUVTORGB_SETUP( + yuvconstants) "pcmpeqb %%xmm5,%%xmm5 \n" + + LABELALIGN "1: \n" READP410 + YUVTORGB(yuvconstants) STOREARGB + "sub $0x8,%[width] \n" + "jg 1b \n" + : [y_buf] "+r"(y_buf), // %[y_buf] + [uv_buf] "+r"(uv_buf), // %[u_buf] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+rm"(width) // %[width] + : [yuvconstants] "r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", + "xmm5"); +} + +void OMITFP P210ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP(yuvconstants) + "pcmpeqb %%xmm5,%%xmm5 \n" + "psrlw $14,%%xmm5 \n" + "psllw $4,%%xmm5 \n" // 2 alpha bits + "pxor %%xmm6,%%xmm6 \n" // 0 for min + "pcmpeqb %%xmm7,%%xmm7 \n" + "psrlw $6,%%xmm7 \n" // 1023 for max + + LABELALIGN + "1: \n" + READP210 + YUVTORGB16(yuvconstants) + STOREAR30 + "sub $0x8,%[width] \n" + "jg 1b \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [uv_buf]"+r"(uv_buf), // %[uv_buf] + [dst_ar30]"+r"(dst_ar30), // %[dst_ar30] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" + ); +} + +void OMITFP P410ToAR30Row_SSSE3(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP(yuvconstants) + "pcmpeqb %%xmm5,%%xmm5 \n" + "psrlw $14,%%xmm5 \n" + "psllw $4,%%xmm5 \n" // 2 alpha bits + "pxor %%xmm6,%%xmm6 \n" // 0 for min + "pcmpeqb %%xmm7,%%xmm7 \n" + "psrlw $6,%%xmm7 \n" // 1023 for max + + LABELALIGN + "1: \n" + READP410 + YUVTORGB16(yuvconstants) + STOREAR30 + "sub $0x8,%[width] \n" + "jg 1b \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [uv_buf]"+r"(uv_buf), // %[uv_buf] + [dst_ar30]"+r"(dst_ar30), // %[dst_ar30] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" + ); +} + void OMITFP I422ToRGBARow_SSSE3(const uint8_t* y_buf, const uint8_t* u_buf, const uint8_t* v_buf, @@ -2496,12 +3154,12 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8_t* y_buf, // Read 16 UV from 444 #define READYUV444_AVX2 \ - "vmovdqu (%[u_buf]),%%xmm0 \n" \ + "vmovdqu (%[u_buf]),%%xmm3 \n" \ "vmovdqu 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ "lea 0x10(%[u_buf]),%[u_buf] \n" \ - "vpermq $0xd8,%%ymm0,%%ymm0 \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ "vpermq $0xd8,%%ymm1,%%ymm1 \n" \ - "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n" \ + "vpunpcklbw %%ymm1,%%ymm3,%%ymm3 \n" \ "vmovdqu (%[y_buf]),%%xmm4 \n" \ "vpermq $0xd8,%%ymm4,%%ymm4 \n" \ "vpunpcklbw %%ymm4,%%ymm4,%%ymm4 \n" \ @@ -2509,42 +3167,124 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8_t* y_buf, // Read 8 UV from 422, upsample to 16 UV. #define READYUV422_AVX2 \ - "vmovq (%[u_buf]),%%xmm0 \n" \ + "vmovq (%[u_buf]),%%xmm3 \n" \ "vmovq 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ "lea 0x8(%[u_buf]),%[u_buf] \n" \ - "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n" \ - "vpermq $0xd8,%%ymm0,%%ymm0 \n" \ - "vpunpcklwd %%ymm0,%%ymm0,%%ymm0 \n" \ + "vpunpcklbw %%ymm1,%%ymm3,%%ymm3 \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ + "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n" \ "vmovdqu (%[y_buf]),%%xmm4 \n" \ "vpermq $0xd8,%%ymm4,%%ymm4 \n" \ "vpunpcklbw %%ymm4,%%ymm4,%%ymm4 \n" \ "lea 0x10(%[y_buf]),%[y_buf] \n" -// Read 8 UV from 210 10 bit, upsample to 16 UV +// Read 8 UV from 210, upsample to 16 UV // TODO(fbarchard): Consider vshufb to replace pack/unpack // TODO(fbarchard): Consider vunpcklpd to combine the 2 registers into 1. #define READYUV210_AVX2 \ - "vmovdqu (%[u_buf]),%%xmm0 \n" \ + "vmovdqu (%[u_buf]),%%xmm3 \n" \ "vmovdqu 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ "lea 0x10(%[u_buf]),%[u_buf] \n" \ - "vpermq $0xd8,%%ymm0,%%ymm0 \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ "vpermq $0xd8,%%ymm1,%%ymm1 \n" \ - "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" \ - "vpsraw $0x2,%%ymm0,%%ymm0 \n" \ - "vpackuswb %%ymm0,%%ymm0,%%ymm0 \n" \ - "vpunpcklwd %%ymm0,%%ymm0,%%ymm0 \n" \ + "vpunpcklwd %%ymm1,%%ymm3,%%ymm3 \n" \ + "vpsraw $2,%%ymm3,%%ymm3 \n" \ + "vpackuswb %%ymm3,%%ymm3,%%ymm3 \n" \ + "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n" \ "vmovdqu (%[y_buf]),%%ymm4 \n" \ - "vpsllw $0x6,%%ymm4,%%ymm4 \n" \ + "vpsllw $6,%%ymm4,%%ymm4 \n" \ "lea 0x20(%[y_buf]),%[y_buf] \n" +// Read 8 UV from 210, upsample to 16 UV. With 16 Alpha. +#define READYUVA210_AVX2 \ + "vmovdqu (%[u_buf]),%%xmm3 \n" \ + "vmovdqu 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ + "lea 0x10(%[u_buf]),%[u_buf] \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ + "vpermq $0xd8,%%ymm1,%%ymm1 \n" \ + "vpunpcklwd %%ymm1,%%ymm3,%%ymm3 \n" \ + "vpsraw $2,%%ymm3,%%ymm3 \n" \ + "vpackuswb %%ymm3,%%ymm3,%%ymm3 \n" \ + "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n" \ + "vmovdqu (%[y_buf]),%%ymm4 \n" \ + "vpsllw $6,%%ymm4,%%ymm4 \n" \ + "lea 0x20(%[y_buf]),%[y_buf] \n" \ + "vmovdqu (%[a_buf]),%%ymm5 \n" \ + "vpsraw $2,%%ymm5,%%ymm5 \n" \ + "vpackuswb %%ymm5,%%ymm5,%%ymm5 \n" \ + "lea 0x20(%[a_buf]),%[a_buf] \n" + +// Read 16 UV from 410 +#define READYUV410_AVX2 \ + "vmovdqu (%[u_buf]),%%ymm3 \n" \ + "vmovdqu 0x00(%[u_buf],%[v_buf],1),%%ymm2 \n" \ + "lea 0x20(%[u_buf]),%[u_buf] \n" \ + "vpsraw $2,%%ymm3,%%ymm3 \n" \ + "vpsraw $2,%%ymm2,%%ymm2 \n" \ + "vpunpckhwd %%ymm2,%%ymm3,%%ymm1 \n" \ + "vpunpcklwd %%ymm2,%%ymm3,%%ymm3 \n" \ + "vpackuswb %%ymm1,%%ymm3,%%ymm3 \n" \ + "vmovdqu (%[y_buf]),%%ymm4 \n" \ + "vpsllw $6,%%ymm4,%%ymm4 \n" \ + "lea 0x20(%[y_buf]),%[y_buf] \n" + +// Read 8 UV from 212 12 bit, upsample to 16 UV +#define READYUV212_AVX2 \ + "vmovdqu (%[u_buf]),%%xmm3 \n" \ + "vmovdqu 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ + "lea 0x10(%[u_buf]),%[u_buf] \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ + "vpermq $0xd8,%%ymm1,%%ymm1 \n" \ + "vpunpcklwd %%ymm1,%%ymm3,%%ymm3 \n" \ + "vpsraw $0x4,%%ymm3,%%ymm3 \n" \ + "vpackuswb %%ymm3,%%ymm3,%%ymm3 \n" \ + "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n" \ + "vmovdqu (%[y_buf]),%%ymm4 \n" \ + "vpsllw $0x4,%%ymm4,%%ymm4 \n" \ + "lea 0x20(%[y_buf]),%[y_buf] \n" + +// Read 16 UV from 410. With 16 Alpha. +#define READYUVA410_AVX2 \ + "vmovdqu (%[u_buf]),%%ymm3 \n" \ + "vmovdqu 0x00(%[u_buf],%[v_buf],1),%%ymm2 \n" \ + "lea 0x20(%[u_buf]),%[u_buf] \n" \ + "vpsraw $2,%%ymm3,%%ymm3 \n" \ + "vpsraw $2,%%ymm2,%%ymm2 \n" \ + "vpunpckhwd %%ymm2,%%ymm3,%%ymm1 \n" \ + "vpunpcklwd %%ymm2,%%ymm3,%%ymm3 \n" \ + "vpackuswb %%ymm1,%%ymm3,%%ymm3 \n" \ + "vmovdqu (%[y_buf]),%%ymm4 \n" \ + "vpsllw $6,%%ymm4,%%ymm4 \n" \ + "lea 0x20(%[y_buf]),%[y_buf] \n" \ + "vmovdqu (%[a_buf]),%%ymm5 \n" \ + "vpsraw $2,%%ymm5,%%ymm5 \n" \ + "vpackuswb %%ymm5,%%ymm5,%%ymm5 \n" \ + "lea 0x20(%[a_buf]),%[a_buf] \n" + +// Read 16 UV from 444. With 16 Alpha. +#define READYUVA444_AVX2 \ + "vmovdqu (%[u_buf]),%%xmm3 \n" \ + "vmovdqu 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ + "lea 0x10(%[u_buf]),%[u_buf] \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ + "vpermq $0xd8,%%ymm1,%%ymm1 \n" \ + "vpunpcklbw %%ymm1,%%ymm3,%%ymm3 \n" \ + "vmovdqu (%[y_buf]),%%xmm4 \n" \ + "vpermq $0xd8,%%ymm4,%%ymm4 \n" \ + "vpunpcklbw %%ymm4,%%ymm4,%%ymm4 \n" \ + "lea 0x10(%[y_buf]),%[y_buf] \n" \ + "vmovdqu (%[a_buf]),%%xmm5 \n" \ + "vpermq $0xd8,%%ymm5,%%ymm5 \n" \ + "lea 0x10(%[a_buf]),%[a_buf] \n" + // Read 8 UV from 422, upsample to 16 UV. With 16 Alpha. #define READYUVA422_AVX2 \ - "vmovq (%[u_buf]),%%xmm0 \n" \ + "vmovq (%[u_buf]),%%xmm3 \n" \ "vmovq 0x00(%[u_buf],%[v_buf],1),%%xmm1 \n" \ "lea 0x8(%[u_buf]),%[u_buf] \n" \ - "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n" \ - "vpermq $0xd8,%%ymm0,%%ymm0 \n" \ - "vpunpcklwd %%ymm0,%%ymm0,%%ymm0 \n" \ + "vpunpcklbw %%ymm1,%%ymm3,%%ymm3 \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ + "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n" \ "vmovdqu (%[y_buf]),%%xmm4 \n" \ "vpermq $0xd8,%%ymm4,%%ymm4 \n" \ "vpunpcklbw %%ymm4,%%ymm4,%%ymm4 \n" \ @@ -2555,10 +3295,10 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8_t* y_buf, // Read 8 UV from NV12, upsample to 16 UV. #define READNV12_AVX2 \ - "vmovdqu (%[uv_buf]),%%xmm0 \n" \ + "vmovdqu (%[uv_buf]),%%xmm3 \n" \ "lea 0x10(%[uv_buf]),%[uv_buf] \n" \ - "vpermq $0xd8,%%ymm0,%%ymm0 \n" \ - "vpunpcklwd %%ymm0,%%ymm0,%%ymm0 \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ + "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n" \ "vmovdqu (%[y_buf]),%%xmm4 \n" \ "vpermq $0xd8,%%ymm4,%%ymm4 \n" \ "vpunpcklbw %%ymm4,%%ymm4,%%ymm4 \n" \ @@ -2566,73 +3306,98 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8_t* y_buf, // Read 8 VU from NV21, upsample to 16 UV. #define READNV21_AVX2 \ - "vmovdqu (%[vu_buf]),%%xmm0 \n" \ + "vmovdqu (%[vu_buf]),%%xmm3 \n" \ "lea 0x10(%[vu_buf]),%[vu_buf] \n" \ - "vpermq $0xd8,%%ymm0,%%ymm0 \n" \ - "vpshufb %[kShuffleNV21], %%ymm0, %%ymm0 \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ + "vpshufb %[kShuffleNV21], %%ymm3, %%ymm3 \n" \ "vmovdqu (%[y_buf]),%%xmm4 \n" \ "vpermq $0xd8,%%ymm4,%%ymm4 \n" \ "vpunpcklbw %%ymm4,%%ymm4,%%ymm4 \n" \ "lea 0x10(%[y_buf]),%[y_buf] \n" +// Read 4 UV from P210, upsample to 8 UV +#define READP210_AVX2 \ + "vmovdqu (%[uv_buf]),%%ymm3 \n" \ + "lea 0x20(%[uv_buf]),%[uv_buf] \n" \ + "vpsrlw $0x8,%%ymm3,%%ymm3 \n" \ + "vpackuswb %%ymm3,%%ymm3,%%ymm3 \n" \ + "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n" \ + "vmovdqu (%[y_buf]),%%ymm4 \n" \ + "lea 0x20(%[y_buf]),%[y_buf] \n" + +// Read 8 UV from P410 +#define READP410_AVX2 \ + "vmovdqu (%[uv_buf]),%%ymm3 \n" \ + "vmovdqu 0x20(%[uv_buf]),%%ymm1 \n" \ + "lea 0x40(%[uv_buf]),%[uv_buf] \n" \ + "vpsrlw $0x8,%%ymm3,%%ymm3 \n" \ + "vpsrlw $0x8,%%ymm1,%%ymm1 \n" \ + "vpackuswb %%ymm1,%%ymm3,%%ymm3 \n" \ + "vpermq $0xd8,%%ymm3,%%ymm3 \n" \ + "vmovdqu (%[y_buf]),%%ymm4 \n" \ + "lea 0x20(%[y_buf]),%[y_buf] \n" + // Read 8 YUY2 with 16 Y and upsample 8 UV to 16 UV. #define READYUY2_AVX2 \ "vmovdqu (%[yuy2_buf]),%%ymm4 \n" \ "vpshufb %[kShuffleYUY2Y], %%ymm4, %%ymm4 \n" \ - "vmovdqu (%[yuy2_buf]),%%ymm0 \n" \ - "vpshufb %[kShuffleYUY2UV], %%ymm0, %%ymm0 \n" \ + "vmovdqu (%[yuy2_buf]),%%ymm3 \n" \ + "vpshufb %[kShuffleYUY2UV], %%ymm3, %%ymm3 \n" \ "lea 0x20(%[yuy2_buf]),%[yuy2_buf] \n" // Read 8 UYVY with 16 Y and upsample 8 UV to 16 UV. #define READUYVY_AVX2 \ "vmovdqu (%[uyvy_buf]),%%ymm4 \n" \ "vpshufb %[kShuffleUYVYY], %%ymm4, %%ymm4 \n" \ - "vmovdqu (%[uyvy_buf]),%%ymm0 \n" \ - "vpshufb %[kShuffleUYVYUV], %%ymm0, %%ymm0 \n" \ + "vmovdqu (%[uyvy_buf]),%%ymm3 \n" \ + "vpshufb %[kShuffleUYVYUV], %%ymm3, %%ymm3 \n" \ "lea 0x20(%[uyvy_buf]),%[uyvy_buf] \n" #if defined(__x86_64__) -#define YUVTORGB_SETUP_AVX2(yuvconstants) \ - "vmovdqa (%[yuvconstants]),%%ymm8 \n" \ - "vmovdqa 32(%[yuvconstants]),%%ymm9 \n" \ - "vmovdqa 64(%[yuvconstants]),%%ymm10 \n" \ - "vmovdqa 96(%[yuvconstants]),%%ymm11 \n" \ - "vmovdqa 128(%[yuvconstants]),%%ymm12 \n" \ - "vmovdqa 160(%[yuvconstants]),%%ymm13 \n" \ - "vmovdqa 192(%[yuvconstants]),%%ymm14 \n" +#define YUVTORGB_SETUP_AVX2(yuvconstants) \ + "vpcmpeqb %%xmm13,%%xmm13,%%xmm13 \n" \ + "vmovdqa (%[yuvconstants]),%%ymm8 \n" \ + "vpsllw $7,%%xmm13,%%xmm13 \n" \ + "vmovdqa 32(%[yuvconstants]),%%ymm9 \n" \ + "vpbroadcastb %%xmm13,%%ymm13 \n" \ + "vmovdqa 64(%[yuvconstants]),%%ymm10 \n" \ + "vmovdqa 96(%[yuvconstants]),%%ymm11 \n" \ + "vmovdqa 128(%[yuvconstants]),%%ymm12 \n" #define YUVTORGB16_AVX2(yuvconstants) \ - "vpmaddubsw %%ymm10,%%ymm0,%%ymm2 \n" \ - "vpmaddubsw %%ymm9,%%ymm0,%%ymm1 \n" \ - "vpmaddubsw %%ymm8,%%ymm0,%%ymm0 \n" \ - "vpsubw %%ymm2,%%ymm13,%%ymm2 \n" \ - "vpsubw %%ymm1,%%ymm12,%%ymm1 \n" \ - "vpsubw %%ymm0,%%ymm11,%%ymm0 \n" \ - "vpmulhuw %%ymm14,%%ymm4,%%ymm4 \n" \ + "vpsubb %%ymm13,%%ymm3,%%ymm3 \n" \ + "vpmulhuw %%ymm11,%%ymm4,%%ymm4 \n" \ + "vpmaddubsw %%ymm3,%%ymm8,%%ymm0 \n" \ + "vpmaddubsw %%ymm3,%%ymm9,%%ymm1 \n" \ + "vpmaddubsw %%ymm3,%%ymm10,%%ymm2 \n" \ + "vpaddw %%ymm4,%%ymm12,%%ymm4 \n" \ "vpaddsw %%ymm4,%%ymm0,%%ymm0 \n" \ - "vpaddsw %%ymm4,%%ymm1,%%ymm1 \n" \ + "vpsubsw %%ymm1,%%ymm4,%%ymm1 \n" \ "vpaddsw %%ymm4,%%ymm2,%%ymm2 \n" -#define YUVTORGB_REGS_AVX2 \ - "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", +#define YUVTORGB_REGS_AVX2 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", #else // Convert 16 pixels: 16 UV and 16 Y. #define YUVTORGB_SETUP_AVX2(yuvconstants) #define YUVTORGB16_AVX2(yuvconstants) \ - "vpmaddubsw 64(%[yuvconstants]),%%ymm0,%%ymm2 \n" \ - "vpmaddubsw 32(%[yuvconstants]),%%ymm0,%%ymm1 \n" \ - "vpmaddubsw (%[yuvconstants]),%%ymm0,%%ymm0 \n" \ - "vmovdqu 160(%[yuvconstants]),%%ymm3 \n" \ - "vpsubw %%ymm2,%%ymm3,%%ymm2 \n" \ - "vmovdqu 128(%[yuvconstants]),%%ymm3 \n" \ - "vpsubw %%ymm1,%%ymm3,%%ymm1 \n" \ - "vmovdqu 96(%[yuvconstants]),%%ymm3 \n" \ - "vpsubw %%ymm0,%%ymm3,%%ymm0 \n" \ - "vpmulhuw 192(%[yuvconstants]),%%ymm4,%%ymm4 \n" \ + "vpcmpeqb %%xmm0,%%xmm0,%%xmm0 \n" \ + "vpsllw $7,%%xmm0,%%xmm0 \n" \ + "vpbroadcastb %%xmm0,%%ymm0 \n" \ + "vpsubb %%ymm0,%%ymm3,%%ymm3 \n" \ + "vpmulhuw 96(%[yuvconstants]),%%ymm4,%%ymm4 \n" \ + "vmovdqa (%[yuvconstants]),%%ymm0 \n" \ + "vmovdqa 32(%[yuvconstants]),%%ymm1 \n" \ + "vmovdqa 64(%[yuvconstants]),%%ymm2 \n" \ + "vpmaddubsw %%ymm3,%%ymm0,%%ymm0 \n" \ + "vpmaddubsw %%ymm3,%%ymm1,%%ymm1 \n" \ + "vpmaddubsw %%ymm3,%%ymm2,%%ymm2 \n" \ + "vmovdqa 128(%[yuvconstants]),%%ymm3 \n" \ + "vpaddw %%ymm4,%%ymm3,%%ymm4 \n" \ "vpaddsw %%ymm4,%%ymm0,%%ymm0 \n" \ - "vpaddsw %%ymm4,%%ymm1,%%ymm1 \n" \ + "vpsubsw %%ymm1,%%ymm4,%%ymm1 \n" \ "vpaddsw %%ymm4,%%ymm2,%%ymm2 \n" + #define YUVTORGB_REGS_AVX2 #endif @@ -2655,7 +3420,7 @@ void OMITFP I422ToRGBARow_SSSE3(const uint8_t* y_buf, "vpunpckhwd %%ymm2,%%ymm0,%%ymm0 \n" \ "vmovdqu %%ymm1,(%[dst_argb]) \n" \ "vmovdqu %%ymm0,0x20(%[dst_argb]) \n" \ - "lea 0x40(%[dst_argb]), %[dst_argb] \n" + "lea 0x40(%[dst_argb]), %[dst_argb] \n" // Store 16 AR30 values. #define STOREAR30_AVX2 \ @@ -2828,6 +3593,41 @@ void OMITFP I210ToARGBRow_AVX2(const uint16_t* y_buf, } #endif // HAS_I210TOARGBROW_AVX2 +#if defined(HAS_I212TOARGBROW_AVX2) +// 16 pixels +// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 ARGB (64 bytes). +void OMITFP I212ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" + + LABELALIGN + "1: \n" + READYUV212_AVX2 + YUVTORGB_AVX2(yuvconstants) + STOREARGB_AVX2 + "sub $0x10,%[width] \n" + "jg 1b \n" + + "vzeroupper \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [dst_argb]"+r"(dst_argb), // %[dst_argb] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + ); +} +#endif // HAS_I212TOARGBROW_AVX2 + #if defined(HAS_I210TOAR30ROW_AVX2) // 16 pixels // 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 AR30 (64 bytes). @@ -2863,11 +3663,239 @@ void OMITFP I210ToAR30Row_AVX2(const uint16_t* y_buf, [width]"+rm"(width) // %[width] : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] : "memory", "cc", YUVTORGB_REGS_AVX2 - "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" ); } #endif // HAS_I210TOAR30ROW_AVX2 +#if defined(HAS_I212TOAR30ROW_AVX2) +// 16 pixels +// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 AR30 (64 bytes). +void OMITFP I212ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" // AR30 constants + "vpsrlw $14,%%ymm5,%%ymm5 \n" + "vpsllw $4,%%ymm5,%%ymm5 \n" // 2 alpha bits + "vpxor %%ymm6,%%ymm6,%%ymm6 \n" // 0 for min + "vpcmpeqb %%ymm7,%%ymm7,%%ymm7 \n" // 1023 for max + "vpsrlw $6,%%ymm7,%%ymm7 \n" + + LABELALIGN + "1: \n" + READYUV212_AVX2 + YUVTORGB16_AVX2(yuvconstants) + STOREAR30_AVX2 + "sub $0x10,%[width] \n" + "jg 1b \n" + + "vzeroupper \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [dst_ar30]"+r"(dst_ar30), // %[dst_ar30] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" + ); +} +#endif // HAS_I212TOAR30ROW_AVX2 + +#if defined(HAS_I410TOARGBROW_AVX2) +// 16 pixels +// 16 UV values with 16 Y producing 16 ARGB (64 bytes). +void OMITFP I410ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" + + LABELALIGN + "1: \n" + READYUV410_AVX2 + YUVTORGB_AVX2(yuvconstants) + STOREARGB_AVX2 + "sub $0x10,%[width] \n" + "jg 1b \n" + "vzeroupper \n" + + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [dst_argb]"+r"(dst_argb), // %[dst_argb] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + ); +} +#endif // HAS_I410TOARGBROW_AVX2 + +#if defined(HAS_I210ALPHATOARGBROW_AVX2) +// 16 pixels +// 8 UV, 16 Y and 16 A producing 16 ARGB (64 bytes). +void OMITFP I210AlphaToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile( + YUVTORGB_SETUP_AVX2( + yuvconstants) "sub %[u_buf],%[v_buf] \n" + + LABELALIGN "1: \n" READYUVA210_AVX2 + YUVTORGB_AVX2(yuvconstants) STOREARGB_AVX2 + "subl $0x10,%[width] \n" + "jg 1b \n" + "vzeroupper \n" + + : [y_buf] "+r"(y_buf), // %[y_buf] + [u_buf] "+r"(u_buf), // %[u_buf] + [v_buf] "+r"(v_buf), // %[v_buf] + [a_buf] "+r"(a_buf), // %[a_buf] + [dst_argb] "+r"(dst_argb), // %[dst_argb] +#if defined(__i386__) + [width] "+m"(width) // %[width] +#else + [width] "+rm"(width) // %[width] +#endif + : [yuvconstants] "r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 "xmm0", "xmm1", "xmm2", "xmm3", + "xmm4", "xmm5"); +} +#endif // HAS_I210TOARGBROW_AVX2 + +#if defined(HAS_I410ALPHATOARGBROW_AVX2) +// 16 pixels +// 16 UV, 16 Y and 16 A producing 16 ARGB (64 bytes). +void OMITFP I410AlphaToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + const uint16_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile( + YUVTORGB_SETUP_AVX2( + yuvconstants) "sub %[u_buf],%[v_buf] \n" + + LABELALIGN "1: \n" READYUVA410_AVX2 + YUVTORGB_AVX2(yuvconstants) STOREARGB_AVX2 + "subl $0x10,%[width] \n" + "jg 1b \n" + "vzeroupper \n" + + : [y_buf] "+r"(y_buf), // %[y_buf] + [u_buf] "+r"(u_buf), // %[u_buf] + [v_buf] "+r"(v_buf), // %[v_buf] + [a_buf] "+r"(a_buf), // %[a_buf] + [dst_argb] "+r"(dst_argb), // %[dst_argb] +#if defined(__i386__) + [width] "+m"(width) // %[width] +#else + [width] "+rm"(width) // %[width] +#endif + : [yuvconstants] "r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 "xmm0", "xmm1", "xmm2", "xmm3", + "xmm4", "xmm5"); +} +#endif // HAS_I410TOARGBROW_AVX2 + +#if defined(HAS_I410TOAR30ROW_AVX2) +// 16 pixels +// 16 UV values with 16 Y producing 16 AR30 (64 bytes). +void OMITFP I410ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* u_buf, + const uint16_t* v_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" // AR30 constants + "vpsrlw $14,%%ymm5,%%ymm5 \n" + "vpsllw $4,%%ymm5,%%ymm5 \n" // 2 alpha bits + "vpxor %%ymm6,%%ymm6,%%ymm6 \n" // 0 for min + "vpcmpeqb %%ymm7,%%ymm7,%%ymm7 \n" // 1023 for max + "vpsrlw $6,%%ymm7,%%ymm7 \n" + + LABELALIGN + "1: \n" + READYUV410_AVX2 + YUVTORGB16_AVX2(yuvconstants) + STOREAR30_AVX2 + "sub $0x10,%[width] \n" + "jg 1b \n" + + "vzeroupper \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [dst_ar30]"+r"(dst_ar30), // %[dst_ar30] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" + ); +} +#endif // HAS_I410TOAR30ROW_AVX2 + +#if defined(HAS_I444ALPHATOARGBROW_AVX2) +// 16 pixels +// 16 UV values with 16 Y and 16 A producing 16 ARGB. +void OMITFP I444AlphaToARGBRow_AVX2(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + // clang-format off + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "sub %[u_buf],%[v_buf] \n" + + LABELALIGN + "1: \n" + READYUVA444_AVX2 + YUVTORGB_AVX2(yuvconstants) + STOREARGB_AVX2 + "subl $0x10,%[width] \n" + "jg 1b \n" + "vzeroupper \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [u_buf]"+r"(u_buf), // %[u_buf] + [v_buf]"+r"(v_buf), // %[v_buf] + [a_buf]"+r"(a_buf), // %[a_buf] + [dst_argb]"+r"(dst_argb), // %[dst_argb] +#if defined(__i386__) + [width]"+m"(width) // %[width] +#else + [width]"+rm"(width) // %[width] +#endif + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + ); + // clang-format on +} +#endif // HAS_I444ALPHATOARGBROW_AVX2 + #if defined(HAS_I422ALPHATOARGBROW_AVX2) // 16 pixels // 8 UV values upsampled to 16 UV, mixed with 16 Y and 16 A producing 16 ARGB. @@ -3086,14 +4114,154 @@ void OMITFP UYVYToARGBRow_AVX2(const uint8_t* uyvy_buf, } #endif // HAS_UYVYTOARGBROW_AVX2 +#if defined(HAS_P210TOARGBROW_AVX2) +// 16 pixels. +// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 ARGB (64 bytes). +void OMITFP P210ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + // clang-format off + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" + + LABELALIGN + "1: \n" + READP210_AVX2 + YUVTORGB_AVX2(yuvconstants) + STOREARGB_AVX2 + "sub $0x10,%[width] \n" + "jg 1b \n" + "vzeroupper \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [uv_buf]"+r"(uv_buf), // %[uv_buf] + [dst_argb]"+r"(dst_argb), // %[dst_argb] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + ); + // clang-format on +} +#endif // HAS_P210TOARGBROW_AVX2 + +#if defined(HAS_P410TOARGBROW_AVX2) +// 16 pixels. +// 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 ARGB (64 bytes). +void OMITFP P410ToARGBRow_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + // clang-format off + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" + + LABELALIGN + "1: \n" + READP410_AVX2 + YUVTORGB_AVX2(yuvconstants) + STOREARGB_AVX2 + "sub $0x10,%[width] \n" + "jg 1b \n" + "vzeroupper \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [uv_buf]"+r"(uv_buf), // %[uv_buf] + [dst_argb]"+r"(dst_argb), // %[dst_argb] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5" + ); + // clang-format on +} +#endif // HAS_P410TOARGBROW_AVX2 + +#if defined(HAS_P210TOAR30ROW_AVX2) +// 16 pixels +// 16 UV values with 16 Y producing 16 AR30 (64 bytes). +void OMITFP P210ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" // AR30 constants + "vpsrlw $14,%%ymm5,%%ymm5 \n" + "vpsllw $4,%%ymm5,%%ymm5 \n" // 2 alpha bits + "vpxor %%ymm6,%%ymm6,%%ymm6 \n" // 0 for min + "vpcmpeqb %%ymm7,%%ymm7,%%ymm7 \n" // 1023 for max + "vpsrlw $6,%%ymm7,%%ymm7 \n" + + LABELALIGN + "1: \n" + READP210_AVX2 + YUVTORGB16_AVX2(yuvconstants) + STOREAR30_AVX2 + "sub $0x10,%[width] \n" + "jg 1b \n" + + "vzeroupper \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [uv_buf]"+r"(uv_buf), // %[uv_buf] + [dst_ar30]"+r"(dst_ar30), // %[dst_ar30] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" + ); +} +#endif // HAS_P210TOAR30ROW_AVX2 + +#if defined(HAS_P410TOAR30ROW_AVX2) +// 16 pixels +// 16 UV values with 16 Y producing 16 AR30 (64 bytes). +void OMITFP P410ToAR30Row_AVX2(const uint16_t* y_buf, + const uint16_t* uv_buf, + uint8_t* dst_ar30, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile ( + YUVTORGB_SETUP_AVX2(yuvconstants) + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" // AR30 constants + "vpsrlw $14,%%ymm5,%%ymm5 \n" + "vpsllw $4,%%ymm5,%%ymm5 \n" // 2 alpha bits + "vpxor %%ymm6,%%ymm6,%%ymm6 \n" // 0 for min + "vpcmpeqb %%ymm7,%%ymm7,%%ymm7 \n" // 1023 for max + "vpsrlw $6,%%ymm7,%%ymm7 \n" + + LABELALIGN + "1: \n" + READP410_AVX2 + YUVTORGB16_AVX2(yuvconstants) + STOREAR30_AVX2 + "sub $0x10,%[width] \n" + "jg 1b \n" + + "vzeroupper \n" + : [y_buf]"+r"(y_buf), // %[y_buf] + [uv_buf]"+r"(uv_buf), // %[uv_buf] + [dst_ar30]"+r"(dst_ar30), // %[dst_ar30] + [width]"+rm"(width) // %[width] + : [yuvconstants]"r"(yuvconstants) // %[yuvconstants] + : "memory", "cc", YUVTORGB_REGS_AVX2 + "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7" + ); +} +#endif // HAS_P410TOAR30ROW_AVX2 + #ifdef HAS_I400TOARGBROW_SSE2 void I400ToARGBRow_SSE2(const uint8_t* y_buf, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { asm volatile( - "movdqa 192(%3),%%xmm2 \n" // yg = 18997 = 1.164 - "movdqa 224(%3),%%xmm3 \n" // ygb = 1160 = 1.164 * 16 + "movdqa 96(%3),%%xmm2 \n" // yg = 18997 = 1.164 + "movdqa 128(%3),%%xmm3 \n" // ygb = 1160 = 1.164 * 16 "pcmpeqb %%xmm4,%%xmm4 \n" // 0xff000000 "pslld $0x18,%%xmm4 \n" @@ -3137,8 +4305,8 @@ void I400ToARGBRow_AVX2(const uint8_t* y_buf, const struct YuvConstants* yuvconstants, int width) { asm volatile( - "vmovdqa 192(%3),%%ymm2 \n" // yg = 18997 = 1.164 - "vmovdqa 224(%3),%%ymm3 \n" // ygb = -1160 = 1.164*16 + "vmovdqa 96(%3),%%ymm2 \n" // yg = 18997 = 1.164 + "vmovdqa 128(%3),%%ymm3 \n" // ygb = -1160 = 1.164*16 "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" // 0xff000000 "vpslld $0x18,%%ymm4,%%ymm4 \n" @@ -3546,22 +4714,16 @@ void MergeUVRow_SSE2(const uint8_t* src_u, } #endif // HAS_MERGEUVROW_SSE2 -// Use scale to convert lsb formats to msb, depending how many bits there are: -// 128 = 9 bits -// 64 = 10 bits -// 16 = 12 bits -// 1 = 16 bits #ifdef HAS_MERGEUVROW_16_AVX2 void MergeUVRow_16_AVX2(const uint16_t* src_u, const uint16_t* src_v, uint16_t* dst_uv, - int scale, + int depth, int width) { + depth = 16 - depth; // clang-format off asm volatile ( "vmovd %4,%%xmm3 \n" - "vpunpcklwd %%xmm3,%%xmm3,%%xmm3 \n" - "vbroadcastss %%xmm3,%%ymm3 \n" "sub %0,%1 \n" // 16 pixels per loop. @@ -3571,8 +4733,8 @@ void MergeUVRow_16_AVX2(const uint16_t* src_u, "vmovdqu (%0,%1,1),%%ymm1 \n" "add $0x20,%0 \n" - "vpmullw %%ymm3,%%ymm0,%%ymm0 \n" - "vpmullw %%ymm3,%%ymm1,%%ymm1 \n" + "vpsllw %%xmm3,%%ymm0,%%ymm0 \n" + "vpsllw %%xmm3,%%ymm1,%%ymm1 \n" "vpunpcklwd %%ymm1,%%ymm0,%%ymm2 \n" // mutates "vpunpckhwd %%ymm1,%%ymm0,%%ymm0 \n" "vextractf128 $0x0,%%ymm2,(%2) \n" @@ -3587,12 +4749,59 @@ void MergeUVRow_16_AVX2(const uint16_t* src_u, "+r"(src_v), // %1 "+r"(dst_uv), // %2 "+r"(width) // %3 - : "r"(scale) // %4 + : "r"(depth) // %4 : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3"); // clang-format on } #endif // HAS_MERGEUVROW_AVX2 +#ifdef HAS_SPLITUVROW_16_AVX2 +const uvec8 kSplitUVShuffle16 = {0, 1, 4, 5, 8, 9, 12, 13, + 2, 3, 6, 7, 10, 11, 14, 15}; +void SplitUVRow_16_AVX2(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width) { + depth = 16 - depth; + // clang-format off + asm volatile ( + "vmovd %4,%%xmm3 \n" + "vbroadcastf128 %5,%%ymm4 \n" + "sub %1,%2 \n" + + // 16 pixels per loop. + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "add $0x40,%0 \n" + + "vpsrlw %%xmm3,%%ymm0,%%ymm0 \n" + "vpsrlw %%xmm3,%%ymm1,%%ymm1 \n" + "vpshufb %%ymm4,%%ymm0,%%ymm0 \n" + "vpshufb %%ymm4,%%ymm1,%%ymm1 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm1,%%ymm1 \n" + "vextractf128 $0x0,%%ymm0,(%1) \n" + "vextractf128 $0x0,%%ymm1,0x10(%1) \n" + "vextractf128 $0x1,%%ymm0,(%1,%2) \n" + "vextractf128 $0x1,%%ymm1,0x10(%1,%2) \n" + "add $0x20,%1 \n" + "sub $0x10,%3 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_uv), // %0 + "+r"(dst_u), // %1 + "+r"(dst_v), // %2 + "+r"(width) // %3 + : "r"(depth), // %4 + "m"(kSplitUVShuffle16) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); + // clang-format on +} +#endif // HAS_SPLITUVROW_16_AVX2 + // Use scale to convert lsb formats to msb, depending how many bits there are: // 128 = 9 bits // 64 = 10 bits @@ -3610,7 +4819,7 @@ void MultiplyRow_16_AVX2(const uint16_t* src_y, "vbroadcastss %%xmm3,%%ymm3 \n" "sub %0,%1 \n" - // 16 pixels per loop. + // 32 pixels per loop. LABELALIGN "1: \n" "vmovdqu (%0),%%ymm0 \n" @@ -3632,6 +4841,46 @@ void MultiplyRow_16_AVX2(const uint16_t* src_y, } #endif // HAS_MULTIPLYROW_16_AVX2 +// Use scale to convert msb formats to lsb, depending how many bits there are: +// 512 = 9 bits +// 1024 = 10 bits +// 4096 = 12 bits +// 65536 = 16 bits +#ifdef HAS_DIVIDEROW_16_AVX2 +void DivideRow_16_AVX2(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width) { + // clang-format off + asm volatile ( + "vmovd %3,%%xmm3 \n" + "vpunpcklwd %%xmm3,%%xmm3,%%xmm3 \n" + "vbroadcastss %%xmm3,%%ymm3 \n" + "sub %0,%1 \n" + + // 32 pixels per loop. + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "vpmulhuw %%ymm3,%%ymm0,%%ymm0 \n" + "vpmulhuw %%ymm3,%%ymm1,%%ymm1 \n" + "vmovdqu %%ymm0,(%0,%1) \n" + "vmovdqu %%ymm1,0x20(%0,%1) \n" + "add $0x40,%0 \n" + "sub $0x20,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_y), // %0 + "+r"(dst_y), // %1 + "+r"(width), // %2 + "+r"(scale) // %3 + : + : "memory", "cc", "xmm0", "xmm1", "xmm3"); + // clang-format on +} +#endif // HAS_MULTIPLYROW_16_AVX2 + // Use scale to convert lsb formats to msb, depending how many bits there are: // 32768 = 9 bits // 16384 = 10 bits @@ -3968,6 +5217,780 @@ void MergeRGBRow_SSSE3(const uint8_t* src_r, } #endif // HAS_MERGERGBROW_SSSE3 +#ifdef HAS_MERGEARGBROW_SSE2 +void MergeARGBRow_SSE2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width) { + asm volatile( + + "sub %0,%1 \n" + "sub %0,%2 \n" + "sub %0,%3 \n" + + LABELALIGN + "1: \n" + + "movq (%0,%2),%%xmm0 \n" // B + "movq (%0),%%xmm1 \n" // R + "movq (%0,%1),%%xmm2 \n" // G + "punpcklbw %%xmm1,%%xmm0 \n" // BR + "movq (%0,%3),%%xmm1 \n" // A + "punpcklbw %%xmm1,%%xmm2 \n" // GA + "movdqa %%xmm0,%%xmm1 \n" // BR + "punpckhbw %%xmm2,%%xmm1 \n" // BGRA (hi) + "punpcklbw %%xmm2,%%xmm0 \n" // BGRA (lo) + "movdqu %%xmm0,(%4) \n" + "movdqu %%xmm1,16(%4) \n" + + "lea 8(%0),%0 \n" + "lea 32(%4),%4 \n" + "sub $0x8,%5 \n" + "jg 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_argb), // %4 + "+r"(width) // %5 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} +#endif + +#ifdef HAS_MERGEXRGBROW_SSE2 +void MergeXRGBRow_SSE2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width) { + asm volatile( + + LABELALIGN + "1: \n" + + "movq (%2),%%xmm0 \n" // B + "movq (%0),%%xmm1 \n" // R + "movq (%1),%%xmm2 \n" // G + "punpcklbw %%xmm1,%%xmm0 \n" // BR + "pcmpeqd %%xmm1,%%xmm1 \n" // A(255) + "punpcklbw %%xmm1,%%xmm2 \n" // GA + "movdqa %%xmm0,%%xmm1 \n" // BR + "punpckhbw %%xmm2,%%xmm1 \n" // BGRA (hi) + "punpcklbw %%xmm2,%%xmm0 \n" // BGRA (lo) + "movdqu %%xmm0,(%3) \n" + "movdqu %%xmm1,16(%3) \n" + + "lea 8(%0),%0 \n" + "lea 8(%1),%1 \n" + "lea 8(%2),%2 \n" + "lea 32(%3),%3 \n" + "sub $0x8,%4 \n" + "jg 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_argb), // %3 + "+r"(width) // %4 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} +#endif // HAS_MERGEARGBROW_SSE2 + +#ifdef HAS_MERGEARGBROW_AVX2 +void MergeARGBRow_AVX2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width) { + asm volatile( + + "sub %0,%1 \n" + "sub %0,%2 \n" + "sub %0,%3 \n" + + LABELALIGN + "1: \n" + + "vmovdqu (%0,%2),%%xmm0 \n" // B + "vmovdqu (%0,%1),%%xmm1 \n" // R + "vinserti128 $1,(%0),%%ymm0,%%ymm0 \n" // G + "vinserti128 $1,(%0,%3),%%ymm1,%%ymm1 \n" // A + "vpunpckhbw %%ymm1,%%ymm0,%%ymm2 \n" + "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n" + "vperm2i128 $0x31,%%ymm2,%%ymm0,%%ymm1 \n" + "vperm2i128 $0x20,%%ymm2,%%ymm0,%%ymm0 \n" + "vpunpckhwd %%ymm1,%%ymm0,%%ymm2 \n" + "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" + "vperm2i128 $0x31,%%ymm2,%%ymm0,%%ymm1 \n" + "vperm2i128 $0x20,%%ymm2,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%4) \n" // First 8 + "vmovdqu %%ymm1,32(%4) \n" // Next 8 + + "lea 16(%0),%0 \n" + "lea 64(%4),%4 \n" + "sub $0x10,%5 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_argb), // %4 + "+r"(width) // %5 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} +#endif + +#ifdef HAS_MERGEXRGBROW_AVX2 +void MergeXRGBRow_AVX2(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width) { + asm volatile( + + LABELALIGN + "1: \n" + + "vmovdqu (%2),%%xmm0 \n" // B + "vpcmpeqd %%ymm1,%%ymm1,%%ymm1 \n" // A(255) + "vinserti128 $0,(%1),%%ymm1,%%ymm1 \n" // R + "vinserti128 $1,(%0),%%ymm0,%%ymm0 \n" // G + "vpunpckhbw %%ymm1,%%ymm0,%%ymm2 \n" + "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n" + "vperm2i128 $0x31,%%ymm2,%%ymm0,%%ymm1 \n" + "vperm2i128 $0x20,%%ymm2,%%ymm0,%%ymm0 \n" + "vpunpckhwd %%ymm1,%%ymm0,%%ymm2 \n" + "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" + "vperm2i128 $0x31,%%ymm2,%%ymm0,%%ymm1 \n" + "vperm2i128 $0x20,%%ymm2,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%3) \n" // First 8 + "vmovdqu %%ymm1,32(%3) \n" // Next 8 + + "lea 16(%0),%0 \n" + "lea 16(%1),%1 \n" + "lea 16(%2),%2 \n" + "lea 64(%3),%3 \n" + "sub $0x10,%4 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_argb), // %3 + "+rm"(width) // %4 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} +#endif // HAS_MERGEARGBROW_AVX2 + +#ifdef HAS_SPLITARGBROW_SSE2 +void SplitARGBRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width) { + asm volatile( + + "sub %1,%2 \n" + "sub %1,%3 \n" + "sub %1,%4 \n" + + LABELALIGN + "1: \n" + + "movdqu (%0),%%xmm0 \n" // 00-0F + "movdqu 16(%0),%%xmm1 \n" // 10-1F + "movdqa %%xmm0,%%xmm2 \n" + "punpcklqdq %%xmm1,%%xmm0 \n" // 00-07 10-17 + "punpckhqdq %%xmm1,%%xmm2 \n" // 08-0F 18-1F + "movdqa %%xmm0,%%xmm1 \n" + "punpcklbw %%xmm2,%%xmm0 \n" // 08192A3B4C5D6E7F (lo) + "punpckhbw %%xmm2,%%xmm1 \n" // 08192A3B4C5D6E7F (hi) + "movdqa %%xmm0,%%xmm2 \n" + "punpcklqdq %%xmm1,%%xmm0 \n" // 08192A3B08192A3B + "punpckhqdq %%xmm1,%%xmm2 \n" // 4C5D6E7F4C5D6E7F + "movdqa %%xmm0,%%xmm1 \n" + "punpcklbw %%xmm2,%%xmm0 \n" // 048C159D26AE37BF (lo) + "punpckhbw %%xmm2,%%xmm1 \n" // 048C159D26AE37BF (hi) + "movdqa %%xmm0,%%xmm2 \n" + "punpckldq %%xmm1,%%xmm0 \n" // 048C048C159D159D (BG) + "punpckhdq %%xmm1,%%xmm2 \n" // 26AE26AE37BF37BF (RA) + "movlps %%xmm0,(%1,%3) \n" // B + "movhps %%xmm0,(%1,%2) \n" // G + "movlps %%xmm2,(%1) \n" // R + "movhps %%xmm2,(%1,%4) \n" // A + + "lea 32(%0),%0 \n" + "lea 8(%1),%1 \n" + "sub $0x8,%5 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(dst_a), // %4 + "+rm"(width) // %5 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} +#endif + +#ifdef HAS_SPLITXRGBROW_SSE2 +void SplitXRGBRow_SSE2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width) { + asm volatile( + + LABELALIGN + "1: \n" + + "movdqu (%0),%%xmm0 \n" // 00-0F + "movdqu 16(%0),%%xmm1 \n" // 10-1F + "movdqa %%xmm0,%%xmm2 \n" + "punpcklqdq %%xmm1,%%xmm0 \n" // 00-07 10-17 + "punpckhqdq %%xmm1,%%xmm2 \n" // 08-0F 18-1F + "movdqa %%xmm0,%%xmm1 \n" + "punpcklbw %%xmm2,%%xmm0 \n" // 08192A3B4C5D6E7F (lo) + "punpckhbw %%xmm2,%%xmm1 \n" // 08192A3B4C5D6E7F (hi) + "movdqa %%xmm0,%%xmm2 \n" + "punpcklqdq %%xmm1,%%xmm0 \n" // 08192A3B08192A3B + "punpckhqdq %%xmm1,%%xmm2 \n" // 4C5D6E7F4C5D6E7F + "movdqa %%xmm0,%%xmm1 \n" + "punpcklbw %%xmm2,%%xmm0 \n" // 048C159D26AE37BF (lo) + "punpckhbw %%xmm2,%%xmm1 \n" // 048C159D26AE37BF (hi) + "movdqa %%xmm0,%%xmm2 \n" + "punpckldq %%xmm1,%%xmm0 \n" // 048C048C159D159D (BG) + "punpckhdq %%xmm1,%%xmm2 \n" // 26AE26AE37BF37BF (RA) + "movlps %%xmm0,(%3) \n" // B + "movhps %%xmm0,(%2) \n" // G + "movlps %%xmm2,(%1) \n" // R + + "lea 32(%0),%0 \n" + "lea 8(%1),%1 \n" + "lea 8(%2),%2 \n" + "lea 8(%3),%3 \n" + "sub $0x8,%4 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+rm"(width) // %4 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2"); +} +#endif + +static const uvec8 kShuffleMaskARGBSplit = {0, 4, 8, 12, 1, 5, 9, 13, + 2, 6, 10, 14, 3, 7, 11, 15}; +#ifdef HAS_SPLITARGBROW_SSSE3 +void SplitARGBRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width) { + asm volatile( + + "movdqa %6,%%xmm3 \n" + "sub %1,%2 \n" + "sub %1,%3 \n" + "sub %1,%4 \n" + + LABELALIGN + "1: \n" + + "movdqu (%0),%%xmm0 \n" // 00-0F + "movdqu 16(%0),%%xmm1 \n" // 10-1F + "pshufb %%xmm3,%%xmm0 \n" // 048C159D26AE37BF (lo) + "pshufb %%xmm3,%%xmm1 \n" // 048C159D26AE37BF (hi) + "movdqa %%xmm0,%%xmm2 \n" + "punpckldq %%xmm1,%%xmm0 \n" // 048C048C159D159D (BG) + "punpckhdq %%xmm1,%%xmm2 \n" // 26AE26AE37BF37BF (RA) + "movlps %%xmm0,(%1,%3) \n" // B + "movhps %%xmm0,(%1,%2) \n" // G + "movlps %%xmm2,(%1) \n" // R + "movhps %%xmm2,(%1,%4) \n" // A + + "lea 32(%0),%0 \n" + "lea 8(%1),%1 \n" + "subl $0x8,%5 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(dst_a), // %4 +#if defined(__i386__) + "+m"(width) // %5 +#else + "+rm"(width) // %5 +#endif + : "m"(kShuffleMaskARGBSplit) // %6 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3"); +} +#endif + +#ifdef HAS_SPLITXRGBROW_SSSE3 +void SplitXRGBRow_SSSE3(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width) { + asm volatile( + + "movdqa %5,%%xmm3 \n" + + LABELALIGN + "1: \n" + + "movdqu (%0),%%xmm0 \n" // 00-0F + "movdqu 16(%0),%%xmm1 \n" // 10-1F + "pshufb %%xmm3,%%xmm0 \n" // 048C159D26AE37BF (lo) + "pshufb %%xmm3,%%xmm1 \n" // 048C159D26AE37BF (hi) + "movdqa %%xmm0,%%xmm2 \n" + "punpckldq %%xmm1,%%xmm0 \n" // 048C048C159D159D (BG) + "punpckhdq %%xmm1,%%xmm2 \n" // 26AE26AE37BF37BF (RA) + "movlps %%xmm0,(%3) \n" // B + "movhps %%xmm0,(%2) \n" // G + "movlps %%xmm2,(%1) \n" // R + + "lea 32(%0),%0 \n" + "lea 8(%1),%1 \n" + "lea 8(%2),%2 \n" + "lea 8(%3),%3 \n" + "sub $0x8,%4 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(width) // %4 + : "m"(kShuffleMaskARGBSplit) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3"); +} +#endif + +#ifdef HAS_SPLITARGBROW_AVX2 +static const ulvec32 kShuffleMaskARGBPermute = {0, 4, 1, 5, 2, 6, 3, 7}; +void SplitARGBRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width) { + asm volatile( + + "sub %1,%2 \n" + "sub %1,%3 \n" + "sub %1,%4 \n" + "vmovdqa %7,%%ymm3 \n" + "vbroadcastf128 %6,%%ymm4 \n" + + LABELALIGN + "1: \n" + + "vmovdqu (%0),%%xmm0 \n" // 00-0F + "vmovdqu 16(%0),%%xmm1 \n" // 10-1F + "vinserti128 $1,32(%0),%%ymm0,%%ymm0 \n" // 00-0F 20-2F + "vinserti128 $1,48(%0),%%ymm1,%%ymm1 \n" // 10-1F 30-3F + "vpshufb %%ymm4,%%ymm0,%%ymm0 \n" + "vpshufb %%ymm4,%%ymm1,%%ymm1 \n" + "vpermd %%ymm0,%%ymm3,%%ymm0 \n" + "vpermd %%ymm1,%%ymm3,%%ymm1 \n" + "vpunpckhdq %%ymm1,%%ymm0,%%ymm2 \n" // GA + "vpunpckldq %%ymm1,%%ymm0,%%ymm0 \n" // BR + "vmovdqu %%xmm0,(%1,%3) \n" // B + "vextracti128 $1,%%ymm0,(%1) \n" // R + "vmovdqu %%xmm2,(%1,%2) \n" // G + "vextracti128 $1,%%ymm2,(%1,%4) \n" // A + "lea 64(%0),%0 \n" + "lea 16(%1),%1 \n" + "subl $0x10,%5 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_argb), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(dst_a), // %4 +#if defined(__i386__) + "+m"(width) // %5 +#else + "+rm"(width) // %5 +#endif + : "m"(kShuffleMaskARGBSplit), // %6 + "m"(kShuffleMaskARGBPermute) // %7 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); +} +#endif + +#ifdef HAS_SPLITXRGBROW_AVX2 +void SplitXRGBRow_AVX2(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width) { + asm volatile( + + "vmovdqa %6,%%ymm3 \n" + "vbroadcastf128 %5,%%ymm4 \n" + + LABELALIGN + "1: \n" + + "vmovdqu (%0),%%xmm0 \n" // 00-0F + "vmovdqu 16(%0),%%xmm1 \n" // 10-1F + "vinserti128 $1,32(%0),%%ymm0,%%ymm0 \n" // 00-0F 20-2F + "vinserti128 $1,48(%0),%%ymm1,%%ymm1 \n" // 10-1F 30-3F + "vpshufb %%ymm4,%%ymm0,%%ymm0 \n" + "vpshufb %%ymm4,%%ymm1,%%ymm1 \n" + "vpermd %%ymm0,%%ymm3,%%ymm0 \n" + "vpermd %%ymm1,%%ymm3,%%ymm1 \n" + "vpunpckhdq %%ymm1,%%ymm0,%%ymm2 \n" // GA + "vpunpckldq %%ymm1,%%ymm0,%%ymm0 \n" // BR + "vmovdqu %%xmm0,(%3) \n" // B + "vextracti128 $1,%%ymm0,(%1) \n" // R + "vmovdqu %%xmm2,(%2) \n" // G + + "lea 64(%0),%0 \n" + "lea 16(%1),%1 \n" + "lea 16(%2),%2 \n" + "lea 16(%3),%3 \n" + "sub $0x10,%4 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_argb), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(width) // %4 + : "m"(kShuffleMaskARGBSplit), // %5 + "m"(kShuffleMaskARGBPermute) // %6 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); +} +#endif + +#ifdef HAS_MERGEXR30ROW_AVX2 +void MergeXR30Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width) { + int shift = depth - 10; + asm volatile( + + "sub %0,%1 \n" + "sub %0,%2 \n" + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" // AR30 constants + "vpsrlw $14,%%ymm5,%%ymm5 \n" + "vpsllw $4,%%ymm5,%%ymm5 \n" // 2 alpha bits + "vpcmpeqb %%ymm6,%%ymm6,%%ymm6 \n" + "vpsrlw $6,%%ymm6,%%ymm6 \n" + "vmovd %5,%%xmm4 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu (%0,%1),%%ymm1 \n" + "vmovdqu (%0,%2),%%ymm2 \n" + "vpsrlw %%xmm4,%%ymm0,%%ymm0 \n" + "vpsrlw %%xmm4,%%ymm1,%%ymm1 \n" + "vpsrlw %%xmm4,%%ymm2,%%ymm2 \n" + "vpminuw %%ymm0,%%ymm6,%%ymm0 \n" + "vpminuw %%ymm1,%%ymm6,%%ymm1 \n" + "vpminuw %%ymm2,%%ymm6,%%ymm2 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm1,%%ymm1 \n" + "vpermq $0xd8,%%ymm2,%%ymm2 \n" + "vpsllw $0x4,%%ymm0,%%ymm0 \n" // Shift R to target bit + "vpunpckhwd %%ymm0,%%ymm2,%%ymm3 \n" // RB + "vpunpcklwd %%ymm0,%%ymm2,%%ymm0 \n" + "vpunpckhwd %%ymm5,%%ymm1,%%ymm2 \n" // AG + "vpunpcklwd %%ymm5,%%ymm1,%%ymm1 \n" + "vpslld $0xa,%%ymm1,%%ymm1 \n" // Shift AG to target bit + "vpslld $0xa,%%ymm2,%%ymm2 \n" + "vpor %%ymm1,%%ymm0,%%ymm0 \n" // Combine + "vpor %%ymm2,%%ymm3,%%ymm3 \n" + "vmovdqu %%ymm0,(%3) \n" + "vmovdqu %%ymm3,0x20(%3) \n" + "lea 0x20(%0),%0 \n" + "lea 0x40(%3),%3 \n" + "sub $0x10,%4 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_ar30), // %3 + "+r"(width) // %4 +#if defined(__i386__) + : "m"(shift) // %5 +#else + : "rm"(shift) // %5 +#endif + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif + +#ifdef HAS_MERGEAR64ROW_AVX2 +static const lvec32 MergeAR64Permute = {0, 4, 2, 6, 1, 5, 3, 7}; +void MergeAR64Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width) { + int shift = 16 - depth; + int mask = (1 << depth) - 1; + mask = (mask << 16) + mask; + asm volatile( + + "sub %0,%1 \n" + "sub %0,%2 \n" + "sub %0,%3 \n" + "vmovdqa %8,%%ymm5 \n" + "vmovd %6,%%xmm6 \n" + "vbroadcastss %7,%%ymm7 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" // R + "vmovdqu (%0,%1),%%ymm1 \n" // G + "vmovdqu (%0,%2),%%ymm2 \n" // B + "vmovdqu (%0,%3),%%ymm3 \n" // A + "vpminuw %%ymm0,%%ymm7,%%ymm0 \n" + "vpminuw %%ymm1,%%ymm7,%%ymm1 \n" + "vpminuw %%ymm2,%%ymm7,%%ymm2 \n" + "vpminuw %%ymm3,%%ymm7,%%ymm3 \n" + "vpsllw %%xmm6,%%ymm0,%%ymm0 \n" + "vpsllw %%xmm6,%%ymm1,%%ymm1 \n" + "vpsllw %%xmm6,%%ymm2,%%ymm2 \n" + "vpsllw %%xmm6,%%ymm3,%%ymm3 \n" + "vpermd %%ymm0,%%ymm5,%%ymm0 \n" + "vpermd %%ymm1,%%ymm5,%%ymm1 \n" + "vpermd %%ymm2,%%ymm5,%%ymm2 \n" + "vpermd %%ymm3,%%ymm5,%%ymm3 \n" + "vpunpcklwd %%ymm1,%%ymm2,%%ymm4 \n" // BG(low) + "vpunpckhwd %%ymm1,%%ymm2,%%ymm1 \n" // BG(hi) + "vpunpcklwd %%ymm3,%%ymm0,%%ymm2 \n" // RA(low) + "vpunpckhwd %%ymm3,%%ymm0,%%ymm0 \n" // RA(hi) + "vpunpckldq %%ymm2,%%ymm4,%%ymm3 \n" // BGRA(1) + "vpunpckhdq %%ymm2,%%ymm4,%%ymm4 \n" // BGRA(3) + "vpunpckldq %%ymm0,%%ymm1,%%ymm2 \n" // BGRA(2) + "vpunpckhdq %%ymm0,%%ymm1,%%ymm1 \n" // BGRA(4) + "vmovdqu %%ymm3,(%4) \n" + "vmovdqu %%ymm2,0x20(%4) \n" + "vmovdqu %%ymm4,0x40(%4) \n" + "vmovdqu %%ymm1,0x60(%4) \n" + "lea 0x20(%0),%0 \n" + "lea 0x80(%4),%4 \n" + "subl $0x10,%5 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_ar64), // %4 +#if defined(__i386__) + "+m"(width) // %5 +#else + "+rm"(width) // %5 +#endif + : "m"(shift), // %6 + "m"(mask), // %7 + "m"(MergeAR64Permute) // %8 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} +#endif + +#ifdef HAS_MERGEXR64ROW_AVX2 +void MergeXR64Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width) { + int shift = 16 - depth; + int mask = (1 << depth) - 1; + mask = (mask << 16) + mask; + asm volatile( + + "sub %0,%1 \n" + "sub %0,%2 \n" + "vmovdqa %7,%%ymm5 \n" + "vmovd %5,%%xmm6 \n" + "vbroadcastss %6,%%ymm7 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" // R + "vmovdqu (%0,%1),%%ymm1 \n" // G + "vmovdqu (%0,%2),%%ymm2 \n" // B + "vpminuw %%ymm0,%%ymm7,%%ymm0 \n" + "vpminuw %%ymm1,%%ymm7,%%ymm1 \n" + "vpminuw %%ymm2,%%ymm7,%%ymm2 \n" + "vpsllw %%xmm6,%%ymm0,%%ymm0 \n" + "vpsllw %%xmm6,%%ymm1,%%ymm1 \n" + "vpsllw %%xmm6,%%ymm2,%%ymm2 \n" + "vpermd %%ymm0,%%ymm5,%%ymm0 \n" + "vpermd %%ymm1,%%ymm5,%%ymm1 \n" + "vpermd %%ymm2,%%ymm5,%%ymm2 \n" + "vpcmpeqb %%ymm3,%%ymm3,%%ymm3 \n" // A (0xffff) + "vpunpcklwd %%ymm1,%%ymm2,%%ymm4 \n" // BG(low) + "vpunpckhwd %%ymm1,%%ymm2,%%ymm1 \n" // BG(hi) + "vpunpcklwd %%ymm3,%%ymm0,%%ymm2 \n" // RA(low) + "vpunpckhwd %%ymm3,%%ymm0,%%ymm0 \n" // RA(hi) + "vpunpckldq %%ymm2,%%ymm4,%%ymm3 \n" // BGRA(1) + "vpunpckhdq %%ymm2,%%ymm4,%%ymm4 \n" // BGRA(3) + "vpunpckldq %%ymm0,%%ymm1,%%ymm2 \n" // BGRA(2) + "vpunpckhdq %%ymm0,%%ymm1,%%ymm1 \n" // BGRA(4) + "vmovdqu %%ymm3,(%3) \n" + "vmovdqu %%ymm2,0x20(%3) \n" + "vmovdqu %%ymm4,0x40(%3) \n" + "vmovdqu %%ymm1,0x60(%3) \n" + "lea 0x20(%0),%0 \n" + "lea 0x80(%3),%3 \n" + "subl $0x10,%4 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_ar64), // %3 + "+r"(width) // %4 + : "m"(shift), // %5 + "m"(mask), // %6 + "m"(MergeAR64Permute) // %7 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} +#endif + +#ifdef HAS_MERGEARGB16TO8ROW_AVX2 +static const uvec8 MergeARGB16To8Shuffle = {0, 8, 1, 9, 2, 10, 3, 11, + 4, 12, 5, 13, 6, 14, 7, 15}; +void MergeARGB16To8Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width) { + int shift = depth - 8; + asm volatile( + + "sub %0,%1 \n" + "sub %0,%2 \n" + "sub %0,%3 \n" + "vbroadcastf128 %7,%%ymm5 \n" + "vmovd %6,%%xmm6 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" // R + "vmovdqu (%0,%1),%%ymm1 \n" // G + "vmovdqu (%0,%2),%%ymm2 \n" // B + "vmovdqu (%0,%3),%%ymm3 \n" // A + "vpsrlw %%xmm6,%%ymm0,%%ymm0 \n" + "vpsrlw %%xmm6,%%ymm1,%%ymm1 \n" + "vpsrlw %%xmm6,%%ymm2,%%ymm2 \n" + "vpsrlw %%xmm6,%%ymm3,%%ymm3 \n" + "vpackuswb %%ymm1,%%ymm2,%%ymm1 \n" // BG (planar) + "vpackuswb %%ymm3,%%ymm0,%%ymm0 \n" // RA (planar) + "vpshufb %%ymm5,%%ymm1,%%ymm1 \n" // BG (interleave) + "vpshufb %%ymm5,%%ymm0,%%ymm0 \n" // RA (interleave) + "vpermq $0xd8,%%ymm1,%%ymm1 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpunpcklwd %%ymm0,%%ymm1,%%ymm2 \n" // BGRA (low) + "vpunpckhwd %%ymm0,%%ymm1,%%ymm0 \n" // BGRA (hi) + "vmovdqu %%ymm2,(%4) \n" + "vmovdqu %%ymm0,0x20(%4) \n" + "lea 0x20(%0),%0 \n" + "lea 0x40(%4),%4 \n" + "subl $0x10,%5 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_argb), // %4 +#if defined(__i386__) + "+m"(width) // %5 +#else + "+rm"(width) // %5 +#endif + : "m"(shift), // %6 + "m"(MergeARGB16To8Shuffle) // %7 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + +#ifdef HAS_MERGEXRGB16TO8ROW_AVX2 +void MergeXRGB16To8Row_AVX2(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width) { + int shift = depth - 8; + asm volatile( + + "sub %0,%1 \n" + "sub %0,%2 \n" + "vbroadcastf128 %6,%%ymm5 \n" + "vmovd %5,%%xmm6 \n" + "vpcmpeqb %%ymm3,%%ymm3,%%ymm3 \n" + "vpsrlw $8,%%ymm3,%%ymm3 \n" // A (0xff) + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" // R + "vmovdqu (%0,%1),%%ymm1 \n" // G + "vmovdqu (%0,%2),%%ymm2 \n" // B + "vpsrlw %%xmm6,%%ymm0,%%ymm0 \n" + "vpsrlw %%xmm6,%%ymm1,%%ymm1 \n" + "vpsrlw %%xmm6,%%ymm2,%%ymm2 \n" + "vpackuswb %%ymm1,%%ymm2,%%ymm1 \n" // BG (planar) + "vpackuswb %%ymm3,%%ymm0,%%ymm0 \n" // RA (planar) + "vpshufb %%ymm5,%%ymm1,%%ymm1 \n" // BG (interleave) + "vpshufb %%ymm5,%%ymm0,%%ymm0 \n" // RA (interleave) + "vpermq $0xd8,%%ymm1,%%ymm1 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpunpcklwd %%ymm0,%%ymm1,%%ymm2 \n" // BGRA (low) + "vpunpckhwd %%ymm0,%%ymm1,%%ymm0 \n" // BGRA (hi) + "vmovdqu %%ymm2,(%3) \n" + "vmovdqu %%ymm0,0x20(%3) \n" + "lea 0x20(%0),%0 \n" + "lea 0x40(%3),%3 \n" + "subl $0x10,%4 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_argb), // %3 + "+r"(width) // %4 + : "m"(shift), // %5 + "m"(MergeARGB16To8Shuffle) // %6 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + #ifdef HAS_COPYROW_SSE2 void CopyRow_SSE2(const uint8_t* src, uint8_t* dst, int width) { asm volatile( @@ -4693,7 +6716,7 @@ static const uvec8 kShuffleAlpha = {3u, 0x80, 3u, 0x80, 7u, 0x80, 7u, 0x80, 11u, 0x80, 11u, 0x80, 15u, 0x80, 15u, 0x80}; // Blend 8 pixels at a time -void ARGBBlendRow_SSSE3(const uint8_t* src_argb0, +void ARGBBlendRow_SSSE3(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -4764,7 +6787,7 @@ void ARGBBlendRow_SSSE3(const uint8_t* src_argb0, "sub $0x1,%3 \n" "jge 91b \n" "99: \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -5366,7 +7389,7 @@ void ARGBShadeRow_SSE2(const uint8_t* src_argb, #ifdef HAS_ARGBMULTIPLYROW_SSE2 // Multiply 2 rows of ARGB pixels together, 4 pixels at a time. -void ARGBMultiplyRow_SSE2(const uint8_t* src_argb0, +void ARGBMultiplyRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -5394,7 +7417,7 @@ void ARGBMultiplyRow_SSE2(const uint8_t* src_argb0, "lea 0x10(%2),%2 \n" "sub $0x4,%3 \n" "jg 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -5405,7 +7428,7 @@ void ARGBMultiplyRow_SSE2(const uint8_t* src_argb0, #ifdef HAS_ARGBMULTIPLYROW_AVX2 // Multiply 2 rows of ARGB pixels together, 8 pixels at a time. -void ARGBMultiplyRow_AVX2(const uint8_t* src_argb0, +void ARGBMultiplyRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -5432,23 +7455,18 @@ void ARGBMultiplyRow_AVX2(const uint8_t* src_argb0, "sub $0x8,%3 \n" "jg 1b \n" "vzeroupper \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 : - : "memory", "cc" -#if defined(__AVX2__) - , - "xmm0", "xmm1", "xmm2", "xmm3", "xmm5" -#endif - ); + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); } #endif // HAS_ARGBMULTIPLYROW_AVX2 #ifdef HAS_ARGBADDROW_SSE2 // Add 2 rows of ARGB pixels together, 4 pixels at a time. -void ARGBAddRow_SSE2(const uint8_t* src_argb0, +void ARGBAddRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -5465,7 +7483,7 @@ void ARGBAddRow_SSE2(const uint8_t* src_argb0, "lea 0x10(%2),%2 \n" "sub $0x4,%3 \n" "jg 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -5476,7 +7494,7 @@ void ARGBAddRow_SSE2(const uint8_t* src_argb0, #ifdef HAS_ARGBADDROW_AVX2 // Add 2 rows of ARGB pixels together, 4 pixels at a time. -void ARGBAddRow_AVX2(const uint8_t* src_argb0, +void ARGBAddRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -5493,7 +7511,7 @@ void ARGBAddRow_AVX2(const uint8_t* src_argb0, "sub $0x8,%3 \n" "jg 1b \n" "vzeroupper \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -5504,7 +7522,7 @@ void ARGBAddRow_AVX2(const uint8_t* src_argb0, #ifdef HAS_ARGBSUBTRACTROW_SSE2 // Subtract 2 rows of ARGB pixels, 4 pixels at a time. -void ARGBSubtractRow_SSE2(const uint8_t* src_argb0, +void ARGBSubtractRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -5521,7 +7539,7 @@ void ARGBSubtractRow_SSE2(const uint8_t* src_argb0, "lea 0x10(%2),%2 \n" "sub $0x4,%3 \n" "jg 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -5532,7 +7550,7 @@ void ARGBSubtractRow_SSE2(const uint8_t* src_argb0, #ifdef HAS_ARGBSUBTRACTROW_AVX2 // Subtract 2 rows of ARGB pixels, 8 pixels at a time. -void ARGBSubtractRow_AVX2(const uint8_t* src_argb0, +void ARGBSubtractRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -5549,7 +7567,7 @@ void ARGBSubtractRow_AVX2(const uint8_t* src_argb0, "sub $0x8,%3 \n" "jg 1b \n" "vzeroupper \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -6638,7 +8656,7 @@ void HalfFloatRow_AVX2(const uint16_t* src, #if defined(__x86_64__) : "x"(scale) // %3 #else - : "m"(scale) // %3 + : "m"(scale) // %3 #endif : "memory", "cc", "xmm2", "xmm3", "xmm4", "xmm5"); } @@ -6676,7 +8694,7 @@ void HalfFloatRow_F16C(const uint16_t* src, #if defined(__x86_64__) : "x"(scale) // %3 #else - : "m"(scale) // %3 + : "m"(scale) // %3 #endif : "memory", "cc", "xmm2", "xmm3", "xmm4"); } diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/row_mmi.cc b/third-party/libyuv/third_party/libyuv/source/row_mmi.cc similarity index 96% rename from third-party/webrtc/dependencies/third_party/libyuv/source/row_mmi.cc rename to third-party/libyuv/third_party/libyuv/source/row_mmi.cc index 9a8e2cb2d1..362fd1cfcc 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/row_mmi.cc +++ b/third-party/libyuv/third_party/libyuv/source/row_mmi.cc @@ -605,7 +605,7 @@ void ARGBToARGB4444Row_MMI(const uint8_t* src_argb, : "memory"); } -void ARGBToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void ARGBToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) { uint64_t src, src_hi, src_lo; uint64_t dest0, dest1, dest2, dest3; const uint64_t value = 0x1080; @@ -613,8 +613,8 @@ void ARGBToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { __asm__ volatile( "1: \n\t" - "gsldlc1 %[src], 0x07(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x00(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x07(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x00(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -626,8 +626,8 @@ void ARGBToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest0], %[dest0], %[src] \n\t" "psrlw %[dest0], %[dest0], %[eight] \n\t" - "gsldlc1 %[src], 0x0f(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x08(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x0f(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x08(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -639,8 +639,8 @@ void ARGBToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest1], %[dest1], %[src] \n\t" "psrlw %[dest1], %[dest1], %[eight] \n\t" - "gsldlc1 %[src], 0x17(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x10(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x17(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x10(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -652,8 +652,8 @@ void ARGBToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest2], %[dest2], %[src] \n\t" "psrlw %[dest2], %[dest2], %[eight] \n\t" - "gsldlc1 %[src], 0x1f(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x18(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x1f(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x18(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -671,20 +671,20 @@ void ARGBToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t" "gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t" - "daddiu %[src_argb0], %[src_argb0], 0x20 \n\t" + "daddiu %[src_argb], %[src_argb], 0x20 \n\t" "daddiu %[dst_y], %[dst_y], 0x08 \n\t" "daddi %[width], %[width], -0x08 \n\t" "bnez %[width], 1b \n\t" : [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo), [dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2), [dest3] "=&f"(dest3) - : [src_argb0] "r"(src_argb0), [dst_y] "r"(dst_y), [width] "r"(width), + : [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width), [mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08), [zero] "f"(0x00) : "memory"); } -void ARGBToUVRow_MMI(const uint8_t* src_rgb0, +void ARGBToUVRow_MMI(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, @@ -700,9 +700,9 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "dli %[tmp0], 0x0001000100010001 \n\t" "dmtc1 %[tmp0], %[ftmp12] \n\t" "1: \n\t" - "daddu %[src_rgb1], %[src_rgb0], %[src_stride_rgb] \n\t" - "gsldrc1 %[src0], 0x00(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x07(%[src_rgb0]) \n\t" + "daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t" + "gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -720,8 +720,8 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t" "pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x08(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x0f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -748,8 +748,8 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest0_v], %[src1], %[src0] \n\t" "psraw %[dest0_v], %[dest0_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x10(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x17(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -767,8 +767,8 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t" "pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x18(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x1f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -795,8 +795,8 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest1_v], %[src1], %[src0] \n\t" "psraw %[dest1_v], %[dest1_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x20(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x27(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -814,8 +814,8 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t" "pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x28(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x2f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -842,8 +842,8 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest2_v], %[src1], %[src0] \n\t" "psraw %[dest2_v], %[dest2_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x30(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x37(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -861,8 +861,8 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t" "pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x38(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x3f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -901,7 +901,7 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, "gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t" "gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t" - "daddiu %[src_rgb0], %[src_rgb0], 0x40 \n\t" + "daddiu %[src_rgb], %[src_rgb], 0x40 \n\t" "daddiu %[dst_u], %[dst_u], 0x08 \n\t" "daddiu %[dst_v], %[dst_v], 0x08 \n\t" "daddi %[width], %[width], -0x10 \n\t" @@ -913,7 +913,7 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, [dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]), [dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0]) - : [src_rgb0] "r"(src_rgb0), [src_stride_rgb] "r"(src_stride_rgb), + : [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb), [dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width), [mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value), [zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01), @@ -921,7 +921,7 @@ void ARGBToUVRow_MMI(const uint8_t* src_rgb0, : "memory"); } -void BGRAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void BGRAToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) { uint64_t src, src_hi, src_lo; uint64_t dest0, dest1, dest2, dest3; const uint64_t value = 0x1080; @@ -929,8 +929,8 @@ void BGRAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { __asm__ volatile( "1: \n\t" - "gsldlc1 %[src], 0x07(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x00(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x07(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x00(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -942,8 +942,8 @@ void BGRAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest0], %[dest0], %[src] \n\t" "psrlw %[dest0], %[dest0], %[eight] \n\t" - "gsldlc1 %[src], 0x0f(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x08(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x0f(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x08(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -955,8 +955,8 @@ void BGRAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest1], %[dest1], %[src] \n\t" "psrlw %[dest1], %[dest1], %[eight] \n\t" - "gsldlc1 %[src], 0x17(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x10(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x17(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x10(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -968,8 +968,8 @@ void BGRAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest2], %[dest2], %[src] \n\t" "psrlw %[dest2], %[dest2], %[eight] \n\t" - "gsldlc1 %[src], 0x1f(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x18(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x1f(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x18(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -987,20 +987,20 @@ void BGRAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t" "gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t" - "daddiu %[src_argb0], %[src_argb0], 0x20 \n\t" + "daddiu %[src_argb], %[src_argb], 0x20 \n\t" "daddiu %[dst_y], %[dst_y], 0x08 \n\t" "daddi %[width], %[width], -0x08 \n\t" "bnez %[width], 1b \n\t" : [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo), [dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2), [dest3] "=&f"(dest3) - : [src_argb0] "r"(src_argb0), [dst_y] "r"(dst_y), [width] "r"(width), + : [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width), [mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08), [zero] "f"(0x00) : "memory"); } -void BGRAToUVRow_MMI(const uint8_t* src_rgb0, +void BGRAToUVRow_MMI(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, @@ -1016,9 +1016,9 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "dli %[tmp0], 0x0001000100010001 \n\t" "dmtc1 %[tmp0], %[ftmp12] \n\t" "1: \n\t" - "daddu %[src_rgb1], %[src_rgb0], %[src_stride_rgb] \n\t" - "gsldrc1 %[src0], 0x00(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x07(%[src_rgb0]) \n\t" + "daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t" + "gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1036,8 +1036,8 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t" "pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x08(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x0f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1064,8 +1064,8 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest0_v], %[src0], %[src1] \n\t" "psraw %[dest0_v], %[dest0_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x10(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x17(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1083,8 +1083,8 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t" "pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x18(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x1f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1111,8 +1111,8 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest1_v], %[src0], %[src1] \n\t" "psraw %[dest1_v], %[dest1_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x20(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x27(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1130,8 +1130,8 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t" "pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x28(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x2f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1158,8 +1158,8 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest2_v], %[src0], %[src1] \n\t" "psraw %[dest2_v], %[dest2_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x30(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x37(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1177,8 +1177,8 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t" "pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x38(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x3f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1217,7 +1217,7 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, "gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t" "gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t" - "daddiu %[src_rgb0], %[src_rgb0], 0x40 \n\t" + "daddiu %[src_rgb], %[src_rgb], 0x40 \n\t" "daddiu %[dst_u], %[dst_u], 0x08 \n\t" "daddiu %[dst_v], %[dst_v], 0x08 \n\t" "daddi %[width], %[width], -0x10 \n\t" @@ -1229,7 +1229,7 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, [dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]), [dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0]) - : [src_rgb0] "r"(src_rgb0), [src_stride_rgb] "r"(src_stride_rgb), + : [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb), [dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width), [mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value), [zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01), @@ -1237,7 +1237,7 @@ void BGRAToUVRow_MMI(const uint8_t* src_rgb0, : "memory"); } -void ABGRToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void ABGRToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) { uint64_t src, src_hi, src_lo; uint64_t dest0, dest1, dest2, dest3; const uint64_t value = 0x1080; @@ -1245,8 +1245,8 @@ void ABGRToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { __asm__ volatile( "1: \n\t" - "gsldlc1 %[src], 0x07(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x00(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x07(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x00(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1258,8 +1258,8 @@ void ABGRToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest0], %[dest0], %[src] \n\t" "psrlw %[dest0], %[dest0], %[eight] \n\t" - "gsldlc1 %[src], 0x0f(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x08(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x0f(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x08(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1271,8 +1271,8 @@ void ABGRToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest1], %[dest1], %[src] \n\t" "psrlw %[dest1], %[dest1], %[eight] \n\t" - "gsldlc1 %[src], 0x17(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x10(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x17(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x10(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1284,8 +1284,8 @@ void ABGRToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest2], %[dest2], %[src] \n\t" "psrlw %[dest2], %[dest2], %[eight] \n\t" - "gsldlc1 %[src], 0x1f(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x18(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x1f(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x18(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1303,20 +1303,20 @@ void ABGRToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t" "gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t" - "daddiu %[src_argb0], %[src_argb0], 0x20 \n\t" + "daddiu %[src_argb], %[src_argb], 0x20 \n\t" "daddiu %[dst_y], %[dst_y], 0x08 \n\t" "daddi %[width], %[width], -0x08 \n\t" "bnez %[width], 1b \n\t" : [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo), [dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2), [dest3] "=&f"(dest3) - : [src_argb0] "r"(src_argb0), [dst_y] "r"(dst_y), [width] "r"(width), + : [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width), [mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08), [zero] "f"(0x00) : "memory"); } -void ABGRToUVRow_MMI(const uint8_t* src_rgb0, +void ABGRToUVRow_MMI(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, @@ -1332,9 +1332,9 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "dli %[tmp0], 0x0001000100010001 \n\t" "dmtc1 %[tmp0], %[ftmp12] \n\t" "1: \n\t" - "daddu %[src_rgb1], %[src_rgb0], %[src_stride_rgb] \n\t" - "gsldrc1 %[src0], 0x00(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x07(%[src_rgb0]) \n\t" + "daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t" + "gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1352,8 +1352,8 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t" "pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x08(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x0f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1380,8 +1380,8 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest0_v], %[src0], %[src1] \n\t" "psraw %[dest0_v], %[dest0_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x10(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x17(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1399,8 +1399,8 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t" "pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x18(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x1f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1427,8 +1427,8 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest1_v], %[src0], %[src1] \n\t" "psraw %[dest1_v], %[dest1_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x20(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x27(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1446,8 +1446,8 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t" "pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x28(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x2f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1474,8 +1474,8 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest2_v], %[src0], %[src1] \n\t" "psraw %[dest2_v], %[dest2_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x30(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x37(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1493,8 +1493,8 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t" "pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x38(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x3f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1533,7 +1533,7 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, "gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t" "gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t" - "daddiu %[src_rgb0], %[src_rgb0], 0x40 \n\t" + "daddiu %[src_rgb], %[src_rgb], 0x40 \n\t" "daddiu %[dst_u], %[dst_u], 0x08 \n\t" "daddiu %[dst_v], %[dst_v], 0x08 \n\t" "daddi %[width], %[width], -0x10 \n\t" @@ -1545,7 +1545,7 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, [dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]), [dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0]) - : [src_rgb0] "r"(src_rgb0), [src_stride_rgb] "r"(src_stride_rgb), + : [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb), [dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width), [mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value), [zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01), @@ -1553,7 +1553,7 @@ void ABGRToUVRow_MMI(const uint8_t* src_rgb0, : "memory"); } -void RGBAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void RGBAToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) { uint64_t src, src_hi, src_lo; uint64_t dest0, dest1, dest2, dest3; const uint64_t value = 0x1080; @@ -1561,8 +1561,8 @@ void RGBAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { __asm__ volatile( "1: \n\t" - "gsldlc1 %[src], 0x07(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x00(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x07(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x00(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1574,8 +1574,8 @@ void RGBAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest0], %[dest0], %[src] \n\t" "psrlw %[dest0], %[dest0], %[eight] \n\t" - "gsldlc1 %[src], 0x0f(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x08(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x0f(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x08(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1587,8 +1587,8 @@ void RGBAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest1], %[dest1], %[src] \n\t" "psrlw %[dest1], %[dest1], %[eight] \n\t" - "gsldlc1 %[src], 0x17(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x10(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x17(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x10(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1600,8 +1600,8 @@ void RGBAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest2], %[dest2], %[src] \n\t" "psrlw %[dest2], %[dest2], %[eight] \n\t" - "gsldlc1 %[src], 0x1f(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x18(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x1f(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x18(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_0 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1619,20 +1619,20 @@ void RGBAToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t" "gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t" - "daddiu %[src_argb0], %[src_argb0], 0x20 \n\t" + "daddiu %[src_argb], %[src_argb], 0x20 \n\t" "daddiu %[dst_y], %[dst_y], 0x08 \n\t" "daddi %[width], %[width], -0x08 \n\t" "bnez %[width], 1b \n\t" : [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo), [dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2), [dest3] "=&f"(dest3) - : [src_argb0] "r"(src_argb0), [dst_y] "r"(dst_y), [width] "r"(width), + : [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width), [mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08), [zero] "f"(0x00) : "memory"); } -void RGBAToUVRow_MMI(const uint8_t* src_rgb0, +void RGBAToUVRow_MMI(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, @@ -1648,9 +1648,9 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "dli %[tmp0], 0x0001000100010001 \n\t" "dmtc1 %[tmp0], %[ftmp12] \n\t" "1: \n\t" - "daddu %[src_rgb1], %[src_rgb0], %[src_stride_rgb] \n\t" - "gsldrc1 %[src0], 0x00(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x07(%[src_rgb0]) \n\t" + "daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t" + "gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1668,8 +1668,8 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t" "pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x08(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x0f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1696,8 +1696,8 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest0_v], %[src1], %[src0] \n\t" "psraw %[dest0_v], %[dest0_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x10(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x17(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1715,8 +1715,8 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t" "pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x18(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x1f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1743,8 +1743,8 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest1_v], %[src1], %[src0] \n\t" "psraw %[dest1_v], %[dest1_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x20(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x27(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1762,8 +1762,8 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t" "pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x28(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x2f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1790,8 +1790,8 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest2_v], %[src1], %[src0] \n\t" "psraw %[dest2_v], %[dest2_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x30(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x37(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1809,8 +1809,8 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t" "pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x38(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x3f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1849,7 +1849,7 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, "gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t" "gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t" - "daddiu %[src_rgb0], %[src_rgb0], 0x40 \n\t" + "daddiu %[src_rgb], %[src_rgb], 0x40 \n\t" "daddiu %[dst_u], %[dst_u], 0x08 \n\t" "daddiu %[dst_v], %[dst_v], 0x08 \n\t" "daddi %[width], %[width], -0x10 \n\t" @@ -1861,7 +1861,7 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, [dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]), [dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0]) - : [src_rgb0] "r"(src_rgb0), [src_stride_rgb] "r"(src_stride_rgb), + : [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb), [dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width), [mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value), [zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01), @@ -1869,7 +1869,7 @@ void RGBAToUVRow_MMI(const uint8_t* src_rgb0, : "memory"); } -void RGB24ToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void RGB24ToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) { uint64_t src, src_hi, src_lo; uint64_t dest0, dest1, dest2, dest3; const uint64_t value = 0x1080; @@ -1877,8 +1877,8 @@ void RGB24ToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { __asm__ volatile( "1: \n\t" - "gsldlc1 %[src], 0x07(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x00(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x07(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x00(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1891,8 +1891,8 @@ void RGB24ToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest0], %[dest0], %[src] \n\t" "psrlw %[dest0], %[dest0], %[eight] \n\t" - "gsldlc1 %[src], 0x0d(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x06(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x0d(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x06(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1905,8 +1905,8 @@ void RGB24ToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest1], %[dest1], %[src] \n\t" "psrlw %[dest1], %[dest1], %[eight] \n\t" - "gsldlc1 %[src], 0x13(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x0c(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x13(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x0c(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1919,8 +1919,8 @@ void RGB24ToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest2], %[dest2], %[src] \n\t" "psrlw %[dest2], %[dest2], %[eight] \n\t" - "gsldlc1 %[src], 0x19(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x12(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x19(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x12(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -1939,20 +1939,20 @@ void RGB24ToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t" "gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t" - "daddiu %[src_argb0], %[src_argb0], 0x18 \n\t" + "daddiu %[src_argb], %[src_argb], 0x18 \n\t" "daddiu %[dst_y], %[dst_y], 0x08 \n\t" "daddi %[width], %[width], -0x08 \n\t" "bnez %[width], 1b \n\t" : [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo), [dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2), [dest3] "=&f"(dest3) - : [src_argb0] "r"(src_argb0), [dst_y] "r"(dst_y), [width] "r"(width), + : [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width), [mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08), [zero] "f"(0x00) : "memory"); } -void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, +void RGB24ToUVRow_MMI(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, @@ -1968,9 +1968,9 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "dli %[tmp0], 0x0001000100010001 \n\t" "dmtc1 %[tmp0], %[ftmp12] \n\t" "1: \n\t" - "daddu %[src_rgb1], %[src_rgb0], %[src_stride_rgb] \n\t" - "gsldrc1 %[src0], 0x00(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x07(%[src_rgb0]) \n\t" + "daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t" + "gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -1990,8 +1990,8 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t" "pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x06(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x0d(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x06(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x0d(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x06(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x0d(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2020,8 +2020,8 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest0_v], %[src1], %[src0] \n\t" "psraw %[dest0_v], %[dest0_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x0c(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x13(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x0c(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x13(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x0c(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x13(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2041,8 +2041,8 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t" "pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x12(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x19(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x12(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x19(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x12(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x19(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2071,8 +2071,8 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest1_v], %[src1], %[src0] \n\t" "psraw %[dest1_v], %[dest1_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x18(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x1f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2092,8 +2092,8 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t" "pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x1e(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x25(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x1e(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x25(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x1e(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x25(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2122,8 +2122,8 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest2_v], %[src1], %[src0] \n\t" "psraw %[dest2_v], %[dest2_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x24(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x2b(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x24(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x2b(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x24(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x2b(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2143,8 +2143,8 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t" "pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x2a(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x31(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x2a(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x31(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x2a(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x31(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2185,7 +2185,7 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, "gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t" "gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t" - "daddiu %[src_rgb0], %[src_rgb0], 0x30 \n\t" + "daddiu %[src_rgb], %[src_rgb], 0x30 \n\t" "daddiu %[dst_u], %[dst_u], 0x08 \n\t" "daddiu %[dst_v], %[dst_v], 0x08 \n\t" "daddi %[width], %[width], -0x10 \n\t" @@ -2197,7 +2197,7 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, [dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]), [dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0]) - : [src_rgb0] "r"(src_rgb0), [src_stride_rgb] "r"(src_stride_rgb), + : [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb), [dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width), [mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value), [zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01), @@ -2205,7 +2205,7 @@ void RGB24ToUVRow_MMI(const uint8_t* src_rgb0, : "memory"); } -void RAWToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void RAWToYRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) { uint64_t src, src_hi, src_lo; uint64_t dest0, dest1, dest2, dest3; const uint64_t value = 0x1080; @@ -2213,8 +2213,8 @@ void RAWToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { __asm__ volatile( "1: \n\t" - "gsldlc1 %[src], 0x07(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x00(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x07(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x00(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -2227,8 +2227,8 @@ void RAWToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest0], %[dest0], %[src] \n\t" "psrlw %[dest0], %[dest0], %[eight] \n\t" - "gsldlc1 %[src], 0x0d(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x06(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x0d(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x06(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -2241,8 +2241,8 @@ void RAWToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest1], %[dest1], %[src] \n\t" "psrlw %[dest1], %[dest1], %[eight] \n\t" - "gsldlc1 %[src], 0x13(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x0c(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x13(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x0c(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -2255,8 +2255,8 @@ void RAWToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "paddw %[dest2], %[dest2], %[src] \n\t" "psrlw %[dest2], %[dest2], %[eight] \n\t" - "gsldlc1 %[src], 0x19(%[src_argb0]) \n\t" - "gsldrc1 %[src], 0x12(%[src_argb0]) \n\t" + "gsldlc1 %[src], 0x19(%[src_argb]) \n\t" + "gsldrc1 %[src], 0x12(%[src_argb]) \n\t" "punpcklbh %[src_lo], %[src], %[zero] \n\t" "pinsrh_3 %[src_lo], %[src_lo], %[value] \n\t" "pmaddhw %[src_lo], %[src_lo], %[mask] \n\t" @@ -2275,20 +2275,20 @@ void RAWToYRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { "gssdlc1 %[dest0], 0x07(%[dst_y]) \n\t" "gssdrc1 %[dest0], 0x00(%[dst_y]) \n\t" - "daddiu %[src_argb0], %[src_argb0], 0x18 \n\t" + "daddiu %[src_argb], %[src_argb], 0x18 \n\t" "daddiu %[dst_y], %[dst_y], 0x08 \n\t" "daddi %[width], %[width], -0x08 \n\t" "bnez %[width], 1b \n\t" : [src] "=&f"(src), [src_hi] "=&f"(src_hi), [src_lo] "=&f"(src_lo), [dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2), [dest3] "=&f"(dest3) - : [src_argb0] "r"(src_argb0), [dst_y] "r"(dst_y), [width] "r"(width), + : [src_argb] "r"(src_argb), [dst_y] "r"(dst_y), [width] "r"(width), [mask] "f"(mask), [value] "f"(value), [eight] "f"(0x08), [zero] "f"(0x00) : "memory"); } -void RAWToUVRow_MMI(const uint8_t* src_rgb0, +void RAWToUVRow_MMI(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, @@ -2304,9 +2304,9 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "dli %[tmp0], 0x0001000100010001 \n\t" "dmtc1 %[tmp0], %[ftmp12] \n\t" "1: \n\t" - "daddu %[src_rgb1], %[src_rgb0], %[src_stride_rgb] \n\t" - "gsldrc1 %[src0], 0x00(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x07(%[src_rgb0]) \n\t" + "daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t" + "gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2326,8 +2326,8 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t" "pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x06(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x0d(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x06(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x0d(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x06(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x0d(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2356,8 +2356,8 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest0_v], %[src0], %[src1] \n\t" "psraw %[dest0_v], %[dest0_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x0c(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x13(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x0c(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x13(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x0c(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x13(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2377,8 +2377,8 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t" "pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x12(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x19(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x12(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x19(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x12(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x19(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2407,8 +2407,8 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest1_v], %[src0], %[src1] \n\t" "psraw %[dest1_v], %[dest1_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x18(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x1f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2428,8 +2428,8 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t" "pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x1e(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x25(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x1e(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x25(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x1e(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x25(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2458,8 +2458,8 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "psubw %[dest2_v], %[src0], %[src1] \n\t" "psraw %[dest2_v], %[dest2_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x24(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x2b(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x24(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x2b(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x24(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x2b(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2479,8 +2479,8 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t" "pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x2a(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x31(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x2a(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x31(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x2a(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x31(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2521,7 +2521,7 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, "gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t" "gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t" - "daddiu %[src_rgb0], %[src_rgb0], 0x30 \n\t" + "daddiu %[src_rgb], %[src_rgb], 0x30 \n\t" "daddiu %[dst_u], %[dst_u], 0x08 \n\t" "daddiu %[dst_v], %[dst_v], 0x08 \n\t" "daddi %[width], %[width], -0x10 \n\t" @@ -2533,7 +2533,7 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, [dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]), [dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]), [ftmp12] "=&f"(ftmp[12]), [tmp0] "=&r"(tmp[0]) - : [src_rgb0] "r"(src_rgb0), [src_stride_rgb] "r"(src_stride_rgb), + : [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb), [dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width), [mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value), [zero] "f"(0x00), [eight] "f"(0x08), [one] "f"(0x01), @@ -2541,7 +2541,7 @@ void RAWToUVRow_MMI(const uint8_t* src_rgb0, : "memory"); } -void ARGBToYJRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void ARGBToYJRow_MMI(const uint8_t* src_argb, uint8_t* dst_y, int width) { uint64_t src, src_hi, src_lo; uint64_t dest, dest0, dest1, dest2, dest3; uint64_t tmp0, tmp1; @@ -2618,13 +2618,13 @@ void ARGBToYJRow_MMI(const uint8_t* src_argb0, uint8_t* dst_y, int width) { [src_lo] "=&f"(src_lo), [dest0] "=&f"(dest0), [dest1] "=&f"(dest1), [dest2] "=&f"(dest2), [dest3] "=&f"(dest3), [tmp0] "=&f"(tmp0), [tmp1] "=&f"(tmp1) - : [src_ptr] "r"(src_argb0), [dst_ptr] "r"(dst_y), [mask0] "f"(mask0), + : [src_ptr] "r"(src_argb), [dst_ptr] "r"(dst_y), [mask0] "f"(mask0), [mask1] "f"(mask1), [shift] "f"(shift), [value] "f"(value), [width] "r"(width) : "memory"); } -void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, +void ARGBToUVJRow_MMI(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, @@ -2637,9 +2637,9 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, __asm__ volatile( "1: \n\t" - "daddu %[src_rgb1], %[src_rgb0], %[src_stride_rgb] \n\t" - "gsldrc1 %[src0], 0x00(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x07(%[src_rgb0]) \n\t" + "daddu %[src_rgb1], %[src_rgb], %[src_stride_rgb] \n\t" + "gsldrc1 %[src0], 0x00(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x07(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x00(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x07(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2655,8 +2655,8 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest0_u], %[dest0_u], %[mask_u] \n\t" "pmaddhw %[dest0_v], %[dest0_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x08(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x0f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x08(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x0f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x08(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x0f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2681,8 +2681,8 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, "psubw %[dest0_v], %[src1], %[src0] \n\t" "psraw %[dest0_v], %[dest0_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x10(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x17(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x10(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x17(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x10(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x17(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2698,8 +2698,8 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest1_u], %[dest1_u], %[mask_u] \n\t" "pmaddhw %[dest1_v], %[dest1_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x18(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x1f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x18(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x1f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x18(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x1f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2724,8 +2724,8 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, "psubw %[dest1_v], %[src1], %[src0] \n\t" "psraw %[dest1_v], %[dest1_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x20(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x27(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x20(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x27(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x20(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x27(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2741,8 +2741,8 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest2_u], %[dest2_u], %[mask_u] \n\t" "pmaddhw %[dest2_v], %[dest2_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x28(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x2f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x28(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x2f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x28(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x2f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2767,8 +2767,8 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, "psubw %[dest2_v], %[src1], %[src0] \n\t" "psraw %[dest2_v], %[dest2_v], %[eight] \n\t" - "gsldrc1 %[src0], 0x30(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x37(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x30(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x37(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x30(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x37(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2784,8 +2784,8 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, "pmaddhw %[dest3_u], %[dest3_u], %[mask_u] \n\t" "pmaddhw %[dest3_v], %[dest3_v], %[mask_v] \n\t" - "gsldrc1 %[src0], 0x38(%[src_rgb0]) \n\t" - "gsldlc1 %[src0], 0x3f(%[src_rgb0]) \n\t" + "gsldrc1 %[src0], 0x38(%[src_rgb]) \n\t" + "gsldlc1 %[src0], 0x3f(%[src_rgb]) \n\t" "gsldrc1 %[src1], 0x38(%[src_rgb1]) \n\t" "gsldlc1 %[src1], 0x3f(%[src_rgb1]) \n\t" "punpcklbh %[src_lo], %[src0], %[zero] \n\t" @@ -2822,7 +2822,7 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, "gssdlc1 %[dest0_v], 0x07(%[dst_v]) \n\t" "gssdrc1 %[dest0_v], 0x00(%[dst_v]) \n\t" - "daddiu %[src_rgb0], %[src_rgb0], 0x40 \n\t" + "daddiu %[src_rgb], %[src_rgb], 0x40 \n\t" "daddiu %[dst_u], %[dst_u], 0x08 \n\t" "daddiu %[dst_v], %[dst_v], 0x08 \n\t" "daddi %[width], %[width], -0x10 \n\t" @@ -2833,7 +2833,7 @@ void ARGBToUVJRow_MMI(const uint8_t* src_rgb0, [dest1_u] "=&f"(ftmp[6]), [dest1_v] "=&f"(ftmp[7]), [dest2_u] "=&f"(ftmp[8]), [dest2_v] "=&f"(ftmp[9]), [dest3_u] "=&f"(ftmp[10]), [dest3_v] "=&f"(ftmp[11]) - : [src_rgb0] "r"(src_rgb0), [src_stride_rgb] "r"(src_stride_rgb), + : [src_rgb] "r"(src_rgb), [src_stride_rgb] "r"(src_stride_rgb), [dst_u] "r"(dst_u), [dst_v] "r"(dst_v), [width] "r"(width), [mask_u] "f"(mask_u), [mask_v] "f"(mask_v), [value] "f"(value), [zero] "f"(0x00), [eight] "f"(0x08), @@ -4386,7 +4386,7 @@ void ARGBShadeRow_MMI(const uint8_t* src_argb, : "memory"); } -void ARGBMultiplyRow_MMI(const uint8_t* src_argb0, +void ARGBMultiplyRow_MMI(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -4422,12 +4422,12 @@ void ARGBMultiplyRow_MMI(const uint8_t* src_argb0, [src1_hi] "=&f"(src1_hi), [src1_lo] "=&f"(src1_lo), [dest_hi] "=&f"(dest_hi), [dest_lo] "=&f"(dest_lo), [src0] "=&f"(src0), [src1] "=&f"(src1), [dest] "=&f"(dest) - : [src0_ptr] "r"(src_argb0), [src1_ptr] "r"(src_argb1), + : [src0_ptr] "r"(src_argb), [src1_ptr] "r"(src_argb1), [dst_ptr] "r"(dst_argb), [width] "r"(width), [mask] "f"(mask) : "memory"); } -void ARGBAddRow_MMI(const uint8_t* src_argb0, +void ARGBAddRow_MMI(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -4449,12 +4449,12 @@ void ARGBAddRow_MMI(const uint8_t* src_argb0, "daddi %[width], %[width], -0x02 \n\t" "bnez %[width], 1b \n\t" : [src0] "=&f"(src0), [src1] "=&f"(src1), [dest] "=&f"(dest) - : [src0_ptr] "r"(src_argb0), [src1_ptr] "r"(src_argb1), + : [src0_ptr] "r"(src_argb), [src1_ptr] "r"(src_argb1), [dst_ptr] "r"(dst_argb), [width] "r"(width) : "memory"); } -void ARGBSubtractRow_MMI(const uint8_t* src_argb0, +void ARGBSubtractRow_MMI(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -4476,7 +4476,7 @@ void ARGBSubtractRow_MMI(const uint8_t* src_argb0, "daddi %[width], %[width], -0x02 \n\t" "bnez %[width], 1b \n\t" : [src0] "=&f"(src0), [src1] "=&f"(src1), [dest] "=&f"(dest) - : [src0_ptr] "r"(src_argb0), [src1_ptr] "r"(src_argb1), + : [src0_ptr] "r"(src_argb), [src1_ptr] "r"(src_argb1), [dst_ptr] "r"(dst_argb), [width] "r"(width) : "memory"); } @@ -5552,10 +5552,10 @@ void UYVYToYRow_MMI(const uint8_t* src_uyvy, uint8_t* dst_y, int width) { : "memory"); } -// Blend src_argb0 over src_argb1 and store to dst_argb. -// dst_argb may be src_argb0 or src_argb1. +// Blend src_argb over src_argb1 and store to dst_argb. +// dst_argb may be src_argb or src_argb1. // This code mimics the SSSE3 version for better testability. -void ARGBBlendRow_MMI(const uint8_t* src_argb0, +void ARGBBlendRow_MMI(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -5608,7 +5608,7 @@ void ARGBBlendRow_MMI(const uint8_t* src_argb0, [dest] "=&f"(dest), [src0_hi] "=&f"(src0_hi), [src0_lo] "=&f"(src0_lo), [src1_hi] "=&f"(src1_hi), [src1_lo] "=&f"(src1_lo), [dest_hi] "=&f"(dest_hi), [dest_lo] "=&f"(dest_lo) - : [src0_ptr] "r"(src_argb0), [src1_ptr] "r"(src_argb1), + : [src0_ptr] "r"(src_argb), [src1_ptr] "r"(src_argb1), [dst_ptr] "r"(dst_argb), [mask0] "f"(mask0), [mask1] "f"(mask1), [mask2] "f"(mask2), [mask3] "f"(mask3), [mask4] "f"(mask4), [shift] "f"(shift), [width] "r"(width) diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/row_msa.cc b/third-party/libyuv/third_party/libyuv/source/row_msa.cc similarity index 96% rename from third-party/webrtc/dependencies/third_party/libyuv/source/row_msa.cc rename to third-party/libyuv/third_party/libyuv/source/row_msa.cc index fe6df93a60..c0b13b0fd0 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/row_msa.cc +++ b/third-party/libyuv/third_party/libyuv/source/row_msa.cc @@ -781,7 +781,7 @@ void UYVYToUV422Row_MSA(const uint8_t* src_uyvy, } } -void ARGBToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void ARGBToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width) { int x; v16u8 src0, src1, src2, src3, vec0, vec1, vec2, vec3, dst0; v8u16 reg0, reg1, reg2, reg3, reg4, reg5; @@ -792,10 +792,10 @@ void ARGBToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080); for (x = 0; x < width; x += 16) { - src0 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 16); - src2 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 32); - src3 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 48); + src0 = (v16u8)__msa_ld_b((v16u8*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((v16u8*)src_argb, 16); + src2 = (v16u8)__msa_ld_b((v16u8*)src_argb, 32); + src3 = (v16u8)__msa_ld_b((v16u8*)src_argb, 48); vec0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0); vec1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2); vec2 = (v16u8)__msa_pckod_b((v16i8)src1, (v16i8)src0); @@ -822,18 +822,18 @@ void ARGBToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { reg1 = (v8u16)__msa_srai_h((v8i16)reg1, 8); dst0 = (v16u8)__msa_pckev_b((v16i8)reg1, (v16i8)reg0); ST_UB(dst0, dst_y); - src_argb0 += 64; + src_argb += 64; dst_y += 16; } } -void ARGBToUVRow_MSA(const uint8_t* src_argb0, +void ARGBToUVRow_MSA(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, int width) { int x; - const uint8_t* src_argb0_next = src_argb0 + src_stride_argb; + const uint8_t* src_argb_next = src_argb + src_stride_argb; v16u8 src0, src1, src2, src3, src4, src5, src6, src7; v16u8 vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7, vec8, vec9; v8u16 reg0, reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; @@ -847,14 +847,14 @@ void ARGBToUVRow_MSA(const uint8_t* src_argb0, v8u16 const_0x0001 = (v8u16)__msa_fill_h(0x0001); for (x = 0; x < width; x += 32) { - src0 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 16); - src2 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 32); - src3 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 48); - src4 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 64); - src5 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 80); - src6 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 96); - src7 = (v16u8)__msa_ld_b((v16u8*)src_argb0, 112); + src0 = (v16u8)__msa_ld_b((v16u8*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((v16u8*)src_argb, 16); + src2 = (v16u8)__msa_ld_b((v16u8*)src_argb, 32); + src3 = (v16u8)__msa_ld_b((v16u8*)src_argb, 48); + src4 = (v16u8)__msa_ld_b((v16u8*)src_argb, 64); + src5 = (v16u8)__msa_ld_b((v16u8*)src_argb, 80); + src6 = (v16u8)__msa_ld_b((v16u8*)src_argb, 96); + src7 = (v16u8)__msa_ld_b((v16u8*)src_argb, 112); vec0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0); vec1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2); vec2 = (v16u8)__msa_pckev_b((v16i8)src5, (v16i8)src4); @@ -875,14 +875,14 @@ void ARGBToUVRow_MSA(const uint8_t* src_argb0, reg3 = __msa_hadd_u_h(vec5, vec5); reg4 = __msa_hadd_u_h(vec0, vec0); reg5 = __msa_hadd_u_h(vec1, vec1); - src0 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 0); - src1 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 16); - src2 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 32); - src3 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 48); - src4 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 64); - src5 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 80); - src6 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 96); - src7 = (v16u8)__msa_ld_b((v16u8*)src_argb0_next, 112); + src0 = (v16u8)__msa_ld_b((v16u8*)src_argb_next, 0); + src1 = (v16u8)__msa_ld_b((v16u8*)src_argb_next, 16); + src2 = (v16u8)__msa_ld_b((v16u8*)src_argb_next, 32); + src3 = (v16u8)__msa_ld_b((v16u8*)src_argb_next, 48); + src4 = (v16u8)__msa_ld_b((v16u8*)src_argb_next, 64); + src5 = (v16u8)__msa_ld_b((v16u8*)src_argb_next, 80); + src6 = (v16u8)__msa_ld_b((v16u8*)src_argb_next, 96); + src7 = (v16u8)__msa_ld_b((v16u8*)src_argb_next, 112); vec0 = (v16u8)__msa_pckev_b((v16i8)src1, (v16i8)src0); vec1 = (v16u8)__msa_pckev_b((v16i8)src3, (v16i8)src2); vec2 = (v16u8)__msa_pckev_b((v16i8)src5, (v16i8)src4); @@ -945,8 +945,8 @@ void ARGBToUVRow_MSA(const uint8_t* src_argb0, dst1 = (v16u8)__msa_pckev_b((v16i8)reg5, (v16i8)reg4); ST_UB(dst0, dst_u); ST_UB(dst1, dst_v); - src_argb0 += 128; - src_argb0_next += 128; + src_argb += 128; + src_argb_next += 128; dst_u += 16; dst_v += 16; } @@ -1173,7 +1173,7 @@ void ARGBToUV444Row_MSA(const uint8_t* src_argb, } } -void ARGBMultiplyRow_MSA(const uint8_t* src_argb0, +void ARGBMultiplyRow_MSA(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -1184,7 +1184,7 @@ void ARGBMultiplyRow_MSA(const uint8_t* src_argb0, v8i16 zero = {0}; for (x = 0; x < width; x += 4) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); src1 = (v16u8)__msa_ld_b((void*)src_argb1, 0); vec0 = (v8u16)__msa_ilvr_b((v16i8)src0, (v16i8)src0); vec1 = (v8u16)__msa_ilvl_b((v16i8)src0, (v16i8)src0); @@ -1206,13 +1206,13 @@ void ARGBMultiplyRow_MSA(const uint8_t* src_argb0, vec1 = (v8u16)__msa_pckev_h((v8i16)reg3, (v8i16)reg2); dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0); ST_UB(dst0, dst_argb); - src_argb0 += 16; + src_argb += 16; src_argb1 += 16; dst_argb += 16; } } -void ARGBAddRow_MSA(const uint8_t* src_argb0, +void ARGBAddRow_MSA(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -1220,20 +1220,20 @@ void ARGBAddRow_MSA(const uint8_t* src_argb0, v16u8 src0, src1, src2, src3, dst0, dst1; for (x = 0; x < width; x += 8) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); src2 = (v16u8)__msa_ld_b((void*)src_argb1, 0); src3 = (v16u8)__msa_ld_b((void*)src_argb1, 16); dst0 = __msa_adds_u_b(src0, src2); dst1 = __msa_adds_u_b(src1, src3); ST_UB2(dst0, dst1, dst_argb, 16); - src_argb0 += 32; + src_argb += 32; src_argb1 += 32; dst_argb += 32; } } -void ARGBSubtractRow_MSA(const uint8_t* src_argb0, +void ARGBSubtractRow_MSA(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -1241,14 +1241,14 @@ void ARGBSubtractRow_MSA(const uint8_t* src_argb0, v16u8 src0, src1, src2, src3, dst0, dst1; for (x = 0; x < width; x += 8) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); src2 = (v16u8)__msa_ld_b((void*)src_argb1, 0); src3 = (v16u8)__msa_ld_b((void*)src_argb1, 16); dst0 = __msa_subs_u_b(src0, src2); dst1 = __msa_subs_u_b(src1, src3); ST_UB2(dst0, dst1, dst_argb, 16); - src_argb0 += 32; + src_argb += 32; src_argb1 += 32; dst_argb += 32; } @@ -1794,7 +1794,7 @@ void RGB565ToYRow_MSA(const uint8_t* src_rgb565, uint8_t* dst_y, int width) { } } -void RGB24ToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void RGB24ToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width) { int x; v16u8 src0, src1, src2, reg0, reg1, reg2, reg3, dst0; v8u16 vec0, vec1, vec2, vec3; @@ -1809,9 +1809,9 @@ void RGB24ToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { v16i8 zero = {0}; for (x = 0; x < width; x += 16) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); - src2 = (v16u8)__msa_ld_b((void*)src_argb0, 32); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); + src2 = (v16u8)__msa_ld_b((void*)src_argb, 32); reg0 = (v16u8)__msa_vshf_b(mask0, zero, (v16i8)src0); reg1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0); reg2 = (v16u8)__msa_vshf_b(mask2, (v16i8)src2, (v16i8)src1); @@ -1830,12 +1830,12 @@ void RGB24ToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { vec1 = (v8u16)__msa_srai_h((v8i16)vec1, 8); dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0); ST_UB(dst0, dst_y); - src_argb0 += 48; + src_argb += 48; dst_y += 16; } } -void RAWToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void RAWToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width) { int x; v16u8 src0, src1, src2, reg0, reg1, reg2, reg3, dst0; v8u16 vec0, vec1, vec2, vec3; @@ -1850,9 +1850,9 @@ void RAWToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { v16i8 zero = {0}; for (x = 0; x < width; x += 16) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); - src2 = (v16u8)__msa_ld_b((void*)src_argb0, 32); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); + src2 = (v16u8)__msa_ld_b((void*)src_argb, 32); reg0 = (v16u8)__msa_vshf_b(mask0, zero, (v16i8)src0); reg1 = (v16u8)__msa_vshf_b(mask1, (v16i8)src1, (v16i8)src0); reg2 = (v16u8)__msa_vshf_b(mask2, (v16i8)src2, (v16i8)src1); @@ -1871,7 +1871,7 @@ void RAWToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { vec1 = (v8u16)__msa_srai_h((v8i16)vec1, 8); dst0 = (v16u8)__msa_pckev_b((v16i8)vec1, (v16i8)vec0); ST_UB(dst0, dst_y); - src_argb0 += 48; + src_argb += 48; dst_y += 16; } } @@ -2037,14 +2037,14 @@ void RGB565ToUVRow_MSA(const uint8_t* src_rgb565, } } -void RGB24ToUVRow_MSA(const uint8_t* src_rgb0, +void RGB24ToUVRow_MSA(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, int width) { int x; - const uint8_t* s = src_rgb0; - const uint8_t* t = src_rgb0 + src_stride_rgb; + const uint8_t* s = src_rgb; + const uint8_t* t = src_rgb + src_stride_rgb; int64_t res0, res1; v16u8 src0, src1, src2, src3, src4, src5, src6, src7; v16u8 inp0, inp1, inp2, inp3, inp4, inp5; @@ -2147,14 +2147,14 @@ void RGB24ToUVRow_MSA(const uint8_t* src_rgb0, } } -void RAWToUVRow_MSA(const uint8_t* src_rgb0, +void RAWToUVRow_MSA(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, int width) { int x; - const uint8_t* s = src_rgb0; - const uint8_t* t = src_rgb0 + src_stride_rgb; + const uint8_t* s = src_rgb; + const uint8_t* t = src_rgb + src_stride_rgb; int64_t res0, res1; v16u8 inp0, inp1, inp2, inp3, inp4, inp5; v16u8 src0, src1, src2, src3, src4, src5, src6, src7; @@ -2446,7 +2446,7 @@ void SobelXYRow_MSA(const uint8_t* src_sobelx, } } -void ARGBToYJRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void ARGBToYJRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width) { int x; v16u8 src0, src1, src2, src3, dst0; v16u8 const_0x961D = (v16u8)__msa_fill_h(0x961D); @@ -2454,19 +2454,19 @@ void ARGBToYJRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { v8u16 const_0x80 = (v8u16)__msa_fill_h(0x80); for (x = 0; x < width; x += 16) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); - src2 = (v16u8)__msa_ld_b((void*)src_argb0, 32); - src3 = (v16u8)__msa_ld_b((void*)src_argb0, 48); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); + src2 = (v16u8)__msa_ld_b((void*)src_argb, 32); + src3 = (v16u8)__msa_ld_b((void*)src_argb, 48); ARGBTOY(src0, src1, src2, src3, const_0x961D, const_0x4D, const_0x80, 8, dst0); ST_UB(dst0, dst_y); - src_argb0 += 64; + src_argb += 64; dst_y += 16; } } -void BGRAToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void BGRAToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width) { int x; v16u8 src0, src1, src2, src3, dst0; v16u8 const_0x4200 = (v16u8)__msa_fill_h(0x4200); @@ -2474,19 +2474,19 @@ void BGRAToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080); for (x = 0; x < width; x += 16) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); - src2 = (v16u8)__msa_ld_b((void*)src_argb0, 32); - src3 = (v16u8)__msa_ld_b((void*)src_argb0, 48); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); + src2 = (v16u8)__msa_ld_b((void*)src_argb, 32); + src3 = (v16u8)__msa_ld_b((void*)src_argb, 48); ARGBTOY(src0, src1, src2, src3, const_0x4200, const_0x1981, const_0x1080, 8, dst0); ST_UB(dst0, dst_y); - src_argb0 += 64; + src_argb += 64; dst_y += 16; } } -void ABGRToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void ABGRToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width) { int x; v16u8 src0, src1, src2, src3, dst0; v16u8 const_0x8142 = (v16u8)__msa_fill_h(0x8142); @@ -2494,19 +2494,19 @@ void ABGRToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080); for (x = 0; x < width; x += 16) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); - src2 = (v16u8)__msa_ld_b((void*)src_argb0, 32); - src3 = (v16u8)__msa_ld_b((void*)src_argb0, 48); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); + src2 = (v16u8)__msa_ld_b((void*)src_argb, 32); + src3 = (v16u8)__msa_ld_b((void*)src_argb, 48); ARGBTOY(src0, src1, src2, src3, const_0x8142, const_0x19, const_0x1080, 8, dst0); ST_UB(dst0, dst_y); - src_argb0 += 64; + src_argb += 64; dst_y += 16; } } -void RGBAToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { +void RGBAToYRow_MSA(const uint8_t* src_argb, uint8_t* dst_y, int width) { int x; v16u8 src0, src1, src2, src3, dst0; v16u8 const_0x1900 = (v16u8)__msa_fill_h(0x1900); @@ -2514,26 +2514,26 @@ void RGBAToYRow_MSA(const uint8_t* src_argb0, uint8_t* dst_y, int width) { v8u16 const_0x1080 = (v8u16)__msa_fill_h(0x1080); for (x = 0; x < width; x += 16) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); - src2 = (v16u8)__msa_ld_b((void*)src_argb0, 32); - src3 = (v16u8)__msa_ld_b((void*)src_argb0, 48); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); + src2 = (v16u8)__msa_ld_b((void*)src_argb, 32); + src3 = (v16u8)__msa_ld_b((void*)src_argb, 48); ARGBTOY(src0, src1, src2, src3, const_0x1900, const_0x4281, const_0x1080, 8, dst0); ST_UB(dst0, dst_y); - src_argb0 += 64; + src_argb += 64; dst_y += 16; } } -void ARGBToUVJRow_MSA(const uint8_t* src_rgb0, +void ARGBToUVJRow_MSA(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, int width) { int x; - const uint8_t* s = src_rgb0; - const uint8_t* t = src_rgb0 + src_stride_rgb; + const uint8_t* s = src_rgb; + const uint8_t* t = src_rgb + src_stride_rgb; v8u16 src0, src1, src2, src3, src4, src5, src6, src7; v8u16 vec0, vec1, vec2, vec3; v8u16 dst0, dst1, dst2, dst3; @@ -2658,14 +2658,14 @@ void ARGBToUVJRow_MSA(const uint8_t* src_rgb0, } } -void BGRAToUVRow_MSA(const uint8_t* src_rgb0, +void BGRAToUVRow_MSA(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, int width) { int x; - const uint8_t* s = src_rgb0; - const uint8_t* t = src_rgb0 + src_stride_rgb; + const uint8_t* s = src_rgb; + const uint8_t* t = src_rgb + src_stride_rgb; const uint8_t unused = 0xf; v8u16 src0, src1, src2, src3; v16u8 dst0, dst1; @@ -2693,14 +2693,14 @@ void BGRAToUVRow_MSA(const uint8_t* src_rgb0, } } -void ABGRToUVRow_MSA(const uint8_t* src_rgb0, +void ABGRToUVRow_MSA(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, int width) { int x; - const uint8_t* s = src_rgb0; - const uint8_t* t = src_rgb0 + src_stride_rgb; + const uint8_t* s = src_rgb; + const uint8_t* t = src_rgb + src_stride_rgb; const uint8_t unused = 0xf; v8u16 src0, src1, src2, src3; v16u8 dst0, dst1; @@ -2728,14 +2728,14 @@ void ABGRToUVRow_MSA(const uint8_t* src_rgb0, } } -void RGBAToUVRow_MSA(const uint8_t* src_rgb0, +void RGBAToUVRow_MSA(const uint8_t* src_rgb, int src_stride_rgb, uint8_t* dst_u, uint8_t* dst_v, int width) { int x; - const uint8_t* s = src_rgb0; - const uint8_t* t = src_rgb0 + src_stride_rgb; + const uint8_t* s = src_rgb; + const uint8_t* t = src_rgb + src_stride_rgb; const uint8_t unused = 0xf; v8u16 src0, src1, src2, src3; v16u8 dst0, dst1; @@ -3109,7 +3109,7 @@ void ARGBExtractAlphaRow_MSA(const uint8_t* src_argb, } } -void ARGBBlendRow_MSA(const uint8_t* src_argb0, +void ARGBBlendRow_MSA(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -3123,8 +3123,8 @@ void ARGBBlendRow_MSA(const uint8_t* src_argb0, v16i8 zero = {0}; for (x = 0; x < width; x += 8) { - src0 = (v16u8)__msa_ld_b((void*)src_argb0, 0); - src1 = (v16u8)__msa_ld_b((void*)src_argb0, 16); + src0 = (v16u8)__msa_ld_b((void*)src_argb, 0); + src1 = (v16u8)__msa_ld_b((void*)src_argb, 16); src2 = (v16u8)__msa_ld_b((void*)src_argb1, 0); src3 = (v16u8)__msa_ld_b((void*)src_argb1, 16); vec0 = (v8u16)__msa_ilvr_b(zero, (v16i8)src0); @@ -3168,7 +3168,7 @@ void ARGBBlendRow_MSA(const uint8_t* src_argb0, dst0 = __msa_bmnz_v(dst0, const_255, mask); dst1 = __msa_bmnz_v(dst1, const_255, mask); ST_UB2(dst0, dst1, dst_argb, 16); - src_argb0 += 32; + src_argb += 32; src_argb1 += 32; dst_argb += 32; } diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/row_neon.cc b/third-party/libyuv/third_party/libyuv/source/row_neon.cc similarity index 74% rename from third-party/webrtc/dependencies/third_party/libyuv/source/row_neon.cc rename to third-party/libyuv/third_party/libyuv/source/row_neon.cc index a5aeaabfbd..6ef6f1c463 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/row_neon.cc +++ b/third-party/libyuv/third_party/libyuv/source/row_neon.cc @@ -21,90 +21,115 @@ extern "C" { #if !defined(LIBYUV_DISABLE_NEON) && defined(__ARM_NEON__) && \ !defined(__aarch64__) +// q0: Y uint16x8_t +// d2: U uint8x8_t +// d3: V uint8x8_t + // Read 8 Y, 4 U and 4 V from 422 #define READYUV422 \ - "vld1.8 {d0}, [%0]! \n" \ - "vld1.32 {d2[0]}, [%1]! \n" \ - "vld1.32 {d2[1]}, [%2]! \n" + "vld1.8 {d0}, [%[src_y]]! \n" \ + "vld1.32 {d2[0]}, [%[src_u]]! \n" \ + "vld1.32 {d2[1]}, [%[src_v]]! \n" \ + "vmov.u8 d1, d0 \n" \ + "vmovl.u8 q1, d2 \n" \ + "vzip.u8 d0, d1 \n" \ + "vsli.u16 q1, q1, #8 \n" // Read 8 Y, 8 U and 8 V from 444 #define READYUV444 \ - "vld1.8 {d0}, [%0]! \n" \ - "vld1.8 {d2}, [%1]! \n" \ - "vld1.8 {d3}, [%2]! \n" \ - "vpaddl.u8 q1, q1 \n" \ - "vrshrn.u16 d2, q1, #1 \n" + "vld1.8 {d0}, [%[src_y]]! \n" \ + "vld1.8 {d2}, [%[src_u]]! \n" \ + "vmovl.u8 q0, d0 \n" \ + "vld1.8 {d3}, [%[src_v]]! \n" \ + "vsli.u16 q0, q0, #8 \n" // Read 8 Y, and set 4 U and 4 V to 128 #define READYUV400 \ - "vld1.8 {d0}, [%0]! \n" \ - "vmov.u8 d2, #128 \n" + "vld1.8 {d0}, [%[src_y]]! \n" \ + "vmov.u8 q1, #128 \n" \ + "vmovl.u8 q0, d0 \n" \ + "vsli.u16 q0, q0, #8 \n" // Read 8 Y and 4 UV from NV12 -#define READNV12 \ - "vld1.8 {d0}, [%0]! \n" \ - "vld1.8 {d2}, [%1]! \n" \ - "vmov.u8 d3, d2 \n" /* split odd/even uv apart */ \ - "vuzp.u8 d2, d3 \n" \ - "vtrn.u32 d2, d3 \n" +#define READNV12 \ + "vld1.8 {d0}, [%[src_y]]! \n" \ + "vld1.8 {d2}, [%[src_uv]]! \n" \ + "vmov.u8 d1, d0 \n" \ + "vmov.u8 d3, d2 \n" \ + "vzip.u8 d0, d1 \n" \ + "vsli.u16 d2, d2, #8 \n" /* Duplicate low byte (U) */ \ + "vsri.u16 d3, d3, #8 \n" /* Duplicate high byte (V) */ // Read 8 Y and 4 VU from NV21 #define READNV21 \ - "vld1.8 {d0}, [%0]! \n" \ - "vld1.8 {d2}, [%1]! \n" \ - "vmov.u8 d3, d2 \n" /* split odd/even uv apart */ \ - "vuzp.u8 d3, d2 \n" \ - "vtrn.u32 d2, d3 \n" + "vld1.8 {d0}, [%[src_y]]! \n" \ + "vld1.8 {d2}, [%[src_vu]]! \n" \ + "vmov.u8 d1, d0 \n" \ + "vmov.u8 d3, d2 \n" \ + "vzip.u8 d0, d1 \n" \ + "vsri.u16 d2, d2, #8 \n" /* Duplicate high byte (U) */ \ + "vsli.u16 d3, d3, #8 \n" /* Duplicate low byte (V) */ // Read 8 YUY2 #define READYUY2 \ - "vld2.8 {d0, d2}, [%0]! \n" \ + "vld2.8 {d0, d2}, [%[src_yuy2]]! \n" \ + "vmovl.u8 q0, d0 \n" \ "vmov.u8 d3, d2 \n" \ - "vuzp.u8 d2, d3 \n" \ - "vtrn.u32 d2, d3 \n" + "vsli.u16 q0, q0, #8 \n" \ + "vsli.u16 d2, d2, #8 \n" \ + "vsri.u16 d3, d3, #8 \n" // Read 8 UYVY #define READUYVY \ - "vld2.8 {d2, d3}, [%0]! \n" \ - "vmov.u8 d0, d3 \n" \ + "vld2.8 {d2, d3}, [%[src_uyvy]]! \n" \ + "vmovl.u8 q0, d3 \n" \ "vmov.u8 d3, d2 \n" \ - "vuzp.u8 d2, d3 \n" \ - "vtrn.u32 d2, d3 \n" + "vsli.u16 q0, q0, #8 \n" \ + "vsli.u16 d2, d2, #8 \n" \ + "vsri.u16 d3, d3, #8 \n" -#define YUVTORGB_SETUP \ - "vld1.8 {d24}, [%[kUVToRB]] \n" \ - "vld1.8 {d25}, [%[kUVToG]] \n" \ - "vld1.16 {d26[], d27[]}, [%[kUVBiasBGR]]! \n" \ - "vld1.16 {d8[], d9[]}, [%[kUVBiasBGR]]! \n" \ - "vld1.16 {d28[], d29[]}, [%[kUVBiasBGR]] \n" \ - "vld1.32 {d30[], d31[]}, [%[kYToRgb]] \n" +#define YUVTORGB_SETUP \ + "vld4.8 {d26[], d27[], d28[], d29[]}, [%[kUVCoeff]] \n" \ + "vld1.16 {d31[]}, [%[kRGBCoeffBias]]! \n" \ + "vld1.16 {d20[], d21[]}, [%[kRGBCoeffBias]]! \n" \ + "vld1.16 {d22[], d23[]}, [%[kRGBCoeffBias]]! \n" \ + "vld1.16 {d24[], d25[]}, [%[kRGBCoeffBias]] \n" -#define YUVTORGB \ - "vmull.u8 q8, d2, d24 \n" /* u/v B/R component */ \ - "vmull.u8 q9, d2, d25 \n" /* u/v G component */ \ - "vmovl.u8 q0, d0 \n" /* Y */ \ - "vmovl.s16 q10, d1 \n" \ - "vmovl.s16 q0, d0 \n" \ - "vmul.s32 q10, q10, q15 \n" \ - "vmul.s32 q0, q0, q15 \n" \ - "vqshrun.s32 d0, q0, #16 \n" \ - "vqshrun.s32 d1, q10, #16 \n" /* Y */ \ - "vadd.s16 d18, d19 \n" \ - "vshll.u16 q1, d16, #16 \n" /* Replicate u * UB */ \ - "vshll.u16 q10, d17, #16 \n" /* Replicate v * VR */ \ - "vshll.u16 q3, d18, #16 \n" /* Replicate (v*VG + u*UG)*/ \ - "vaddw.u16 q1, q1, d16 \n" \ - "vaddw.u16 q10, q10, d17 \n" \ - "vaddw.u16 q3, q3, d18 \n" \ - "vqadd.s16 q8, q0, q13 \n" /* B */ \ - "vqadd.s16 q9, q0, q14 \n" /* R */ \ - "vqadd.s16 q0, q0, q4 \n" /* G */ \ - "vqadd.s16 q8, q8, q1 \n" /* B */ \ - "vqadd.s16 q9, q9, q10 \n" /* R */ \ - "vqsub.s16 q0, q0, q3 \n" /* G */ \ - "vqshrun.s16 d20, q8, #6 \n" /* B */ \ - "vqshrun.s16 d22, q9, #6 \n" /* R */ \ - "vqshrun.s16 d21, q0, #6 \n" /* G */ +// q0: B uint16x8_t +// q1: G uint16x8_t +// q2: R uint16x8_t + +// Convert from YUV to 2.14 fixed point RGB +#define YUVTORGB \ + "vmull.u16 q2, d1, d31 \n" \ + "vmull.u8 q8, d3, d29 \n" /* DGV */ \ + "vmull.u16 q0, d0, d31 \n" \ + "vmlal.u8 q8, d2, d28 \n" /* DG */ \ + "vqshrn.u32 d0, q0, #16 \n" \ + "vqshrn.u32 d1, q2, #16 \n" /* Y */ \ + "vmull.u8 q9, d2, d26 \n" /* DB */ \ + "vmull.u8 q2, d3, d27 \n" /* DR */ \ + "vadd.u16 q4, q0, q11 \n" /* G */ \ + "vadd.u16 q2, q0, q2 \n" /* R */ \ + "vadd.u16 q0, q0, q9 \n" /* B */ \ + "vqsub.u16 q1, q4, q8 \n" /* G */ \ + "vqsub.u16 q0, q0, q10 \n" /* B */ \ + "vqsub.u16 q2, q2, q12 \n" /* R */ + +// Convert from 2.14 fixed point RGB To 8 bit RGB +#define RGBTORGB8 \ + "vqshrn.u16 d4, q2, #6 \n" /* R */ \ + "vqshrn.u16 d2, q1, #6 \n" /* G */ \ + "vqshrn.u16 d0, q0, #6 \n" /* B */ + +#define YUVTORGB_REGS \ + "q0", "q1", "q2", "q4", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "d31" + +#define STORERGBA \ + "vmov.u8 d1, d0 \n" \ + "vmov.u8 d3, d4 \n" \ + "vmov.u8 d0, d6 \n" \ + "vst4.8 {d0, d1, d2, d3}, [%[dst_rgba]]! \n" void I444ToARGBRow_NEON(const uint8_t* src_y, const uint8_t* src_u, @@ -114,22 +139,20 @@ void I444ToARGBRow_NEON(const uint8_t* src_y, int width) { asm volatile( YUVTORGB_SETUP - "vmov.u8 d23, #255 \n" + "vmov.u8 d6, #255 \n" "1: \n" READYUV444 YUVTORGB - "subs %4, %4, #8 \n" - "vst4.8 {d20, d21, d22, d23}, [%3]! \n" + RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_argb), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } void I422ToARGBRow_NEON(const uint8_t* src_y, @@ -140,22 +163,46 @@ void I422ToARGBRow_NEON(const uint8_t* src_y, int width) { asm volatile( YUVTORGB_SETUP - "vmov.u8 d23, #255 \n" + "vmov.u8 d6, #255 \n" "1: \n" READYUV422 YUVTORGB - "subs %4, %4, #8 \n" - "vst4.8 {d20, d21, d22, d23}, [%3]! \n" + RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_argb), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); +} + +void I444AlphaToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile( + YUVTORGB_SETUP + "1: \n" READYUV444 YUVTORGB + RGBTORGB8 + "vld1.8 {d6}, [%[src_a]]! \n" + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" + "bgt 1b \n" + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [src_a] "+r"(src_a), // %[src_a] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } void I422AlphaToARGBRow_NEON(const uint8_t* src_y, @@ -168,22 +215,20 @@ void I422AlphaToARGBRow_NEON(const uint8_t* src_y, asm volatile( YUVTORGB_SETUP "1: \n" READYUV422 YUVTORGB - "subs %5, %5, #8 \n" - "vld1.8 {d23}, [%3]! \n" - "vst4.8 {d20, d21, d22, d23}, [%4]! \n" + RGBTORGB8 + "vld1.8 {d6}, [%[src_a]]! \n" + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(src_a), // %3 - "+r"(dst_argb), // %4 - "+r"(width) // %5 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [src_a] "+r"(src_a), // %[src_a] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } void I422ToRGBARow_NEON(const uint8_t* src_y, @@ -194,22 +239,18 @@ void I422ToRGBARow_NEON(const uint8_t* src_y, int width) { asm volatile( YUVTORGB_SETUP + "vmov.u8 d6, #255 \n" "1: \n" READYUV422 YUVTORGB - "subs %4, %4, #8 \n" - "vmov.u8 d19, #255 \n" // YUVTORGB modified d19 - "vst4.8 {d19, d20, d21, d22}, [%3]! \n" + RGBTORGB8 "subs %[width], %[width], #8 \n" STORERGBA "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_rgba), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_rgba] "+r"(dst_rgba), // %[dst_rgba] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } void I422ToRGB24Row_NEON(const uint8_t* src_y, @@ -220,29 +261,28 @@ void I422ToRGB24Row_NEON(const uint8_t* src_y, int width) { asm volatile( YUVTORGB_SETUP + "vmov.u8 d6, #255 \n" "1: \n" READYUV422 YUVTORGB - "subs %4, %4, #8 \n" - "vst3.8 {d20, d21, d22}, [%3]! \n" + RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst3.8 {d0, d2, d4}, [%[dst_rgb24]]! \n" "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_rgb24), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS); } #define ARGBTORGB565 \ - "vshll.u8 q0, d22, #8 \n" /* R */ \ - "vshll.u8 q8, d21, #8 \n" /* G */ \ - "vshll.u8 q9, d20, #8 \n" /* B */ \ - "vsri.16 q0, q8, #5 \n" /* RG */ \ - "vsri.16 q0, q9, #11 \n" /* RGB */ + "vshll.u8 q2, d4, #8 \n" /* R */ \ + "vshll.u8 q1, d2, #8 \n" /* G */ \ + "vshll.u8 q0, d0, #8 \n" /* B */ \ + "vsri.16 q2, q1, #5 \n" /* RG */ \ + "vsri.16 q2, q0, #11 \n" /* RGB */ void I422ToRGB565Row_NEON(const uint8_t* src_y, const uint8_t* src_u, @@ -252,31 +292,29 @@ void I422ToRGB565Row_NEON(const uint8_t* src_y, int width) { asm volatile( YUVTORGB_SETUP + "vmov.u8 d6, #255 \n" "1: \n" READYUV422 YUVTORGB - "subs %4, %4, #8 \n" ARGBTORGB565 - "vst1.8 {q0}, [%3]! \n" // store 8 pixels RGB565. + RGBTORGB8 "subs %[width], %[width], #8 \n" ARGBTORGB565 + "vst1.8 {q2}, [%[dst_rgb565]]! \n" // store 8 pixels RGB565. "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_rgb565), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_rgb565] "+r"(dst_rgb565), // %[dst_rgb565] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS); } #define ARGBTOARGB1555 \ - "vshll.u8 q0, d23, #8 \n" /* A */ \ - "vshll.u8 q8, d22, #8 \n" /* R */ \ - "vshll.u8 q9, d21, #8 \n" /* G */ \ - "vshll.u8 q10, d20, #8 \n" /* B */ \ - "vsri.16 q0, q8, #1 \n" /* AR */ \ - "vsri.16 q0, q9, #6 \n" /* ARG */ \ - "vsri.16 q0, q10, #11 \n" /* ARGB */ + "vshll.u8 q3, d6, #8 \n" /* A */ \ + "vshll.u8 q2, d4, #8 \n" /* R */ \ + "vshll.u8 q1, d2, #8 \n" /* G */ \ + "vshll.u8 q0, d0, #8 \n" /* B */ \ + "vsri.16 q3, q2, #1 \n" /* AR */ \ + "vsri.16 q3, q1, #6 \n" /* ARG */ \ + "vsri.16 q3, q0, #11 \n" /* ARGB */ void I422ToARGB1555Row_NEON(const uint8_t* src_y, const uint8_t* src_u, @@ -287,30 +325,28 @@ void I422ToARGB1555Row_NEON(const uint8_t* src_y, asm volatile( YUVTORGB_SETUP "1: \n" READYUV422 YUVTORGB - "subs %4, %4, #8 \n" - "vmov.u8 d23, #255 \n" ARGBTOARGB1555 - "vst1.8 {q0}, [%3]! \n" // store 8 pixels + RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vmov.u8 d6, #0xff \n" ARGBTOARGB1555 + "vst1.8 {q3}, [%[dst_argb1555]]! \n" // store 8 pixels RGB1555. "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_argb1555), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_argb1555] "+r"(dst_argb1555), // %[dst_argb1555] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "q3"); } #define ARGBTOARGB4444 \ - "vshr.u8 d20, d20, #4 \n" /* B */ \ - "vbic.32 d21, d21, d4 \n" /* G */ \ - "vshr.u8 d22, d22, #4 \n" /* R */ \ - "vbic.32 d23, d23, d4 \n" /* A */ \ - "vorr d0, d20, d21 \n" /* BG */ \ - "vorr d1, d22, d23 \n" /* RA */ \ + "vshr.u8 d0, d0, #4 \n" /* B */ \ + "vbic.32 d2, d2, d7 \n" /* G */ \ + "vshr.u8 d4, d4, #4 \n" /* R */ \ + "vbic.32 d6, d6, d7 \n" /* A */ \ + "vorr d0, d0, d2 \n" /* BG */ \ + "vorr d1, d4, d6 \n" /* RA */ \ "vzip.u8 d0, d1 \n" /* BGRA */ void I422ToARGB4444Row_NEON(const uint8_t* src_y, @@ -321,25 +357,21 @@ void I422ToARGB4444Row_NEON(const uint8_t* src_y, int width) { asm volatile( YUVTORGB_SETUP - "vmov.u8 d4, #0x0f \n" // vbic bits to clear - "1: \n" - - READYUV422 YUVTORGB - "subs %4, %4, #8 \n" - "vmov.u8 d23, #255 \n" ARGBTOARGB4444 - "vst1.8 {q0}, [%3]! \n" // store 8 pixels + "vmov.u8 d6, #255 \n" + "vmov.u8 d7, #0x0f \n" // vbic bits to clear + "1: \n" READYUV422 YUVTORGB + RGBTORGB8 + "subs %[width], %[width], #8 \n" ARGBTOARGB4444 + "vst1.8 {q0}, [%[dst_argb4444]]! \n" // store 8 pixels "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_argb4444), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_argb4444] "+r"(dst_argb4444), // %[dst_argb4444] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "q3"); } void I400ToARGBRow_NEON(const uint8_t* src_y, @@ -348,20 +380,18 @@ void I400ToARGBRow_NEON(const uint8_t* src_y, int width) { asm volatile( YUVTORGB_SETUP - "vmov.u8 d23, #255 \n" + "vmov.u8 d6, #255 \n" "1: \n" READYUV400 YUVTORGB - "subs %2, %2, #8 \n" - "vst4.8 {d20, d21, d22, d23}, [%1]! \n" + RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(dst_argb), // %1 - "+r"(width) // %2 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } void J400ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, int width) { @@ -386,22 +416,20 @@ void NV12ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile(YUVTORGB_SETUP - "vmov.u8 d23, #255 \n" - "1: \n" READNV12 YUVTORGB - "subs %3, %3, #8 \n" - "vst4.8 {d20, d21, d22, d23}, [%2]! \n" - "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_uv), // %1 - "+r"(dst_argb), // %2 - "+r"(width) // %3 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", - "q10", "q11", "q12", "q13", "q14", "q15"); + asm volatile( + YUVTORGB_SETUP + "vmov.u8 d6, #255 \n" + "1: \n" READNV12 YUVTORGB RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" + "bgt 1b \n" + : [src_y] "+r"(src_y), // %[src_y] + [src_uv] "+r"(src_uv), // %[src_uv] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } void NV21ToARGBRow_NEON(const uint8_t* src_y, @@ -409,22 +437,20 @@ void NV21ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile(YUVTORGB_SETUP - "vmov.u8 d23, #255 \n" - "1: \n" READNV21 YUVTORGB - "subs %3, %3, #8 \n" - "vst4.8 {d20, d21, d22, d23}, [%2]! \n" - "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_vu), // %1 - "+r"(dst_argb), // %2 - "+r"(width) // %3 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", - "q10", "q11", "q12", "q13", "q14", "q15"); + asm volatile( + YUVTORGB_SETUP + "vmov.u8 d6, #255 \n" + "1: \n" READNV21 YUVTORGB RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" + "bgt 1b \n" + : [src_y] "+r"(src_y), // %[src_y] + [src_vu] "+r"(src_vu), // %[src_vu] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } void NV12ToRGB24Row_NEON(const uint8_t* src_y, @@ -433,25 +459,19 @@ void NV12ToRGB24Row_NEON(const uint8_t* src_y, const struct YuvConstants* yuvconstants, int width) { asm volatile( - YUVTORGB_SETUP - - "1: \n" - - READNV12 YUVTORGB - "subs %3, %3, #8 \n" - "vst3.8 {d20, d21, d22}, [%2]! \n" + "vmov.u8 d6, #255 \n" + "1: \n" READNV12 YUVTORGB RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst3.8 {d0, d2, d4}, [%[dst_rgb24]]! \n" "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_uv), // %1 - "+r"(dst_rgb24), // %2 - "+r"(width) // %3 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_uv] "+r"(src_uv), // %[src_uv] + [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS); } void NV21ToRGB24Row_NEON(const uint8_t* src_y, @@ -460,25 +480,19 @@ void NV21ToRGB24Row_NEON(const uint8_t* src_y, const struct YuvConstants* yuvconstants, int width) { asm volatile( - YUVTORGB_SETUP - - "1: \n" - - READNV21 YUVTORGB - "subs %3, %3, #8 \n" - "vst3.8 {d20, d21, d22}, [%2]! \n" + "vmov.u8 d6, #255 \n" + "1: \n" READNV21 YUVTORGB RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst3.8 {d0, d2, d4}, [%[dst_rgb24]]! \n" "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_vu), // %1 - "+r"(dst_rgb24), // %2 - "+r"(width) // %3 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_vu] "+r"(src_vu), // %[src_vu] + [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS); } void NV12ToRGB565Row_NEON(const uint8_t* src_y, @@ -488,62 +502,56 @@ void NV12ToRGB565Row_NEON(const uint8_t* src_y, int width) { asm volatile( YUVTORGB_SETUP - "1: \n" READNV12 YUVTORGB - "subs %3, %3, #8 \n" ARGBTORGB565 - "vst1.8 {q0}, [%2]! \n" // store 8 pixels RGB565. + "vmov.u8 d6, #255 \n" + "1: \n" READNV12 YUVTORGB RGBTORGB8 + "subs %[width], %[width], #8 \n" ARGBTORGB565 + "vst1.8 {q2}, [%[dst_rgb565]]! \n" // store 8 pixels RGB565. "bgt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_uv), // %1 - "+r"(dst_rgb565), // %2 - "+r"(width) // %3 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", "q10", "q11", - "q12", "q13", "q14", "q15"); + : [src_y] "+r"(src_y), // %[src_y] + [src_uv] "+r"(src_uv), // %[src_uv] + [dst_rgb565] "+r"(dst_rgb565), // %[dst_rgb565] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS); } void YUY2ToARGBRow_NEON(const uint8_t* src_yuy2, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile(YUVTORGB_SETUP - "vmov.u8 d23, #255 \n" - "1: \n" READYUY2 YUVTORGB - "subs %2, %2, #8 \n" - "vst4.8 {d20, d21, d22, d23}, [%1]! \n" - "bgt 1b \n" - : "+r"(src_yuy2), // %0 - "+r"(dst_argb), // %1 - "+r"(width) // %2 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", - "q10", "q11", "q12", "q13", "q14", "q15"); + asm volatile( + YUVTORGB_SETUP + "vmov.u8 d6, #255 \n" + "1: \n" READYUY2 YUVTORGB RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" + "bgt 1b \n" + : [src_yuy2] "+r"(src_yuy2), // %[src_yuy2] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } void UYVYToARGBRow_NEON(const uint8_t* src_uyvy, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile(YUVTORGB_SETUP - "vmov.u8 d23, #255 \n" - "1: \n" READUYVY YUVTORGB - "subs %2, %2, #8 \n" - "vst4.8 {d20, d21, d22, d23}, [%1]! \n" - "bgt 1b \n" - : "+r"(src_uyvy), // %0 - "+r"(dst_argb), // %1 - "+r"(width) // %2 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "q0", "q1", "q2", "q3", "q4", "q8", "q9", - "q10", "q11", "q12", "q13", "q14", "q15"); + asm volatile( + YUVTORGB_SETUP + "vmov.u8 d6, #255 \n" + "1: \n" READUYVY YUVTORGB RGBTORGB8 + "subs %[width], %[width], #8 \n" + "vst4.8 {d0, d2, d4, d6}, [%[dst_argb]]! \n" + "bgt 1b \n" + : [src_uyvy] "+r"(src_uyvy), // %[src_uyvy] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "d6"); } // Reads 16 pairs of UV and write even values to dst_u and odd to dst_v. @@ -638,6 +646,333 @@ void MergeRGBRow_NEON(const uint8_t* src_r, ); } +// Reads 16 packed ARGB and write to planar dst_r, dst_g, dst_b, dst_a. +void SplitARGBRow_NEON(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width) { + asm volatile( + "1: \n" + "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB + "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // next 8 ARGB + "subs %5, %5, #16 \n" // 16 processed per loop + "vst1.8 {q0}, [%3]! \n" // store B + "vst1.8 {q1}, [%2]! \n" // store G + "vst1.8 {q2}, [%1]! \n" // store R + "vst1.8 {q3}, [%4]! \n" // store A + "bgt 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(dst_a), // %4 + "+r"(width) // %5 + : // Input registers + : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List + ); +} + +// Reads 16 planar R's, G's and B's and writes out 16 packed ARGB at a time +void MergeARGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width) { + asm volatile( + "1: \n" + "vld1.8 {q2}, [%0]! \n" // load R + "vld1.8 {q1}, [%1]! \n" // load G + "vld1.8 {q0}, [%2]! \n" // load B + "vld1.8 {q3}, [%3]! \n" // load A + "subs %5, %5, #16 \n" // 16 processed per loop + "vst4.8 {d0, d2, d4, d6}, [%4]! \n" // store 8 ARGB + "vst4.8 {d1, d3, d5, d7}, [%4]! \n" // next 8 ARGB + "bgt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_argb), // %4 + "+r"(width) // %5 + : // Input registers + : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List + ); +} + +// Reads 16 packed ARGB and write to planar dst_r, dst_g, dst_b. +void SplitXRGBRow_NEON(const uint8_t* src_argb, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width) { + asm volatile( + "1: \n" + "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 ARGB + "vld4.8 {d1, d3, d5, d7}, [%0]! \n" // next 8 ARGB + "subs %4, %4, #16 \n" // 16 processed per loop + "vst1.8 {q0}, [%3]! \n" // store B + "vst1.8 {q1}, [%2]! \n" // store G + "vst1.8 {q2}, [%1]! \n" // store R + "bgt 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(width) // %4 + : // Input registers + : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List + ); +} + +// Reads 16 planar R's, G's, B's and A's and writes out 16 packed ARGB at a time +void MergeXRGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width) { + asm volatile( + "vmov.u8 q3, #255 \n" // load A(255) + "1: \n" + "vld1.8 {q2}, [%0]! \n" // load R + "vld1.8 {q1}, [%1]! \n" // load G + "vld1.8 {q0}, [%2]! \n" // load B + "subs %4, %4, #16 \n" // 16 processed per loop + "vst4.8 {d0, d2, d4, d6}, [%3]! \n" // store 8 ARGB + "vst4.8 {d1, d3, d5, d7}, [%3]! \n" // next 8 ARGB + "bgt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_argb), // %3 + "+r"(width) // %4 + : // Input registers + : "cc", "memory", "q0", "q1", "q2", "q3" // Clobber List + ); +} + +void MergeXR30Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width) { + int shift = 10 - depth; + asm volatile( + "vmov.u32 q14, #1023 \n" + "vdup.32 q15, %5 \n" + "1: \n" + "vld1.16 {d4}, [%2]! \n" // B + "vld1.16 {d2}, [%1]! \n" // G + "vld1.16 {d0}, [%0]! \n" // R + "vmovl.u16 q2, d4 \n" // B + "vmovl.u16 q1, d2 \n" // G + "vmovl.u16 q0, d0 \n" // R + "vshl.u32 q2, q2, q15 \n" // 000B + "vshl.u32 q1, q1, q15 \n" + "vshl.u32 q0, q0, q15 \n" + "vmin.u32 q2, q2, q14 \n" + "vmin.u32 q1, q1, q14 \n" + "vmin.u32 q0, q0, q14 \n" + "vsli.u32 q2, q1, #10 \n" // 00GB + "vsli.u32 q2, q0, #20 \n" // 0RGB + "vorr.u32 q2, #0xc0000000 \n" // ARGB (AR30) + "subs %4, %4, #4 \n" + "vst1.8 {q2}, [%3]! \n" + "bgt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_ar30), // %3 + "+r"(width) // %4 + : "r"(shift) // %5 + : "memory", "cc", "q0", "q1", "q2", "q14", "q15"); +} + +void MergeXR30Row_10_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int /* depth */, + int width) { + asm volatile( + "vmov.u32 q14, #1023 \n" + "1: \n" + "vld1.16 {d4}, [%2]! \n" // B + "vld1.16 {d2}, [%1]! \n" // G + "vld1.16 {d0}, [%0]! \n" // R + "vmovl.u16 q2, d4 \n" // 000B + "vmovl.u16 q1, d2 \n" // G + "vmovl.u16 q0, d0 \n" // R + "vmin.u32 q2, q2, q14 \n" + "vmin.u32 q1, q1, q14 \n" + "vmin.u32 q0, q0, q14 \n" + "vsli.u32 q2, q1, #10 \n" // 00GB + "vsli.u32 q2, q0, #20 \n" // 0RGB + "vorr.u32 q2, #0xc0000000 \n" // ARGB (AR30) + "subs %4, %4, #4 \n" + "vst1.8 {q2}, [%3]! \n" + "bgt 1b \n" + "3: \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_ar30), // %3 + "+r"(width) // %4 + : + : "memory", "cc", "q0", "q1", "q2", "q14"); +} + +void MergeAR64Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width) { + int shift = 16 - depth; + int mask = (1 << depth) - 1; + asm volatile( + + "vdup.u16 q15, %6 \n" + "vdup.u16 q14, %7 \n" + "1: \n" + "vld1.16 {q2}, [%0]! \n" // R + "vld1.16 {q1}, [%1]! \n" // G + "vld1.16 {q0}, [%2]! \n" // B + "vld1.16 {q3}, [%3]! \n" // A + "vmin.u16 q2, q2, q14 \n" + "vmin.u16 q1, q1, q14 \n" + "vmin.u16 q0, q0, q14 \n" + "vmin.u16 q3, q3, q14 \n" + "vshl.u16 q2, q2, q15 \n" + "vshl.u16 q1, q1, q15 \n" + "vshl.u16 q0, q0, q15 \n" + "vshl.u16 q3, q3, q15 \n" + "subs %5, %5, #8 \n" + "vst4.16 {d0, d2, d4, d6}, [%4]! \n" + "vst4.16 {d1, d3, d5, d7}, [%4]! \n" + "bgt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_ar64), // %4 + "+r"(width) // %5 + : "r"(shift), // %6 + "r"(mask) // %7 + : "memory", "cc", "q0", "q1", "q2", "q3", "q15"); +} + +void MergeXR64Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width) { + int shift = 16 - depth; + int mask = (1 << depth) - 1; + asm volatile( + + "vmov.u8 q3, #0xff \n" // A (0xffff) + "vdup.u16 q15, %5 \n" + "vdup.u16 q14, %6 \n" + "1: \n" + "vld1.16 {q2}, [%0]! \n" // R + "vld1.16 {q1}, [%1]! \n" // G + "vld1.16 {q0}, [%2]! \n" // B + "vmin.u16 q2, q2, q14 \n" + "vmin.u16 q1, q1, q14 \n" + "vmin.u16 q0, q0, q14 \n" + "vshl.u16 q2, q2, q15 \n" + "vshl.u16 q1, q1, q15 \n" + "vshl.u16 q0, q0, q15 \n" + "subs %4, %4, #8 \n" + "vst4.16 {d0, d2, d4, d6}, [%3]! \n" + "vst4.16 {d1, d3, d5, d7}, [%3]! \n" + "bgt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_ar64), // %3 + "+r"(width) // %4 + : "r"(shift), // %5 + "r"(mask) // %6 + : "memory", "cc", "q0", "q1", "q2", "q3", "q15"); +} + +void MergeARGB16To8Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width) { + int shift = 8 - depth; + asm volatile( + + "vdup.16 q15, %6 \n" + "1: \n" + "vld1.16 {q2}, [%0]! \n" // R + "vld1.16 {q1}, [%1]! \n" // G + "vld1.16 {q0}, [%2]! \n" // B + "vld1.16 {q3}, [%3]! \n" // A + "vshl.u16 q2, q2, q15 \n" + "vshl.u16 q1, q1, q15 \n" + "vshl.u16 q0, q0, q15 \n" + "vshl.u16 q3, q3, q15 \n" + "vqmovn.u16 d0, q0 \n" + "vqmovn.u16 d1, q1 \n" + "vqmovn.u16 d2, q2 \n" + "vqmovn.u16 d3, q3 \n" + "subs %5, %5, #8 \n" + "vst4.8 {d0, d1, d2, d3}, [%4]! \n" + "bgt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_argb), // %4 + "+r"(width) // %5 + : "r"(shift) // %6 + : "memory", "cc", "q0", "q1", "q2", "q3", "q15"); +} + +void MergeXRGB16To8Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width) { + int shift = 8 - depth; + asm volatile( + + "vdup.16 q15, %5 \n" + "vmov.u8 d6, #0xff \n" // A (0xff) + "1: \n" + "vld1.16 {q2}, [%0]! \n" // R + "vld1.16 {q1}, [%1]! \n" // G + "vld1.16 {q0}, [%2]! \n" // B + "vshl.u16 q2, q2, q15 \n" + "vshl.u16 q1, q1, q15 \n" + "vshl.u16 q0, q0, q15 \n" + "vqmovn.u16 d5, q2 \n" + "vqmovn.u16 d4, q1 \n" + "vqmovn.u16 d3, q0 \n" + "subs %4, %4, #8 \n" + "vst4.u8 {d3, d4, d5, d6}, [%3]! \n" + "bgt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_argb), // %3 + "+r"(width) // %4 + : "r"(shift) // %5 + : "memory", "cc", "q0", "q1", "q2", "d6", "q15"); +} + // Copy multiple of 32. vld4.8 allow unaligned and is fastest on a15. void CopyRow_NEON(const uint8_t* src, uint8_t* dst, int width) { asm volatile( @@ -1193,16 +1528,16 @@ void ARGBToRGB565Row_NEON(const uint8_t* src_argb, int width) { asm volatile( "1: \n" - "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. + "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 pixels of ARGB. "subs %2, %2, #8 \n" // 8 processed per loop. ARGBTORGB565 - "vst1.8 {q0}, [%1]! \n" // store 8 pixels RGB565. + "vst1.8 {q2}, [%1]! \n" // store 8 pixels RGB565. "bgt 1b \n" : "+r"(src_argb), // %0 "+r"(dst_rgb565), // %1 "+r"(width) // %2 : - : "cc", "memory", "q0", "q8", "q9", "q10", "q11"); + : "cc", "memory", "q0", "q1", "q2", "d6"); } void ARGBToRGB565DitherRow_NEON(const uint8_t* src_argb, @@ -1210,21 +1545,21 @@ void ARGBToRGB565DitherRow_NEON(const uint8_t* src_argb, const uint32_t dither4, int width) { asm volatile( - "vdup.32 d2, %2 \n" // dither4 + "vdup.32 d7, %2 \n" // dither4 "1: \n" - "vld4.8 {d20, d21, d22, d23}, [%1]! \n" // load 8 pixels of ARGB. + "vld4.8 {d0, d2, d4, d6}, [%1]! \n" // load 8 pixels of ARGB. "subs %3, %3, #8 \n" // 8 processed per loop. - "vqadd.u8 d20, d20, d2 \n" - "vqadd.u8 d21, d21, d2 \n" - "vqadd.u8 d22, d22, d2 \n" // add for dither + "vqadd.u8 d0, d0, d7 \n" + "vqadd.u8 d2, d2, d7 \n" + "vqadd.u8 d4, d4, d7 \n" // add for dither ARGBTORGB565 - "vst1.8 {q0}, [%0]! \n" // store 8 RGB565. + "vst1.8 {q2}, [%0]! \n" // store 8 RGB565. "bgt 1b \n" : "+r"(dst_rgb) // %0 : "r"(src_argb), // %1 "r"(dither4), // %2 "r"(width) // %3 - : "cc", "memory", "q0", "q1", "q8", "q9", "q10", "q11"); + : "cc", "memory", "q0", "q1", "q2", "q3"); } void ARGBToARGB1555Row_NEON(const uint8_t* src_argb, @@ -1232,26 +1567,26 @@ void ARGBToARGB1555Row_NEON(const uint8_t* src_argb, int width) { asm volatile( "1: \n" - "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. + "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 pixels of ARGB. "subs %2, %2, #8 \n" // 8 processed per loop. ARGBTOARGB1555 - "vst1.8 {q0}, [%1]! \n" // store 8 ARGB1555. + "vst1.8 {q3}, [%1]! \n" // store 8 ARGB1555. "bgt 1b \n" : "+r"(src_argb), // %0 "+r"(dst_argb1555), // %1 "+r"(width) // %2 : - : "cc", "memory", "q0", "q8", "q9", "q10", "q11"); + : "cc", "memory", "q0", "q1", "q2", "q3"); } void ARGBToARGB4444Row_NEON(const uint8_t* src_argb, uint8_t* dst_argb4444, int width) { asm volatile( - "vmov.u8 d4, #0x0f \n" // bits to clear with + "vmov.u8 d7, #0x0f \n" // bits to clear with // vbic. "1: \n" - "vld4.8 {d20, d21, d22, d23}, [%0]! \n" // load 8 pixels of ARGB. + "vld4.8 {d0, d2, d4, d6}, [%0]! \n" // load 8 pixels of ARGB. "subs %2, %2, #8 \n" // 8 processed per loop. ARGBTOARGB4444 "vst1.8 {q0}, [%1]! \n" // store 8 ARGB4444. @@ -1260,7 +1595,7 @@ void ARGBToARGB4444Row_NEON(const uint8_t* src_argb, "+r"(dst_argb4444), // %1 "+r"(width) // %2 : - : "cc", "memory", "q0", "q8", "q9", "q10", "q11"); + : "cc", "memory", "q0", "q1", "q2", "q3"); } void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { @@ -1325,7 +1660,7 @@ void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { : "cc", "memory", "q0", "q1", "q2", "q12", "q13"); } -void RGBAToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { +void RGBAToYJRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width) { asm volatile( "vmov.u8 d24, #29 \n" // B * 0.1140 coefficient "vmov.u8 d25, #150 \n" // G * 0.5870 coefficient @@ -1339,7 +1674,7 @@ void RGBAToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { "vqrshrn.u16 d0, q2, #8 \n" // 16 bit to 8 bit Y "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. "bgt 1b \n" - : "+r"(src_argb), // %0 + : "+r"(src_rgba), // %0 "+r"(dst_y), // %1 "+r"(width) // %2 : @@ -1984,6 +2319,105 @@ void ARGB4444ToYRow_NEON(const uint8_t* src_argb4444, : "cc", "memory", "q0", "q1", "q2", "q3", "q12", "q13"); } +static const uvec8 kShuffleARGBToABGR = {2, 1, 0, 3, 6, 5, 4, 7, + 10, 9, 8, 11, 14, 13, 12, 15}; + +void ARGBToAR64Row_NEON(const uint8_t* src_argb, + uint16_t* dst_ar64, + int width) { + asm volatile( + "1: \n" + "vld1.8 {q0}, [%0]! \n" + "vld1.8 {q2}, [%0]! \n" + "vmov.u8 q1, q0 \n" + "vmov.u8 q3, q2 \n" + "subs %2, %2, #8 \n" // 8 processed per loop. + "vst2.8 {q0, q1}, [%1]! \n" // store 4 pixels + "vst2.8 {q2, q3}, [%1]! \n" // store 4 pixels + "bgt 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_ar64), // %1 + "+r"(width) // %2 + : + : "cc", "memory", "q0", "q1", "q2", "q3"); +} + +void ARGBToAB64Row_NEON(const uint8_t* src_argb, + uint16_t* dst_ab64, + int width) { + asm volatile( + "vld1.8 q4, %3 \n" // shuffler + "1: \n" + "vld1.8 {q0}, [%0]! \n" + "vld1.8 {q2}, [%0]! \n" + "vtbl.8 d2, {d0, d1}, d8 \n" + "vtbl.8 d3, {d0, d1}, d9 \n" + "vtbl.8 d6, {d4, d5}, d8 \n" + "vtbl.8 d7, {d4, d5}, d9 \n" + "vmov.u8 q0, q1 \n" + "vmov.u8 q2, q3 \n" + "subs %2, %2, #8 \n" // 8 processed per loop. + "vst2.8 {q0, q1}, [%1]! \n" // store 4 pixels + "vst2.8 {q2, q3}, [%1]! \n" // store 4 pixels + "bgt 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_ab64), // %1 + "+r"(width) // %2 + : "m"(kShuffleARGBToABGR) // %3 + : "cc", "memory", "q0", "q1", "q2", "q3", "q4"); +} + +void AR64ToARGBRow_NEON(const uint16_t* src_ar64, + uint8_t* dst_argb, + int width) { + asm volatile( + "1: \n" + "vld1.16 {q0}, [%0]! \n" + "vld1.16 {q1}, [%0]! \n" + "vld1.16 {q2}, [%0]! \n" + "vld1.16 {q3}, [%0]! \n" + "vshrn.u16 d0, q0, #8 \n" + "vshrn.u16 d1, q1, #8 \n" + "vshrn.u16 d4, q2, #8 \n" + "vshrn.u16 d5, q3, #8 \n" + "subs %2, %2, #8 \n" // 8 processed per loop. + "vst1.8 {q0}, [%1]! \n" // store 4 pixels + "vst1.8 {q2}, [%1]! \n" // store 4 pixels + "bgt 1b \n" + : "+r"(src_ar64), // %0 + "+r"(dst_argb), // %1 + "+r"(width) // %2 + : + : "cc", "memory", "q0", "q1", "q2", "q3"); +} + +static const uvec8 kShuffleAB64ToARGB = {5, 3, 1, 7, 13, 11, 9, 15}; + +void AB64ToARGBRow_NEON(const uint16_t* src_ab64, + uint8_t* dst_argb, + int width) { + asm volatile( + "vld1.8 d8, %3 \n" // shuffler + "1: \n" + "vld1.16 {q0}, [%0]! \n" + "vld1.16 {q1}, [%0]! \n" + "vld1.16 {q2}, [%0]! \n" + "vld1.16 {q3}, [%0]! \n" + "vtbl.8 d0, {d0, d1}, d8 \n" + "vtbl.8 d1, {d2, d3}, d8 \n" + "vtbl.8 d4, {d4, d5}, d8 \n" + "vtbl.8 d5, {d6, d7}, d8 \n" + "subs %2, %2, #8 \n" // 8 processed per loop. + "vst1.8 {q0}, [%1]! \n" // store 4 pixels + "vst1.8 {q2}, [%1]! \n" // store 4 pixels + "bgt 1b \n" + : "+r"(src_ab64), // %0 + "+r"(dst_argb), // %1 + "+r"(width) // %2 + : "m"(kShuffleAB64ToARGB) // %3 + : "cc", "memory", "q0", "q1", "q2", "q3", "q4"); +} + void BGRAToYRow_NEON(const uint8_t* src_bgra, uint8_t* dst_y, int width) { asm volatile( "vmov.u8 d6, #25 \n" // B * 0.1016 coefficient @@ -2128,9 +2562,9 @@ void RAWToYJRow_NEON(const uint8_t* src_raw, uint8_t* dst_yj, int width) { "1: \n" "vld3.8 {d0, d1, d2}, [%0]! \n" // load 8 pixels of RAW. "subs %2, %2, #8 \n" // 8 processed per loop. - "vmull.u8 q4, d0, d4 \n" // B + "vmull.u8 q4, d0, d4 \n" // R "vmlal.u8 q4, d1, d5 \n" // G - "vmlal.u8 q4, d2, d6 \n" // R + "vmlal.u8 q4, d2, d6 \n" // B "vqrshrn.u16 d0, q4, #8 \n" // 16 bit to 8 bit Y "vst1.8 {d0}, [%1]! \n" // store 8 pixels Y. "bgt 1b \n" @@ -2201,7 +2635,7 @@ void InterpolateRow_NEON(uint8_t* dst_ptr, } // dr * (256 - sa) / 256 + sr = dr - dr * sa / 256 + sr -void ARGBBlendRow_NEON(const uint8_t* src_argb0, +void ARGBBlendRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -2252,7 +2686,7 @@ void ARGBBlendRow_NEON(const uint8_t* src_argb0, "99: \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -2490,7 +2924,7 @@ void ARGBColorMatrixRow_NEON(const uint8_t* src_argb, } // Multiply 2 rows of ARGB pixels together, 8 pixels at a time. -void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, +void ARGBMultiplyRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -2510,7 +2944,7 @@ void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, "vrshrn.u16 d3, q3, #8 \n" // 16 bit to 8 bit A "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels. "bgt 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -2519,7 +2953,7 @@ void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, } // Add 2 rows of ARGB pixels together, 8 pixels at a time. -void ARGBAddRow_NEON(const uint8_t* src_argb0, +void ARGBAddRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -2533,7 +2967,7 @@ void ARGBAddRow_NEON(const uint8_t* src_argb0, "vqadd.u8 q1, q1, q3 \n" // add R, A "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels. "bgt 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -2542,7 +2976,7 @@ void ARGBAddRow_NEON(const uint8_t* src_argb0, } // Subtract 2 rows of ARGB pixels, 8 pixels at a time. -void ARGBSubtractRow_NEON(const uint8_t* src_argb0, +void ARGBSubtractRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -2556,7 +2990,7 @@ void ARGBSubtractRow_NEON(const uint8_t* src_argb0, "vqsub.u8 q1, q1, q3 \n" // subtract R, A "vst4.8 {d0, d1, d2, d3}, [%2]! \n" // store 8 ARGB pixels. "bgt 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -3031,6 +3465,110 @@ void HalfMergeUVRow_NEON(const uint8_t* src_u, : "cc", "memory", "q0", "q1", "q2", "q3"); } +void SplitUVRow_16_NEON(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width) { + int shift = depth - 16; // Negative for right shift. + asm volatile( + "vdup.16 q2, %4 \n" + "1: \n" + "vld2.16 {q0, q1}, [%0]! \n" // load 8 UV + "vshl.u16 q0, q0, q2 \n" + "vshl.u16 q1, q1, q2 \n" + "subs %3, %3, #8 \n" // 8 src pixels per loop + "vst1.16 {q0}, [%1]! \n" // store 8 U pixels + "vst1.16 {q1}, [%2]! \n" // store 8 V pixels + "bgt 1b \n" + : "+r"(src_uv), // %0 + "+r"(dst_u), // %1 + "+r"(dst_v), // %2 + "+r"(width) // %3 + : "r"(shift) // %4 + : "cc", "memory", "q0", "q1", "q2", "q3", "q4"); +} + +void MergeUVRow_16_NEON(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width) { + int shift = 16 - depth; + asm volatile( + "vdup.16 q2, %4 \n" + "1: \n" + "vld1.16 {q0}, [%0]! \n" // load 8 U + "vld1.16 {q1}, [%1]! \n" // load 8 V + "vshl.u16 q0, q0, q2 \n" + "vshl.u16 q1, q1, q2 \n" + "subs %3, %3, #8 \n" // 8 src pixels per loop + "vst2.16 {q0, q1}, [%2]! \n" // store 8 UV pixels + "bgt 1b \n" + : "+r"(src_u), // %0 + "+r"(src_v), // %1 + "+r"(dst_uv), // %2 + "+r"(width) // %3 + : "r"(shift) // %4 + : "cc", "memory", "q0", "q1", "q2"); +} + +void MultiplyRow_16_NEON(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width) { + asm volatile( + "vdup.16 q2, %2 \n" + "1: \n" + "vld1.16 {q0}, [%0]! \n" + "vld1.16 {q1}, [%0]! \n" + "vmul.u16 q0, q0, q2 \n" + "vmul.u16 q1, q1, q2 \n" + "vst1.16 {q0}, [%1]! \n" + "vst1.16 {q1}, [%1]! \n" + "subs %3, %3, #16 \n" // 16 src pixels per loop + "bgt 1b \n" + : "+r"(src_y), // %0 + "+r"(dst_y), // %1 + "+r"(scale), // %2 + "+r"(width) // %3 + : + : "cc", "memory", "q0", "q1", "q2"); +} + +void DivideRow_16_NEON(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width) { + asm volatile( + "vdup.16 q0, %2 \n" + "1: \n" + "vld1.16 {q1}, [%0]! \n" + "vld1.16 {q2}, [%0]! \n" + "vmovl.u16 q3, d2 \n" + "vmovl.u16 q1, d3 \n" + "vmovl.u16 q4, d4 \n" + "vmovl.u16 q2, d5 \n" + "vshl.u32 q3, q3, q0 \n" + "vshl.u32 q4, q4, q0 \n" + "vshl.u32 q1, q1, q0 \n" + "vshl.u32 q2, q2, q0 \n" + "vmovn.u32 d2, q3 \n" + "vmovn.u32 d3, q1 \n" + "vmovn.u32 d4, q4 \n" + "vmovn.u32 d5, q2 \n" + "vst1.16 {q1}, [%1]! \n" + "vst1.16 {q2}, [%1]! \n" + "subs %3, %3, #16 \n" // 16 src pixels per loop + "bgt 1b \n" + : "+r"(src_y), // %0 + "+r"(dst_y), // %1 + "+r"(scale), // %2 + "+r"(width) // %3 + : + : "cc", "memory", "q0", "q1", "q2", "q3", "q4"); +} + #endif // !defined(LIBYUV_DISABLE_NEON) && defined(__ARM_NEON__).. #ifdef __cplusplus diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/row_neon64.cc b/third-party/libyuv/third_party/libyuv/source/row_neon64.cc similarity index 75% rename from third-party/webrtc/dependencies/third_party/libyuv/source/row_neon64.cc rename to third-party/libyuv/third_party/libyuv/source/row_neon64.cc index d5258a3aef..da7e3c7cd4 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/row_neon64.cc +++ b/third-party/libyuv/third_party/libyuv/source/row_neon64.cc @@ -18,93 +18,101 @@ extern "C" { // This module is for GCC Neon armv8 64 bit. #if !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__) +// v0.8h: Y +// v1.16b: 8U, 8V + // Read 8 Y, 4 U and 4 V from 422 #define READYUV422 \ - "ld1 {v0.8b}, [%0], #8 \n" \ - "ld1 {v1.s}[0], [%1], #4 \n" \ - "ld1 {v1.s}[1], [%2], #4 \n" + "ldr d0, [%[src_y]], #8 \n" \ + "ld1 {v1.s}[0], [%[src_u]], #4 \n" \ + "ld1 {v1.s}[1], [%[src_v]], #4 \n" \ + "zip1 v0.16b, v0.16b, v0.16b \n" \ + "prfm pldl1keep, [%[src_y], 448] \n" \ + "zip1 v1.16b, v1.16b, v1.16b \n" \ + "prfm pldl1keep, [%[src_u], 128] \n" \ + "prfm pldl1keep, [%[src_v], 128] \n" // Read 8 Y, 8 U and 8 V from 444 #define READYUV444 \ - "ld1 {v0.8b}, [%0], #8 \n" \ - "ld1 {v1.d}[0], [%1], #8 \n" \ - "ld1 {v1.d}[1], [%2], #8 \n" \ - "uaddlp v1.8h, v1.16b \n" \ - "rshrn v1.8b, v1.8h, #1 \n" + "ldr d0, [%[src_y]], #8 \n" \ + "ld1 {v1.d}[0], [%[src_u]], #8 \n" \ + "prfm pldl1keep, [%[src_y], 448] \n" \ + "ld1 {v1.d}[1], [%[src_v]], #8 \n" \ + "prfm pldl1keep, [%[src_u], 448] \n" \ + "zip1 v0.16b, v0.16b, v0.16b \n" \ + "prfm pldl1keep, [%[src_v], 448] \n" // Read 8 Y, and set 4 U and 4 V to 128 #define READYUV400 \ - "ld1 {v0.8b}, [%0], #8 \n" \ - "movi v1.8b , #128 \n" + "ldr d0, [%[src_y]], #8 \n" \ + "movi v1.16b, #128 \n" \ + "prfm pldl1keep, [%[src_y], 448] \n" \ + "zip1 v0.16b, v0.16b, v0.16b \n" -// Read 8 Y and 4 UV from NV12 +static const uvec8 kNV12Table = {0, 0, 2, 2, 4, 4, 6, 6, + 1, 1, 3, 3, 5, 5, 7, 7}; +static const uvec8 kNV21Table = {1, 1, 3, 3, 5, 5, 7, 7, + 0, 0, 2, 2, 4, 4, 6, 6}; + +// Read 8 Y and 4 UV from NV12 or NV21 #define READNV12 \ - "ld1 {v0.8b}, [%0], #8 \n" \ - "ld1 {v2.8b}, [%1], #8 \n" \ - "uzp1 v1.8b, v2.8b, v2.8b \n" \ - "uzp2 v3.8b, v2.8b, v2.8b \n" \ - "ins v1.s[1], v3.s[0] \n" - -// Read 8 Y and 4 VU from NV21 -#define READNV21 \ - "ld1 {v0.8b}, [%0], #8 \n" \ - "ld1 {v2.8b}, [%1], #8 \n" \ - "uzp1 v3.8b, v2.8b, v2.8b \n" \ - "uzp2 v1.8b, v2.8b, v2.8b \n" \ - "ins v1.s[1], v3.s[0] \n" + "ldr d0, [%[src_y]], #8 \n" \ + "ldr d1, [%[src_uv]], #8 \n" \ + "zip1 v0.16b, v0.16b, v0.16b \n" \ + "prfm pldl1keep, [%[src_y], 448] \n" \ + "tbl v1.16b, {v1.16b}, v2.16b \n" \ + "prfm pldl1keep, [%[src_uv], 448] \n" // Read 8 YUY2 -#define READYUY2 \ - "ld2 {v0.8b, v1.8b}, [%0], #16 \n" \ - "uzp2 v3.8b, v1.8b, v1.8b \n" \ - "uzp1 v1.8b, v1.8b, v1.8b \n" \ - "ins v1.s[1], v3.s[0] \n" +#define READYUY2 \ + "ld2 {v0.8b, v1.8b}, [%[src_yuy2]], #16 \n" \ + "zip1 v0.16b, v0.16b, v0.16b \n" \ + "prfm pldl1keep, [%[src_yuy2], 448] \n" \ + "tbl v1.16b, {v1.16b}, v2.16b \n" // Read 8 UYVY -#define READUYVY \ - "ld2 {v2.8b, v3.8b}, [%0], #16 \n" \ - "orr v0.8b, v3.8b, v3.8b \n" \ - "uzp1 v1.8b, v2.8b, v2.8b \n" \ - "uzp2 v3.8b, v2.8b, v2.8b \n" \ - "ins v1.s[1], v3.s[0] \n" +#define READUYVY \ + "ld2 {v3.8b, v4.8b}, [%[src_uyvy]], #16 \n" \ + "zip1 v0.16b, v4.16b, v4.16b \n" \ + "prfm pldl1keep, [%[src_uyvy], 448] \n" \ + "tbl v1.16b, {v3.16b}, v2.16b \n" -#define YUVTORGB_SETUP \ - "ld3r {v24.8h, v25.8h, v26.8h}, [%[kUVBiasBGR]] \n" \ - "ld1r {v31.4s}, [%[kYToRgb]] \n" \ - "ld2 {v27.8h, v28.8h}, [%[kUVToRB]] \n" \ - "ld2 {v29.8h, v30.8h}, [%[kUVToG]] \n" +// UB VR UG VG +// YG BB BG BR +#define YUVTORGB_SETUP \ + "ld4r {v28.16b, v29.16b, v30.16b, v31.16b}, [%[kUVCoeff]] \n" \ + "ld4r {v24.8h, v25.8h, v26.8h, v27.8h}, [%[kRGBCoeffBias]] \n" -// clang-format off +// v16.8h: B +// v17.8h: G +// v18.8h: R -#define YUVTORGB(vR, vG, vB) \ - "uxtl v0.8h, v0.8b \n" /* Extract Y */ \ - "shll v2.8h, v1.8b, #8 \n" /* Replicate UV */ \ - "ushll2 v3.4s, v0.8h, #0 \n" /* Y */ \ - "ushll v0.4s, v0.4h, #0 \n" \ - "mul v3.4s, v3.4s, v31.4s \n" \ - "mul v0.4s, v0.4s, v31.4s \n" \ - "sqshrun v0.4h, v0.4s, #16 \n" \ - "sqshrun2 v0.8h, v3.4s, #16 \n" /* Y */ \ - "uaddw v1.8h, v2.8h, v1.8b \n" /* Replicate UV */ \ - "mov v2.d[0], v1.d[1] \n" /* Extract V */ \ - "uxtl v2.8h, v2.8b \n" \ - "uxtl v1.8h, v1.8b \n" /* Extract U */ \ - "mul v3.8h, v27.8h, v1.8h \n" \ - "mul v5.8h, v29.8h, v1.8h \n" \ - "mul v6.8h, v30.8h, v2.8h \n" \ - "mul v7.8h, v28.8h, v2.8h \n" \ - "sqadd v6.8h, v6.8h, v5.8h \n" \ - "sqadd " #vB ".8h, v24.8h, v0.8h \n" /* B */ \ - "sqadd " #vG ".8h, v25.8h, v0.8h \n" /* G */ \ - "sqadd " #vR ".8h, v26.8h, v0.8h \n" /* R */ \ - "sqadd " #vB ".8h, " #vB ".8h, v3.8h \n" /* B */ \ - "sqsub " #vG ".8h, " #vG ".8h, v6.8h \n" /* G */ \ - "sqadd " #vR ".8h, " #vR ".8h, v7.8h \n" /* R */ \ - "sqshrun " #vB ".8b, " #vB ".8h, #6 \n" /* B */ \ - "sqshrun " #vG ".8b, " #vG ".8h, #6 \n" /* G */ \ - "sqshrun " #vR ".8b, " #vR ".8h, #6 \n" /* R */ +// Convert from YUV to 2.14 fixed point RGB +#define YUVTORGB \ + "umull2 v3.4s, v0.8h, v24.8h \n" \ + "umull v6.8h, v1.8b, v30.8b \n" \ + "umull v0.4s, v0.4h, v24.4h \n" \ + "umlal2 v6.8h, v1.16b, v31.16b \n" /* DG */ \ + "uqshrn v0.4h, v0.4s, #16 \n" \ + "uqshrn2 v0.8h, v3.4s, #16 \n" /* Y */ \ + "umull v4.8h, v1.8b, v28.8b \n" /* DB */ \ + "umull2 v5.8h, v1.16b, v29.16b \n" /* DR */ \ + "add v17.8h, v0.8h, v26.8h \n" /* G */ \ + "add v16.8h, v0.8h, v4.8h \n" /* B */ \ + "add v18.8h, v0.8h, v5.8h \n" /* R */ \ + "uqsub v17.8h, v17.8h, v6.8h \n" /* G */ \ + "uqsub v16.8h, v16.8h, v25.8h \n" /* B */ \ + "uqsub v18.8h, v18.8h, v27.8h \n" /* R */ -// clang-format on +// Convert from 2.14 fixed point RGB To 8 bit RGB +#define RGBTORGB8 \ + "uqshrn v17.8b, v17.8h, #6 \n" \ + "uqshrn v16.8b, v16.8h, #6 \n" \ + "uqshrn v18.8b, v18.8h, #6 \n" + +#define YUVTORGB_REGS \ + "v0", "v1", "v3", "v4", "v5", "v6", "v7", "v16", "v17", "v18", "v24", "v25", \ + "v26", "v27", "v28", "v29", "v30", "v31" void I444ToARGBRow_NEON(const uint8_t* src_y, const uint8_t* src_u, @@ -112,30 +120,22 @@ void I444ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v23.8b, #255 \n" /* A */ - "1: \n" - READYUV444 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%1, 448] \n" - "prfm pldl1keep, [%2, 448] \n" - "subs %w4, %w4, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" + asm volatile( + YUVTORGB_SETUP + "movi v19.8b, #255 \n" /* A */ + "1: \n" READYUV444 YUVTORGB + RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_argb), // %3 - "+r"(width) // %4 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "v19"); } void I422ToARGBRow_NEON(const uint8_t* src_y, @@ -144,31 +144,48 @@ void I422ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v23.8b, #255 \n" /* A */ - - "1: \n" - READYUV422 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%1, 128] \n" - "prfm pldl1keep, [%2, 128] \n" - "subs %w4, %w4, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" + asm volatile( + YUVTORGB_SETUP + "movi v19.8b, #255 \n" /* A */ + "1: \n" READYUV422 YUVTORGB + RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_argb), // %3 - "+r"(width) // %4 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "v19"); +} + +void I444AlphaToARGBRow_NEON(const uint8_t* src_y, + const uint8_t* src_u, + const uint8_t* src_v, + const uint8_t* src_a, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + asm volatile( + YUVTORGB_SETUP + "1: \n" + "ld1 {v19.8b}, [%[src_a]], #8 \n" READYUV444 + "prfm pldl1keep, [%[src_a], 448] \n" YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" + "b.gt 1b \n" + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [src_a] "+r"(src_a), // %[src_a] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "v19"); } void I422AlphaToARGBRow_NEON(const uint8_t* src_y, @@ -178,32 +195,23 @@ void I422AlphaToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP + asm volatile( + YUVTORGB_SETUP "1: \n" - READYUV422 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "ld1 {v23.8b}, [%3], #8 \n" - "prfm pldl1keep, [%1, 128] \n" - "prfm pldl1keep, [%2, 128] \n" - "prfm pldl1keep, [%3, 448] \n" - "subs %w5, %w5, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%4], #32 \n" + "ld1 {v19.8b}, [%[src_a]], #8 \n" READYUV422 + "prfm pldl1keep, [%[src_a], 448] \n" YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(src_a), // %3 - "+r"(dst_argb), // %4 - "+r"(width) // %5 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [src_a] "+r"(src_a), // %[src_a] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "v19"); } void I422ToRGBARow_NEON(const uint8_t* src_y, @@ -212,30 +220,22 @@ void I422ToRGBARow_NEON(const uint8_t* src_y, uint8_t* dst_rgba, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v20.8b, #255 \n" /* A */ - "1: \n" - READYUV422 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v23, v22, v21) - "prfm pldl1keep, [%1, 128] \n" - "prfm pldl1keep, [%2, 128] \n" - "subs %w4, %w4, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%3], #32 \n" + asm volatile( + YUVTORGB_SETUP + "movi v15.8b, #255 \n" /* A */ + "1: \n" READYUV422 YUVTORGB + RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v15.8b,v16.8b,v17.8b,v18.8b}, [%[dst_rgba]], #32 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_rgba), // %3 - "+r"(width) // %4 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_rgba] "+r"(dst_rgba), // %[dst_rgba] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "v15"); } void I422ToRGB24Row_NEON(const uint8_t* src_y, @@ -244,39 +244,29 @@ void I422ToRGB24Row_NEON(const uint8_t* src_y, uint8_t* dst_rgb24, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "1: \n" - READYUV422 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%1, 128] \n" - "prfm pldl1keep, [%2, 128] \n" - "subs %w4, %w4, #8 \n" - "st3 {v20.8b,v21.8b,v22.8b}, [%3], #24 \n" + asm volatile( + YUVTORGB_SETUP + "1: \n" READYUV422 YUVTORGB + RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st3 {v16.8b,v17.8b,v18.8b}, [%[dst_rgb24]], #24 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_rgb24), // %3 - "+r"(width) // %4 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS); } #define ARGBTORGB565 \ - "shll v0.8h, v22.8b, #8 \n" /* R */ \ - "shll v21.8h, v21.8b, #8 \n" /* G */ \ - "shll v20.8h, v20.8b, #8 \n" /* B */ \ - "sri v0.8h, v21.8h, #5 \n" /* RG */ \ - "sri v0.8h, v20.8h, #11 \n" /* RGB */ - -// clang-format off + "shll v18.8h, v18.8b, #8 \n" /* R */ \ + "shll v17.8h, v17.8b, #8 \n" /* G */ \ + "shll v16.8h, v16.8b, #8 \n" /* B */ \ + "sri v18.8h, v17.8h, #5 \n" /* RG */ \ + "sri v18.8h, v16.8h, #11 \n" /* RGB */ void I422ToRGB565Row_NEON(const uint8_t* src_y, const uint8_t* src_u, @@ -285,38 +275,29 @@ void I422ToRGB565Row_NEON(const uint8_t* src_y, const struct YuvConstants* yuvconstants, int width) { asm volatile( - YUVTORGB_SETUP - "1: \n" - READYUV422 - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%0, 448] \n" - "subs %w4, %w4, #8 \n" - ARGBTORGB565 - "prfm pldl1keep, [%1, 128] \n" - "prfm pldl1keep, [%2, 128] \n" - "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels RGB565. + YUVTORGB_SETUP + "1: \n" READYUV422 YUVTORGB + RGBTORGB8 "subs %w[width], %w[width], #8 \n" ARGBTORGB565 + "st1 {v18.8h}, [%[dst_rgb565]], #16 \n" // store 8 pixels RGB565. "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_rgb565), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_rgb565] "+r"(dst_rgb565), // %[dst_rgb565] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS); } #define ARGBTOARGB1555 \ - "shll v0.8h, v23.8b, #8 \n" /* A */ \ - "shll v22.8h, v22.8b, #8 \n" /* R */ \ - "shll v21.8h, v21.8b, #8 \n" /* G */ \ - "shll v20.8h, v20.8b, #8 \n" /* B */ \ - "sri v0.8h, v22.8h, #1 \n" /* AR */ \ - "sri v0.8h, v21.8h, #6 \n" /* ARG */ \ - "sri v0.8h, v20.8h, #11 \n" /* ARGB */ + "shll v0.8h, v19.8b, #8 \n" /* A */ \ + "shll v18.8h, v18.8b, #8 \n" /* R */ \ + "shll v17.8h, v17.8b, #8 \n" /* G */ \ + "shll v16.8h, v16.8b, #8 \n" /* B */ \ + "sri v0.8h, v18.8h, #1 \n" /* AR */ \ + "sri v0.8h, v17.8h, #6 \n" /* ARG */ \ + "sri v0.8h, v16.8h, #11 \n" /* ARGB */ void I422ToARGB1555Row_NEON(const uint8_t* src_y, const uint8_t* src_u, @@ -325,40 +306,32 @@ void I422ToARGB1555Row_NEON(const uint8_t* src_y, const struct YuvConstants* yuvconstants, int width) { asm volatile( - YUVTORGB_SETUP - "movi v23.8b, #255 \n" - "1: \n" - READYUV422 - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%0, 448] \n" - "subs %w4, %w4, #8 \n" - ARGBTOARGB1555 - "prfm pldl1keep, [%1, 128] \n" - "prfm pldl1keep, [%2, 128] \n" - "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels RGB565. + YUVTORGB_SETUP + "movi v19.8b, #255 \n" + "1: \n" READYUV422 YUVTORGB + RGBTORGB8 + "subs %w[width], %w[width], #8 \n" ARGBTOARGB1555 + "st1 {v0.8h}, [%[dst_argb1555]], #16 \n" // store 8 pixels + // RGB565. "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_argb1555), // %3 - "+r"(width) // %4 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_argb1555] "+r"(dst_argb1555), // %[dst_argb1555] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "v19"); } -// clang-format on #define ARGBTOARGB4444 \ - /* Input v20.8b<=B, v21.8b<=G, v22.8b<=R, v23.8b<=A, v4.8b<=0x0f */ \ - "ushr v20.8b, v20.8b, #4 \n" /* B */ \ - "bic v21.8b, v21.8b, v4.8b \n" /* G */ \ - "ushr v22.8b, v22.8b, #4 \n" /* R */ \ - "bic v23.8b, v23.8b, v4.8b \n" /* A */ \ - "orr v0.8b, v20.8b, v21.8b \n" /* BG */ \ - "orr v1.8b, v22.8b, v23.8b \n" /* RA */ \ + /* Input v16.8b<=B, v17.8b<=G, v18.8b<=R, v19.8b<=A, v23.8b<=0x0f */ \ + "ushr v16.8b, v16.8b, #4 \n" /* B */ \ + "bic v17.8b, v17.8b, v23.8b \n" /* G */ \ + "ushr v18.8b, v18.8b, #4 \n" /* R */ \ + "bic v19.8b, v19.8b, v23.8b \n" /* A */ \ + "orr v0.8b, v16.8b, v17.8b \n" /* BG */ \ + "orr v1.8b, v18.8b, v19.8b \n" /* RA */ \ "zip1 v0.16b, v0.16b, v1.16b \n" /* BGRA */ void I422ToARGB4444Row_NEON(const uint8_t* src_y, @@ -367,58 +340,46 @@ void I422ToARGB4444Row_NEON(const uint8_t* src_y, uint8_t* dst_argb4444, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v4.16b, #0x0f \n" // bits to clear with vbic. - "1: \n" - READYUV422 - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%0, 448] \n" - "subs %w4, %w4, #8 \n" - "movi v23.8b, #255 \n" - ARGBTOARGB4444 - "prfm pldl1keep, [%1, 128] \n" - "prfm pldl1keep, [%2, 128] \n" - "st1 {v0.8h}, [%3], #16 \n" // store 8 pixels ARGB4444. + asm volatile( + YUVTORGB_SETUP + "movi v23.16b, #0x0f \n" // bits to clear with + // vbic. + "1: \n" READYUV422 YUVTORGB + RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "movi v19.8b, #255 \n" ARGBTOARGB4444 + "st1 {v0.8h}, [%[dst_argb4444]], #16 \n" // store 8 + // pixels + // ARGB4444. "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_u), // %1 - "+r"(src_v), // %2 - "+r"(dst_argb4444), // %3 - "+r"(width) // %4 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_u] "+r"(src_u), // %[src_u] + [src_v] "+r"(src_v), // %[src_v] + [dst_argb4444] "+r"(dst_argb4444), // %[dst_argb4444] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "v19", "v23"); } void I400ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v23.8b, #255 \n" - "1: \n" - READYUV400 - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], #32 \n" + asm volatile( + YUVTORGB_SETUP + "movi v19.8b, #255 \n" + "1: \n" READYUV400 YUVTORGB + RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(dst_argb), // %1 - "+r"(width) // %2 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias) // %[kRGBCoeffBias] + : "cc", "memory", YUVTORGB_REGS, "v19"); } void J400ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, int width) { @@ -444,28 +405,22 @@ void NV12ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v23.8b, #255 \n" - "1: \n" - READNV12 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%1, 256] \n" - "subs %w3, %w3, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%2], #32 \n" + asm volatile( + YUVTORGB_SETUP + "movi v19.8b, #255 \n" + "ldr q2, [%[kNV12Table]] \n" + "1: \n" READNV12 YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_uv), // %1 - "+r"(dst_argb), // %2 - "+r"(width) // %3 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_uv] "+r"(src_uv), // %[src_uv] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias), // %[kRGBCoeffBias] + [kNV12Table] "r"(&kNV12Table) + : "cc", "memory", YUVTORGB_REGS, "v2", "v19"); } void NV21ToARGBRow_NEON(const uint8_t* src_y, @@ -473,28 +428,22 @@ void NV21ToARGBRow_NEON(const uint8_t* src_y, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v23.8b, #255 \n" - "1: \n" - READNV21 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%1, 256] \n" - "subs %w3, %w3, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%2], #32 \n" + asm volatile( + YUVTORGB_SETUP + "movi v19.8b, #255 \n" + "ldr q2, [%[kNV12Table]] \n" + "1: \n" READNV12 YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_vu), // %1 - "+r"(dst_argb), // %2 - "+r"(width) // %3 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_uv] "+r"(src_vu), // %[src_uv] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias), // %[kRGBCoeffBias] + [kNV12Table] "r"(&kNV21Table) + : "cc", "memory", YUVTORGB_REGS, "v2", "v19"); } void NV12ToRGB24Row_NEON(const uint8_t* src_y, @@ -502,27 +451,21 @@ void NV12ToRGB24Row_NEON(const uint8_t* src_y, uint8_t* dst_rgb24, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "1: \n" - READNV12 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%1, 256] \n" - "subs %w3, %w3, #8 \n" - "st3 {v20.8b,v21.8b,v22.8b}, [%2], #24 \n" + asm volatile( + YUVTORGB_SETUP + "ldr q2, [%[kNV12Table]] \n" + "1: \n" READNV12 YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st3 {v16.8b,v17.8b,v18.8b}, [%[dst_rgb24]], #24 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_uv), // %1 - "+r"(dst_rgb24), // %2 - "+r"(width) // %3 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_uv] "+r"(src_uv), // %[src_uv] + [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias), // %[kRGBCoeffBias] + [kNV12Table] "r"(&kNV12Table) + : "cc", "memory", YUVTORGB_REGS, "v2"); } void NV21ToRGB24Row_NEON(const uint8_t* src_y, @@ -530,27 +473,21 @@ void NV21ToRGB24Row_NEON(const uint8_t* src_y, uint8_t* dst_rgb24, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "1: \n" - READNV21 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%1, 256] \n" - "subs %w3, %w3, #8 \n" - "st3 {v20.8b,v21.8b,v22.8b}, [%2], #24 \n" + asm volatile( + YUVTORGB_SETUP + "ldr q2, [%[kNV12Table]] \n" + "1: \n" READNV12 YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st3 {v16.8b,v17.8b,v18.8b}, [%[dst_rgb24]], #24 \n" "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_vu), // %1 - "+r"(dst_rgb24), // %2 - "+r"(width) // %3 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_y] "+r"(src_y), // %[src_y] + [src_uv] "+r"(src_vu), // %[src_uv] + [dst_rgb24] "+r"(dst_rgb24), // %[dst_rgb24] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias), // %[kRGBCoeffBias] + [kNV12Table] "r"(&kNV21Table) + : "cc", "memory", YUVTORGB_REGS, "v2"); } void NV12ToRGB565Row_NEON(const uint8_t* src_y, @@ -559,75 +496,64 @@ void NV12ToRGB565Row_NEON(const uint8_t* src_y, const struct YuvConstants* yuvconstants, int width) { asm volatile( - YUVTORGB_SETUP "1: \n" READNV12 - "prfm pldl1keep, [%0, 448] \n" YUVTORGB( - v22, v21, v20) ARGBTORGB565 - "prfm pldl1keep, [%1, 256] \n" - "subs %w3, %w3, #8 \n" - "st1 {v0.8h}, [%2], 16 \n" // store 8 pixels + YUVTORGB_SETUP + "ldr q2, [%[kNV12Table]] \n" + "1: \n" READNV12 YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" ARGBTORGB565 + "st1 {v18.8h}, [%[dst_rgb565]], #16 \n" // store 8 + // pixels + // RGB565. "b.gt 1b \n" - : "+r"(src_y), // %0 - "+r"(src_uv), // %1 - "+r"(dst_rgb565), // %2 - "+r"(width) // %3 - : [kUVToRB] "r"(&yuvconstants->kUVToRB), - [kUVToG] "r"(&yuvconstants->kUVToG), - [kUVBiasBGR] "r"(&yuvconstants->kUVBiasBGR), - [kYToRgb] "r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30"); + : [src_y] "+r"(src_y), // %[src_y] + [src_uv] "+r"(src_uv), // %[src_uv] + [dst_rgb565] "+r"(dst_rgb565), // %[dst_rgb565] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias), // %[kRGBCoeffBias] + [kNV12Table] "r"(&kNV12Table) + : "cc", "memory", YUVTORGB_REGS, "v2"); } void YUY2ToARGBRow_NEON(const uint8_t* src_yuy2, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v23.8b, #255 \n" - "1: \n" - READYUY2 - "prfm pldl1keep, [%0, 448] \n" - YUVTORGB(v22, v21, v20) - "subs %w2, %w2, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], #32 \n" + asm volatile( + YUVTORGB_SETUP + "movi v19.8b, #255 \n" + "ldr q2, [%[kNV12Table]] \n" + "1: \n" READYUY2 YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" "b.gt 1b \n" - : "+r"(src_yuy2), // %0 - "+r"(dst_argb), // %1 - "+r"(width) // %2 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_yuy2] "+r"(src_yuy2), // %[src_yuy2] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias), // %[kRGBCoeffBias] + [kNV12Table] "r"(&kNV12Table) + : "cc", "memory", YUVTORGB_REGS, "v2", "v19"); } void UYVYToARGBRow_NEON(const uint8_t* src_uyvy, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - asm volatile ( - YUVTORGB_SETUP - "movi v23.8b, #255 \n" - "1: \n" - READUYVY - YUVTORGB(v22, v21, v20) - "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" - "st4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], 32 \n" + asm volatile( + YUVTORGB_SETUP + "movi v19.8b, #255 \n" + "ldr q2, [%[kNV12Table]] \n" + "1: \n" READUYVY YUVTORGB RGBTORGB8 + "subs %w[width], %w[width], #8 \n" + "st4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%[dst_argb]], #32 \n" "b.gt 1b \n" - : "+r"(src_uyvy), // %0 - "+r"(dst_argb), // %1 - "+r"(width) // %2 - : [kUVToRB]"r"(&yuvconstants->kUVToRB), - [kUVToG]"r"(&yuvconstants->kUVToG), - [kUVBiasBGR]"r"(&yuvconstants->kUVBiasBGR), - [kYToRgb]"r"(&yuvconstants->kYToRgb) - : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v20", - "v21", "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30" - ); + : [src_uyvy] "+r"(src_uyvy), // %[src_yuy2] + [dst_argb] "+r"(dst_argb), // %[dst_argb] + [width] "+r"(width) // %[width] + : [kUVCoeff] "r"(&yuvconstants->kUVCoeff), // %[kUVCoeff] + [kRGBCoeffBias] "r"(&yuvconstants->kRGBCoeffBias), // %[kRGBCoeffBias] + [kNV12Table] "r"(&kNV12Table) + : "cc", "memory", YUVTORGB_REGS, "v2", "v19"); } // Reads 16 pairs of UV and write even values to dst_u and odd to dst_v. @@ -638,8 +564,8 @@ void SplitUVRow_NEON(const uint8_t* src_uv, asm volatile( "1: \n" "ld2 {v0.16b,v1.16b}, [%0], #32 \n" // load 16 pairs of UV - "prfm pldl1keep, [%0, 448] \n" "subs %w3, %w3, #16 \n" // 16 processed per loop + "prfm pldl1keep, [%0, 448] \n" "st1 {v0.16b}, [%1], #16 \n" // store U "st1 {v1.16b}, [%2], #16 \n" // store V "b.gt 1b \n" @@ -661,9 +587,9 @@ void MergeUVRow_NEON(const uint8_t* src_u, "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load U "ld1 {v1.16b}, [%1], #16 \n" // load V + "subs %w3, %w3, #16 \n" // 16 processed per loop "prfm pldl1keep, [%0, 448] \n" "prfm pldl1keep, [%1, 448] \n" - "subs %w3, %w3, #16 \n" // 16 processed per loop "st2 {v0.16b,v1.16b}, [%2], #32 \n" // store 16 pairs of UV "b.gt 1b \n" : "+r"(src_u), // %0 @@ -684,8 +610,8 @@ void SplitRGBRow_NEON(const uint8_t* src_rgb, asm volatile( "1: \n" "ld3 {v0.16b,v1.16b,v2.16b}, [%0], #48 \n" // load 16 RGB - "prfm pldl1keep, [%0, 448] \n" "subs %w4, %w4, #16 \n" // 16 processed per loop + "prfm pldl1keep, [%0, 448] \n" "st1 {v0.16b}, [%1], #16 \n" // store R "st1 {v1.16b}, [%2], #16 \n" // store G "st1 {v2.16b}, [%3], #16 \n" // store B @@ -711,12 +637,11 @@ void MergeRGBRow_NEON(const uint8_t* src_r, "ld1 {v0.16b}, [%0], #16 \n" // load R "ld1 {v1.16b}, [%1], #16 \n" // load G "ld1 {v2.16b}, [%2], #16 \n" // load B + "subs %w4, %w4, #16 \n" // 16 processed per loop "prfm pldl1keep, [%0, 448] \n" "prfm pldl1keep, [%1, 448] \n" "prfm pldl1keep, [%2, 448] \n" - "subs %w4, %w4, #16 \n" // 16 processed per loop "st3 {v0.16b,v1.16b,v2.16b}, [%3], #48 \n" // store 16 RGB - "prfm pldl1keep, [%0, 448] \n" "b.gt 1b \n" : "+r"(src_r), // %0 "+r"(src_g), // %1 @@ -728,6 +653,352 @@ void MergeRGBRow_NEON(const uint8_t* src_r, ); } +// Reads 16 packed ARGB and write to planar dst_r, dst_g, dst_b, dst_a. +void SplitARGBRow_NEON(const uint8_t* src_rgba, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + uint8_t* dst_a, + int width) { + asm volatile( + "1: \n" + "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 ARGB + "subs %w5, %w5, #16 \n" // 16 processed per loop + "prfm pldl1keep, [%0, 448] \n" + "st1 {v0.16b}, [%3], #16 \n" // store B + "st1 {v1.16b}, [%2], #16 \n" // store G + "st1 {v2.16b}, [%1], #16 \n" // store R + "st1 {v3.16b}, [%4], #16 \n" // store A + "b.gt 1b \n" + : "+r"(src_rgba), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(dst_a), // %4 + "+r"(width) // %5 + : // Input registers + : "cc", "memory", "v0", "v1", "v2", "v3" // Clobber List + ); +} + +// Reads 16 planar R's, G's, B's and A's and writes out 16 packed ARGB at a time +void MergeARGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + const uint8_t* src_a, + uint8_t* dst_argb, + int width) { + asm volatile( + "1: \n" + "ld1 {v2.16b}, [%0], #16 \n" // load R + "ld1 {v1.16b}, [%1], #16 \n" // load G + "ld1 {v0.16b}, [%2], #16 \n" // load B + "ld1 {v3.16b}, [%3], #16 \n" // load A + "subs %w5, %w5, #16 \n" // 16 processed per loop + "prfm pldl1keep, [%0, 448] \n" + "prfm pldl1keep, [%1, 448] \n" + "prfm pldl1keep, [%2, 448] \n" + "prfm pldl1keep, [%3, 448] \n" + "st4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%4], #64 \n" // store 16ARGB + "b.gt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_argb), // %4 + "+r"(width) // %5 + : // Input registers + : "cc", "memory", "v0", "v1", "v2", "v3" // Clobber List + ); +} + +// Reads 16 packed ARGB and write to planar dst_r, dst_g, dst_b. +void SplitXRGBRow_NEON(const uint8_t* src_rgba, + uint8_t* dst_r, + uint8_t* dst_g, + uint8_t* dst_b, + int width) { + asm volatile( + "1: \n" + "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 ARGB + "subs %w4, %w4, #16 \n" // 16 processed per loop + "prfm pldl1keep, [%0, 448] \n" + "st1 {v0.16b}, [%3], #16 \n" // store B + "st1 {v1.16b}, [%2], #16 \n" // store G + "st1 {v2.16b}, [%1], #16 \n" // store R + "b.gt 1b \n" + : "+r"(src_rgba), // %0 + "+r"(dst_r), // %1 + "+r"(dst_g), // %2 + "+r"(dst_b), // %3 + "+r"(width) // %4 + : // Input registers + : "cc", "memory", "v0", "v1", "v2", "v3" // Clobber List + ); +} + +// Reads 16 planar R's, G's and B's and writes out 16 packed ARGB at a time +void MergeXRGBRow_NEON(const uint8_t* src_r, + const uint8_t* src_g, + const uint8_t* src_b, + uint8_t* dst_argb, + int width) { + asm volatile( + "movi v3.16b, #255 \n" // load A(255) + "1: \n" + "ld1 {v2.16b}, [%0], #16 \n" // load R + "ld1 {v1.16b}, [%1], #16 \n" // load G + "ld1 {v0.16b}, [%2], #16 \n" // load B + "subs %w4, %w4, #16 \n" // 16 processed per loop + "prfm pldl1keep, [%0, 448] \n" + "prfm pldl1keep, [%1, 448] \n" + "prfm pldl1keep, [%2, 448] \n" + "st4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%3], #64 \n" // store 16ARGB + "b.gt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_argb), // %3 + "+r"(width) // %4 + : // Input registers + : "cc", "memory", "v0", "v1", "v2", "v3" // Clobber List + ); +} + +void MergeXR30Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int depth, + int width) { + int shift = 10 - depth; + asm volatile( + "movi v30.16b, #255 \n" + "ushr v30.4s, v30.4s, #22 \n" // 1023 + "dup v31.4s, %w5 \n" + "1: \n" + "ldr d2, [%2], #8 \n" // B + "ldr d1, [%1], #8 \n" // G + "ldr d0, [%0], #8 \n" // R + "ushll v2.4s, v2.4h, #0 \n" // B + "ushll v1.4s, v1.4h, #0 \n" // G + "ushll v0.4s, v0.4h, #0 \n" // R + "ushl v2.4s, v2.4s, v31.4s \n" // 000B + "ushl v1.4s, v1.4s, v31.4s \n" // G + "ushl v0.4s, v0.4s, v31.4s \n" // R + "umin v2.4s, v2.4s, v30.4s \n" + "umin v1.4s, v1.4s, v30.4s \n" + "umin v0.4s, v0.4s, v30.4s \n" + "sli v2.4s, v1.4s, #10 \n" // 00GB + "sli v2.4s, v0.4s, #20 \n" // 0RGB + "orr v2.4s, #0xc0, lsl #24 \n" // ARGB (AR30) + "subs %w4, %w4, #4 \n" + "str q2, [%3], #16 \n" + "b.gt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_ar30), // %3 + "+r"(width) // %4 + : "r"(shift) // %5 + : "memory", "cc", "v0", "v1", "v2", "v30", "v31"); +} + +void MergeXR30Row_10_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_ar30, + int /* depth */, + int width) { + asm volatile( + "movi v30.16b, #255 \n" + "ushr v30.4s, v30.4s, #22 \n" // 1023 + "1: \n" + "ldr d2, [%2], #8 \n" // B + "ldr d1, [%1], #8 \n" // G + "ldr d0, [%0], #8 \n" // R + "ushll v2.4s, v2.4h, #0 \n" // 000B + "ushll v1.4s, v1.4h, #0 \n" // G + "ushll v0.4s, v0.4h, #0 \n" // R + "umin v2.4s, v2.4s, v30.4s \n" + "umin v1.4s, v1.4s, v30.4s \n" + "umin v0.4s, v0.4s, v30.4s \n" + "sli v2.4s, v1.4s, #10 \n" // 00GB + "sli v2.4s, v0.4s, #20 \n" // 0RGB + "orr v2.4s, #0xc0, lsl #24 \n" // ARGB (AR30) + "subs %w4, %w4, #4 \n" + "str q2, [%3], #16 \n" + "b.gt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_ar30), // %3 + "+r"(width) // %4 + : + : "memory", "cc", "v0", "v1", "v2", "v30"); +} + +void MergeAR64Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint16_t* dst_ar64, + int depth, + int width) { + int shift = 16 - depth; + int mask = (1 << depth) - 1; + asm volatile( + + "dup v30.8h, %w7 \n" + "dup v31.8h, %w6 \n" + "1: \n" + "ldr q2, [%0], #16 \n" // R + "ldr q1, [%1], #16 \n" // G + "ldr q0, [%2], #16 \n" // B + "ldr q3, [%3], #16 \n" // A + "umin v2.8h, v2.8h, v30.8h \n" + "prfm pldl1keep, [%0, 448] \n" + "umin v1.8h, v1.8h, v30.8h \n" + "prfm pldl1keep, [%1, 448] \n" + "umin v0.8h, v0.8h, v30.8h \n" + "prfm pldl1keep, [%2, 448] \n" + "umin v3.8h, v3.8h, v30.8h \n" + "prfm pldl1keep, [%3, 448] \n" + "ushl v2.8h, v2.8h, v31.8h \n" + "ushl v1.8h, v1.8h, v31.8h \n" + "ushl v0.8h, v0.8h, v31.8h \n" + "ushl v3.8h, v3.8h, v31.8h \n" + "subs %w5, %w5, #8 \n" + "st4 {v0.8h, v1.8h, v2.8h, v3.8h}, [%4], #64 \n" + "b.gt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_ar64), // %4 + "+r"(width) // %5 + : "r"(shift), // %6 + "r"(mask) // %7 + : "memory", "cc", "v0", "v1", "v2", "v3", "v31"); +} + +void MergeXR64Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint16_t* dst_ar64, + int depth, + int width) { + int shift = 16 - depth; + int mask = (1 << depth) - 1; + asm volatile( + + "movi v3.16b, #0xff \n" // A (0xffff) + "dup v30.8h, %w6 \n" + "dup v31.8h, %w5 \n" + + "1: \n" + "ldr q2, [%0], #16 \n" // R + "ldr q1, [%1], #16 \n" // G + "ldr q0, [%2], #16 \n" // B + "umin v2.8h, v2.8h, v30.8h \n" + "prfm pldl1keep, [%0, 448] \n" + "umin v1.8h, v1.8h, v30.8h \n" + "prfm pldl1keep, [%1, 448] \n" + "umin v0.8h, v0.8h, v30.8h \n" + "prfm pldl1keep, [%2, 448] \n" + "ushl v2.8h, v2.8h, v31.8h \n" + "ushl v1.8h, v1.8h, v31.8h \n" + "ushl v0.8h, v0.8h, v31.8h \n" + "subs %w4, %w4, #8 \n" + "st4 {v0.8h, v1.8h, v2.8h, v3.8h}, [%3], #64 \n" + "b.gt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_ar64), // %3 + "+r"(width) // %4 + : "r"(shift), // %5 + "r"(mask) // %6 + : "memory", "cc", "v0", "v1", "v2", "v3", "v31"); +} + +void MergeARGB16To8Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + const uint16_t* src_a, + uint8_t* dst_argb, + int depth, + int width) { + int shift = 8 - depth; + asm volatile( + + "dup v31.8h, %w6 \n" + "1: \n" + "ldr q2, [%0], #16 \n" // R + "ldr q1, [%1], #16 \n" // G + "ldr q0, [%2], #16 \n" // B + "ldr q3, [%3], #16 \n" // A + "ushl v2.8h, v2.8h, v31.8h \n" + "prfm pldl1keep, [%0, 448] \n" + "ushl v1.8h, v1.8h, v31.8h \n" + "prfm pldl1keep, [%1, 448] \n" + "ushl v0.8h, v0.8h, v31.8h \n" + "prfm pldl1keep, [%2, 448] \n" + "ushl v3.8h, v3.8h, v31.8h \n" + "prfm pldl1keep, [%3, 448] \n" + "uqxtn v2.8b, v2.8h \n" + "uqxtn v1.8b, v1.8h \n" + "uqxtn v0.8b, v0.8h \n" + "uqxtn v3.8b, v3.8h \n" + "subs %w5, %w5, #8 \n" + "st4 {v0.8b, v1.8b, v2.8b, v3.8b}, [%4], #32 \n" + "b.gt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(src_a), // %3 + "+r"(dst_argb), // %4 + "+r"(width) // %5 + : "r"(shift) // %6 + : "memory", "cc", "v0", "v1", "v2", "v3", "v31"); +} + +void MergeXRGB16To8Row_NEON(const uint16_t* src_r, + const uint16_t* src_g, + const uint16_t* src_b, + uint8_t* dst_argb, + int depth, + int width) { + int shift = 8 - depth; + asm volatile( + + "dup v31.8h, %w5 \n" + "movi v3.8b, #0xff \n" // A (0xff) + "1: \n" + "ldr q2, [%0], #16 \n" // R + "ldr q1, [%1], #16 \n" // G + "ldr q0, [%2], #16 \n" // B + "ushl v2.8h, v2.8h, v31.8h \n" + "prfm pldl1keep, [%0, 448] \n" + "ushl v1.8h, v1.8h, v31.8h \n" + "prfm pldl1keep, [%1, 448] \n" + "ushl v0.8h, v0.8h, v31.8h \n" + "prfm pldl1keep, [%2, 448] \n" + "uqxtn v2.8b, v2.8h \n" + "uqxtn v1.8b, v1.8h \n" + "uqxtn v0.8b, v0.8h \n" + "subs %w4, %w4, #8 \n" + "st4 {v0.8b, v1.8b, v2.8b, v3.8b}, [%3], #32 \n" + "b.gt 1b \n" + : "+r"(src_r), // %0 + "+r"(src_g), // %1 + "+r"(src_b), // %2 + "+r"(dst_argb), // %3 + "+r"(width) // %4 + : "r"(shift) // %5 + : "memory", "cc", "v0", "v1", "v2", "v3", "v31"); +} + // Copy multiple of 32. void CopyRow_NEON(const uint8_t* src, uint8_t* dst, int width) { asm volatile( @@ -925,10 +1196,10 @@ void RAWToARGBRow_NEON(const uint8_t* src_raw, uint8_t* dst_argb, int width) { "movi v5.8b, #255 \n" // Alpha "1: \n" "ld3 {v0.8b,v1.8b,v2.8b}, [%0], #24 \n" // read r g b + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "orr v3.8b, v1.8b, v1.8b \n" // move g "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" // 8 processed per loop. - "orr v3.8b, v1.8b, v1.8b \n" // move g - "orr v4.8b, v0.8b, v0.8b \n" // move r + "orr v4.8b, v0.8b, v0.8b \n" // move r "st4 {v2.8b,v3.8b,v4.8b,v5.8b}, [%1], #32 \n" // store b g r a "b.gt 1b \n" : "+r"(src_raw), // %0 @@ -944,10 +1215,10 @@ void RAWToRGBARow_NEON(const uint8_t* src_raw, uint8_t* dst_rgba, int width) { "movi v0.8b, #255 \n" // Alpha "1: \n" "ld3 {v3.8b,v4.8b,v5.8b}, [%0], #24 \n" // read r g b + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "orr v2.8b, v4.8b, v4.8b \n" // move g "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" // 8 processed per loop. - "orr v2.8b, v4.8b, v4.8b \n" // move g - "orr v1.8b, v5.8b, v5.8b \n" // move r + "orr v1.8b, v5.8b, v5.8b \n" // move r "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%1], #32 \n" // store a b g r "b.gt 1b \n" : "+r"(src_raw), // %0 @@ -962,9 +1233,9 @@ void RAWToRGB24Row_NEON(const uint8_t* src_raw, uint8_t* dst_rgb24, int width) { asm volatile( "1: \n" "ld3 {v0.8b,v1.8b,v2.8b}, [%0], #24 \n" // read r g b - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "orr v3.8b, v1.8b, v1.8b \n" // move g + "prfm pldl1keep, [%0, 448] \n" "orr v4.8b, v0.8b, v0.8b \n" // move r "st3 {v2.8b,v3.8b,v4.8b}, [%1], #24 \n" // store b g r "b.gt 1b \n" @@ -996,9 +1267,8 @@ void RGB565ToARGBRow_NEON(const uint8_t* src_rgb565, "movi v3.8b, #255 \n" // Alpha "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 8 RGB565 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. - RGB565TOARGB + "prfm pldl1keep, [%0, 448] \n" RGB565TOARGB "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%1], #32 \n" // store 8 ARGB "b.gt 1b \n" : "+r"(src_rgb565), // %0 @@ -1086,9 +1356,8 @@ void ARGB4444ToARGBRow_NEON(const uint8_t* src_argb4444, asm volatile( "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 8 ARGB4444 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. - ARGB4444TOARGB + "prfm pldl1keep, [%0, 448] \n" ARGB4444TOARGB "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%1], #32 \n" // store 8 ARGB "b.gt 1b \n" : "+r"(src_argb4444), // %0 @@ -1105,8 +1374,8 @@ void ARGBToRGB24Row_NEON(const uint8_t* src_argb, asm volatile( "1: \n" "ld4 {v1.8b,v2.8b,v3.8b,v4.8b}, [%0], #32 \n" // load 8 ARGB + "subs %w2, %w2, #8 \n" // 8 processed per loop. "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" // 8 processed per loop. "st3 {v1.8b,v2.8b,v3.8b}, [%1], #24 \n" // store 8 pixels of // RGB24 "b.gt 1b \n" @@ -1122,9 +1391,9 @@ void ARGBToRAWRow_NEON(const uint8_t* src_argb, uint8_t* dst_raw, int width) { asm volatile( "1: \n" "ld4 {v1.8b,v2.8b,v3.8b,v4.8b}, [%0], #32 \n" // load b g r a + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "orr v4.8b, v2.8b, v2.8b \n" // mov g "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" // 8 processed per loop. - "orr v4.8b, v2.8b, v2.8b \n" // mov g "orr v5.8b, v1.8b, v1.8b \n" // mov b "st3 {v3.8b,v4.8b,v5.8b}, [%1], #24 \n" // store r g b "b.gt 1b \n" @@ -1140,8 +1409,8 @@ void YUY2ToYRow_NEON(const uint8_t* src_yuy2, uint8_t* dst_y, int width) { asm volatile( "1: \n" "ld2 {v0.16b,v1.16b}, [%0], #32 \n" // load 16 pixels of YUY2. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #16 \n" // 16 processed per loop. + "prfm pldl1keep, [%0, 448] \n" "st1 {v0.16b}, [%1], #16 \n" // store 16 pixels of Y. "b.gt 1b \n" : "+r"(src_yuy2), // %0 @@ -1156,8 +1425,8 @@ void UYVYToYRow_NEON(const uint8_t* src_uyvy, uint8_t* dst_y, int width) { asm volatile( "1: \n" "ld2 {v0.16b,v1.16b}, [%0], #32 \n" // load 16 pixels of UYVY. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #16 \n" // 16 processed per loop. + "prfm pldl1keep, [%0, 448] \n" "st1 {v1.16b}, [%1], #16 \n" // store 16 pixels of Y. "b.gt 1b \n" : "+r"(src_uyvy), // %0 @@ -1175,8 +1444,8 @@ void YUY2ToUV422Row_NEON(const uint8_t* src_yuy2, asm volatile( "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 16 YUY2 - "prfm pldl1keep, [%0, 448] \n" "subs %w3, %w3, #16 \n" // 16 pixels = 8 UVs. + "prfm pldl1keep, [%0, 448] \n" "st1 {v1.8b}, [%1], #8 \n" // store 8 U. "st1 {v3.8b}, [%2], #8 \n" // store 8 V. "b.gt 1b \n" @@ -1196,8 +1465,8 @@ void UYVYToUV422Row_NEON(const uint8_t* src_uyvy, asm volatile( "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 16 UYVY - "prfm pldl1keep, [%0, 448] \n" "subs %w3, %w3, #16 \n" // 16 pixels = 8 UVs. + "prfm pldl1keep, [%0, 448] \n" "st1 {v0.8b}, [%1], #8 \n" // store 8 U. "st1 {v2.8b}, [%2], #8 \n" // store 8 V. "b.gt 1b \n" @@ -1219,10 +1488,10 @@ void YUY2ToUVRow_NEON(const uint8_t* src_yuy2, asm volatile( "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 16 pixels - "prfm pldl1keep, [%0, 448] \n" "subs %w4, %w4, #16 \n" // 16 pixels = 8 UVs. "ld4 {v4.8b,v5.8b,v6.8b,v7.8b}, [%1], #32 \n" // load next row "urhadd v1.8b, v1.8b, v5.8b \n" // average rows of U + "prfm pldl1keep, [%0, 448] \n" "urhadd v3.8b, v3.8b, v7.8b \n" // average rows of V "st1 {v1.8b}, [%2], #8 \n" // store 8 U. "st1 {v3.8b}, [%3], #8 \n" // store 8 V. @@ -1247,10 +1516,10 @@ void UYVYToUVRow_NEON(const uint8_t* src_uyvy, asm volatile( "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 16 pixels - "prfm pldl1keep, [%0, 448] \n" "subs %w4, %w4, #16 \n" // 16 pixels = 8 UVs. "ld4 {v4.8b,v5.8b,v6.8b,v7.8b}, [%1], #32 \n" // load next row "urhadd v0.8b, v0.8b, v4.8b \n" // average rows of U + "prfm pldl1keep, [%0, 448] \n" "urhadd v2.8b, v2.8b, v6.8b \n" // average rows of V "st1 {v0.8b}, [%2], #8 \n" // store 8 U. "st1 {v2.8b}, [%3], #8 \n" // store 8 V. @@ -1275,8 +1544,8 @@ void ARGBShuffleRow_NEON(const uint8_t* src_argb, "ld1 {v2.16b}, [%3] \n" // shuffler "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 4 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #4 \n" // 4 processed per loop + "prfm pldl1keep, [%0, 448] \n" "tbl v1.16b, {v0.16b}, v2.16b \n" // look up 4 pixels "st1 {v1.16b}, [%1], #16 \n" // store 4. "b.gt 1b \n" @@ -1296,11 +1565,11 @@ void I422ToYUY2Row_NEON(const uint8_t* src_y, asm volatile( "1: \n" "ld2 {v0.8b, v1.8b}, [%0], #16 \n" // load 16 Ys - "prfm pldl1keep, [%0, 448] \n" + "subs %w4, %w4, #16 \n" // 16 pixels "orr v2.8b, v1.8b, v1.8b \n" + "prfm pldl1keep, [%0, 448] \n" "ld1 {v1.8b}, [%1], #8 \n" // load 8 Us "ld1 {v3.8b}, [%2], #8 \n" // load 8 Vs - "subs %w4, %w4, #16 \n" // 16 pixels "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%3], #32 \n" // Store 16 pixels. "b.gt 1b \n" : "+r"(src_y), // %0 @@ -1320,8 +1589,8 @@ void I422ToUYVYRow_NEON(const uint8_t* src_y, asm volatile( "1: \n" "ld2 {v1.8b,v2.8b}, [%0], #16 \n" // load 16 Ys - "prfm pldl1keep, [%0, 448] \n" "orr v3.8b, v2.8b, v2.8b \n" + "prfm pldl1keep, [%0, 448] \n" "ld1 {v0.8b}, [%1], #8 \n" // load 8 Us "ld1 {v2.8b}, [%2], #8 \n" // load 8 Vs "subs %w4, %w4, #16 \n" // 16 pixels @@ -1341,18 +1610,17 @@ void ARGBToRGB565Row_NEON(const uint8_t* src_argb, int width) { asm volatile( "1: \n" - "ld4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%0], #32 \n" // load 8 + "ld4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%0], #32 \n" // load 8 // pixels - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. - ARGBTORGB565 - "st1 {v0.16b}, [%1], #16 \n" // store 8 pixels RGB565. + "prfm pldl1keep, [%0, 448] \n" ARGBTORGB565 + "st1 {v18.16b}, [%1], #16 \n" // store 8 pixels RGB565. "b.gt 1b \n" : "+r"(src_argb), // %0 "+r"(dst_rgb565), // %1 "+r"(width) // %2 : - : "cc", "memory", "v0", "v20", "v21", "v22", "v23"); + : "cc", "memory", "v16", "v17", "v18", "v19"); } void ARGBToRGB565DitherRow_NEON(const uint8_t* src_argb, @@ -1362,20 +1630,20 @@ void ARGBToRGB565DitherRow_NEON(const uint8_t* src_argb, asm volatile( "dup v1.4s, %w2 \n" // dither4 "1: \n" - "ld4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%1], #32 \n" // load 8 + "ld4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%1], #32 \n" // load 8 // pixels - "prfm pldl1keep, [%0, 448] \n" "subs %w3, %w3, #8 \n" // 8 processed per loop. - "uqadd v20.8b, v20.8b, v1.8b \n" - "uqadd v21.8b, v21.8b, v1.8b \n" - "uqadd v22.8b, v22.8b, v1.8b \n" ARGBTORGB565 - "st1 {v0.16b}, [%0], #16 \n" // store 8 pixels RGB565. + "uqadd v16.8b, v16.8b, v1.8b \n" + "prfm pldl1keep, [%0, 448] \n" + "uqadd v17.8b, v17.8b, v1.8b \n" + "uqadd v18.8b, v18.8b, v1.8b \n" ARGBTORGB565 + "st1 {v18.16b}, [%0], #16 \n" // store 8 pixels RGB565. "b.gt 1b \n" : "+r"(dst_rgb) // %0 : "r"(src_argb), // %1 "r"(dither4), // %2 "r"(width) // %3 - : "cc", "memory", "v0", "v1", "v20", "v21", "v22", "v23"); + : "cc", "memory", "v1", "v16", "v17", "v18", "v19"); } void ARGBToARGB1555Row_NEON(const uint8_t* src_argb, @@ -1383,39 +1651,131 @@ void ARGBToARGB1555Row_NEON(const uint8_t* src_argb, int width) { asm volatile( "1: \n" - "ld4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%0], #32 \n" // load 8 + "ld4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%0], #32 \n" // load 8 // pixels - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. - ARGBTOARGB1555 + "prfm pldl1keep, [%0, 448] \n" ARGBTOARGB1555 "st1 {v0.16b}, [%1], #16 \n" // store 8 pixels "b.gt 1b \n" : "+r"(src_argb), // %0 "+r"(dst_argb1555), // %1 "+r"(width) // %2 : - : "cc", "memory", "v0", "v20", "v21", "v22", "v23"); + : "cc", "memory", "v0", "v16", "v17", "v18", "v19"); } void ARGBToARGB4444Row_NEON(const uint8_t* src_argb, uint8_t* dst_argb4444, int width) { asm volatile( - "movi v4.16b, #0x0f \n" // bits to clear with + "movi v23.16b, #0x0f \n" // bits to clear with // vbic. "1: \n" - "ld4 {v20.8b,v21.8b,v22.8b,v23.8b}, [%0], #32 \n" // load 8 + "ld4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%0], #32 \n" // load 8 // pixels - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. - ARGBTOARGB4444 + "prfm pldl1keep, [%0, 448] \n" ARGBTOARGB4444 "st1 {v0.16b}, [%1], #16 \n" // store 8 pixels "b.gt 1b \n" : "+r"(src_argb), // %0 "+r"(dst_argb4444), // %1 "+r"(width) // %2 : - : "cc", "memory", "v0", "v1", "v4", "v20", "v21", "v22", "v23"); + : "cc", "memory", "v0", "v1", "v16", "v17", "v18", "v19", "v23"); +} + +static const uvec8 kShuffleARGBToABGR = {2, 1, 0, 3, 6, 5, 4, 7, + 10, 9, 8, 11, 14, 13, 12, 15}; + +void ARGBToAR64Row_NEON(const uint8_t* src_argb, + uint16_t* dst_ar64, + int width) { + asm volatile( + "1: \n" + "ldp q0, q2, [%0], #32 \n" // load 8 pixels + "mov v1.16b, v0.16b \n" + "prfm pldl1keep, [%0, 448] \n" + "mov v3.16b, v2.16b \n" + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "st2 {v0.16b, v1.16b}, [%1], #32 \n" // store 4 pixels + "st2 {v2.16b, v3.16b}, [%1], #32 \n" // store 4 pixels + "b.gt 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_ar64), // %1 + "+r"(width) // %2 + : + : "cc", "memory", "v0", "v1", "v2", "v3"); +} + +void ARGBToAB64Row_NEON(const uint8_t* src_argb, + uint16_t* dst_ab64, + int width) { + asm volatile( + "ld1 {v4.16b}, %3 \n" // shuffler + "1: \n" + "ldp q0, q2, [%0], #32 \n" // load 8 pixels + "tbl v0.16b, {v0.16b}, v4.16b \n" + "tbl v2.16b, {v2.16b}, v4.16b \n" + "prfm pldl1keep, [%0, 448] \n" + "mov v1.16b, v0.16b \n" + "mov v3.16b, v2.16b \n" + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "st2 {v0.16b, v1.16b}, [%1], #32 \n" // store 4 pixels + "st2 {v2.16b, v3.16b}, [%1], #32 \n" // store 4 pixels + "b.gt 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_ab64), // %1 + "+r"(width) // %2 + : "m"(kShuffleARGBToABGR) // %3 + : "cc", "memory", "v0", "v1", "v2", "v3", "v4"); +} + +static const uvec8 kShuffleAR64ToARGB = {1, 3, 5, 7, 9, 11, 13, 15, + 17, 19, 21, 23, 25, 27, 29, 31}; + +void AR64ToARGBRow_NEON(const uint16_t* src_ar64, + uint8_t* dst_argb, + int width) { + asm volatile( + "ld1 {v4.16b}, %3 \n" // shuffler + "1: \n" + "ldp q0, q1, [%0], #32 \n" // load 4 pixels + "ldp q2, q3, [%0], #32 \n" // load 4 pixels + "tbl v0.16b, {v0.16b, v1.16b}, v4.16b \n" + "prfm pldl1keep, [%0, 448] \n" + "tbl v2.16b, {v2.16b, v3.16b}, v4.16b \n" + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "stp q0, q2, [%1], #32 \n" // store 8 pixels + "b.gt 1b \n" + : "+r"(src_ar64), // %0 + "+r"(dst_argb), // %1 + "+r"(width) // %2 + : "m"(kShuffleAR64ToARGB) // %3 + : "cc", "memory", "v0", "v1", "v2", "v3", "v4"); +} + +static const uvec8 kShuffleAB64ToARGB = {5, 3, 1, 7, 13, 11, 9, 15, + 21, 19, 17, 23, 29, 27, 25, 31}; + +void AB64ToARGBRow_NEON(const uint16_t* src_ab64, + uint8_t* dst_argb, + int width) { + asm volatile( + "ld1 {v4.16b}, %3 \n" // shuffler + "1: \n" + "ldp q0, q1, [%0], #32 \n" // load 4 pixels + "ldp q2, q3, [%0], #32 \n" // load 4 pixels + "tbl v0.16b, {v0.16b, v1.16b}, v4.16b \n" + "prfm pldl1keep, [%0, 448] \n" + "tbl v2.16b, {v2.16b, v3.16b}, v4.16b \n" + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "stp q0, q2, [%1], #32 \n" // store 8 pixels + "b.gt 1b \n" + : "+r"(src_ab64), // %0 + "+r"(dst_argb), // %1 + "+r"(width) // %2 + : "m"(kShuffleAB64ToARGB) // %3 + : "cc", "memory", "v0", "v1", "v2", "v3", "v4"); } void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { @@ -1426,9 +1786,9 @@ void ARGBToYRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { "movi v7.8b, #16 \n" // Add 16 constant "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "umull v3.8h, v0.8b, v4.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlal v3.8h, v1.8b, v5.8b \n" // G "umlal v3.8h, v2.8b, v6.8b \n" // R "uqrshrn v0.8b, v3.8h, #8 \n" // 16 bit to 8 bit Y @@ -1467,9 +1827,9 @@ void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { "movi v6.8b, #77 \n" // R * 0.2990 coefficient "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "umull v3.8h, v0.8b, v4.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlal v3.8h, v1.8b, v5.8b \n" // G "umlal v3.8h, v2.8b, v6.8b \n" // R "uqrshrn v0.8b, v3.8h, #8 \n" // 16 bit to 8 bit Y @@ -1482,22 +1842,22 @@ void ARGBToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { : "cc", "memory", "v0", "v1", "v2", "v3", "v4", "v5", "v6"); } -void RGBAToYJRow_NEON(const uint8_t* src_argb, uint8_t* dst_y, int width) { +void RGBAToYJRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width) { asm volatile( "movi v4.8b, #29 \n" // B * 0.1140 coefficient "movi v5.8b, #150 \n" // G * 0.5870 coefficient "movi v6.8b, #77 \n" // R * 0.2990 coefficient "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 RGBA - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "umull v0.8h, v1.8b, v4.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlal v0.8h, v2.8b, v5.8b \n" // G "umlal v0.8h, v3.8b, v6.8b \n" // R "uqrshrn v3.8b, v0.8h, #8 \n" // 16 bit to 8 bit Y "st1 {v3.8b}, [%1], #8 \n" // store 8 pixels Y. "b.gt 1b \n" - : "+r"(src_argb), // %0 + : "+r"(src_rgba), // %0 "+r"(dst_y), // %1 "+r"(width) // %2 : @@ -1519,9 +1879,9 @@ void ARGBToUV444Row_NEON(const uint8_t* src_argb, "movi v29.16b,#0x80 \n" // 128.5 "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB - "prfm pldl1keep, [%0, 448] \n" "subs %w3, %w3, #8 \n" // 8 processed per loop. "umull v4.8h, v0.8b, v24.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlsl v4.8h, v1.8b, v25.8b \n" // G "umlsl v4.8h, v2.8b, v26.8b \n" // R "add v4.8h, v4.8h, v29.8h \n" // +128 -> unsigned @@ -1582,14 +1942,14 @@ void ARGBToUVRow_NEON(const uint8_t* src_argb, RGBTOUV_SETUP_REG "1: \n" "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 pixels. - "prfm pldl1keep, [%0, 448] \n" "uaddlp v0.8h, v0.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v1.8h, v1.16b \n" // G 16 bytes -> 8 shorts. "uaddlp v2.8h, v2.16b \n" // R 16 bytes -> 8 shorts. "ld4 {v4.16b,v5.16b,v6.16b,v7.16b}, [%1], #64 \n" // load next 16 - "prfm pldl1keep, [%1, 448] \n" "uadalp v0.8h, v4.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v1.8h, v5.16b \n" // G 16 bytes -> 8 shorts. "uadalp v2.8h, v6.16b \n" // R 16 bytes -> 8 shorts. @@ -1628,13 +1988,13 @@ void ARGBToUVJRow_NEON(const uint8_t* src_argb, "movi v25.16b, #0x80 \n" // 128.5 (0x8080 in 16-bit) "1: \n" "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 pixels. - "prfm pldl1keep, [%0, 448] \n" "uaddlp v0.8h, v0.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v1.8h, v1.16b \n" // G 16 bytes -> 8 shorts. "uaddlp v2.8h, v2.16b \n" // R 16 bytes -> 8 shorts. "ld4 {v4.16b,v5.16b,v6.16b,v7.16b}, [%1], #64 \n" // load next 16 - "prfm pldl1keep, [%1, 448] \n" "uadalp v0.8h, v4.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v1.8h, v5.16b \n" // G 16 bytes -> 8 shorts. "uadalp v2.8h, v6.16b \n" // R 16 bytes -> 8 shorts. @@ -1668,13 +2028,13 @@ void BGRAToUVRow_NEON(const uint8_t* src_bgra, RGBTOUV_SETUP_REG "1: \n" "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 pixels. - "prfm pldl1keep, [%0, 448] \n" "uaddlp v0.8h, v3.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v3.8h, v2.16b \n" // G 16 bytes -> 8 shorts. "uaddlp v2.8h, v1.16b \n" // R 16 bytes -> 8 shorts. "ld4 {v4.16b,v5.16b,v6.16b,v7.16b}, [%1], #64 \n" // load 16 more - "prfm pldl1keep, [%1, 448] \n" "uadalp v0.8h, v7.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v3.8h, v6.16b \n" // G 16 bytes -> 8 shorts. "uadalp v2.8h, v5.16b \n" // R 16 bytes -> 8 shorts. @@ -1708,13 +2068,13 @@ void ABGRToUVRow_NEON(const uint8_t* src_abgr, RGBTOUV_SETUP_REG "1: \n" "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 pixels. - "prfm pldl1keep, [%0, 448] \n" "uaddlp v3.8h, v2.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v2.8h, v1.16b \n" // G 16 bytes -> 8 shorts. "uaddlp v1.8h, v0.16b \n" // R 16 bytes -> 8 shorts. "ld4 {v4.16b,v5.16b,v6.16b,v7.16b}, [%1], #64 \n" // load 16 more. - "prfm pldl1keep, [%1, 448] \n" "uadalp v3.8h, v6.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v2.8h, v5.16b \n" // G 16 bytes -> 8 shorts. "uadalp v1.8h, v4.16b \n" // R 16 bytes -> 8 shorts. @@ -1748,13 +2108,13 @@ void RGBAToUVRow_NEON(const uint8_t* src_rgba, RGBTOUV_SETUP_REG "1: \n" "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 pixels. - "prfm pldl1keep, [%0, 448] \n" "uaddlp v0.8h, v1.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v1.8h, v2.16b \n" // G 16 bytes -> 8 shorts. "uaddlp v2.8h, v3.16b \n" // R 16 bytes -> 8 shorts. "ld4 {v4.16b,v5.16b,v6.16b,v7.16b}, [%1], #64 \n" // load 16 more. - "prfm pldl1keep, [%1, 448] \n" "uadalp v0.8h, v5.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v1.8h, v6.16b \n" // G 16 bytes -> 8 shorts. "uadalp v2.8h, v7.16b \n" // R 16 bytes -> 8 shorts. @@ -1788,13 +2148,13 @@ void RGB24ToUVRow_NEON(const uint8_t* src_rgb24, RGBTOUV_SETUP_REG "1: \n" "ld3 {v0.16b,v1.16b,v2.16b}, [%0], #48 \n" // load 16 pixels. - "prfm pldl1keep, [%0, 448] \n" "uaddlp v0.8h, v0.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v1.8h, v1.16b \n" // G 16 bytes -> 8 shorts. "uaddlp v2.8h, v2.16b \n" // R 16 bytes -> 8 shorts. "ld3 {v4.16b,v5.16b,v6.16b}, [%1], #48 \n" // load 16 more. - "prfm pldl1keep, [%1, 448] \n" "uadalp v0.8h, v4.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v1.8h, v5.16b \n" // G 16 bytes -> 8 shorts. "uadalp v2.8h, v6.16b \n" // R 16 bytes -> 8 shorts. @@ -1828,13 +2188,13 @@ void RAWToUVRow_NEON(const uint8_t* src_raw, RGBTOUV_SETUP_REG "1: \n" "ld3 {v0.16b,v1.16b,v2.16b}, [%0], #48 \n" // load 8 RAW pixels. - "prfm pldl1keep, [%0, 448] \n" "uaddlp v2.8h, v2.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v1.8h, v1.16b \n" // G 16 bytes -> 8 shorts. "uaddlp v0.8h, v0.16b \n" // R 16 bytes -> 8 shorts. "ld3 {v4.16b,v5.16b,v6.16b}, [%1], #48 \n" // load 8 more RAW pixels - "prfm pldl1keep, [%1, 448] \n" "uadalp v2.8h, v6.16b \n" // B 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v1.8h, v5.16b \n" // G 16 bytes -> 8 shorts. "uadalp v0.8h, v4.16b \n" // R 16 bytes -> 8 shorts. @@ -1869,9 +2229,9 @@ void RGB565ToUVRow_NEON(const uint8_t* src_rgb565, RGBTOUV_SETUP_REG "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 8 RGB565 pixels. - "prfm pldl1keep, [%0, 448] \n" RGB565TOARGB "uaddlp v16.4h, v0.8b \n" // B 8 bytes -> 4 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v17.4h, v1.8b \n" // G 8 bytes -> 4 shorts. "uaddlp v18.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%0], #16 \n" // next 8 RGB565 pixels. @@ -1881,9 +2241,9 @@ void RGB565ToUVRow_NEON(const uint8_t* src_rgb565, "uaddlp v28.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%1], #16 \n" // load 8 RGB565 pixels. - "prfm pldl1keep, [%1, 448] \n" RGB565TOARGB "uadalp v16.4h, v0.8b \n" // B 8 bytes -> 4 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v17.4h, v1.8b \n" // G 8 bytes -> 4 shorts. "uadalp v18.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%1], #16 \n" // next 8 RGB565 pixels. @@ -1927,9 +2287,9 @@ void ARGB1555ToUVRow_NEON(const uint8_t* src_argb1555, RGBTOUV_SETUP_REG "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 8 ARGB1555 pixels. - "prfm pldl1keep, [%0, 448] \n" RGB555TOARGB "uaddlp v16.4h, v0.8b \n" // B 8 bytes -> 4 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v17.4h, v1.8b \n" // G 8 bytes -> 4 shorts. "uaddlp v18.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%0], #16 \n" // next 8 ARGB1555 pixels. @@ -1939,9 +2299,9 @@ void ARGB1555ToUVRow_NEON(const uint8_t* src_argb1555, "uaddlp v28.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%1], #16 \n" // load 8 ARGB1555 pixels. - "prfm pldl1keep, [%1, 448] \n" RGB555TOARGB "uadalp v16.4h, v0.8b \n" // B 8 bytes -> 4 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v17.4h, v1.8b \n" // G 8 bytes -> 4 shorts. "uadalp v18.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%1], #16 \n" // next 8 ARGB1555 pixels. @@ -1985,9 +2345,9 @@ void ARGB4444ToUVRow_NEON(const uint8_t* src_argb4444, RGBTOUV_SETUP_REG // sets v20-v25 "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 8 ARGB4444 pixels. - "prfm pldl1keep, [%0, 448] \n" ARGB4444TOARGB "uaddlp v16.4h, v0.8b \n" // B 8 bytes -> 4 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v17.4h, v1.8b \n" // G 8 bytes -> 4 shorts. "uaddlp v18.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%0], #16 \n" // next 8 ARGB4444 pixels. @@ -1997,9 +2357,9 @@ void ARGB4444ToUVRow_NEON(const uint8_t* src_argb4444, "uaddlp v28.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%1], #16 \n" // load 8 ARGB4444 pixels. - "prfm pldl1keep, [%1, 448] \n" ARGB4444TOARGB "uadalp v16.4h, v0.8b \n" // B 8 bytes -> 4 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v17.4h, v1.8b \n" // G 8 bytes -> 4 shorts. "uadalp v18.4h, v2.8b \n" // R 8 bytes -> 4 shorts. "ld1 {v0.16b}, [%1], #16 \n" // next 8 ARGB4444 pixels. @@ -2042,10 +2402,10 @@ void RGB565ToYRow_NEON(const uint8_t* src_rgb565, uint8_t* dst_y, int width) { "movi v27.8b, #16 \n" // Add 16 constant "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 8 RGB565 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. RGB565TOARGB "umull v3.8h, v0.8b, v24.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlal v3.8h, v1.8b, v25.8b \n" // G "umlal v3.8h, v2.8b, v26.8b \n" // R "uqrshrn v0.8b, v3.8h, #8 \n" // 16 bit to 8 bit Y @@ -2070,10 +2430,10 @@ void ARGB1555ToYRow_NEON(const uint8_t* src_argb1555, "movi v7.8b, #16 \n" // Add 16 constant "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 8 ARGB1555 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. ARGB1555TOARGB "umull v3.8h, v0.8b, v4.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlal v3.8h, v1.8b, v5.8b \n" // G "umlal v3.8h, v2.8b, v6.8b \n" // R "uqrshrn v0.8b, v3.8h, #8 \n" // 16 bit to 8 bit Y @@ -2097,10 +2457,10 @@ void ARGB4444ToYRow_NEON(const uint8_t* src_argb4444, "movi v27.8b, #16 \n" // Add 16 constant "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 8 ARGB4444 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. ARGB4444TOARGB "umull v3.8h, v0.8b, v24.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlal v3.8h, v1.8b, v25.8b \n" // G "umlal v3.8h, v2.8b, v26.8b \n" // R "uqrshrn v0.8b, v3.8h, #8 \n" // 16 bit to 8 bit Y @@ -2122,9 +2482,9 @@ void BGRAToYRow_NEON(const uint8_t* src_bgra, uint8_t* dst_y, int width) { "movi v7.8b, #16 \n" // Add 16 constant "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "umull v16.8h, v1.8b, v4.8b \n" // R + "prfm pldl1keep, [%0, 448] \n" "umlal v16.8h, v2.8b, v5.8b \n" // G "umlal v16.8h, v3.8b, v6.8b \n" // B "uqrshrn v0.8b, v16.8h, #8 \n" // 16 bit to 8 bit Y @@ -2146,9 +2506,9 @@ void ABGRToYRow_NEON(const uint8_t* src_abgr, uint8_t* dst_y, int width) { "movi v7.8b, #16 \n" // Add 16 constant "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "umull v16.8h, v0.8b, v4.8b \n" // R + "prfm pldl1keep, [%0, 448] \n" "umlal v16.8h, v1.8b, v5.8b \n" // G "umlal v16.8h, v2.8b, v6.8b \n" // B "uqrshrn v0.8b, v16.8h, #8 \n" // 16 bit to 8 bit Y @@ -2170,9 +2530,9 @@ void RGBAToYRow_NEON(const uint8_t* src_rgba, uint8_t* dst_y, int width) { "movi v7.8b, #16 \n" // Add 16 constant "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 pixels. - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "umull v16.8h, v1.8b, v4.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlal v16.8h, v2.8b, v5.8b \n" // G "umlal v16.8h, v3.8b, v6.8b \n" // R "uqrshrn v0.8b, v16.8h, #8 \n" // 16 bit to 8 bit Y @@ -2194,9 +2554,9 @@ void RGB24ToYRow_NEON(const uint8_t* src_rgb24, uint8_t* dst_y, int width) { "movi v7.8b, #16 \n" // Add 16 constant "1: \n" "ld3 {v0.8b,v1.8b,v2.8b}, [%0], #24 \n" // load 8 pixels. + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "umull v16.8h, v0.8b, v4.8b \n" // B "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" // 8 processed per loop. - "umull v16.8h, v0.8b, v4.8b \n" // B "umlal v16.8h, v1.8b, v5.8b \n" // G "umlal v16.8h, v2.8b, v6.8b \n" // R "uqrshrn v0.8b, v16.8h, #8 \n" // 16 bit to 8 bit Y @@ -2218,9 +2578,9 @@ void RAWToYRow_NEON(const uint8_t* src_raw, uint8_t* dst_y, int width) { "movi v7.8b, #16 \n" // Add 16 constant "1: \n" "ld3 {v0.8b,v1.8b,v2.8b}, [%0], #24 \n" // load 8 pixels. + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "umull v16.8h, v0.8b, v4.8b \n" // B "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" // 8 processed per loop. - "umull v16.8h, v0.8b, v4.8b \n" // B "umlal v16.8h, v1.8b, v5.8b \n" // G "umlal v16.8h, v2.8b, v6.8b \n" // R "uqrshrn v0.8b, v16.8h, #8 \n" // 16 bit to 8 bit Y @@ -2241,9 +2601,9 @@ void RGB24ToYJRow_NEON(const uint8_t* src_rgb24, uint8_t* dst_yj, int width) { "movi v6.8b, #77 \n" // R * 0.2990 coefficient "1: \n" "ld3 {v0.8b,v1.8b,v2.8b}, [%0], #24 \n" // load 8 pixels. + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "umull v0.8h, v0.8b, v4.8b \n" // B "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" // 8 processed per loop. - "umull v0.8h, v0.8b, v4.8b \n" // B "umlal v0.8h, v1.8b, v5.8b \n" // G "umlal v0.8h, v2.8b, v6.8b \n" // R "uqrshrn v0.8b, v0.8h, #8 \n" // 16 bit to 8 bit Y @@ -2263,9 +2623,9 @@ void RAWToYJRow_NEON(const uint8_t* src_raw, uint8_t* dst_yj, int width) { "movi v4.8b, #77 \n" // R * 0.2990 coefficient "1: \n" "ld3 {v0.8b,v1.8b,v2.8b}, [%0], #24 \n" // load 8 pixels. + "subs %w2, %w2, #8 \n" // 8 processed per loop. + "umull v0.8h, v0.8b, v4.8b \n" // B "prfm pldl1keep, [%0, 448] \n" - "subs %w2, %w2, #8 \n" // 8 processed per loop. - "umull v0.8h, v0.8b, v4.8b \n" // B "umlal v0.8h, v1.8b, v5.8b \n" // G "umlal v0.8h, v2.8b, v6.8b \n" // R "uqrshrn v0.8b, v0.8h, #8 \n" // 16 bit to 8 bit Y @@ -2299,11 +2659,11 @@ void InterpolateRow_NEON(uint8_t* dst_ptr, "1: \n" "ld1 {v0.16b}, [%1], #16 \n" "ld1 {v1.16b}, [%2], #16 \n" - "prfm pldl1keep, [%1, 448] \n" - "prfm pldl1keep, [%2, 448] \n" "subs %w3, %w3, #16 \n" "umull v2.8h, v0.8b, v4.8b \n" + "prfm pldl1keep, [%1, 448] \n" "umull2 v3.8h, v0.16b, v4.16b \n" + "prfm pldl1keep, [%2, 448] \n" "umlal v2.8h, v1.8b, v5.8b \n" "umlal2 v3.8h, v1.16b, v5.16b \n" "rshrn v0.8b, v2.8h, #8 \n" @@ -2316,10 +2676,10 @@ void InterpolateRow_NEON(uint8_t* dst_ptr, "50: \n" "ld1 {v0.16b}, [%1], #16 \n" "ld1 {v1.16b}, [%2], #16 \n" - "prfm pldl1keep, [%1, 448] \n" - "prfm pldl1keep, [%2, 448] \n" "subs %w3, %w3, #16 \n" + "prfm pldl1keep, [%1, 448] \n" "urhadd v0.16b, v0.16b, v1.16b \n" + "prfm pldl1keep, [%2, 448] \n" "st1 {v0.16b}, [%0], #16 \n" "b.gt 50b \n" "b 99f \n" @@ -2327,8 +2687,8 @@ void InterpolateRow_NEON(uint8_t* dst_ptr, // Blend 100 / 0 - Copy row unchanged. "100: \n" "ld1 {v0.16b}, [%1], #16 \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #16 \n" + "prfm pldl1keep, [%1, 448] \n" "st1 {v0.16b}, [%0], #16 \n" "b.gt 100b \n" @@ -2344,7 +2704,7 @@ void InterpolateRow_NEON(uint8_t* dst_ptr, } // dr * (256 - sa) / 256 + sr = dr - dr * sa / 256 + sr -void ARGBBlendRow_NEON(const uint8_t* src_argb0, +void ARGBBlendRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -2355,11 +2715,11 @@ void ARGBBlendRow_NEON(const uint8_t* src_argb0, "8: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB0 "ld4 {v4.8b,v5.8b,v6.8b,v7.8b}, [%1], #32 \n" // load 8 ARGB1 - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #8 \n" // 8 processed per loop. "umull v16.8h, v4.8b, v3.8b \n" // db * a + "prfm pldl1keep, [%0, 448] \n" "umull v17.8h, v5.8b, v3.8b \n" // dg * a + "prfm pldl1keep, [%1, 448] \n" "umull v18.8h, v6.8b, v3.8b \n" // dr * a "uqrshrn v16.8b, v16.8h, #8 \n" // db >>= 8 "uqrshrn v17.8b, v17.8h, #8 \n" // dg >>= 8 @@ -2385,11 +2745,11 @@ void ARGBBlendRow_NEON(const uint8_t* src_argb0, // ARGB0. "ld4 {v4.b,v5.b,v6.b,v7.b}[0], [%1], #4 \n" // load 1 pixel // ARGB1. - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #1 \n" // 1 processed per loop. "umull v16.8h, v4.8b, v3.8b \n" // db * a + "prfm pldl1keep, [%0, 448] \n" "umull v17.8h, v5.8b, v3.8b \n" // dg * a + "prfm pldl1keep, [%1, 448] \n" "umull v18.8h, v6.8b, v3.8b \n" // dr * a "uqrshrn v16.8b, v16.8h, #8 \n" // db >>= 8 "uqrshrn v17.8b, v17.8h, #8 \n" // dg >>= 8 @@ -2406,7 +2766,7 @@ void ARGBBlendRow_NEON(const uint8_t* src_argb0, "99: \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -2423,14 +2783,14 @@ void ARGBAttenuateRow_NEON(const uint8_t* src_argb, // Attenuate 8 pixels. "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "umull v4.8h, v0.8b, v3.8b \n" // b * a - "umull v5.8h, v1.8b, v3.8b \n" // g * a - "umull v6.8h, v2.8b, v3.8b \n" // r * a - "uqrshrn v0.8b, v4.8h, #8 \n" // b >>= 8 - "uqrshrn v1.8b, v5.8h, #8 \n" // g >>= 8 - "uqrshrn v2.8b, v6.8h, #8 \n" // r >>= 8 + "prfm pldl1keep, [%0, 448] \n" + "umull v5.8h, v1.8b, v3.8b \n" // g * a + "umull v6.8h, v2.8b, v3.8b \n" // r * a + "uqrshrn v0.8b, v4.8h, #8 \n" // b >>= 8 + "uqrshrn v1.8b, v5.8h, #8 \n" // g >>= 8 + "uqrshrn v2.8b, v6.8h, #8 \n" // r >>= 8 "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%1], #32 \n" // store 8 ARGB "b.gt 1b \n" : "+r"(src_argb), // %0 @@ -2456,9 +2816,9 @@ void ARGBQuantizeRow_NEON(uint8_t* dst_argb, // 8 pixel loop. "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0] \n" // load 8 ARGB. + "subs %w1, %w1, #8 \n" // 8 processed per loop. + "uxtl v0.8h, v0.8b \n" // b (0 .. 255) "prfm pldl1keep, [%0, 448] \n" - "subs %w1, %w1, #8 \n" // 8 processed per loop. - "uxtl v0.8h, v0.8b \n" // b (0 .. 255) "uxtl v1.8h, v1.8b \n" "uxtl v2.8h, v2.8b \n" "sqdmulh v0.8h, v0.8h, v4.8h \n" // b * scale @@ -2498,9 +2858,9 @@ void ARGBShadeRow_NEON(const uint8_t* src_argb, // 8 pixel loop. "1: \n" "ld4 {v4.8b,v5.8b,v6.8b,v7.8b}, [%0], #32 \n" // load 8 ARGB - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "uxtl v4.8h, v4.8b \n" // b (0 .. 255) + "prfm pldl1keep, [%0, 448] \n" "uxtl v5.8h, v5.8b \n" "uxtl v6.8h, v6.8b \n" "uxtl v7.8h, v7.8b \n" @@ -2531,9 +2891,9 @@ void ARGBGrayRow_NEON(const uint8_t* src_argb, uint8_t* dst_argb, int width) { "movi v26.8b, #77 \n" // R * 0.2990 coefficient "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "umull v4.8h, v0.8b, v24.8b \n" // B + "prfm pldl1keep, [%0, 448] \n" "umlal v4.8h, v1.8b, v25.8b \n" // G "umlal v4.8h, v2.8b, v26.8b \n" // R "uqrshrn v0.8b, v4.8h, #8 \n" // 16 bit to 8 bit B @@ -2566,9 +2926,9 @@ void ARGBSepiaRow_NEON(uint8_t* dst_argb, int width) { "movi v30.8b, #50 \n" // BR coefficient "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0] \n" // load 8 ARGB pixels. + "subs %w1, %w1, #8 \n" // 8 processed per loop. + "umull v4.8h, v0.8b, v20.8b \n" // B to Sepia B "prfm pldl1keep, [%0, 448] \n" - "subs %w1, %w1, #8 \n" // 8 processed per loop. - "umull v4.8h, v0.8b, v20.8b \n" // B to Sepia B "umlal v4.8h, v1.8b, v21.8b \n" // G "umlal v4.8h, v2.8b, v22.8b \n" // R "umull v5.8h, v0.8b, v24.8b \n" // B to Sepia G @@ -2603,9 +2963,9 @@ void ARGBColorMatrixRow_NEON(const uint8_t* src_argb, "1: \n" "ld4 {v16.8b,v17.8b,v18.8b,v19.8b}, [%0], #32 \n" // load 8 ARGB - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop. "uxtl v16.8h, v16.8b \n" // b (0 .. 255) 16 bit + "prfm pldl1keep, [%0, 448] \n" "uxtl v17.8h, v17.8b \n" // g "uxtl v18.8h, v18.8b \n" // r "uxtl v19.8h, v19.8b \n" // a @@ -2653,7 +3013,7 @@ void ARGBColorMatrixRow_NEON(const uint8_t* src_argb, // TODO(fbarchard): fix vqshrun in ARGBMultiplyRow_NEON and reenable. // Multiply 2 rows of ARGB pixels together, 8 pixels at a time. -void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, +void ARGBMultiplyRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -2662,11 +3022,11 @@ void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB "ld4 {v4.8b,v5.8b,v6.8b,v7.8b}, [%1], #32 \n" // load 8 more - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #8 \n" // 8 processed per loop. "umull v0.8h, v0.8b, v4.8b \n" // multiply B + "prfm pldl1keep, [%0, 448] \n" "umull v1.8h, v1.8b, v5.8b \n" // multiply G + "prfm pldl1keep, [%1, 448] \n" "umull v2.8h, v2.8b, v6.8b \n" // multiply R "umull v3.8h, v3.8b, v7.8b \n" // multiply A "rshrn v0.8b, v0.8h, #8 \n" // 16 bit to 8 bit B @@ -2675,7 +3035,7 @@ void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, "rshrn v3.8b, v3.8h, #8 \n" // 16 bit to 8 bit A "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%2], #32 \n" // store 8 ARGB "b.gt 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -2684,7 +3044,7 @@ void ARGBMultiplyRow_NEON(const uint8_t* src_argb0, } // Add 2 rows of ARGB pixels together, 8 pixels at a time. -void ARGBAddRow_NEON(const uint8_t* src_argb0, +void ARGBAddRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -2693,16 +3053,16 @@ void ARGBAddRow_NEON(const uint8_t* src_argb0, "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB "ld4 {v4.8b,v5.8b,v6.8b,v7.8b}, [%1], #32 \n" // load 8 more - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #8 \n" // 8 processed per loop. "uqadd v0.8b, v0.8b, v4.8b \n" + "prfm pldl1keep, [%0, 448] \n" "uqadd v1.8b, v1.8b, v5.8b \n" + "prfm pldl1keep, [%1, 448] \n" "uqadd v2.8b, v2.8b, v6.8b \n" "uqadd v3.8b, v3.8b, v7.8b \n" "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%2], #32 \n" // store 8 ARGB "b.gt 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -2711,7 +3071,7 @@ void ARGBAddRow_NEON(const uint8_t* src_argb0, } // Subtract 2 rows of ARGB pixels, 8 pixels at a time. -void ARGBSubtractRow_NEON(const uint8_t* src_argb0, +void ARGBSubtractRow_NEON(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { @@ -2720,16 +3080,16 @@ void ARGBSubtractRow_NEON(const uint8_t* src_argb0, "1: \n" "ld4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%0], #32 \n" // load 8 ARGB "ld4 {v4.8b,v5.8b,v6.8b,v7.8b}, [%1], #32 \n" // load 8 more - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #8 \n" // 8 processed per loop. "uqsub v0.8b, v0.8b, v4.8b \n" + "prfm pldl1keep, [%0, 448] \n" "uqsub v1.8b, v1.8b, v5.8b \n" + "prfm pldl1keep, [%1, 448] \n" "uqsub v2.8b, v2.8b, v6.8b \n" "uqsub v3.8b, v3.8b, v7.8b \n" "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%2], #32 \n" // store 8 ARGB "b.gt 1b \n" - : "+r"(src_argb0), // %0 + : "+r"(src_argb), // %0 "+r"(src_argb1), // %1 "+r"(dst_argb), // %2 "+r"(width) // %3 @@ -2752,11 +3112,11 @@ void SobelRow_NEON(const uint8_t* src_sobelx, "1: \n" "ld1 {v0.8b}, [%0], #8 \n" // load 8 sobelx. "ld1 {v1.8b}, [%1], #8 \n" // load 8 sobely. - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #8 \n" // 8 processed per loop. "uqadd v0.8b, v0.8b, v1.8b \n" // add + "prfm pldl1keep, [%0, 448] \n" "orr v1.8b, v0.8b, v0.8b \n" + "prfm pldl1keep, [%1, 448] \n" "orr v2.8b, v0.8b, v0.8b \n" "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%2], #32 \n" // store 8 ARGB "b.gt 1b \n" @@ -2778,10 +3138,10 @@ void SobelToPlaneRow_NEON(const uint8_t* src_sobelx, "1: \n" "ld1 {v0.16b}, [%0], #16 \n" // load 16 sobelx. "ld1 {v1.16b}, [%1], #16 \n" // load 16 sobely. - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #16 \n" // 16 processed per loop. + "prfm pldl1keep, [%0, 448] \n" "uqadd v0.16b, v0.16b, v1.16b \n" // add + "prfm pldl1keep, [%1, 448] \n" "st1 {v0.16b}, [%2], #16 \n" // store 16 pixels. "b.gt 1b \n" : "+r"(src_sobelx), // %0 @@ -2807,10 +3167,10 @@ void SobelXYRow_NEON(const uint8_t* src_sobelx, "1: \n" "ld1 {v2.8b}, [%0], #8 \n" // load 8 sobelx. "ld1 {v0.8b}, [%1], #8 \n" // load 8 sobely. - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #8 \n" // 8 processed per loop. + "prfm pldl1keep, [%0, 448] \n" "uqadd v1.8b, v0.8b, v2.8b \n" // add + "prfm pldl1keep, [%1, 448] \n" "st4 {v0.8b,v1.8b,v2.8b,v3.8b}, [%2], #32 \n" // store 8 ARGB "b.gt 1b \n" : "+r"(src_sobelx), // %0 @@ -2834,18 +3194,18 @@ void SobelXRow_NEON(const uint8_t* src_y0, "1: \n" "ld1 {v0.8b}, [%0],%5 \n" // top "ld1 {v1.8b}, [%0],%6 \n" - "prfm pldl1keep, [%0, 448] \n" "usubl v0.8h, v0.8b, v1.8b \n" + "prfm pldl1keep, [%0, 448] \n" "ld1 {v2.8b}, [%1],%5 \n" // center * 2 "ld1 {v3.8b}, [%1],%6 \n" - "prfm pldl1keep, [%1, 448] \n" "usubl v1.8h, v2.8b, v3.8b \n" + "prfm pldl1keep, [%1, 448] \n" "add v0.8h, v0.8h, v1.8h \n" "add v0.8h, v0.8h, v1.8h \n" "ld1 {v2.8b}, [%2],%5 \n" // bottom "ld1 {v3.8b}, [%2],%6 \n" - "prfm pldl1keep, [%2, 448] \n" "subs %w4, %w4, #8 \n" // 8 pixels + "prfm pldl1keep, [%2, 448] \n" "usubl v1.8h, v2.8b, v3.8b \n" "add v0.8h, v0.8h, v1.8h \n" "abs v0.8h, v0.8h \n" @@ -2883,11 +3243,11 @@ void SobelYRow_NEON(const uint8_t* src_y0, "add v0.8h, v0.8h, v1.8h \n" "ld1 {v2.8b}, [%0],%5 \n" // right "ld1 {v3.8b}, [%1],%5 \n" - "prfm pldl1keep, [%0, 448] \n" - "prfm pldl1keep, [%1, 448] \n" "subs %w3, %w3, #8 \n" // 8 pixels "usubl v1.8h, v2.8b, v3.8b \n" + "prfm pldl1keep, [%0, 448] \n" "add v0.8h, v0.8h, v1.8h \n" + "prfm pldl1keep, [%1, 448] \n" "abs v0.8h, v0.8h \n" "uqxtn v0.8b, v0.8h \n" "st1 {v0.8b}, [%2], #8 \n" // store 8 sobely @@ -2910,9 +3270,9 @@ void HalfFloat1Row_NEON(const uint16_t* src, asm volatile( "1: \n" "ld1 {v1.16b}, [%0], #16 \n" // load 8 shorts - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 pixels per loop "uxtl v2.4s, v1.4h \n" // 8 int's + "prfm pldl1keep, [%0, 448] \n" "uxtl2 v3.4s, v1.8h \n" "scvtf v2.4s, v2.4s \n" // 8 floats "scvtf v3.4s, v3.4s \n" @@ -2934,9 +3294,9 @@ void HalfFloatRow_NEON(const uint16_t* src, asm volatile( "1: \n" "ld1 {v1.16b}, [%0], #16 \n" // load 8 shorts - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 pixels per loop "uxtl v2.4s, v1.4h \n" // 8 int's + "prfm pldl1keep, [%0, 448] \n" "uxtl2 v3.4s, v1.8h \n" "scvtf v2.4s, v2.4s \n" // 8 floats "scvtf v3.4s, v3.4s \n" @@ -2960,9 +3320,9 @@ void ByteToFloatRow_NEON(const uint8_t* src, asm volatile( "1: \n" "ld1 {v1.8b}, [%0], #8 \n" // load 8 bytes - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 pixels per loop "uxtl v1.8h, v1.8b \n" // 8 shorts + "prfm pldl1keep, [%0, 448] \n" "uxtl v2.4s, v1.4h \n" // 8 ints "uxtl2 v3.4s, v1.8h \n" "scvtf v2.4s, v2.4s \n" // 8 floats @@ -2989,9 +3349,9 @@ float ScaleMaxSamples_NEON(const float* src, "1: \n" "ld1 {v1.4s, v2.4s}, [%0], #32 \n" // load 8 samples - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop "fmul v3.4s, v1.4s, %4.s[0] \n" // scale + "prfm pldl1keep, [%0, 448] \n" "fmul v4.4s, v2.4s, %4.s[0] \n" // scale "fmax v5.4s, v5.4s, v1.4s \n" // max "fmax v6.4s, v6.4s, v2.4s \n" @@ -3019,9 +3379,9 @@ float ScaleSumSamples_NEON(const float* src, "1: \n" "ld1 {v1.4s, v2.4s}, [%0], #32 \n" // load 8 samples - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #8 \n" // 8 processed per loop "fmul v3.4s, v1.4s, %4.s[0] \n" // scale + "prfm pldl1keep, [%0, 448] \n" "fmul v4.4s, v2.4s, %4.s[0] \n" "fmla v5.4s, v1.4s, v1.4s \n" // sum of squares "fmla v6.4s, v2.4s, v2.4s \n" @@ -3229,10 +3589,10 @@ void NV21ToYUV24Row_NEON(const uint8_t* src_y, "1: \n" "ld1 {v2.16b}, [%0], #16 \n" // load 16 Y values "ld2 {v0.8b, v1.8b}, [%1], #16 \n" // load 8 VU values + "zip1 v0.16b, v0.16b, v0.16b \n" // replicate V values "prfm pldl1keep, [%0, 448] \n" + "zip1 v1.16b, v1.16b, v1.16b \n" // replicate U values "prfm pldl1keep, [%1, 448] \n" - "zip1 v0.16b, v0.16b, v0.16b \n" // replicate V values - "zip1 v1.16b, v1.16b, v1.16b \n" // replicate U values "subs %w3, %w3, #16 \n" // 16 pixels per loop "st3 {v0.16b,v1.16b,v2.16b}, [%2], #48 \n" // store 16 YUV pixels "b.gt 1b \n" @@ -3244,6 +3604,7 @@ void NV21ToYUV24Row_NEON(const uint8_t* src_y, : "cc", "memory", "v0", "v1", "v2"); } +// AYUV is YVUA in memory. UV for NV12 is UV order in memory. void AYUVToUVRow_NEON(const uint8_t* src_ayuv, int src_stride_ayuv, uint8_t* dst_uv, @@ -3253,12 +3614,12 @@ void AYUVToUVRow_NEON(const uint8_t* src_ayuv, "1: \n" "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 ayuv - "prfm pldl1keep, [%0, 448] \n" "uaddlp v0.8h, v0.16b \n" // V 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v1.8h, v1.16b \n" // U 16 bytes -> 8 shorts. "ld4 {v4.16b,v5.16b,v6.16b,v7.16b}, [%1], #64 \n" // load next 16 - "prfm pldl1keep, [%1, 448] \n" "uadalp v0.8h, v4.16b \n" // V 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v1.8h, v5.16b \n" // U 16 bytes -> 8 shorts. "uqrshrn v3.8b, v0.8h, #2 \n" // 2x2 average "uqrshrn v2.8b, v1.8h, #2 \n" @@ -3282,12 +3643,12 @@ void AYUVToVURow_NEON(const uint8_t* src_ayuv, "1: \n" "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 ayuv - "prfm pldl1keep, [%0, 448] \n" "uaddlp v0.8h, v0.16b \n" // V 16 bytes -> 8 shorts. + "prfm pldl1keep, [%0, 448] \n" "uaddlp v1.8h, v1.16b \n" // U 16 bytes -> 8 shorts. "ld4 {v4.16b,v5.16b,v6.16b,v7.16b}, [%1], #64 \n" // load next 16 - "prfm pldl1keep, [%1, 448] \n" "uadalp v0.8h, v4.16b \n" // V 16 bytes -> 8 shorts. + "prfm pldl1keep, [%1, 448] \n" "uadalp v1.8h, v5.16b \n" // U 16 bytes -> 8 shorts. "uqrshrn v0.8b, v0.8h, #2 \n" // 2x2 average "uqrshrn v1.8b, v1.8h, #2 \n" @@ -3307,8 +3668,8 @@ void AYUVToYRow_NEON(const uint8_t* src_ayuv, uint8_t* dst_y, int width) { asm volatile( "1: \n" "ld4 {v0.16b,v1.16b,v2.16b,v3.16b}, [%0], #64 \n" // load 16 - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #16 \n" // 16 pixels per loop + "prfm pldl1keep, [%0, 448] \n" "st1 {v2.16b}, [%1], #16 \n" // store 16 Y pixels "b.gt 1b \n" : "+r"(src_ayuv), // %0 @@ -3329,9 +3690,9 @@ void SwapUVRow_NEON(const uint8_t* src_uv, uint8_t* dst_vu, int width) { "1: \n" "ld1 {v0.16b}, [%0], 16 \n" // load 16 UV values "ld1 {v1.16b}, [%0], 16 \n" - "prfm pldl1keep, [%0, 448] \n" "subs %w2, %w2, #16 \n" // 16 pixels per loop "tbl v0.16b, {v0.16b}, v2.16b \n" + "prfm pldl1keep, [%0, 448] \n" "tbl v1.16b, {v1.16b}, v2.16b \n" "stp q0, q1, [%1], 32 \n" // store 16 VU pixels "b.gt 1b \n" @@ -3379,6 +3740,113 @@ void HalfMergeUVRow_NEON(const uint8_t* src_u, : "cc", "memory", "v0", "v1", "v2", "v3"); } +void SplitUVRow_16_NEON(const uint16_t* src_uv, + uint16_t* dst_u, + uint16_t* dst_v, + int depth, + int width) { + int shift = depth - 16; // Negative for right shift. + asm volatile( + "dup v2.8h, %w4 \n" + "1: \n" + "ld2 {v0.8h, v1.8h}, [%0], #32 \n" // load 8 UV + "subs %w3, %w3, #8 \n" // 8 src pixels per loop + "ushl v0.8h, v0.8h, v2.8h \n" + "prfm pldl1keep, [%0, 448] \n" + "ushl v1.8h, v1.8h, v2.8h \n" + "st1 {v0.8h}, [%1], #16 \n" // store 8 U pixels + "st1 {v1.8h}, [%2], #16 \n" // store 8 V pixels + "b.gt 1b \n" + : "+r"(src_uv), // %0 + "+r"(dst_u), // %1 + "+r"(dst_v), // %2 + "+r"(width) // %3 + : "r"(shift) // %4 + : "cc", "memory", "v0", "v1", "v2"); +} + +void MergeUVRow_16_NEON(const uint16_t* src_u, + const uint16_t* src_v, + uint16_t* dst_uv, + int depth, + int width) { + int shift = 16 - depth; + asm volatile( + "dup v2.8h, %w4 \n" + "1: \n" + "ld1 {v0.8h}, [%0], #16 \n" // load 8 U + "subs %w3, %w3, #8 \n" // 8 src pixels per loop + "ld1 {v1.8h}, [%1], #16 \n" // load 8 V + "ushl v0.8h, v0.8h, v2.8h \n" + "prfm pldl1keep, [%0, 448] \n" + "ushl v1.8h, v1.8h, v2.8h \n" + "prfm pldl1keep, [%1, 448] \n" + "st2 {v0.8h, v1.8h}, [%2], #32 \n" // store 8 UV pixels + "b.gt 1b \n" + : "+r"(src_u), // %0 + "+r"(src_v), // %1 + "+r"(dst_uv), // %2 + "+r"(width) // %3 + : "r"(shift) // %4 + : "cc", "memory", "v0", "v1", "v2"); +} + +void MultiplyRow_16_NEON(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width) { + asm volatile( + "dup v2.8h, %w2 \n" + "1: \n" + "ldp q0, q1, [%0], #32 \n" + "mul v0.8h, v0.8h, v2.8h \n" + "prfm pldl1keep, [%0, 448] \n" + "mul v1.8h, v1.8h, v2.8h \n" + "stp q0, q1, [%1] \n" // store 16 pixels + "add %1, %1, #32 \n" + "subs %w3, %w3, #16 \n" // 16 src pixels per loop + "b.gt 1b \n" + : "+r"(src_y), // %0 + "+r"(dst_y), // %1 + "+r"(scale), // %2 + "+r"(width) // %3 + : + : "cc", "memory", "v0", "v1", "v2"); +} + +void DivideRow_16_NEON(const uint16_t* src_y, + uint16_t* dst_y, + int scale, + int width) { + asm volatile( + "dup v0.8h, %w2 \n" + "1: \n" + "ldp q1, q2, [%0], #32 \n" + "ushll v3.4s, v1.4h, #0 \n" + "ushll v4.4s, v2.4h, #0 \n" + "prfm pldl1keep, [%0, 448] \n" + "ushll2 v1.4s, v1.8h, #0 \n" + "ushll2 v2.4s, v2.8h, #0 \n" + "mul v3.4s, v0.4s, v3.4s \n" + "mul v4.4s, v0.4s, v4.4s \n" + "mul v1.4s, v0.4s, v1.4s \n" + "mul v2.4s, v0.4s, v2.4s \n" + "shrn v3.4h, v3.4s, #16 \n" + "shrn v4.4h, v4.4s, #16 \n" + "shrn2 v3.8h, v1.4s, #16 \n" + "shrn2 v4.8h, v2.4s, #16 \n" + "stp q3, q3, [%1] \n" // store 16 pixels + "add %1, %1, #32 \n" + "subs %w3, %w3, #16 \n" // 16 src pixels per loop + "b.gt 1b \n" + : "+r"(src_y), // %0 + "+r"(dst_y), // %1 + "+r"(scale), // %2 + "+r"(width) // %3 + : + : "cc", "memory", "v0", "v1", "v2", "v3", "v4"); +} + #endif // !defined(LIBYUV_DISABLE_NEON) && defined(__aarch64__) #ifdef __cplusplus diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/row_win.cc b/third-party/libyuv/third_party/libyuv/source/row_win.cc similarity index 91% rename from third-party/webrtc/dependencies/third_party/libyuv/source/row_win.cc rename to third-party/libyuv/third_party/libyuv/source/row_win.cc index 9afcf060a4..7dccacc7fd 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/row_win.cc +++ b/third-party/libyuv/third_party/libyuv/source/row_win.cc @@ -10,9 +10,9 @@ #include "libyuv/row.h" -// This module is for Visual C 32/64 bit and clangcl 32 bit +// This module is for Visual C 32/64 bit #if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && \ - (defined(_M_IX86) || (defined(_M_X64) && !defined(__clang__))) + !defined(__clang__) && (defined(_M_IX86) || defined(_M_X64)) #if defined(_M_X64) #include @@ -27,12 +27,34 @@ extern "C" { // 64 bit #if defined(_M_X64) +// Read 8 UV from 444 +#define READYUV444 \ + xmm3 = _mm_loadl_epi64((__m128i*)u_buf); \ + xmm1 = _mm_loadl_epi64((__m128i*)(u_buf + offset)); \ + xmm3 = _mm_unpacklo_epi8(xmm3, xmm1); \ + u_buf += 8; \ + xmm4 = _mm_loadl_epi64((__m128i*)y_buf); \ + xmm4 = _mm_unpacklo_epi8(xmm4, xmm4); \ + y_buf += 8; + +// Read 8 UV from 444, With 8 Alpha. +#define READYUVA444 \ + xmm3 = _mm_loadl_epi64((__m128i*)u_buf); \ + xmm1 = _mm_loadl_epi64((__m128i*)(u_buf + offset)); \ + xmm3 = _mm_unpacklo_epi8(xmm3, xmm1); \ + u_buf += 8; \ + xmm4 = _mm_loadl_epi64((__m128i*)y_buf); \ + xmm4 = _mm_unpacklo_epi8(xmm4, xmm4); \ + y_buf += 8; \ + xmm5 = _mm_loadl_epi64((__m128i*)a_buf); \ + a_buf += 8; + // Read 4 UV from 422, upsample to 8 UV. #define READYUV422 \ - xmm0 = _mm_cvtsi32_si128(*(uint32_t*)u_buf); \ + xmm3 = _mm_cvtsi32_si128(*(uint32_t*)u_buf); \ xmm1 = _mm_cvtsi32_si128(*(uint32_t*)(u_buf + offset)); \ - xmm0 = _mm_unpacklo_epi8(xmm0, xmm1); \ - xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); \ + xmm3 = _mm_unpacklo_epi8(xmm3, xmm1); \ + xmm3 = _mm_unpacklo_epi16(xmm3, xmm3); \ u_buf += 4; \ xmm4 = _mm_loadl_epi64((__m128i*)y_buf); \ xmm4 = _mm_unpacklo_epi8(xmm4, xmm4); \ @@ -40,10 +62,10 @@ extern "C" { // Read 4 UV from 422, upsample to 8 UV. With 8 Alpha. #define READYUVA422 \ - xmm0 = _mm_cvtsi32_si128(*(uint32_t*)u_buf); \ + xmm3 = _mm_cvtsi32_si128(*(uint32_t*)u_buf); \ xmm1 = _mm_cvtsi32_si128(*(uint32_t*)(u_buf + offset)); \ - xmm0 = _mm_unpacklo_epi8(xmm0, xmm1); \ - xmm0 = _mm_unpacklo_epi16(xmm0, xmm0); \ + xmm3 = _mm_unpacklo_epi8(xmm3, xmm1); \ + xmm3 = _mm_unpacklo_epi16(xmm3, xmm3); \ u_buf += 4; \ xmm4 = _mm_loadl_epi64((__m128i*)y_buf); \ xmm4 = _mm_unpacklo_epi8(xmm4, xmm4); \ @@ -52,24 +74,21 @@ extern "C" { a_buf += 8; // Convert 8 pixels: 8 UV and 8 Y. -#define YUVTORGB(yuvconstants) \ - xmm1 = _mm_loadu_si128(&xmm0); \ - xmm2 = _mm_loadu_si128(&xmm0); \ - xmm0 = _mm_maddubs_epi16(xmm0, *(__m128i*)yuvconstants->kUVToB); \ - xmm1 = _mm_maddubs_epi16(xmm1, *(__m128i*)yuvconstants->kUVToG); \ - xmm2 = _mm_maddubs_epi16(xmm2, *(__m128i*)yuvconstants->kUVToR); \ - xmm0 = _mm_sub_epi16(*(__m128i*)yuvconstants->kUVBiasB, xmm0); \ - xmm1 = _mm_sub_epi16(*(__m128i*)yuvconstants->kUVBiasG, xmm1); \ - xmm2 = _mm_sub_epi16(*(__m128i*)yuvconstants->kUVBiasR, xmm2); \ - xmm4 = _mm_mulhi_epu16(xmm4, *(__m128i*)yuvconstants->kYToRgb); \ - xmm0 = _mm_adds_epi16(xmm0, xmm4); \ - xmm1 = _mm_adds_epi16(xmm1, xmm4); \ - xmm2 = _mm_adds_epi16(xmm2, xmm4); \ - xmm0 = _mm_srai_epi16(xmm0, 6); \ - xmm1 = _mm_srai_epi16(xmm1, 6); \ - xmm2 = _mm_srai_epi16(xmm2, 6); \ - xmm0 = _mm_packus_epi16(xmm0, xmm0); \ - xmm1 = _mm_packus_epi16(xmm1, xmm1); \ +#define YUVTORGB(yuvconstants) \ + xmm3 = _mm_sub_epi8(xmm3, _mm_set1_epi8(0x80)); \ + xmm4 = _mm_mulhi_epu16(xmm4, *(__m128i*)yuvconstants->kYToRgb); \ + xmm4 = _mm_add_epi16(xmm4, *(__m128i*)yuvconstants->kYBiasToRgb); \ + xmm0 = _mm_maddubs_epi16(*(__m128i*)yuvconstants->kUVToB, xmm3); \ + xmm1 = _mm_maddubs_epi16(*(__m128i*)yuvconstants->kUVToG, xmm3); \ + xmm2 = _mm_maddubs_epi16(*(__m128i*)yuvconstants->kUVToR, xmm3); \ + xmm0 = _mm_adds_epi16(xmm4, xmm0); \ + xmm1 = _mm_subs_epi16(xmm4, xmm1); \ + xmm2 = _mm_adds_epi16(xmm4, xmm2); \ + xmm0 = _mm_srai_epi16(xmm0, 6); \ + xmm1 = _mm_srai_epi16(xmm1, 6); \ + xmm2 = _mm_srai_epi16(xmm2, 6); \ + xmm0 = _mm_packus_epi16(xmm0, xmm0); \ + xmm1 = _mm_packus_epi16(xmm1, xmm1); \ xmm2 = _mm_packus_epi16(xmm2, xmm2); // Store 8 ARGB values. @@ -90,7 +109,7 @@ void I422ToARGBRow_SSSE3(const uint8_t* y_buf, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - __m128i xmm0, xmm1, xmm2, xmm4; + __m128i xmm0, xmm1, xmm2, xmm3, xmm4; const __m128i xmm5 = _mm_set1_epi8(-1); const ptrdiff_t offset = (uint8_t*)v_buf - (uint8_t*)u_buf; while (width > 0) { @@ -110,7 +129,7 @@ void I422AlphaToARGBRow_SSSE3(const uint8_t* y_buf, uint8_t* dst_argb, const struct YuvConstants* yuvconstants, int width) { - __m128i xmm0, xmm1, xmm2, xmm4, xmm5; + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5; const ptrdiff_t offset = (uint8_t*)v_buf - (uint8_t*)u_buf; while (width > 0) { READYUVA422 @@ -121,6 +140,44 @@ void I422AlphaToARGBRow_SSSE3(const uint8_t* y_buf, } #endif +#if defined(HAS_I444TOARGBROW_SSSE3) +void I444ToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + __m128i xmm0, xmm1, xmm2, xmm3, xmm4; + const __m128i xmm5 = _mm_set1_epi8(-1); + const ptrdiff_t offset = (uint8_t*)v_buf - (uint8_t*)u_buf; + while (width > 0) { + READYUV444 + YUVTORGB(yuvconstants) + STOREARGB + width -= 8; + } +} +#endif + +#if defined(HAS_I444ALPHATOARGBROW_SSSE3) +void I444AlphaToARGBRow_SSSE3(const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + __m128i xmm0, xmm1, xmm2, xmm3, xmm4, xmm5; + const ptrdiff_t offset = (uint8_t*)v_buf - (uint8_t*)u_buf; + while (width > 0) { + READYUVA444 + YUVTORGB(yuvconstants) + STOREARGB + width -= 8; + } +} +#endif + // 32 bit #else // defined(_M_X64) #ifdef HAS_ARGBTOYROW_SSSE3 @@ -187,11 +244,11 @@ static const uvec8 kAddY16 = {16u, 16u, 16u, 16u, 16u, 16u, 16u, 16u, // 7 bit fixed point 0.5. static const vec16 kAddYJ64 = {64, 64, 64, 64, 64, 64, 64, 64}; -static const uvec8 kAddUV128 = {128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u, - 128u, 128u, 128u, 128u, 128u, 128u, 128u, 128u}; - -static const uvec16 kAddUVJ128 = {0x8080u, 0x8080u, 0x8080u, 0x8080u, - 0x8080u, 0x8080u, 0x8080u, 0x8080u}; +// 8 bit fixed point 0.5, for bias of UV. +static const ulvec8 kBiasUV128 = { + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}; // Shuffle table for converting RGB24 to ARGB. static const uvec8 kShuffleMaskRGB24ToARGB = { @@ -1367,7 +1424,7 @@ __declspec(naked) void RGBAToYRow_SSSE3(const uint8_t* src_argb, } } -__declspec(naked) void ARGBToUVRow_SSSE3(const uint8_t* src_argb0, +__declspec(naked) void ARGBToUVRow_SSSE3(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1380,7 +1437,7 @@ __declspec(naked) void ARGBToUVRow_SSSE3(const uint8_t* src_argb0, mov edx, [esp + 8 + 12] // dst_u mov edi, [esp + 8 + 16] // dst_v mov ecx, [esp + 8 + 20] // width - movdqa xmm5, xmmword ptr kAddUV128 + movdqa xmm5, xmmword ptr kBiasUV128 movdqa xmm6, xmmword ptr kARGBToV movdqa xmm7, xmmword ptr kARGBToU sub edi, edx // stride from u to v @@ -1439,7 +1496,7 @@ __declspec(naked) void ARGBToUVRow_SSSE3(const uint8_t* src_argb0, } } -__declspec(naked) void ARGBToUVJRow_SSSE3(const uint8_t* src_argb0, +__declspec(naked) void ARGBToUVJRow_SSSE3(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1452,7 +1509,7 @@ __declspec(naked) void ARGBToUVJRow_SSSE3(const uint8_t* src_argb0, mov edx, [esp + 8 + 12] // dst_u mov edi, [esp + 8 + 16] // dst_v mov ecx, [esp + 8 + 20] // width - movdqa xmm5, xmmword ptr kAddUVJ128 + movdqa xmm5, xmmword ptr kBiasUV128 movdqa xmm6, xmmword ptr kARGBToVJ movdqa xmm7, xmmword ptr kARGBToUJ sub edi, edx // stride from u to v @@ -1513,7 +1570,7 @@ __declspec(naked) void ARGBToUVJRow_SSSE3(const uint8_t* src_argb0, } #ifdef HAS_ARGBTOUVROW_AVX2 -__declspec(naked) void ARGBToUVRow_AVX2(const uint8_t* src_argb0, +__declspec(naked) void ARGBToUVRow_AVX2(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1526,7 +1583,7 @@ __declspec(naked) void ARGBToUVRow_AVX2(const uint8_t* src_argb0, mov edx, [esp + 8 + 12] // dst_u mov edi, [esp + 8 + 16] // dst_v mov ecx, [esp + 8 + 20] // width - vbroadcastf128 ymm5, xmmword ptr kAddUV128 + vbroadcastf128 ymm5, xmmword ptr kBiasUV128 vbroadcastf128 ymm6, xmmword ptr kARGBToV vbroadcastf128 ymm7, xmmword ptr kARGBToU sub edi, edx // stride from u to v @@ -1581,7 +1638,7 @@ __declspec(naked) void ARGBToUVRow_AVX2(const uint8_t* src_argb0, #endif // HAS_ARGBTOUVROW_AVX2 #ifdef HAS_ARGBTOUVJROW_AVX2 -__declspec(naked) void ARGBToUVJRow_AVX2(const uint8_t* src_argb0, +__declspec(naked) void ARGBToUVJRow_AVX2(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1594,7 +1651,7 @@ __declspec(naked) void ARGBToUVJRow_AVX2(const uint8_t* src_argb0, mov edx, [esp + 8 + 12] // dst_u mov edi, [esp + 8 + 16] // dst_v mov ecx, [esp + 8 + 20] // width - vbroadcastf128 ymm5, xmmword ptr kAddUVJ128 + vbroadcastf128 ymm5, xmmword ptr kBiasUV128 vbroadcastf128 ymm6, xmmword ptr kARGBToVJ vbroadcastf128 ymm7, xmmword ptr kARGBToUJ sub edi, edx // stride from u to v @@ -1649,7 +1706,7 @@ __declspec(naked) void ARGBToUVJRow_AVX2(const uint8_t* src_argb0, } #endif // HAS_ARGBTOUVJROW_AVX2 -__declspec(naked) void ARGBToUV444Row_SSSE3(const uint8_t* src_argb0, +__declspec(naked) void ARGBToUV444Row_SSSE3(const uint8_t* src_argb, uint8_t* dst_u, uint8_t* dst_v, int width) { @@ -1659,7 +1716,7 @@ __declspec(naked) void ARGBToUV444Row_SSSE3(const uint8_t* src_argb0, mov edx, [esp + 4 + 8] // dst_u mov edi, [esp + 4 + 12] // dst_v mov ecx, [esp + 4 + 16] // width - movdqa xmm5, xmmword ptr kAddUV128 + movdqa xmm5, xmmword ptr kBiasUV128 movdqa xmm6, xmmword ptr kARGBToV movdqa xmm7, xmmword ptr kARGBToU sub edi, edx // stride from u to v @@ -1707,7 +1764,7 @@ __declspec(naked) void ARGBToUV444Row_SSSE3(const uint8_t* src_argb0, } } -__declspec(naked) void BGRAToUVRow_SSSE3(const uint8_t* src_argb0, +__declspec(naked) void BGRAToUVRow_SSSE3(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1720,7 +1777,7 @@ __declspec(naked) void BGRAToUVRow_SSSE3(const uint8_t* src_argb0, mov edx, [esp + 8 + 12] // dst_u mov edi, [esp + 8 + 16] // dst_v mov ecx, [esp + 8 + 20] // width - movdqa xmm5, xmmword ptr kAddUV128 + movdqa xmm5, xmmword ptr kBiasUV128 movdqa xmm6, xmmword ptr kBGRAToV movdqa xmm7, xmmword ptr kBGRAToU sub edi, edx // stride from u to v @@ -1779,7 +1836,7 @@ __declspec(naked) void BGRAToUVRow_SSSE3(const uint8_t* src_argb0, } } -__declspec(naked) void ABGRToUVRow_SSSE3(const uint8_t* src_argb0, +__declspec(naked) void ABGRToUVRow_SSSE3(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1792,7 +1849,7 @@ __declspec(naked) void ABGRToUVRow_SSSE3(const uint8_t* src_argb0, mov edx, [esp + 8 + 12] // dst_u mov edi, [esp + 8 + 16] // dst_v mov ecx, [esp + 8 + 20] // width - movdqa xmm5, xmmword ptr kAddUV128 + movdqa xmm5, xmmword ptr kBiasUV128 movdqa xmm6, xmmword ptr kABGRToV movdqa xmm7, xmmword ptr kABGRToU sub edi, edx // stride from u to v @@ -1851,7 +1908,7 @@ __declspec(naked) void ABGRToUVRow_SSSE3(const uint8_t* src_argb0, } } -__declspec(naked) void RGBAToUVRow_SSSE3(const uint8_t* src_argb0, +__declspec(naked) void RGBAToUVRow_SSSE3(const uint8_t* src_argb, int src_stride_argb, uint8_t* dst_u, uint8_t* dst_v, @@ -1864,7 +1921,7 @@ __declspec(naked) void RGBAToUVRow_SSSE3(const uint8_t* src_argb0, mov edx, [esp + 8 + 12] // dst_u mov edi, [esp + 8 + 16] // dst_v mov ecx, [esp + 8 + 20] // width - movdqa xmm5, xmmword ptr kAddUV128 + movdqa xmm5, xmmword ptr kBiasUV128 movdqa xmm6, xmmword ptr kRGBAToV movdqa xmm7, xmmword ptr kRGBAToU sub edi, edx // stride from u to v @@ -1926,137 +1983,153 @@ __declspec(naked) void RGBAToUVRow_SSSE3(const uint8_t* src_argb0, // Read 16 UV from 444 #define READYUV444_AVX2 \ - __asm { \ - __asm vmovdqu xmm0, [esi] /* U */ \ - __asm vmovdqu xmm1, [esi + edi] /* V */ \ + __asm { \ + __asm vmovdqu xmm3, [esi] /* U */ \ + __asm vmovdqu xmm1, [esi + edi] /* V */ \ __asm lea esi, [esi + 16] \ - __asm vpermq ymm0, ymm0, 0xd8 \ + __asm vpermq ymm3, ymm3, 0xd8 \ __asm vpermq ymm1, ymm1, 0xd8 \ - __asm vpunpcklbw ymm0, ymm0, ymm1 /* UV */ \ - __asm vmovdqu xmm4, [eax] /* Y */ \ + __asm vpunpcklbw ymm3, ymm3, ymm1 /* UV */ \ + __asm vmovdqu xmm4, [eax] /* Y */ \ __asm vpermq ymm4, ymm4, 0xd8 \ __asm vpunpcklbw ymm4, ymm4, ymm4 \ __asm lea eax, [eax + 16]} +// Read 16 UV from 444. With 16 Alpha. +#define READYUVA444_AVX2 \ + __asm { \ + __asm vmovdqu xmm3, [esi] /* U */ \ + __asm vmovdqu xmm1, [esi + edi] /* V */ \ + __asm lea esi, [esi + 16] \ + __asm vpermq ymm3, ymm3, 0xd8 \ + __asm vpermq ymm1, ymm1, 0xd8 \ + __asm vpunpcklbw ymm3, ymm3, ymm1 /* UV */ \ + __asm vmovdqu xmm4, [eax] /* Y */ \ + __asm vpermq ymm4, ymm4, 0xd8 \ + __asm vpunpcklbw ymm4, ymm4, ymm4 \ + __asm lea eax, [eax + 16] \ + __asm vmovdqu xmm5, [ebp] /* A */ \ + __asm vpermq ymm5, ymm5, 0xd8 \ + __asm lea ebp, [ebp + 16]} + // Read 8 UV from 422, upsample to 16 UV. #define READYUV422_AVX2 \ - __asm { \ - __asm vmovq xmm0, qword ptr [esi] /* U */ \ - __asm vmovq xmm1, qword ptr [esi + edi] /* V */ \ + __asm { \ + __asm vmovq xmm3, qword ptr [esi] /* U */ \ + __asm vmovq xmm1, qword ptr [esi + edi] /* V */ \ __asm lea esi, [esi + 8] \ - __asm vpunpcklbw ymm0, ymm0, ymm1 /* UV */ \ - __asm vpermq ymm0, ymm0, 0xd8 \ - __asm vpunpcklwd ymm0, ymm0, ymm0 /* UVUV (upsample) */ \ - __asm vmovdqu xmm4, [eax] /* Y */ \ + __asm vpunpcklbw ymm3, ymm3, ymm1 /* UV */ \ + __asm vpermq ymm3, ymm3, 0xd8 \ + __asm vpunpcklwd ymm3, ymm3, ymm3 /* UVUV (upsample) */ \ + __asm vmovdqu xmm4, [eax] /* Y */ \ __asm vpermq ymm4, ymm4, 0xd8 \ __asm vpunpcklbw ymm4, ymm4, ymm4 \ __asm lea eax, [eax + 16]} // Read 8 UV from 422, upsample to 16 UV. With 16 Alpha. #define READYUVA422_AVX2 \ - __asm { \ - __asm vmovq xmm0, qword ptr [esi] /* U */ \ - __asm vmovq xmm1, qword ptr [esi + edi] /* V */ \ + __asm { \ + __asm vmovq xmm3, qword ptr [esi] /* U */ \ + __asm vmovq xmm1, qword ptr [esi + edi] /* V */ \ __asm lea esi, [esi + 8] \ - __asm vpunpcklbw ymm0, ymm0, ymm1 /* UV */ \ - __asm vpermq ymm0, ymm0, 0xd8 \ - __asm vpunpcklwd ymm0, ymm0, ymm0 /* UVUV (upsample) */ \ - __asm vmovdqu xmm4, [eax] /* Y */ \ + __asm vpunpcklbw ymm3, ymm3, ymm1 /* UV */ \ + __asm vpermq ymm3, ymm3, 0xd8 \ + __asm vpunpcklwd ymm3, ymm3, ymm3 /* UVUV (upsample) */ \ + __asm vmovdqu xmm4, [eax] /* Y */ \ __asm vpermq ymm4, ymm4, 0xd8 \ __asm vpunpcklbw ymm4, ymm4, ymm4 \ __asm lea eax, [eax + 16] \ - __asm vmovdqu xmm5, [ebp] /* A */ \ + __asm vmovdqu xmm5, [ebp] /* A */ \ __asm vpermq ymm5, ymm5, 0xd8 \ __asm lea ebp, [ebp + 16]} // Read 8 UV from NV12, upsample to 16 UV. #define READNV12_AVX2 \ - __asm { \ - __asm vmovdqu xmm0, [esi] /* UV */ \ + __asm { \ + __asm vmovdqu xmm3, [esi] /* UV */ \ __asm lea esi, [esi + 16] \ - __asm vpermq ymm0, ymm0, 0xd8 \ - __asm vpunpcklwd ymm0, ymm0, ymm0 /* UVUV (upsample) */ \ - __asm vmovdqu xmm4, [eax] /* Y */ \ + __asm vpermq ymm3, ymm3, 0xd8 \ + __asm vpunpcklwd ymm3, ymm3, ymm3 /* UVUV (upsample) */ \ + __asm vmovdqu xmm4, [eax] /* Y */ \ __asm vpermq ymm4, ymm4, 0xd8 \ __asm vpunpcklbw ymm4, ymm4, ymm4 \ __asm lea eax, [eax + 16]} // Read 8 UV from NV21, upsample to 16 UV. #define READNV21_AVX2 \ - __asm { \ - __asm vmovdqu xmm0, [esi] /* UV */ \ + __asm { \ + __asm vmovdqu xmm3, [esi] /* UV */ \ __asm lea esi, [esi + 16] \ - __asm vpermq ymm0, ymm0, 0xd8 \ - __asm vpshufb ymm0, ymm0, ymmword ptr kShuffleNV21 \ - __asm vmovdqu xmm4, [eax] /* Y */ \ + __asm vpermq ymm3, ymm3, 0xd8 \ + __asm vpshufb ymm3, ymm3, ymmword ptr kShuffleNV21 \ + __asm vmovdqu xmm4, [eax] /* Y */ \ __asm vpermq ymm4, ymm4, 0xd8 \ __asm vpunpcklbw ymm4, ymm4, ymm4 \ __asm lea eax, [eax + 16]} // Read 8 YUY2 with 16 Y and upsample 8 UV to 16 UV. #define READYUY2_AVX2 \ - __asm { \ - __asm vmovdqu ymm4, [eax] /* YUY2 */ \ + __asm { \ + __asm vmovdqu ymm4, [eax] /* YUY2 */ \ __asm vpshufb ymm4, ymm4, ymmword ptr kShuffleYUY2Y \ - __asm vmovdqu ymm0, [eax] /* UV */ \ - __asm vpshufb ymm0, ymm0, ymmword ptr kShuffleYUY2UV \ + __asm vmovdqu ymm3, [eax] /* UV */ \ + __asm vpshufb ymm3, ymm3, ymmword ptr kShuffleYUY2UV \ __asm lea eax, [eax + 32]} // Read 8 UYVY with 16 Y and upsample 8 UV to 16 UV. #define READUYVY_AVX2 \ - __asm { \ - __asm vmovdqu ymm4, [eax] /* UYVY */ \ + __asm { \ + __asm vmovdqu ymm4, [eax] /* UYVY */ \ __asm vpshufb ymm4, ymm4, ymmword ptr kShuffleUYVYY \ - __asm vmovdqu ymm0, [eax] /* UV */ \ - __asm vpshufb ymm0, ymm0, ymmword ptr kShuffleUYVYUV \ + __asm vmovdqu ymm3, [eax] /* UV */ \ + __asm vpshufb ymm3, ymm3, ymmword ptr kShuffleUYVYUV \ __asm lea eax, [eax + 32]} // Convert 16 pixels: 16 UV and 16 Y. #define YUVTORGB_AVX2(YuvConstants) \ - __asm { \ - __asm vpmaddubsw ymm2, ymm0, ymmword ptr [YuvConstants + KUVTOR] /* R UV */\ - __asm vpmaddubsw ymm1, ymm0, ymmword ptr [YuvConstants + KUVTOG] /* G UV */\ - __asm vpmaddubsw ymm0, ymm0, ymmword ptr [YuvConstants + KUVTOB] /* B UV */\ - __asm vmovdqu ymm3, ymmword ptr [YuvConstants + KUVBIASR] \ - __asm vpsubw ymm2, ymm3, ymm2 \ - __asm vmovdqu ymm3, ymmword ptr [YuvConstants + KUVBIASG] \ - __asm vpsubw ymm1, ymm3, ymm1 \ - __asm vmovdqu ymm3, ymmword ptr [YuvConstants + KUVBIASB] \ - __asm vpsubw ymm0, ymm3, ymm0 /* Step 2: Find Y contribution to 16 R,G,B values */ \ + __asm { \ + __asm vpsubb ymm3, ymm3, ymmword ptr kBiasUV128 \ __asm vpmulhuw ymm4, ymm4, ymmword ptr [YuvConstants + KYTORGB] \ - __asm vpaddsw ymm0, ymm0, ymm4 /* B += Y */ \ - __asm vpaddsw ymm1, ymm1, ymm4 /* G += Y */ \ - __asm vpaddsw ymm2, ymm2, ymm4 /* R += Y */ \ + __asm vmovdqa ymm0, ymmword ptr [YuvConstants + KUVTOB] \ + __asm vmovdqa ymm1, ymmword ptr [YuvConstants + KUVTOG] \ + __asm vmovdqa ymm2, ymmword ptr [YuvConstants + KUVTOR] \ + __asm vpmaddubsw ymm0, ymm0, ymm3 /* B UV */ \ + __asm vpmaddubsw ymm1, ymm1, ymm3 /* G UV */ \ + __asm vpmaddubsw ymm2, ymm2, ymm3 /* B UV */ \ + __asm vmovdqu ymm3, ymmword ptr [YuvConstants + KYBIASTORGB] \ + __asm vpaddw ymm4, ymm3, ymm4 \ + __asm vpaddsw ymm0, ymm0, ymm4 \ + __asm vpsubsw ymm1, ymm4, ymm1 \ + __asm vpaddsw ymm2, ymm2, ymm4 \ __asm vpsraw ymm0, ymm0, 6 \ __asm vpsraw ymm1, ymm1, 6 \ __asm vpsraw ymm2, ymm2, 6 \ - __asm vpackuswb ymm0, ymm0, ymm0 /* B */ \ - __asm vpackuswb ymm1, ymm1, ymm1 /* G */ \ - __asm vpackuswb ymm2, ymm2, ymm2 /* R */ \ - } + __asm vpackuswb ymm0, ymm0, ymm0 \ + __asm vpackuswb ymm1, ymm1, ymm1 \ + __asm vpackuswb ymm2, ymm2, ymm2} // Store 16 ARGB values. #define STOREARGB_AVX2 \ - __asm { \ - __asm vpunpcklbw ymm0, ymm0, ymm1 /* BG */ \ + __asm { \ + __asm vpunpcklbw ymm0, ymm0, ymm1 /* BG */ \ __asm vpermq ymm0, ymm0, 0xd8 \ - __asm vpunpcklbw ymm2, ymm2, ymm5 /* RA */ \ + __asm vpunpcklbw ymm2, ymm2, ymm5 /* RA */ \ __asm vpermq ymm2, ymm2, 0xd8 \ - __asm vpunpcklwd ymm1, ymm0, ymm2 /* BGRA first 8 pixels */ \ - __asm vpunpckhwd ymm0, ymm0, ymm2 /* BGRA next 8 pixels */ \ + __asm vpunpcklwd ymm1, ymm0, ymm2 /* BGRA first 8 pixels */ \ + __asm vpunpckhwd ymm0, ymm0, ymm2 /* BGRA next 8 pixels */ \ __asm vmovdqu 0[edx], ymm1 \ __asm vmovdqu 32[edx], ymm0 \ __asm lea edx, [edx + 64]} // Store 16 RGBA values. #define STORERGBA_AVX2 \ - __asm { \ - __asm vpunpcklbw ymm1, ymm1, ymm2 /* GR */ \ + __asm { \ + __asm vpunpcklbw ymm1, ymm1, ymm2 /* GR */ \ __asm vpermq ymm1, ymm1, 0xd8 \ - __asm vpunpcklbw ymm2, ymm5, ymm0 /* AB */ \ + __asm vpunpcklbw ymm2, ymm5, ymm0 /* AB */ \ __asm vpermq ymm2, ymm2, 0xd8 \ - __asm vpunpcklwd ymm0, ymm2, ymm1 /* ABGR first 8 pixels */ \ - __asm vpunpckhwd ymm1, ymm2, ymm1 /* ABGR next 8 pixels */ \ + __asm vpunpcklwd ymm0, ymm2, ymm1 /* ABGR first 8 pixels */ \ + __asm vpunpckhwd ymm1, ymm2, ymm1 /* ABGR next 8 pixels */ \ __asm vmovdqu [edx], ymm0 \ __asm vmovdqu [edx + 32], ymm1 \ __asm lea edx, [edx + 64]} @@ -2183,6 +2256,48 @@ __declspec(naked) void I444ToARGBRow_AVX2( } #endif // HAS_I444TOARGBROW_AVX2 +#ifdef HAS_I444ALPHATOARGBROW_AVX2 +// 16 pixels +// 16 UV values with 16 Y producing 16 ARGB (64 bytes). +__declspec(naked) void I444AlphaToARGBRow_AVX2( + const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + __asm { + push esi + push edi + push ebx + push ebp + mov eax, [esp + 16 + 4] // Y + mov esi, [esp + 16 + 8] // U + mov edi, [esp + 16 + 12] // V + mov ebp, [esp + 16 + 16] // A + mov edx, [esp + 16 + 20] // argb + mov ebx, [esp + 16 + 24] // yuvconstants + mov ecx, [esp + 16 + 28] // width + sub edi, esi + convertloop: + READYUVA444_AVX2 + YUVTORGB_AVX2(ebx) + STOREARGB_AVX2 + + sub ecx, 16 + jg convertloop + + pop ebp + pop ebx + pop edi + pop esi + vzeroupper + ret + } +} +#endif // HAS_I444AlphaTOARGBROW_AVX2 + #ifdef HAS_NV12TOARGBROW_AVX2 // 16 pixels. // 8 UV values upsampled to 16 UV, mixed with 16 Y producing 16 ARGB (64 bytes). @@ -2361,191 +2476,202 @@ __declspec(naked) void I422ToRGBARow_AVX2( // Read 8 UV from 444. #define READYUV444 \ - __asm { \ - __asm movq xmm0, qword ptr [esi] /* U */ \ + __asm { \ + __asm movq xmm3, qword ptr [esi] /* U */ \ __asm movq xmm1, qword ptr [esi + edi] /* V */ \ __asm lea esi, [esi + 8] \ - __asm punpcklbw xmm0, xmm1 /* UV */ \ + __asm punpcklbw xmm3, xmm1 /* UV */ \ __asm movq xmm4, qword ptr [eax] \ __asm punpcklbw xmm4, xmm4 \ __asm lea eax, [eax + 8]} +// Read 4 UV from 444. With 8 Alpha. +#define READYUVA444 \ + __asm { \ + __asm movq xmm3, qword ptr [esi] /* U */ \ + __asm movq xmm1, qword ptr [esi + edi] /* V */ \ + __asm lea esi, [esi + 8] \ + __asm punpcklbw xmm3, xmm1 /* UV */ \ + __asm movq xmm4, qword ptr [eax] \ + __asm punpcklbw xmm4, xmm4 \ + __asm lea eax, [eax + 8] \ + __asm movq xmm5, qword ptr [ebp] /* A */ \ + __asm lea ebp, [ebp + 8]} + // Read 4 UV from 422, upsample to 8 UV. #define READYUV422 \ - __asm { \ - __asm movd xmm0, [esi] /* U */ \ - __asm movd xmm1, [esi + edi] /* V */ \ + __asm { \ + __asm movd xmm3, [esi] /* U */ \ + __asm movd xmm1, [esi + edi] /* V */ \ __asm lea esi, [esi + 4] \ - __asm punpcklbw xmm0, xmm1 /* UV */ \ - __asm punpcklwd xmm0, xmm0 /* UVUV (upsample) */ \ + __asm punpcklbw xmm3, xmm1 /* UV */ \ + __asm punpcklwd xmm3, xmm3 /* UVUV (upsample) */ \ __asm movq xmm4, qword ptr [eax] \ __asm punpcklbw xmm4, xmm4 \ __asm lea eax, [eax + 8]} // Read 4 UV from 422, upsample to 8 UV. With 8 Alpha. #define READYUVA422 \ - __asm { \ - __asm movd xmm0, [esi] /* U */ \ - __asm movd xmm1, [esi + edi] /* V */ \ + __asm { \ + __asm movd xmm3, [esi] /* U */ \ + __asm movd xmm1, [esi + edi] /* V */ \ __asm lea esi, [esi + 4] \ - __asm punpcklbw xmm0, xmm1 /* UV */ \ - __asm punpcklwd xmm0, xmm0 /* UVUV (upsample) */ \ - __asm movq xmm4, qword ptr [eax] /* Y */ \ + __asm punpcklbw xmm3, xmm1 /* UV */ \ + __asm punpcklwd xmm3, xmm3 /* UVUV (upsample) */ \ + __asm movq xmm4, qword ptr [eax] /* Y */ \ __asm punpcklbw xmm4, xmm4 \ __asm lea eax, [eax + 8] \ - __asm movq xmm5, qword ptr [ebp] /* A */ \ + __asm movq xmm5, qword ptr [ebp] /* A */ \ __asm lea ebp, [ebp + 8]} // Read 4 UV from NV12, upsample to 8 UV. #define READNV12 \ - __asm { \ - __asm movq xmm0, qword ptr [esi] /* UV */ \ + __asm { \ + __asm movq xmm3, qword ptr [esi] /* UV */ \ __asm lea esi, [esi + 8] \ - __asm punpcklwd xmm0, xmm0 /* UVUV (upsample) */ \ + __asm punpcklwd xmm3, xmm3 /* UVUV (upsample) */ \ __asm movq xmm4, qword ptr [eax] \ __asm punpcklbw xmm4, xmm4 \ __asm lea eax, [eax + 8]} // Read 4 VU from NV21, upsample to 8 UV. #define READNV21 \ - __asm { \ - __asm movq xmm0, qword ptr [esi] /* UV */ \ + __asm { \ + __asm movq xmm3, qword ptr [esi] /* UV */ \ __asm lea esi, [esi + 8] \ - __asm pshufb xmm0, xmmword ptr kShuffleNV21 \ + __asm pshufb xmm3, xmmword ptr kShuffleNV21 \ __asm movq xmm4, qword ptr [eax] \ __asm punpcklbw xmm4, xmm4 \ __asm lea eax, [eax + 8]} // Read 4 YUY2 with 8 Y and upsample 4 UV to 8 UV. #define READYUY2 \ - __asm { \ - __asm movdqu xmm4, [eax] /* YUY2 */ \ + __asm { \ + __asm movdqu xmm4, [eax] /* YUY2 */ \ __asm pshufb xmm4, xmmword ptr kShuffleYUY2Y \ - __asm movdqu xmm0, [eax] /* UV */ \ - __asm pshufb xmm0, xmmword ptr kShuffleYUY2UV \ + __asm movdqu xmm3, [eax] /* UV */ \ + __asm pshufb xmm3, xmmword ptr kShuffleYUY2UV \ __asm lea eax, [eax + 16]} // Read 4 UYVY with 8 Y and upsample 4 UV to 8 UV. #define READUYVY \ - __asm { \ - __asm movdqu xmm4, [eax] /* UYVY */ \ + __asm { \ + __asm movdqu xmm4, [eax] /* UYVY */ \ __asm pshufb xmm4, xmmword ptr kShuffleUYVYY \ - __asm movdqu xmm0, [eax] /* UV */ \ - __asm pshufb xmm0, xmmword ptr kShuffleUYVYUV \ + __asm movdqu xmm3, [eax] /* UV */ \ + __asm pshufb xmm3, xmmword ptr kShuffleUYVYUV \ __asm lea eax, [eax + 16]} // Convert 8 pixels: 8 UV and 8 Y. #define YUVTORGB(YuvConstants) \ - __asm { \ - __asm movdqa xmm1, xmm0 \ - __asm movdqa xmm2, xmm0 \ - __asm movdqa xmm3, xmm0 \ - __asm movdqa xmm0, xmmword ptr [YuvConstants + KUVBIASB] \ - __asm pmaddubsw xmm1, xmmword ptr [YuvConstants + KUVTOB] \ - __asm psubw xmm0, xmm1 \ - __asm movdqa xmm1, xmmword ptr [YuvConstants + KUVBIASG] \ - __asm pmaddubsw xmm2, xmmword ptr [YuvConstants + KUVTOG] \ - __asm psubw xmm1, xmm2 \ - __asm movdqa xmm2, xmmword ptr [YuvConstants + KUVBIASR] \ - __asm pmaddubsw xmm3, xmmword ptr [YuvConstants + KUVTOR] \ - __asm psubw xmm2, xmm3 \ + __asm { \ + __asm psubb xmm3, xmmword ptr kBiasUV128 \ __asm pmulhuw xmm4, xmmword ptr [YuvConstants + KYTORGB] \ - __asm paddsw xmm0, xmm4 /* B += Y */ \ - __asm paddsw xmm1, xmm4 /* G += Y */ \ - __asm paddsw xmm2, xmm4 /* R += Y */ \ + __asm movdqa xmm0, xmmword ptr [YuvConstants + KUVTOB] \ + __asm movdqa xmm1, xmmword ptr [YuvConstants + KUVTOG] \ + __asm movdqa xmm2, xmmword ptr [YuvConstants + KUVTOR] \ + __asm pmaddubsw xmm0, xmm3 \ + __asm pmaddubsw xmm1, xmm3 \ + __asm pmaddubsw xmm2, xmm3 \ + __asm movdqa xmm3, xmmword ptr [YuvConstants + KYBIASTORGB] \ + __asm paddw xmm4, xmm3 \ + __asm paddsw xmm0, xmm4 \ + __asm paddsw xmm2, xmm4 \ + __asm psubsw xmm4, xmm1 \ + __asm movdqa xmm1, xmm4 \ __asm psraw xmm0, 6 \ __asm psraw xmm1, 6 \ __asm psraw xmm2, 6 \ - __asm packuswb xmm0, xmm0 /* B */ \ - __asm packuswb xmm1, xmm1 /* G */ \ + __asm packuswb xmm0, xmm0 /* B */ \ + __asm packuswb xmm1, xmm1 /* G */ \ __asm packuswb xmm2, xmm2 /* R */ \ } // Store 8 ARGB values. #define STOREARGB \ - __asm { \ - __asm punpcklbw xmm0, xmm1 /* BG */ \ - __asm punpcklbw xmm2, xmm5 /* RA */ \ + __asm { \ + __asm punpcklbw xmm0, xmm1 /* BG */ \ + __asm punpcklbw xmm2, xmm5 /* RA */ \ __asm movdqa xmm1, xmm0 \ - __asm punpcklwd xmm0, xmm2 /* BGRA first 4 pixels */ \ - __asm punpckhwd xmm1, xmm2 /* BGRA next 4 pixels */ \ + __asm punpcklwd xmm0, xmm2 /* BGRA first 4 pixels */ \ + __asm punpckhwd xmm1, xmm2 /* BGRA next 4 pixels */ \ __asm movdqu 0[edx], xmm0 \ __asm movdqu 16[edx], xmm1 \ __asm lea edx, [edx + 32]} // Store 8 BGRA values. #define STOREBGRA \ - __asm { \ - __asm pcmpeqb xmm5, xmm5 /* generate 0xffffffff for alpha */ \ - __asm punpcklbw xmm1, xmm0 /* GB */ \ - __asm punpcklbw xmm5, xmm2 /* AR */ \ + __asm { \ + __asm pcmpeqb xmm5, xmm5 /* generate 0xffffffff for alpha */ \ + __asm punpcklbw xmm1, xmm0 /* GB */ \ + __asm punpcklbw xmm5, xmm2 /* AR */ \ __asm movdqa xmm0, xmm5 \ - __asm punpcklwd xmm5, xmm1 /* BGRA first 4 pixels */ \ - __asm punpckhwd xmm0, xmm1 /* BGRA next 4 pixels */ \ + __asm punpcklwd xmm5, xmm1 /* BGRA first 4 pixels */ \ + __asm punpckhwd xmm0, xmm1 /* BGRA next 4 pixels */ \ __asm movdqu 0[edx], xmm5 \ __asm movdqu 16[edx], xmm0 \ __asm lea edx, [edx + 32]} // Store 8 RGBA values. #define STORERGBA \ - __asm { \ - __asm pcmpeqb xmm5, xmm5 /* generate 0xffffffff for alpha */ \ - __asm punpcklbw xmm1, xmm2 /* GR */ \ - __asm punpcklbw xmm5, xmm0 /* AB */ \ + __asm { \ + __asm pcmpeqb xmm5, xmm5 /* generate 0xffffffff for alpha */ \ + __asm punpcklbw xmm1, xmm2 /* GR */ \ + __asm punpcklbw xmm5, xmm0 /* AB */ \ __asm movdqa xmm0, xmm5 \ - __asm punpcklwd xmm5, xmm1 /* RGBA first 4 pixels */ \ - __asm punpckhwd xmm0, xmm1 /* RGBA next 4 pixels */ \ + __asm punpcklwd xmm5, xmm1 /* RGBA first 4 pixels */ \ + __asm punpckhwd xmm0, xmm1 /* RGBA next 4 pixels */ \ __asm movdqu 0[edx], xmm5 \ __asm movdqu 16[edx], xmm0 \ __asm lea edx, [edx + 32]} // Store 8 RGB24 values. #define STORERGB24 \ - __asm {/* Weave into RRGB */ \ - __asm punpcklbw xmm0, xmm1 /* BG */ \ - __asm punpcklbw xmm2, xmm2 /* RR */ \ + __asm {/* Weave into RRGB */ \ + __asm punpcklbw xmm0, xmm1 /* BG */ \ + __asm punpcklbw xmm2, xmm2 /* RR */ \ __asm movdqa xmm1, xmm0 \ - __asm punpcklwd xmm0, xmm2 /* BGRR first 4 pixels */ \ - __asm punpckhwd xmm1, xmm2 /* BGRR next 4 pixels */ /* RRGB -> RGB24 */ \ - __asm pshufb xmm0, xmm5 /* Pack first 8 and last 4 bytes. */ \ - __asm pshufb xmm1, xmm6 /* Pack first 12 bytes. */ \ - __asm palignr xmm1, xmm0, 12 /* last 4 bytes of xmm0 + 12 xmm1 */ \ - __asm movq qword ptr 0[edx], xmm0 /* First 8 bytes */ \ - __asm movdqu 8[edx], xmm1 /* Last 16 bytes */ \ + __asm punpcklwd xmm0, xmm2 /* BGRR first 4 pixels */ \ + __asm punpckhwd xmm1, xmm2 /* BGRR next 4 pixels */ /* RRGB -> RGB24 */ \ + __asm pshufb xmm0, xmm5 /* Pack first 8 and last 4 bytes. */ \ + __asm pshufb xmm1, xmm6 /* Pack first 12 bytes. */ \ + __asm palignr xmm1, xmm0, 12 /* last 4 bytes of xmm0 + 12 xmm1 */ \ + __asm movq qword ptr 0[edx], xmm0 /* First 8 bytes */ \ + __asm movdqu 8[edx], xmm1 /* Last 16 bytes */ \ __asm lea edx, [edx + 24]} // Store 8 RGB565 values. #define STORERGB565 \ - __asm {/* Weave into RRGB */ \ - __asm punpcklbw xmm0, xmm1 /* BG */ \ - __asm punpcklbw xmm2, xmm2 /* RR */ \ + __asm {/* Weave into RRGB */ \ + __asm punpcklbw xmm0, xmm1 /* BG */ \ + __asm punpcklbw xmm2, xmm2 /* RR */ \ __asm movdqa xmm1, xmm0 \ - __asm punpcklwd xmm0, xmm2 /* BGRR first 4 pixels */ \ - __asm punpckhwd xmm1, xmm2 /* BGRR next 4 pixels */ /* RRGB -> RGB565 */ \ - __asm movdqa xmm3, xmm0 /* B first 4 pixels of argb */ \ - __asm movdqa xmm2, xmm0 /* G */ \ - __asm pslld xmm0, 8 /* R */ \ - __asm psrld xmm3, 3 /* B */ \ - __asm psrld xmm2, 5 /* G */ \ - __asm psrad xmm0, 16 /* R */ \ - __asm pand xmm3, xmm5 /* B */ \ - __asm pand xmm2, xmm6 /* G */ \ - __asm pand xmm0, xmm7 /* R */ \ - __asm por xmm3, xmm2 /* BG */ \ - __asm por xmm0, xmm3 /* BGR */ \ - __asm movdqa xmm3, xmm1 /* B next 4 pixels of argb */ \ - __asm movdqa xmm2, xmm1 /* G */ \ - __asm pslld xmm1, 8 /* R */ \ - __asm psrld xmm3, 3 /* B */ \ - __asm psrld xmm2, 5 /* G */ \ - __asm psrad xmm1, 16 /* R */ \ - __asm pand xmm3, xmm5 /* B */ \ - __asm pand xmm2, xmm6 /* G */ \ - __asm pand xmm1, xmm7 /* R */ \ - __asm por xmm3, xmm2 /* BG */ \ - __asm por xmm1, xmm3 /* BGR */ \ + __asm punpcklwd xmm0, xmm2 /* BGRR first 4 pixels */ \ + __asm punpckhwd xmm1, xmm2 /* BGRR next 4 pixels */ /* RRGB -> RGB565 */ \ + __asm movdqa xmm3, xmm0 /* B first 4 pixels of argb */ \ + __asm movdqa xmm2, xmm0 /* G */ \ + __asm pslld xmm0, 8 /* R */ \ + __asm psrld xmm3, 3 /* B */ \ + __asm psrld xmm2, 5 /* G */ \ + __asm psrad xmm0, 16 /* R */ \ + __asm pand xmm3, xmm5 /* B */ \ + __asm pand xmm2, xmm6 /* G */ \ + __asm pand xmm0, xmm7 /* R */ \ + __asm por xmm3, xmm2 /* BG */ \ + __asm por xmm0, xmm3 /* BGR */ \ + __asm movdqa xmm3, xmm1 /* B next 4 pixels of argb */ \ + __asm movdqa xmm2, xmm1 /* G */ \ + __asm pslld xmm1, 8 /* R */ \ + __asm psrld xmm3, 3 /* B */ \ + __asm psrld xmm2, 5 /* G */ \ + __asm psrad xmm1, 16 /* R */ \ + __asm pand xmm3, xmm5 /* B */ \ + __asm pand xmm2, xmm6 /* G */ \ + __asm pand xmm1, xmm7 /* R */ \ + __asm por xmm3, xmm2 /* BG */ \ + __asm por xmm1, xmm3 /* BGR */ \ __asm packssdw xmm0, xmm1 \ - __asm movdqu 0[edx], xmm0 /* store 8 pixels of RGB565 */ \ + __asm movdqu 0[edx], xmm0 /* store 8 pixels of RGB565 */ \ __asm lea edx, [edx + 16]} // 8 pixels. @@ -2585,6 +2711,46 @@ __declspec(naked) void I444ToARGBRow_SSSE3( } } +// 8 pixels. +// 8 UV values, mixed with 8 Y and 8A producing 8 ARGB (32 bytes). +__declspec(naked) void I444AlphaToARGBRow_SSSE3( + const uint8_t* y_buf, + const uint8_t* u_buf, + const uint8_t* v_buf, + const uint8_t* a_buf, + uint8_t* dst_argb, + const struct YuvConstants* yuvconstants, + int width) { + __asm { + push esi + push edi + push ebx + push ebp + mov eax, [esp + 16 + 4] // Y + mov esi, [esp + 16 + 8] // U + mov edi, [esp + 16 + 12] // V + mov ebp, [esp + 16 + 16] // A + mov edx, [esp + 16 + 20] // argb + mov ebx, [esp + 16 + 24] // yuvconstants + mov ecx, [esp + 16 + 28] // width + sub edi, esi + + convertloop: + READYUVA444 + YUVTORGB(ebx) + STOREARGB + + sub ecx, 8 + jg convertloop + + pop ebp + pop ebx + pop edi + pop esi + ret + } +} + // 8 pixels. // 4 UV values upsampled to 8 UV, mixed with 8 Y producing 8 RGB24 (24 bytes). __declspec(naked) void I422ToRGB24Row_SSSE3( @@ -4175,13 +4341,13 @@ static const uvec8 kShuffleAlpha = {3u, 0x80, 3u, 0x80, 7u, 0x80, 7u, 0x80, 11u, 0x80, 11u, 0x80, 15u, 0x80, 15u, 0x80}; // Blend 8 pixels at a time. -__declspec(naked) void ARGBBlendRow_SSSE3(const uint8_t* src_argb0, +__declspec(naked) void ARGBBlendRow_SSSE3(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { __asm { push esi - mov eax, [esp + 4 + 4] // src_argb0 + mov eax, [esp + 4 + 4] // src_argb mov esi, [esp + 4 + 8] // src_argb1 mov edx, [esp + 4 + 12] // dst_argb mov ecx, [esp + 4 + 16] // width @@ -4270,7 +4436,7 @@ __declspec(naked) void ARGBAttenuateRow_SSSE3(const uint8_t* src_argb, uint8_t* dst_argb, int width) { __asm { - mov eax, [esp + 4] // src_argb0 + mov eax, [esp + 4] // src_argb mov edx, [esp + 8] // dst_argb mov ecx, [esp + 12] // width pcmpeqb xmm3, xmm3 // generate mask 0xff000000 @@ -4315,7 +4481,7 @@ __declspec(naked) void ARGBAttenuateRow_AVX2(const uint8_t* src_argb, uint8_t* dst_argb, int width) { __asm { - mov eax, [esp + 4] // src_argb0 + mov eax, [esp + 4] // src_argb mov edx, [esp + 8] // dst_argb mov ecx, [esp + 12] // width sub edx, eax @@ -4409,7 +4575,7 @@ __declspec(naked) void ARGBUnattenuateRow_AVX2(const uint8_t* src_argb, uint8_t* dst_argb, int width) { __asm { - mov eax, [esp + 4] // src_argb0 + mov eax, [esp + 4] // src_argb mov edx, [esp + 8] // dst_argb mov ecx, [esp + 12] // width sub edx, eax @@ -4765,20 +4931,20 @@ __declspec(naked) void ARGBShadeRow_SSE2(const uint8_t* src_argb, #ifdef HAS_ARGBMULTIPLYROW_SSE2 // Multiply 2 rows of ARGB pixels together, 4 pixels at a time. -__declspec(naked) void ARGBMultiplyRow_SSE2(const uint8_t* src_argb0, +__declspec(naked) void ARGBMultiplyRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { __asm { push esi - mov eax, [esp + 4 + 4] // src_argb0 + mov eax, [esp + 4 + 4] // src_argb mov esi, [esp + 4 + 8] // src_argb1 mov edx, [esp + 4 + 12] // dst_argb mov ecx, [esp + 4 + 16] // width pxor xmm5, xmm5 // constant 0 convertloop: - movdqu xmm0, [eax] // read 4 pixels from src_argb0 + movdqu xmm0, [eax] // read 4 pixels from src_argb movdqu xmm2, [esi] // read 4 pixels from src_argb1 movdqu xmm1, xmm0 movdqu xmm3, xmm2 @@ -4786,8 +4952,8 @@ __declspec(naked) void ARGBMultiplyRow_SSE2(const uint8_t* src_argb0, punpckhbw xmm1, xmm1 // next 2 punpcklbw xmm2, xmm5 // first 2 punpckhbw xmm3, xmm5 // next 2 - pmulhuw xmm0, xmm2 // src_argb0 * src_argb1 first 2 - pmulhuw xmm1, xmm3 // src_argb0 * src_argb1 next 2 + pmulhuw xmm0, xmm2 // src_argb * src_argb1 first 2 + pmulhuw xmm1, xmm3 // src_argb * src_argb1 next 2 lea eax, [eax + 16] lea esi, [esi + 16] packuswb xmm0, xmm1 @@ -4805,13 +4971,13 @@ __declspec(naked) void ARGBMultiplyRow_SSE2(const uint8_t* src_argb0, #ifdef HAS_ARGBADDROW_SSE2 // Add 2 rows of ARGB pixels together, 4 pixels at a time. // TODO(fbarchard): Port this to posix, neon and other math functions. -__declspec(naked) void ARGBAddRow_SSE2(const uint8_t* src_argb0, +__declspec(naked) void ARGBAddRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { __asm { push esi - mov eax, [esp + 4 + 4] // src_argb0 + mov eax, [esp + 4 + 4] // src_argb mov esi, [esp + 4 + 8] // src_argb1 mov edx, [esp + 4 + 12] // dst_argb mov ecx, [esp + 4 + 16] // width @@ -4820,11 +4986,11 @@ __declspec(naked) void ARGBAddRow_SSE2(const uint8_t* src_argb0, jl convertloop49 convertloop4: - movdqu xmm0, [eax] // read 4 pixels from src_argb0 + movdqu xmm0, [eax] // read 4 pixels from src_argb lea eax, [eax + 16] movdqu xmm1, [esi] // read 4 pixels from src_argb1 lea esi, [esi + 16] - paddusb xmm0, xmm1 // src_argb0 + src_argb1 + paddusb xmm0, xmm1 // src_argb + src_argb1 movdqu [edx], xmm0 lea edx, [edx + 16] sub ecx, 4 @@ -4835,11 +5001,11 @@ __declspec(naked) void ARGBAddRow_SSE2(const uint8_t* src_argb0, jl convertloop19 convertloop1: - movd xmm0, [eax] // read 1 pixels from src_argb0 + movd xmm0, [eax] // read 1 pixels from src_argb lea eax, [eax + 4] movd xmm1, [esi] // read 1 pixels from src_argb1 lea esi, [esi + 4] - paddusb xmm0, xmm1 // src_argb0 + src_argb1 + paddusb xmm0, xmm1 // src_argb + src_argb1 movd [edx], xmm0 lea edx, [edx + 4] sub ecx, 1 @@ -4854,23 +5020,23 @@ __declspec(naked) void ARGBAddRow_SSE2(const uint8_t* src_argb0, #ifdef HAS_ARGBSUBTRACTROW_SSE2 // Subtract 2 rows of ARGB pixels together, 4 pixels at a time. -__declspec(naked) void ARGBSubtractRow_SSE2(const uint8_t* src_argb0, +__declspec(naked) void ARGBSubtractRow_SSE2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { __asm { push esi - mov eax, [esp + 4 + 4] // src_argb0 + mov eax, [esp + 4 + 4] // src_argb mov esi, [esp + 4 + 8] // src_argb1 mov edx, [esp + 4 + 12] // dst_argb mov ecx, [esp + 4 + 16] // width convertloop: - movdqu xmm0, [eax] // read 4 pixels from src_argb0 + movdqu xmm0, [eax] // read 4 pixels from src_argb lea eax, [eax + 16] movdqu xmm1, [esi] // read 4 pixels from src_argb1 lea esi, [esi + 16] - psubusb xmm0, xmm1 // src_argb0 - src_argb1 + psubusb xmm0, xmm1 // src_argb - src_argb1 movdqu [edx], xmm0 lea edx, [edx + 16] sub ecx, 4 @@ -4884,20 +5050,20 @@ __declspec(naked) void ARGBSubtractRow_SSE2(const uint8_t* src_argb0, #ifdef HAS_ARGBMULTIPLYROW_AVX2 // Multiply 2 rows of ARGB pixels together, 8 pixels at a time. -__declspec(naked) void ARGBMultiplyRow_AVX2(const uint8_t* src_argb0, +__declspec(naked) void ARGBMultiplyRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { __asm { push esi - mov eax, [esp + 4 + 4] // src_argb0 + mov eax, [esp + 4 + 4] // src_argb mov esi, [esp + 4 + 8] // src_argb1 mov edx, [esp + 4 + 12] // dst_argb mov ecx, [esp + 4 + 16] // width vpxor ymm5, ymm5, ymm5 // constant 0 convertloop: - vmovdqu ymm1, [eax] // read 8 pixels from src_argb0 + vmovdqu ymm1, [eax] // read 8 pixels from src_argb lea eax, [eax + 32] vmovdqu ymm3, [esi] // read 8 pixels from src_argb1 lea esi, [esi + 32] @@ -4905,8 +5071,8 @@ __declspec(naked) void ARGBMultiplyRow_AVX2(const uint8_t* src_argb0, vpunpckhbw ymm1, ymm1, ymm1 // high 4 vpunpcklbw ymm2, ymm3, ymm5 // low 4 vpunpckhbw ymm3, ymm3, ymm5 // high 4 - vpmulhuw ymm0, ymm0, ymm2 // src_argb0 * src_argb1 low 4 - vpmulhuw ymm1, ymm1, ymm3 // src_argb0 * src_argb1 high 4 + vpmulhuw ymm0, ymm0, ymm2 // src_argb * src_argb1 low 4 + vpmulhuw ymm1, ymm1, ymm3 // src_argb * src_argb1 high 4 vpackuswb ymm0, ymm0, ymm1 vmovdqu [edx], ymm0 lea edx, [edx + 32] @@ -4922,19 +5088,19 @@ __declspec(naked) void ARGBMultiplyRow_AVX2(const uint8_t* src_argb0, #ifdef HAS_ARGBADDROW_AVX2 // Add 2 rows of ARGB pixels together, 8 pixels at a time. -__declspec(naked) void ARGBAddRow_AVX2(const uint8_t* src_argb0, +__declspec(naked) void ARGBAddRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { __asm { push esi - mov eax, [esp + 4 + 4] // src_argb0 + mov eax, [esp + 4 + 4] // src_argb mov esi, [esp + 4 + 8] // src_argb1 mov edx, [esp + 4 + 12] // dst_argb mov ecx, [esp + 4 + 16] // width convertloop: - vmovdqu ymm0, [eax] // read 8 pixels from src_argb0 + vmovdqu ymm0, [eax] // read 8 pixels from src_argb lea eax, [eax + 32] vpaddusb ymm0, ymm0, [esi] // add 8 pixels from src_argb1 lea esi, [esi + 32] @@ -4952,21 +5118,21 @@ __declspec(naked) void ARGBAddRow_AVX2(const uint8_t* src_argb0, #ifdef HAS_ARGBSUBTRACTROW_AVX2 // Subtract 2 rows of ARGB pixels together, 8 pixels at a time. -__declspec(naked) void ARGBSubtractRow_AVX2(const uint8_t* src_argb0, +__declspec(naked) void ARGBSubtractRow_AVX2(const uint8_t* src_argb, const uint8_t* src_argb1, uint8_t* dst_argb, int width) { __asm { push esi - mov eax, [esp + 4 + 4] // src_argb0 + mov eax, [esp + 4 + 4] // src_argb mov esi, [esp + 4 + 8] // src_argb1 mov edx, [esp + 4 + 12] // dst_argb mov ecx, [esp + 4 + 16] // width convertloop: - vmovdqu ymm0, [eax] // read 8 pixels from src_argb0 + vmovdqu ymm0, [eax] // read 8 pixels from src_argb lea eax, [eax + 32] - vpsubusb ymm0, ymm0, [esi] // src_argb0 - src_argb1 + vpsubusb ymm0, ymm0, [esi] // src_argb - src_argb1 lea esi, [esi + 32] vmovdqu [edx], ymm0 lea edx, [edx + 32] diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale.cc b/third-party/libyuv/third_party/libyuv/source/scale.cc similarity index 80% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale.cc rename to third-party/libyuv/third_party/libyuv/source/scale.cc index cf3c033257..03b0486f76 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/scale.cc +++ b/third-party/libyuv/third_party/libyuv/source/scale.cc @@ -1336,6 +1336,327 @@ void ScalePlaneBilinearUp(int src_width, } } +// Scale plane, horizontally up by 2 times. +// Uses linear filter horizontally, nearest vertically. +// This is an optimized version for scaling up a plane to 2 times of +// its original width, using linear interpolation. +// This is used to scale U and V planes of I422 to I444. +void ScalePlaneUp2_Linear(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint8_t* src_ptr, + uint8_t* dst_ptr) { + void (*ScaleRowUp)(const uint8_t* src_ptr, uint8_t* dst_ptr, int dst_width) = + ScaleRowUp2_Linear_Any_C; + int i; + int y; + int dy; + + // This function can only scale up by 2 times horizontally. + assert(src_width == ((dst_width + 1) / 2)); + +#ifdef HAS_SCALEROWUP2LINEAR_SSE2 + if (TestCpuFlag(kCpuHasSSE2)) { + ScaleRowUp = ScaleRowUp2_Linear_Any_SSE2; + } +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_SSSE3 + if (TestCpuFlag(kCpuHasSSSE3)) { + ScaleRowUp = ScaleRowUp2_Linear_Any_SSSE3; + } +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + ScaleRowUp = ScaleRowUp2_Linear_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_NEON + if (TestCpuFlag(kCpuHasNEON)) { + ScaleRowUp = ScaleRowUp2_Linear_Any_NEON; + } +#endif + + if (dst_height == 1) { + ScaleRowUp(src_ptr + ((src_height - 1) / 2) * src_stride, dst_ptr, + dst_width); + } else { + dy = FixedDiv(src_height - 1, dst_height - 1); + y = (1 << 15) - 1; + for (i = 0; i < dst_height; ++i) { + ScaleRowUp(src_ptr + (y >> 16) * src_stride, dst_ptr, dst_width); + dst_ptr += dst_stride; + y += dy; + } + } +} + +// Scale plane, up by 2 times. +// This is an optimized version for scaling up a plane to 2 times of +// its original size, using bilinear interpolation. +// This is used to scale U and V planes of I420 to I444. +void ScalePlaneUp2_Bilinear(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint8_t* src_ptr, + uint8_t* dst_ptr) { + void (*Scale2RowUp)(const uint8_t* src_ptr, ptrdiff_t src_stride, + uint8_t* dst_ptr, ptrdiff_t dst_stride, int dst_width) = + ScaleRowUp2_Bilinear_Any_C; + int x; + + // This function can only scale up by 2 times. + assert(src_width == ((dst_width + 1) / 2)); + assert(src_height == ((dst_height + 1) / 2)); + +#ifdef HAS_SCALEROWUP2BILINEAR_SSE2 + if (TestCpuFlag(kCpuHasSSE2)) { + Scale2RowUp = ScaleRowUp2_Bilinear_Any_SSE2; + } +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_SSSE3 + if (TestCpuFlag(kCpuHasSSSE3)) { + Scale2RowUp = ScaleRowUp2_Bilinear_Any_SSSE3; + } +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + Scale2RowUp = ScaleRowUp2_Bilinear_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_NEON + if (TestCpuFlag(kCpuHasNEON)) { + Scale2RowUp = ScaleRowUp2_Bilinear_Any_NEON; + } +#endif + + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + dst_ptr += dst_stride; + for (x = 0; x < src_height - 1; ++x) { + Scale2RowUp(src_ptr, src_stride, dst_ptr, dst_stride, dst_width); + src_ptr += src_stride; + // TODO(fbarchard): Test performance of writing one row of destination at a + // time. + dst_ptr += 2 * dst_stride; + } + if (!(dst_height & 1)) { + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + } +} + +// Scale at most 14 bit plane, horizontally up by 2 times. +// This is an optimized version for scaling up a plane to 2 times of +// its original width, using linear interpolation. +// stride is in count of uint16_t. +// This is used to scale U and V planes of I210 to I410 and I212 to I412. +void ScalePlaneUp2_12_Linear(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint16_t* src_ptr, + uint16_t* dst_ptr) { + void (*ScaleRowUp)(const uint16_t* src_ptr, uint16_t* dst_ptr, + int dst_width) = ScaleRowUp2_Linear_16_Any_C; + int i; + int y; + int dy; + + // This function can only scale up by 2 times horizontally. + assert(src_width == ((dst_width + 1) / 2)); + +#ifdef HAS_SCALEROWUP2LINEAR_12_SSSE3 + if (TestCpuFlag(kCpuHasSSSE3)) { + ScaleRowUp = ScaleRowUp2_Linear_12_Any_SSSE3; + } +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_12_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + ScaleRowUp = ScaleRowUp2_Linear_12_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_12_NEON + if (TestCpuFlag(kCpuHasNEON)) { + ScaleRowUp = ScaleRowUp2_Linear_12_Any_NEON; + } +#endif + + if (dst_height == 1) { + ScaleRowUp(src_ptr + ((src_height - 1) / 2) * src_stride, dst_ptr, + dst_width); + } else { + dy = FixedDiv(src_height - 1, dst_height - 1); + y = (1 << 15) - 1; + for (i = 0; i < dst_height; ++i) { + ScaleRowUp(src_ptr + (y >> 16) * src_stride, dst_ptr, dst_width); + dst_ptr += dst_stride; + y += dy; + } + } +} + +// Scale at most 12 bit plane, up by 2 times. +// This is an optimized version for scaling up a plane to 2 times of +// its original size, using bilinear interpolation. +// stride is in count of uint16_t. +// This is used to scale U and V planes of I010 to I410 and I012 to I412. +void ScalePlaneUp2_12_Bilinear(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint16_t* src_ptr, + uint16_t* dst_ptr) { + void (*Scale2RowUp)(const uint16_t* src_ptr, ptrdiff_t src_stride, + uint16_t* dst_ptr, ptrdiff_t dst_stride, int dst_width) = + ScaleRowUp2_Bilinear_16_Any_C; + int x; + + // This function can only scale up by 2 times. + assert(src_width == ((dst_width + 1) / 2)); + assert(src_height == ((dst_height + 1) / 2)); + +#ifdef HAS_SCALEROWUP2BILINEAR_12_SSSE3 + if (TestCpuFlag(kCpuHasSSSE3)) { + Scale2RowUp = ScaleRowUp2_Bilinear_12_Any_SSSE3; + } +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_12_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + Scale2RowUp = ScaleRowUp2_Bilinear_12_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_12_NEON + if (TestCpuFlag(kCpuHasNEON)) { + Scale2RowUp = ScaleRowUp2_Bilinear_12_Any_NEON; + } +#endif + + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + dst_ptr += dst_stride; + for (x = 0; x < src_height - 1; ++x) { + Scale2RowUp(src_ptr, src_stride, dst_ptr, dst_stride, dst_width); + src_ptr += src_stride; + dst_ptr += 2 * dst_stride; + } + if (!(dst_height & 1)) { + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + } +} + +void ScalePlaneUp2_16_Linear(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint16_t* src_ptr, + uint16_t* dst_ptr) { + void (*ScaleRowUp)(const uint16_t* src_ptr, uint16_t* dst_ptr, + int dst_width) = ScaleRowUp2_Linear_16_Any_C; + int i; + int y; + int dy; + + // This function can only scale up by 2 times horizontally. + assert(src_width == ((dst_width + 1) / 2)); + +#ifdef HAS_SCALEROWUP2LINEAR_16_SSE2 + if (TestCpuFlag(kCpuHasSSE2)) { + ScaleRowUp = ScaleRowUp2_Linear_16_Any_SSE2; + } +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_16_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + ScaleRowUp = ScaleRowUp2_Linear_16_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_16_NEON + if (TestCpuFlag(kCpuHasNEON)) { + ScaleRowUp = ScaleRowUp2_Linear_16_Any_NEON; + } +#endif + + if (dst_height == 1) { + ScaleRowUp(src_ptr + ((src_height - 1) / 2) * src_stride, dst_ptr, + dst_width); + } else { + dy = FixedDiv(src_height - 1, dst_height - 1); + y = (1 << 15) - 1; + for (i = 0; i < dst_height; ++i) { + ScaleRowUp(src_ptr + (y >> 16) * src_stride, dst_ptr, dst_width); + dst_ptr += dst_stride; + y += dy; + } + } +} + +void ScalePlaneUp2_16_Bilinear(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint16_t* src_ptr, + uint16_t* dst_ptr) { + void (*Scale2RowUp)(const uint16_t* src_ptr, ptrdiff_t src_stride, + uint16_t* dst_ptr, ptrdiff_t dst_stride, int dst_width) = + ScaleRowUp2_Bilinear_16_Any_C; + int x; + + // This function can only scale up by 2 times. + assert(src_width == ((dst_width + 1) / 2)); + assert(src_height == ((dst_height + 1) / 2)); + +#ifdef HAS_SCALEROWUP2BILINEAR_16_SSE2 + if (TestCpuFlag(kCpuHasSSSE3)) { + Scale2RowUp = ScaleRowUp2_Bilinear_16_Any_SSSE3; + } +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_16_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + Scale2RowUp = ScaleRowUp2_Bilinear_16_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_16_NEON + if (TestCpuFlag(kCpuHasNEON)) { + Scale2RowUp = ScaleRowUp2_Bilinear_16_Any_NEON; + } +#endif + + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + dst_ptr += dst_stride; + for (x = 0; x < src_height - 1; ++x) { + Scale2RowUp(src_ptr, src_stride, dst_ptr, dst_stride, dst_width); + src_ptr += src_stride; + dst_ptr += 2 * dst_stride; + } + if (!(dst_height & 1)) { + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + } +} + void ScalePlaneBilinearUp_16(int src_width, int src_height, int dst_width, @@ -1627,6 +1948,17 @@ void ScalePlane(const uint8_t* src, dst_stride, src, dst); return; } + if ((dst_width + 1) / 2 == src_width && filtering == kFilterLinear) { + ScalePlaneUp2_Linear(src_width, src_height, dst_width, dst_height, + src_stride, dst_stride, src, dst); + return; + } + if ((dst_height + 1) / 2 == src_height && (dst_width + 1) / 2 == src_width && + (filtering == kFilterBilinear || filtering == kFilterBox)) { + ScalePlaneUp2_Bilinear(src_width, src_height, dst_width, dst_height, + src_stride, dst_stride, src, dst); + return; + } if (filtering && dst_height > src_height) { ScalePlaneBilinearUp(src_width, src_height, dst_width, dst_height, src_stride, dst_stride, src, dst, filtering); @@ -1710,6 +2042,17 @@ void ScalePlane_16(const uint16_t* src, dst_stride, src, dst); return; } + if ((dst_width + 1) / 2 == src_width && filtering == kFilterLinear) { + ScalePlaneUp2_16_Linear(src_width, src_height, dst_width, dst_height, + src_stride, dst_stride, src, dst); + return; + } + if ((dst_height + 1) / 2 == src_height && (dst_width + 1) / 2 == src_width && + (filtering == kFilterBilinear || filtering == kFilterBox)) { + ScalePlaneUp2_16_Bilinear(src_width, src_height, dst_width, dst_height, + src_stride, dst_stride, src, dst); + return; + } if (filtering && dst_height > src_height) { ScalePlaneBilinearUp_16(src_width, src_height, dst_width, dst_height, src_stride, dst_stride, src, dst, filtering); @@ -1724,6 +2067,43 @@ void ScalePlane_16(const uint16_t* src, dst_stride, src, dst); } +LIBYUV_API +void ScalePlane_12(const uint16_t* src, + int src_stride, + int src_width, + int src_height, + uint16_t* dst, + int dst_stride, + int dst_width, + int dst_height, + enum FilterMode filtering) { + // Simplify filtering when possible. + filtering = ScaleFilterReduce(src_width, src_height, dst_width, dst_height, + filtering); + + // Negative height means invert the image. + if (src_height < 0) { + src_height = -src_height; + src = src + (src_height - 1) * src_stride; + src_stride = -src_stride; + } + + if ((dst_width + 1) / 2 == src_width && filtering == kFilterLinear) { + ScalePlaneUp2_12_Linear(src_width, src_height, dst_width, dst_height, + src_stride, dst_stride, src, dst); + return; + } + if ((dst_height + 1) / 2 == src_height && (dst_width + 1) / 2 == src_width && + (filtering == kFilterBilinear || filtering == kFilterBox)) { + ScalePlaneUp2_12_Bilinear(src_width, src_height, dst_width, dst_height, + src_stride, dst_stride, src, dst); + return; + } + + ScalePlane_16(src, src_stride, src_width, src_height, dst, dst_stride, + dst_width, dst_height, filtering); +} + // Scale an I420 image. // This function in turn calls a scaling function for each plane. @@ -1749,7 +2129,7 @@ int I420Scale(const uint8_t* src_y, int src_halfheight = SUBSAMPLE(src_height, 1, 1); int dst_halfwidth = SUBSAMPLE(dst_width, 1, 1); int dst_halfheight = SUBSAMPLE(dst_height, 1, 1); - if (!src_y || !src_u || !src_v || src_width == 0 || src_height == 0 || + if (!src_y || !src_u || !src_v || src_width <= 0 || src_height == 0 || src_width > 32768 || src_height > 32768 || !dst_y || !dst_u || !dst_v || dst_width <= 0 || dst_height <= 0) { return -1; @@ -1786,7 +2166,7 @@ int I420Scale_16(const uint16_t* src_y, int src_halfheight = SUBSAMPLE(src_height, 1, 1); int dst_halfwidth = SUBSAMPLE(dst_width, 1, 1); int dst_halfheight = SUBSAMPLE(dst_height, 1, 1); - if (!src_y || !src_u || !src_v || src_width == 0 || src_height == 0 || + if (!src_y || !src_u || !src_v || src_width <= 0 || src_height == 0 || src_width > 32768 || src_height > 32768 || !dst_y || !dst_u || !dst_v || dst_width <= 0 || dst_height <= 0) { return -1; @@ -1801,6 +2181,43 @@ int I420Scale_16(const uint16_t* src_y, return 0; } +LIBYUV_API +int I420Scale_12(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering) { + int src_halfwidth = SUBSAMPLE(src_width, 1, 1); + int src_halfheight = SUBSAMPLE(src_height, 1, 1); + int dst_halfwidth = SUBSAMPLE(dst_width, 1, 1); + int dst_halfheight = SUBSAMPLE(dst_height, 1, 1); + if (!src_y || !src_u || !src_v || src_width <= 0 || src_height == 0 || + src_width > 32768 || src_height > 32768 || !dst_y || !dst_u || !dst_v || + dst_width <= 0 || dst_height <= 0) { + return -1; + } + + ScalePlane_12(src_y, src_stride_y, src_width, src_height, dst_y, dst_stride_y, + dst_width, dst_height, filtering); + ScalePlane_12(src_u, src_stride_u, src_halfwidth, src_halfheight, dst_u, + dst_stride_u, dst_halfwidth, dst_halfheight, filtering); + ScalePlane_12(src_v, src_stride_v, src_halfwidth, src_halfheight, dst_v, + dst_stride_v, dst_halfwidth, dst_halfheight, filtering); + return 0; +} + // Scale an I444 image. // This function in turn calls a scaling function for each plane. @@ -1822,7 +2239,7 @@ int I444Scale(const uint8_t* src_y, int dst_width, int dst_height, enum FilterMode filtering) { - if (!src_y || !src_u || !src_v || src_width == 0 || src_height == 0 || + if (!src_y || !src_u || !src_v || src_width <= 0 || src_height == 0 || src_width > 32768 || src_height > 32768 || !dst_y || !dst_u || !dst_v || dst_width <= 0 || dst_height <= 0) { return -1; @@ -1855,7 +2272,7 @@ int I444Scale_16(const uint16_t* src_y, int dst_width, int dst_height, enum FilterMode filtering) { - if (!src_y || !src_u || !src_v || src_width == 0 || src_height == 0 || + if (!src_y || !src_u || !src_v || src_width <= 0 || src_height == 0 || src_width > 32768 || src_height > 32768 || !dst_y || !dst_u || !dst_v || dst_width <= 0 || dst_height <= 0) { return -1; @@ -1870,6 +2287,39 @@ int I444Scale_16(const uint16_t* src_y, return 0; } +LIBYUV_API +int I444Scale_12(const uint16_t* src_y, + int src_stride_y, + const uint16_t* src_u, + int src_stride_u, + const uint16_t* src_v, + int src_stride_v, + int src_width, + int src_height, + uint16_t* dst_y, + int dst_stride_y, + uint16_t* dst_u, + int dst_stride_u, + uint16_t* dst_v, + int dst_stride_v, + int dst_width, + int dst_height, + enum FilterMode filtering) { + if (!src_y || !src_u || !src_v || src_width <= 0 || src_height == 0 || + src_width > 32768 || src_height > 32768 || !dst_y || !dst_u || !dst_v || + dst_width <= 0 || dst_height <= 0) { + return -1; + } + + ScalePlane_12(src_y, src_stride_y, src_width, src_height, dst_y, dst_stride_y, + dst_width, dst_height, filtering); + ScalePlane_12(src_u, src_stride_u, src_width, src_height, dst_u, dst_stride_u, + dst_width, dst_height, filtering); + ScalePlane_12(src_v, src_stride_v, src_width, src_height, dst_v, dst_stride_v, + dst_width, dst_height, filtering); + return 0; +} + // Scale an NV12 image. // This function in turn calls a scaling function for each plane. @@ -1891,7 +2341,7 @@ int NV12Scale(const uint8_t* src_y, int src_halfheight = SUBSAMPLE(src_height, 1, 1); int dst_halfwidth = SUBSAMPLE(dst_width, 1, 1); int dst_halfheight = SUBSAMPLE(dst_height, 1, 1); - if (!src_y || !src_uv || src_width == 0 || src_height == 0 || + if (!src_y || !src_uv || src_width <= 0 || src_height == 0 || src_width > 32768 || src_height > 32768 || !dst_y || !dst_uv || dst_width <= 0 || dst_height <= 0) { return -1; diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_any.cc b/third-party/libyuv/third_party/libyuv/source/scale_any.cc similarity index 55% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_any.cc rename to third-party/libyuv/third_party/libyuv/source/scale_any.cc index c93d70c5fc..965749c415 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_any.cc +++ b/third-party/libyuv/third_party/libyuv/source/scale_any.cc @@ -609,6 +609,417 @@ CANY(ScaleARGBFilterCols_Any_MSA, #endif #undef CANY +// Scale up horizontally 2 times using linear filter. +#define SUH2LANY(NAME, SIMD, C, MASK, PTYPE) \ + void NAME(const PTYPE* src_ptr, PTYPE* dst_ptr, int dst_width) { \ + int work_width = (dst_width - 1) & ~1; \ + int r = work_width & MASK; \ + int n = work_width & ~MASK; \ + dst_ptr[0] = src_ptr[0]; \ + if (work_width > 0) { \ + if (n != 0) { \ + SIMD(src_ptr, dst_ptr + 1, n); \ + } \ + C(src_ptr + (n / 2), dst_ptr + n + 1, r); \ + } \ + dst_ptr[dst_width - 1] = src_ptr[(dst_width / 2) - 1]; \ + } + +// Even the C versions need to be wrapped, because boundary pixels have to +// be handled differently + +SUH2LANY(ScaleRowUp2_Linear_Any_C, + ScaleRowUp2_Linear_C, + ScaleRowUp2_Linear_C, + 0, + uint8_t) + +SUH2LANY(ScaleRowUp2_Linear_16_Any_C, + ScaleRowUp2_Linear_16_C, + ScaleRowUp2_Linear_16_C, + 0, + uint16_t) + +#ifdef HAS_SCALEROWUP2LINEAR_SSE2 +SUH2LANY(ScaleRowUp2_Linear_Any_SSE2, + ScaleRowUp2_Linear_SSE2, + ScaleRowUp2_Linear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_SSSE3 +SUH2LANY(ScaleRowUp2_Linear_Any_SSSE3, + ScaleRowUp2_Linear_SSSE3, + ScaleRowUp2_Linear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_12_SSSE3 +SUH2LANY(ScaleRowUp2_Linear_12_Any_SSSE3, + ScaleRowUp2_Linear_12_SSSE3, + ScaleRowUp2_Linear_16_C, + 15, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_16_SSE2 +SUH2LANY(ScaleRowUp2_Linear_16_Any_SSE2, + ScaleRowUp2_Linear_16_SSE2, + ScaleRowUp2_Linear_16_C, + 7, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_AVX2 +SUH2LANY(ScaleRowUp2_Linear_Any_AVX2, + ScaleRowUp2_Linear_AVX2, + ScaleRowUp2_Linear_C, + 31, + uint8_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_12_AVX2 +SUH2LANY(ScaleRowUp2_Linear_12_Any_AVX2, + ScaleRowUp2_Linear_12_AVX2, + ScaleRowUp2_Linear_16_C, + 31, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_16_AVX2 +SUH2LANY(ScaleRowUp2_Linear_16_Any_AVX2, + ScaleRowUp2_Linear_16_AVX2, + ScaleRowUp2_Linear_16_C, + 15, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_NEON +SUH2LANY(ScaleRowUp2_Linear_Any_NEON, + ScaleRowUp2_Linear_NEON, + ScaleRowUp2_Linear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_12_NEON +SUH2LANY(ScaleRowUp2_Linear_12_Any_NEON, + ScaleRowUp2_Linear_12_NEON, + ScaleRowUp2_Linear_16_C, + 15, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_16_NEON +SUH2LANY(ScaleRowUp2_Linear_16_Any_NEON, + ScaleRowUp2_Linear_16_NEON, + ScaleRowUp2_Linear_16_C, + 15, + uint16_t) +#endif + +#undef SUH2LANY + +// Scale up 2 times using bilinear filter. +// This function produces 2 rows at a time. +#define SU2BLANY(NAME, SIMD, C, MASK, PTYPE) \ + void NAME(const PTYPE* src_ptr, ptrdiff_t src_stride, PTYPE* dst_ptr, \ + ptrdiff_t dst_stride, int dst_width) { \ + int work_width = (dst_width - 1) & ~1; \ + int r = work_width & MASK; \ + int n = work_width & ~MASK; \ + const PTYPE* sa = src_ptr; \ + const PTYPE* sb = src_ptr + src_stride; \ + PTYPE* da = dst_ptr; \ + PTYPE* db = dst_ptr + dst_stride; \ + da[0] = (3 * sa[0] + sb[0] + 2) >> 2; \ + db[0] = (sa[0] + 3 * sb[0] + 2) >> 2; \ + if (work_width > 0) { \ + if (n != 0) { \ + SIMD(sa, sb - sa, da + 1, db - da, n); \ + } \ + C(sa + (n / 2), sb - sa, da + n + 1, db - da, r); \ + } \ + da[dst_width - 1] = \ + (3 * sa[(dst_width - 1) / 2] + sb[(dst_width - 1) / 2] + 2) >> 2; \ + db[dst_width - 1] = \ + (sa[(dst_width - 1) / 2] + 3 * sb[(dst_width - 1) / 2] + 2) >> 2; \ + } + +SU2BLANY(ScaleRowUp2_Bilinear_Any_C, + ScaleRowUp2_Bilinear_C, + ScaleRowUp2_Bilinear_C, + 0, + uint8_t) + +SU2BLANY(ScaleRowUp2_Bilinear_16_Any_C, + ScaleRowUp2_Bilinear_16_C, + ScaleRowUp2_Bilinear_16_C, + 0, + uint16_t) + +#ifdef HAS_SCALEROWUP2BILINEAR_SSE2 +SU2BLANY(ScaleRowUp2_Bilinear_Any_SSE2, + ScaleRowUp2_Bilinear_SSE2, + ScaleRowUp2_Bilinear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_12_SSSE3 +SU2BLANY(ScaleRowUp2_Bilinear_12_Any_SSSE3, + ScaleRowUp2_Bilinear_12_SSSE3, + ScaleRowUp2_Bilinear_16_C, + 15, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_16_SSE2 +SU2BLANY(ScaleRowUp2_Bilinear_16_Any_SSSE3, + ScaleRowUp2_Bilinear_16_SSE2, + ScaleRowUp2_Bilinear_16_C, + 7, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_SSSE3 +SU2BLANY(ScaleRowUp2_Bilinear_Any_SSSE3, + ScaleRowUp2_Bilinear_SSSE3, + ScaleRowUp2_Bilinear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_AVX2 +SU2BLANY(ScaleRowUp2_Bilinear_Any_AVX2, + ScaleRowUp2_Bilinear_AVX2, + ScaleRowUp2_Bilinear_C, + 31, + uint8_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_12_AVX2 +SU2BLANY(ScaleRowUp2_Bilinear_12_Any_AVX2, + ScaleRowUp2_Bilinear_12_AVX2, + ScaleRowUp2_Bilinear_16_C, + 15, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_16_AVX2 +SU2BLANY(ScaleRowUp2_Bilinear_16_Any_AVX2, + ScaleRowUp2_Bilinear_16_AVX2, + ScaleRowUp2_Bilinear_16_C, + 15, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_NEON +SU2BLANY(ScaleRowUp2_Bilinear_Any_NEON, + ScaleRowUp2_Bilinear_NEON, + ScaleRowUp2_Bilinear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_12_NEON +SU2BLANY(ScaleRowUp2_Bilinear_12_Any_NEON, + ScaleRowUp2_Bilinear_12_NEON, + ScaleRowUp2_Bilinear_16_C, + 15, + uint16_t) +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_16_NEON +SU2BLANY(ScaleRowUp2_Bilinear_16_Any_NEON, + ScaleRowUp2_Bilinear_16_NEON, + ScaleRowUp2_Bilinear_16_C, + 7, + uint16_t) +#endif + +#undef SU2BLANY + +// Scale bi-planar plane up horizontally 2 times using linear filter. +#define SBUH2LANY(NAME, SIMD, C, MASK, PTYPE) \ + void NAME(const PTYPE* src_ptr, PTYPE* dst_ptr, int dst_width) { \ + int work_width = (dst_width - 1) & ~1; \ + int r = work_width & MASK; \ + int n = work_width & ~MASK; \ + dst_ptr[0] = src_ptr[0]; \ + dst_ptr[1] = src_ptr[1]; \ + if (work_width > 0) { \ + if (n != 0) { \ + SIMD(src_ptr, dst_ptr + 2, n); \ + } \ + C(src_ptr + n, dst_ptr + 2 * n + 2, r); \ + } \ + dst_ptr[2 * dst_width - 2] = src_ptr[((dst_width + 1) & ~1) - 2]; \ + dst_ptr[2 * dst_width - 1] = src_ptr[((dst_width + 1) & ~1) - 1]; \ + } + +SBUH2LANY(ScaleUVRowUp2_Linear_Any_C, + ScaleUVRowUp2_Linear_C, + ScaleUVRowUp2_Linear_C, + 0, + uint8_t) + +SBUH2LANY(ScaleUVRowUp2_Linear_16_Any_C, + ScaleUVRowUp2_Linear_16_C, + ScaleUVRowUp2_Linear_16_C, + 0, + uint16_t) + +#ifdef HAS_SCALEUVROWUP2LINEAR_SSSE3 +SBUH2LANY(ScaleUVRowUp2_Linear_Any_SSSE3, + ScaleUVRowUp2_Linear_SSSE3, + ScaleUVRowUp2_Linear_C, + 7, + uint8_t) +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_AVX2 +SBUH2LANY(ScaleUVRowUp2_Linear_Any_AVX2, + ScaleUVRowUp2_Linear_AVX2, + ScaleUVRowUp2_Linear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_16_SSE2 +SBUH2LANY(ScaleUVRowUp2_Linear_16_Any_SSE2, + ScaleUVRowUp2_Linear_16_SSE2, + ScaleUVRowUp2_Linear_16_C, + 3, + uint16_t) +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_16_AVX2 +SBUH2LANY(ScaleUVRowUp2_Linear_16_Any_AVX2, + ScaleUVRowUp2_Linear_16_AVX2, + ScaleUVRowUp2_Linear_16_C, + 7, + uint16_t) +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_NEON +SBUH2LANY(ScaleUVRowUp2_Linear_Any_NEON, + ScaleUVRowUp2_Linear_NEON, + ScaleUVRowUp2_Linear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_16_NEON +SBUH2LANY(ScaleUVRowUp2_Linear_16_Any_NEON, + ScaleUVRowUp2_Linear_16_NEON, + ScaleUVRowUp2_Linear_16_C, + 15, + uint16_t) +#endif + +#undef SBUH2LANY + +// Scale bi-planar plane up 2 times using bilinear filter. +// This function produces 2 rows at a time. +#define SBU2BLANY(NAME, SIMD, C, MASK, PTYPE) \ + void NAME(const PTYPE* src_ptr, ptrdiff_t src_stride, PTYPE* dst_ptr, \ + ptrdiff_t dst_stride, int dst_width) { \ + int work_width = (dst_width - 1) & ~1; \ + int r = work_width & MASK; \ + int n = work_width & ~MASK; \ + const PTYPE* sa = src_ptr; \ + const PTYPE* sb = src_ptr + src_stride; \ + PTYPE* da = dst_ptr; \ + PTYPE* db = dst_ptr + dst_stride; \ + da[0] = (3 * sa[0] + sb[0] + 2) >> 2; \ + db[0] = (sa[0] + 3 * sb[0] + 2) >> 2; \ + da[1] = (3 * sa[1] + sb[1] + 2) >> 2; \ + db[1] = (sa[1] + 3 * sb[1] + 2) >> 2; \ + if (work_width > 0) { \ + if (n != 0) { \ + SIMD(sa, sb - sa, da + 2, db - da, n); \ + } \ + C(sa + n, sb - sa, da + 2 * n + 2, db - da, r); \ + } \ + da[2 * dst_width - 2] = (3 * sa[((dst_width + 1) & ~1) - 2] + \ + sb[((dst_width + 1) & ~1) - 2] + 2) >> \ + 2; \ + db[2 * dst_width - 2] = (sa[((dst_width + 1) & ~1) - 2] + \ + 3 * sb[((dst_width + 1) & ~1) - 2] + 2) >> \ + 2; \ + da[2 * dst_width - 1] = (3 * sa[((dst_width + 1) & ~1) - 1] + \ + sb[((dst_width + 1) & ~1) - 1] + 2) >> \ + 2; \ + db[2 * dst_width - 1] = (sa[((dst_width + 1) & ~1) - 1] + \ + 3 * sb[((dst_width + 1) & ~1) - 1] + 2) >> \ + 2; \ + } + +SBU2BLANY(ScaleUVRowUp2_Bilinear_Any_C, + ScaleUVRowUp2_Bilinear_C, + ScaleUVRowUp2_Bilinear_C, + 0, + uint8_t) + +SBU2BLANY(ScaleUVRowUp2_Bilinear_16_Any_C, + ScaleUVRowUp2_Bilinear_16_C, + ScaleUVRowUp2_Bilinear_16_C, + 0, + uint16_t) + +#ifdef HAS_SCALEUVROWUP2BILINEAR_SSSE3 +SBU2BLANY(ScaleUVRowUp2_Bilinear_Any_SSSE3, + ScaleUVRowUp2_Bilinear_SSSE3, + ScaleUVRowUp2_Bilinear_C, + 7, + uint8_t) +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_AVX2 +SBU2BLANY(ScaleUVRowUp2_Bilinear_Any_AVX2, + ScaleUVRowUp2_Bilinear_AVX2, + ScaleUVRowUp2_Bilinear_C, + 15, + uint8_t) +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_16_SSE2 +SBU2BLANY(ScaleUVRowUp2_Bilinear_16_Any_SSE2, + ScaleUVRowUp2_Bilinear_16_SSE2, + ScaleUVRowUp2_Bilinear_16_C, + 7, + uint16_t) +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_16_AVX2 +SBU2BLANY(ScaleUVRowUp2_Bilinear_16_Any_AVX2, + ScaleUVRowUp2_Bilinear_16_AVX2, + ScaleUVRowUp2_Bilinear_16_C, + 7, + uint16_t) +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_NEON +SBU2BLANY(ScaleUVRowUp2_Bilinear_Any_NEON, + ScaleUVRowUp2_Bilinear_NEON, + ScaleUVRowUp2_Bilinear_C, + 7, + uint8_t) +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_16_NEON +SBU2BLANY(ScaleUVRowUp2_Bilinear_16_Any_NEON, + ScaleUVRowUp2_Bilinear_16_NEON, + ScaleUVRowUp2_Bilinear_16_C, + 7, + uint16_t) +#endif + +#undef SBU2BLANY + #ifdef __cplusplus } // extern "C" } // namespace libyuv diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_argb.cc b/third-party/libyuv/third_party/libyuv/source/scale_argb.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_argb.cc rename to third-party/libyuv/third_party/libyuv/source/scale_argb.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_common.cc b/third-party/libyuv/third_party/libyuv/source/scale_common.cc similarity index 85% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_common.cc rename to third-party/libyuv/third_party/libyuv/source/scale_common.cc index 81959925c8..da96d42865 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_common.cc +++ b/third-party/libyuv/third_party/libyuv/source/scale_common.cc @@ -400,6 +400,95 @@ void ScaleRowDown34_1_Box_16_C(const uint16_t* src_ptr, } } +// Sample position: (O is src sample position, X is dst sample position) +// +// v dst_ptr at here v stop at here +// X O X X O X X O X X O X X O X +// ^ src_ptr at here +void ScaleRowUp2_Linear_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + int src_width = dst_width >> 1; + int x; + assert((dst_width % 2 == 0) && (dst_width >= 0)); + for (x = 0; x < src_width; ++x) { + dst_ptr[2 * x + 0] = (src_ptr[x + 0] * 3 + src_ptr[x + 1] * 1 + 2) >> 2; + dst_ptr[2 * x + 1] = (src_ptr[x + 0] * 1 + src_ptr[x + 1] * 3 + 2) >> 2; + } +} + +// Sample position: (O is src sample position, X is dst sample position) +// +// src_ptr at here +// X v X X X X X X X X X +// O O O O O +// X X X X X X X X X X +// ^ dst_ptr at here ^ stop at here +// X X X X X X X X X X +// O O O O O +// X X X X X X X X X X +void ScaleRowUp2_Bilinear_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint8_t* s = src_ptr; + const uint8_t* t = src_ptr + src_stride; + uint8_t* d = dst_ptr; + uint8_t* e = dst_ptr + dst_stride; + int src_width = dst_width >> 1; + int x; + assert((dst_width % 2 == 0) && (dst_width >= 0)); + for (x = 0; x < src_width; ++x) { + d[2 * x + 0] = + (s[x + 0] * 9 + s[x + 1] * 3 + t[x + 0] * 3 + t[x + 1] * 1 + 8) >> 4; + d[2 * x + 1] = + (s[x + 0] * 3 + s[x + 1] * 9 + t[x + 0] * 1 + t[x + 1] * 3 + 8) >> 4; + e[2 * x + 0] = + (s[x + 0] * 3 + s[x + 1] * 1 + t[x + 0] * 9 + t[x + 1] * 3 + 8) >> 4; + e[2 * x + 1] = + (s[x + 0] * 1 + s[x + 1] * 3 + t[x + 0] * 3 + t[x + 1] * 9 + 8) >> 4; + } +} + +// Only suitable for at most 14 bit range. +void ScaleRowUp2_Linear_16_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + int src_width = dst_width >> 1; + int x; + assert((dst_width % 2 == 0) && (dst_width >= 0)); + for (x = 0; x < src_width; ++x) { + dst_ptr[2 * x + 0] = (src_ptr[x + 0] * 3 + src_ptr[x + 1] * 1 + 2) >> 2; + dst_ptr[2 * x + 1] = (src_ptr[x + 0] * 1 + src_ptr[x + 1] * 3 + 2) >> 2; + } +} + +// Only suitable for at most 12bit range. +void ScaleRowUp2_Bilinear_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint16_t* s = src_ptr; + const uint16_t* t = src_ptr + src_stride; + uint16_t* d = dst_ptr; + uint16_t* e = dst_ptr + dst_stride; + int src_width = dst_width >> 1; + int x; + assert((dst_width % 2 == 0) && (dst_width >= 0)); + for (x = 0; x < src_width; ++x) { + d[2 * x + 0] = + (s[x + 0] * 9 + s[x + 1] * 3 + t[x + 0] * 3 + t[x + 1] * 1 + 8) >> 4; + d[2 * x + 1] = + (s[x + 0] * 3 + s[x + 1] * 9 + t[x + 0] * 1 + t[x + 1] * 3 + 8) >> 4; + e[2 * x + 0] = + (s[x + 0] * 3 + s[x + 1] * 1 + t[x + 0] * 9 + t[x + 1] * 3 + 8) >> 4; + e[2 * x + 1] = + (s[x + 0] * 1 + s[x + 1] * 3 + t[x + 0] * 3 + t[x + 1] * 9 + 8) >> 4; + } +} + // Scales a single row of pixels using point sampling. void ScaleCols_C(uint8_t* dst_ptr, const uint8_t* src_ptr, @@ -1111,6 +1200,122 @@ void ScaleUVRowDownEvenBox_C(const uint8_t* src_uv, } } +void ScaleUVRowUp2_Linear_C(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + int src_width = dst_width >> 1; + int x; + assert((dst_width % 2 == 0) && (dst_width >= 0)); + for (x = 0; x < src_width; ++x) { + dst_ptr[4 * x + 0] = + (src_ptr[2 * x + 0] * 3 + src_ptr[2 * x + 2] * 1 + 2) >> 2; + dst_ptr[4 * x + 1] = + (src_ptr[2 * x + 1] * 3 + src_ptr[2 * x + 3] * 1 + 2) >> 2; + dst_ptr[4 * x + 2] = + (src_ptr[2 * x + 0] * 1 + src_ptr[2 * x + 2] * 3 + 2) >> 2; + dst_ptr[4 * x + 3] = + (src_ptr[2 * x + 1] * 1 + src_ptr[2 * x + 3] * 3 + 2) >> 2; + } +} + +void ScaleUVRowUp2_Bilinear_C(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint8_t* s = src_ptr; + const uint8_t* t = src_ptr + src_stride; + uint8_t* d = dst_ptr; + uint8_t* e = dst_ptr + dst_stride; + int src_width = dst_width >> 1; + int x; + assert((dst_width % 2 == 0) && (dst_width >= 0)); + for (x = 0; x < src_width; ++x) { + d[4 * x + 0] = (s[2 * x + 0] * 9 + s[2 * x + 2] * 3 + t[2 * x + 0] * 3 + + t[2 * x + 2] * 1 + 8) >> + 4; + d[4 * x + 1] = (s[2 * x + 1] * 9 + s[2 * x + 3] * 3 + t[2 * x + 1] * 3 + + t[2 * x + 3] * 1 + 8) >> + 4; + d[4 * x + 2] = (s[2 * x + 0] * 3 + s[2 * x + 2] * 9 + t[2 * x + 0] * 1 + + t[2 * x + 2] * 3 + 8) >> + 4; + d[4 * x + 3] = (s[2 * x + 1] * 3 + s[2 * x + 3] * 9 + t[2 * x + 1] * 1 + + t[2 * x + 3] * 3 + 8) >> + 4; + e[4 * x + 0] = (s[2 * x + 0] * 3 + s[2 * x + 2] * 1 + t[2 * x + 0] * 9 + + t[2 * x + 2] * 3 + 8) >> + 4; + e[4 * x + 1] = (s[2 * x + 1] * 3 + s[2 * x + 3] * 1 + t[2 * x + 1] * 9 + + t[2 * x + 3] * 3 + 8) >> + 4; + e[4 * x + 2] = (s[2 * x + 0] * 1 + s[2 * x + 2] * 3 + t[2 * x + 0] * 3 + + t[2 * x + 2] * 9 + 8) >> + 4; + e[4 * x + 3] = (s[2 * x + 1] * 1 + s[2 * x + 3] * 3 + t[2 * x + 1] * 3 + + t[2 * x + 3] * 9 + 8) >> + 4; + } +} + +void ScaleUVRowUp2_Linear_16_C(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + int src_width = dst_width >> 1; + int x; + assert((dst_width % 2 == 0) && (dst_width >= 0)); + for (x = 0; x < src_width; ++x) { + dst_ptr[4 * x + 0] = + (src_ptr[2 * x + 0] * 3 + src_ptr[2 * x + 2] * 1 + 2) >> 2; + dst_ptr[4 * x + 1] = + (src_ptr[2 * x + 1] * 3 + src_ptr[2 * x + 3] * 1 + 2) >> 2; + dst_ptr[4 * x + 2] = + (src_ptr[2 * x + 0] * 1 + src_ptr[2 * x + 2] * 3 + 2) >> 2; + dst_ptr[4 * x + 3] = + (src_ptr[2 * x + 1] * 1 + src_ptr[2 * x + 3] * 3 + 2) >> 2; + } +} + +void ScaleUVRowUp2_Bilinear_16_C(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint16_t* s = src_ptr; + const uint16_t* t = src_ptr + src_stride; + uint16_t* d = dst_ptr; + uint16_t* e = dst_ptr + dst_stride; + int src_width = dst_width >> 1; + int x; + assert((dst_width % 2 == 0) && (dst_width >= 0)); + for (x = 0; x < src_width; ++x) { + d[4 * x + 0] = (s[2 * x + 0] * 9 + s[2 * x + 2] * 3 + t[2 * x + 0] * 3 + + t[2 * x + 2] * 1 + 8) >> + 4; + d[4 * x + 1] = (s[2 * x + 1] * 9 + s[2 * x + 3] * 3 + t[2 * x + 1] * 3 + + t[2 * x + 3] * 1 + 8) >> + 4; + d[4 * x + 2] = (s[2 * x + 0] * 3 + s[2 * x + 2] * 9 + t[2 * x + 0] * 1 + + t[2 * x + 2] * 3 + 8) >> + 4; + d[4 * x + 3] = (s[2 * x + 1] * 3 + s[2 * x + 3] * 9 + t[2 * x + 1] * 1 + + t[2 * x + 3] * 3 + 8) >> + 4; + e[4 * x + 0] = (s[2 * x + 0] * 3 + s[2 * x + 2] * 1 + t[2 * x + 0] * 9 + + t[2 * x + 2] * 3 + 8) >> + 4; + e[4 * x + 1] = (s[2 * x + 1] * 3 + s[2 * x + 3] * 1 + t[2 * x + 1] * 9 + + t[2 * x + 3] * 3 + 8) >> + 4; + e[4 * x + 2] = (s[2 * x + 0] * 1 + s[2 * x + 2] * 3 + t[2 * x + 0] * 3 + + t[2 * x + 2] * 9 + 8) >> + 4; + e[4 * x + 3] = (s[2 * x + 1] * 1 + s[2 * x + 3] * 3 + t[2 * x + 1] * 3 + + t[2 * x + 3] * 9 + 8) >> + 4; + } +} + // Scales a single row of pixels using point sampling. void ScaleUVCols_C(uint8_t* dst_uv, const uint8_t* src_uv, diff --git a/third-party/libyuv/third_party/libyuv/source/scale_gcc.cc b/third-party/libyuv/third_party/libyuv/source/scale_gcc.cc new file mode 100644 index 0000000000..279c5e4020 --- /dev/null +++ b/third-party/libyuv/third_party/libyuv/source/scale_gcc.cc @@ -0,0 +1,2947 @@ +/* + * Copyright 2013 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include "libyuv/row.h" +#include "libyuv/scale_row.h" + +#ifdef __cplusplus +namespace libyuv { +extern "C" { +#endif + +// This module is for GCC x86 and x64. +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) + +// Offsets for source bytes 0 to 9 +static const uvec8 kShuf0 = {0, 1, 3, 4, 5, 7, 8, 9, + 128, 128, 128, 128, 128, 128, 128, 128}; + +// Offsets for source bytes 11 to 20 with 8 subtracted = 3 to 12. +static const uvec8 kShuf1 = {3, 4, 5, 7, 8, 9, 11, 12, + 128, 128, 128, 128, 128, 128, 128, 128}; + +// Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31. +static const uvec8 kShuf2 = {5, 7, 8, 9, 11, 12, 13, 15, + 128, 128, 128, 128, 128, 128, 128, 128}; + +// Offsets for source bytes 0 to 10 +static const uvec8 kShuf01 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10}; + +// Offsets for source bytes 10 to 21 with 8 subtracted = 3 to 13. +static const uvec8 kShuf11 = {2, 3, 4, 5, 5, 6, 6, 7, + 8, 9, 9, 10, 10, 11, 12, 13}; + +// Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31. +static const uvec8 kShuf21 = {5, 6, 6, 7, 8, 9, 9, 10, + 10, 11, 12, 13, 13, 14, 14, 15}; + +// Coefficients for source bytes 0 to 10 +static const uvec8 kMadd01 = {3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2}; + +// Coefficients for source bytes 10 to 21 +static const uvec8 kMadd11 = {1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1}; + +// Coefficients for source bytes 21 to 31 +static const uvec8 kMadd21 = {2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3}; + +// Coefficients for source bytes 21 to 31 +static const vec16 kRound34 = {2, 2, 2, 2, 2, 2, 2, 2}; + +static const uvec8 kShuf38a = {0, 3, 6, 8, 11, 14, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128}; + +static const uvec8 kShuf38b = {128, 128, 128, 128, 128, 128, 0, 3, + 6, 8, 11, 14, 128, 128, 128, 128}; + +// Arrange words 0,3,6 into 0,1,2 +static const uvec8 kShufAc = {0, 1, 6, 7, 12, 13, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128}; + +// Arrange words 0,3,6 into 3,4,5 +static const uvec8 kShufAc3 = {128, 128, 128, 128, 128, 128, 0, 1, + 6, 7, 12, 13, 128, 128, 128, 128}; + +// Scaling values for boxes of 3x3 and 2x3 +static const uvec16 kScaleAc33 = {65536 / 9, 65536 / 9, 65536 / 6, 65536 / 9, + 65536 / 9, 65536 / 6, 0, 0}; + +// Arrange first value for pixels 0,1,2,3,4,5 +static const uvec8 kShufAb0 = {0, 128, 3, 128, 6, 128, 8, 128, + 11, 128, 14, 128, 128, 128, 128, 128}; + +// Arrange second value for pixels 0,1,2,3,4,5 +static const uvec8 kShufAb1 = {1, 128, 4, 128, 7, 128, 9, 128, + 12, 128, 15, 128, 128, 128, 128, 128}; + +// Arrange third value for pixels 0,1,2,3,4,5 +static const uvec8 kShufAb2 = {2, 128, 5, 128, 128, 128, 10, 128, + 13, 128, 128, 128, 128, 128, 128, 128}; + +// Scaling values for boxes of 3x2 and 2x2 +static const uvec16 kScaleAb2 = {65536 / 3, 65536 / 3, 65536 / 2, 65536 / 3, + 65536 / 3, 65536 / 2, 0, 0}; + +// GCC versions of row functions are verbatim conversions from Visual C. +// Generated using gcc disassembly on Visual C object file: +// objdump -D yuvscaler.obj >yuvscaler.txt + +void ScaleRowDown2_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + (void)src_stride; + asm volatile( + // 16 pixel loop. + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "lea 0x20(%0),%0 \n" + "psrlw $0x8,%%xmm0 \n" + "psrlw $0x8,%%xmm1 \n" + "packuswb %%xmm1,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1"); +} + +void ScaleRowDown2Linear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + (void)src_stride; + asm volatile( + "pcmpeqb %%xmm4,%%xmm4 \n" + "psrlw $0xf,%%xmm4 \n" + "packuswb %%xmm4,%%xmm4 \n" + "pxor %%xmm5,%%xmm5 \n" + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "lea 0x20(%0),%0 \n" + "pmaddubsw %%xmm4,%%xmm0 \n" + "pmaddubsw %%xmm4,%%xmm1 \n" + "pavgw %%xmm5,%%xmm0 \n" + "pavgw %%xmm5,%%xmm1 \n" + "packuswb %%xmm1,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1", "xmm4", "xmm5"); +} + +void ScaleRowDown2Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "pcmpeqb %%xmm4,%%xmm4 \n" + "psrlw $0xf,%%xmm4 \n" + "packuswb %%xmm4,%%xmm4 \n" + "pxor %%xmm5,%%xmm5 \n" + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "movdqu 0x00(%0,%3,1),%%xmm2 \n" + "movdqu 0x10(%0,%3,1),%%xmm3 \n" + "lea 0x20(%0),%0 \n" + "pmaddubsw %%xmm4,%%xmm0 \n" + "pmaddubsw %%xmm4,%%xmm1 \n" + "pmaddubsw %%xmm4,%%xmm2 \n" + "pmaddubsw %%xmm4,%%xmm3 \n" + "paddw %%xmm2,%%xmm0 \n" + "paddw %%xmm3,%%xmm1 \n" + "psrlw $0x1,%%xmm0 \n" + "psrlw $0x1,%%xmm1 \n" + "pavgw %%xmm5,%%xmm0 \n" + "pavgw %%xmm5,%%xmm1 \n" + "packuswb %%xmm1,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); +} + +#ifdef HAS_SCALEROWDOWN2_AVX2 +void ScaleRowDown2_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + (void)src_stride; + asm volatile(LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "lea 0x40(%0),%0 \n" + "vpsrlw $0x8,%%ymm0,%%ymm0 \n" + "vpsrlw $0x8,%%ymm1,%%ymm1 \n" + "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + "lea 0x20(%1),%1 \n" + "sub $0x20,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1"); +} + +void ScaleRowDown2Linear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + (void)src_stride; + asm volatile( + "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrlw $0xf,%%ymm4,%%ymm4 \n" + "vpackuswb %%ymm4,%%ymm4,%%ymm4 \n" + "vpxor %%ymm5,%%ymm5,%%ymm5 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "lea 0x40(%0),%0 \n" + "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" + "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n" + "vpavgw %%ymm5,%%ymm0,%%ymm0 \n" + "vpavgw %%ymm5,%%ymm1,%%ymm1 \n" + "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + "lea 0x20(%1),%1 \n" + "sub $0x20,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1", "xmm4", "xmm5"); +} + +void ScaleRowDown2Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrlw $0xf,%%ymm4,%%ymm4 \n" + "vpackuswb %%ymm4,%%ymm4,%%ymm4 \n" + "vpxor %%ymm5,%%ymm5,%%ymm5 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "vmovdqu 0x00(%0,%3,1),%%ymm2 \n" + "vmovdqu 0x20(%0,%3,1),%%ymm3 \n" + "lea 0x40(%0),%0 \n" + "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" + "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n" + "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" + "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n" + "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" + "vpaddw %%ymm3,%%ymm1,%%ymm1 \n" + "vpsrlw $0x1,%%ymm0,%%ymm0 \n" + "vpsrlw $0x1,%%ymm1,%%ymm1 \n" + "vpavgw %%ymm5,%%ymm0,%%ymm0 \n" + "vpavgw %%ymm5,%%ymm1,%%ymm1 \n" + "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + "lea 0x20(%1),%1 \n" + "sub $0x20,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); +} +#endif // HAS_SCALEROWDOWN2_AVX2 + +void ScaleRowDown4_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + (void)src_stride; + asm volatile( + "pcmpeqb %%xmm5,%%xmm5 \n" + "psrld $0x18,%%xmm5 \n" + "pslld $0x10,%%xmm5 \n" + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "lea 0x20(%0),%0 \n" + "pand %%xmm5,%%xmm0 \n" + "pand %%xmm5,%%xmm1 \n" + "packuswb %%xmm1,%%xmm0 \n" + "psrlw $0x8,%%xmm0 \n" + "packuswb %%xmm0,%%xmm0 \n" + "movq %%xmm0,(%1) \n" + "lea 0x8(%1),%1 \n" + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1", "xmm5"); +} + +void ScaleRowDown4Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + intptr_t stridex3; + asm volatile( + "pcmpeqb %%xmm4,%%xmm4 \n" + "psrlw $0xf,%%xmm4 \n" + "movdqa %%xmm4,%%xmm5 \n" + "packuswb %%xmm4,%%xmm4 \n" + "psllw $0x3,%%xmm5 \n" + "lea 0x00(%4,%4,2),%3 \n" + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "movdqu 0x00(%0,%4,1),%%xmm2 \n" + "movdqu 0x10(%0,%4,1),%%xmm3 \n" + "pmaddubsw %%xmm4,%%xmm0 \n" + "pmaddubsw %%xmm4,%%xmm1 \n" + "pmaddubsw %%xmm4,%%xmm2 \n" + "pmaddubsw %%xmm4,%%xmm3 \n" + "paddw %%xmm2,%%xmm0 \n" + "paddw %%xmm3,%%xmm1 \n" + "movdqu 0x00(%0,%4,2),%%xmm2 \n" + "movdqu 0x10(%0,%4,2),%%xmm3 \n" + "pmaddubsw %%xmm4,%%xmm2 \n" + "pmaddubsw %%xmm4,%%xmm3 \n" + "paddw %%xmm2,%%xmm0 \n" + "paddw %%xmm3,%%xmm1 \n" + "movdqu 0x00(%0,%3,1),%%xmm2 \n" + "movdqu 0x10(%0,%3,1),%%xmm3 \n" + "lea 0x20(%0),%0 \n" + "pmaddubsw %%xmm4,%%xmm2 \n" + "pmaddubsw %%xmm4,%%xmm3 \n" + "paddw %%xmm2,%%xmm0 \n" + "paddw %%xmm3,%%xmm1 \n" + "phaddw %%xmm1,%%xmm0 \n" + "paddw %%xmm5,%%xmm0 \n" + "psrlw $0x4,%%xmm0 \n" + "packuswb %%xmm0,%%xmm0 \n" + "movq %%xmm0,(%1) \n" + "lea 0x8(%1),%1 \n" + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width), // %2 + "=&r"(stridex3) // %3 + : "r"((intptr_t)(src_stride)) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} + +#ifdef HAS_SCALEROWDOWN4_AVX2 +void ScaleRowDown4_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + (void)src_stride; + asm volatile( + "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" + "vpsrld $0x18,%%ymm5,%%ymm5 \n" + "vpslld $0x10,%%ymm5,%%ymm5 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "lea 0x40(%0),%0 \n" + "vpand %%ymm5,%%ymm0,%%ymm0 \n" + "vpand %%ymm5,%%ymm1,%%ymm1 \n" + "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpsrlw $0x8,%%ymm0,%%ymm0 \n" + "vpackuswb %%ymm0,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vmovdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" + "sub $0x10,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1", "xmm5"); +} + +void ScaleRowDown4Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrlw $0xf,%%ymm4,%%ymm4 \n" + "vpsllw $0x3,%%ymm4,%%ymm5 \n" + "vpackuswb %%ymm4,%%ymm4,%%ymm4 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" + "vmovdqu 0x20(%0),%%ymm1 \n" + "vmovdqu 0x00(%0,%3,1),%%ymm2 \n" + "vmovdqu 0x20(%0,%3,1),%%ymm3 \n" + "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" + "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n" + "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" + "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n" + "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" + "vpaddw %%ymm3,%%ymm1,%%ymm1 \n" + "vmovdqu 0x00(%0,%3,2),%%ymm2 \n" + "vmovdqu 0x20(%0,%3,2),%%ymm3 \n" + "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" + "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n" + "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" + "vpaddw %%ymm3,%%ymm1,%%ymm1 \n" + "vmovdqu 0x00(%0,%4,1),%%ymm2 \n" + "vmovdqu 0x20(%0,%4,1),%%ymm3 \n" + "lea 0x40(%0),%0 \n" + "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" + "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n" + "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" + "vpaddw %%ymm3,%%ymm1,%%ymm1 \n" + "vphaddw %%ymm1,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vpaddw %%ymm5,%%ymm0,%%ymm0 \n" + "vpsrlw $0x4,%%ymm0,%%ymm0 \n" + "vpackuswb %%ymm0,%%ymm0,%%ymm0 \n" + "vpermq $0xd8,%%ymm0,%%ymm0 \n" + "vmovdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" + "sub $0x10,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(src_stride * 3)) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif // HAS_SCALEROWDOWN4_AVX2 + +void ScaleRowDown34_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + (void)src_stride; + asm volatile( + "movdqa %0,%%xmm3 \n" + "movdqa %1,%%xmm4 \n" + "movdqa %2,%%xmm5 \n" + : + : "m"(kShuf0), // %0 + "m"(kShuf1), // %1 + "m"(kShuf2) // %2 + ); + asm volatile(LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm2 \n" + "lea 0x20(%0),%0 \n" + "movdqa %%xmm2,%%xmm1 \n" + "palignr $0x8,%%xmm0,%%xmm1 \n" + "pshufb %%xmm3,%%xmm0 \n" + "pshufb %%xmm4,%%xmm1 \n" + "pshufb %%xmm5,%%xmm2 \n" + "movq %%xmm0,(%1) \n" + "movq %%xmm1,0x8(%1) \n" + "movq %%xmm2,0x10(%1) \n" + "lea 0x18(%1),%1 \n" + "sub $0x18,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} + +void ScaleRowDown34_1_Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "movdqa %0,%%xmm2 \n" // kShuf01 + "movdqa %1,%%xmm3 \n" // kShuf11 + "movdqa %2,%%xmm4 \n" // kShuf21 + : + : "m"(kShuf01), // %0 + "m"(kShuf11), // %1 + "m"(kShuf21) // %2 + ); + asm volatile( + "movdqa %0,%%xmm5 \n" // kMadd01 + "movdqa %1,%%xmm0 \n" // kMadd11 + "movdqa %2,%%xmm1 \n" // kRound34 + : + : "m"(kMadd01), // %0 + "m"(kMadd11), // %1 + "m"(kRound34) // %2 + ); + asm volatile(LABELALIGN + "1: \n" + "movdqu (%0),%%xmm6 \n" + "movdqu 0x00(%0,%3,1),%%xmm7 \n" + "pavgb %%xmm7,%%xmm6 \n" + "pshufb %%xmm2,%%xmm6 \n" + "pmaddubsw %%xmm5,%%xmm6 \n" + "paddsw %%xmm1,%%xmm6 \n" + "psrlw $0x2,%%xmm6 \n" + "packuswb %%xmm6,%%xmm6 \n" + "movq %%xmm6,(%1) \n" + "movdqu 0x8(%0),%%xmm6 \n" + "movdqu 0x8(%0,%3,1),%%xmm7 \n" + "pavgb %%xmm7,%%xmm6 \n" + "pshufb %%xmm3,%%xmm6 \n" + "pmaddubsw %%xmm0,%%xmm6 \n" + "paddsw %%xmm1,%%xmm6 \n" + "psrlw $0x2,%%xmm6 \n" + "packuswb %%xmm6,%%xmm6 \n" + "movq %%xmm6,0x8(%1) \n" + "movdqu 0x10(%0),%%xmm6 \n" + "movdqu 0x10(%0,%3,1),%%xmm7 \n" + "lea 0x20(%0),%0 \n" + "pavgb %%xmm7,%%xmm6 \n" + "pshufb %%xmm4,%%xmm6 \n" + "pmaddubsw %4,%%xmm6 \n" + "paddsw %%xmm1,%%xmm6 \n" + "psrlw $0x2,%%xmm6 \n" + "packuswb %%xmm6,%%xmm6 \n" + "movq %%xmm6,0x10(%1) \n" + "lea 0x18(%1),%1 \n" + "sub $0x18,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "m"(kMadd21) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", + "xmm6", "xmm7"); +} + +void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "movdqa %0,%%xmm2 \n" // kShuf01 + "movdqa %1,%%xmm3 \n" // kShuf11 + "movdqa %2,%%xmm4 \n" // kShuf21 + : + : "m"(kShuf01), // %0 + "m"(kShuf11), // %1 + "m"(kShuf21) // %2 + ); + asm volatile( + "movdqa %0,%%xmm5 \n" // kMadd01 + "movdqa %1,%%xmm0 \n" // kMadd11 + "movdqa %2,%%xmm1 \n" // kRound34 + : + : "m"(kMadd01), // %0 + "m"(kMadd11), // %1 + "m"(kRound34) // %2 + ); + + asm volatile(LABELALIGN + "1: \n" + "movdqu (%0),%%xmm6 \n" + "movdqu 0x00(%0,%3,1),%%xmm7 \n" + "pavgb %%xmm6,%%xmm7 \n" + "pavgb %%xmm7,%%xmm6 \n" + "pshufb %%xmm2,%%xmm6 \n" + "pmaddubsw %%xmm5,%%xmm6 \n" + "paddsw %%xmm1,%%xmm6 \n" + "psrlw $0x2,%%xmm6 \n" + "packuswb %%xmm6,%%xmm6 \n" + "movq %%xmm6,(%1) \n" + "movdqu 0x8(%0),%%xmm6 \n" + "movdqu 0x8(%0,%3,1),%%xmm7 \n" + "pavgb %%xmm6,%%xmm7 \n" + "pavgb %%xmm7,%%xmm6 \n" + "pshufb %%xmm3,%%xmm6 \n" + "pmaddubsw %%xmm0,%%xmm6 \n" + "paddsw %%xmm1,%%xmm6 \n" + "psrlw $0x2,%%xmm6 \n" + "packuswb %%xmm6,%%xmm6 \n" + "movq %%xmm6,0x8(%1) \n" + "movdqu 0x10(%0),%%xmm6 \n" + "movdqu 0x10(%0,%3,1),%%xmm7 \n" + "lea 0x20(%0),%0 \n" + "pavgb %%xmm6,%%xmm7 \n" + "pavgb %%xmm7,%%xmm6 \n" + "pshufb %%xmm4,%%xmm6 \n" + "pmaddubsw %4,%%xmm6 \n" + "paddsw %%xmm1,%%xmm6 \n" + "psrlw $0x2,%%xmm6 \n" + "packuswb %%xmm6,%%xmm6 \n" + "movq %%xmm6,0x10(%1) \n" + "lea 0x18(%1),%1 \n" + "sub $0x18,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "m"(kMadd21) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", + "xmm6", "xmm7"); +} + +void ScaleRowDown38_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + (void)src_stride; + asm volatile( + "movdqa %3,%%xmm4 \n" + "movdqa %4,%%xmm5 \n" + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "lea 0x20(%0),%0 \n" + "pshufb %%xmm4,%%xmm0 \n" + "pshufb %%xmm5,%%xmm1 \n" + "paddusb %%xmm1,%%xmm0 \n" + "movq %%xmm0,(%1) \n" + "movhlps %%xmm0,%%xmm1 \n" + "movd %%xmm1,0x8(%1) \n" + "lea 0xc(%1),%1 \n" + "sub $0xc,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "m"(kShuf38a), // %3 + "m"(kShuf38b) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm4", "xmm5"); +} + +void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "movdqa %0,%%xmm2 \n" + "movdqa %1,%%xmm3 \n" + "movdqa %2,%%xmm4 \n" + "movdqa %3,%%xmm5 \n" + : + : "m"(kShufAb0), // %0 + "m"(kShufAb1), // %1 + "m"(kShufAb2), // %2 + "m"(kScaleAb2) // %3 + ); + asm volatile(LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x00(%0,%3,1),%%xmm1 \n" + "lea 0x10(%0),%0 \n" + "pavgb %%xmm1,%%xmm0 \n" + "movdqa %%xmm0,%%xmm1 \n" + "pshufb %%xmm2,%%xmm1 \n" + "movdqa %%xmm0,%%xmm6 \n" + "pshufb %%xmm3,%%xmm6 \n" + "paddusw %%xmm6,%%xmm1 \n" + "pshufb %%xmm4,%%xmm0 \n" + "paddusw %%xmm0,%%xmm1 \n" + "pmulhuw %%xmm5,%%xmm1 \n" + "packuswb %%xmm1,%%xmm1 \n" + "movd %%xmm1,(%1) \n" + "psrlq $0x10,%%xmm1 \n" + "movd %%xmm1,0x2(%1) \n" + "lea 0x6(%1),%1 \n" + "sub $0x6,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", + "xmm6"); +} + +void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "movdqa %0,%%xmm2 \n" + "movdqa %1,%%xmm3 \n" + "movdqa %2,%%xmm4 \n" + "pxor %%xmm5,%%xmm5 \n" + : + : "m"(kShufAc), // %0 + "m"(kShufAc3), // %1 + "m"(kScaleAc33) // %2 + ); + asm volatile(LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x00(%0,%3,1),%%xmm6 \n" + "movhlps %%xmm0,%%xmm1 \n" + "movhlps %%xmm6,%%xmm7 \n" + "punpcklbw %%xmm5,%%xmm0 \n" + "punpcklbw %%xmm5,%%xmm1 \n" + "punpcklbw %%xmm5,%%xmm6 \n" + "punpcklbw %%xmm5,%%xmm7 \n" + "paddusw %%xmm6,%%xmm0 \n" + "paddusw %%xmm7,%%xmm1 \n" + "movdqu 0x00(%0,%3,2),%%xmm6 \n" + "lea 0x10(%0),%0 \n" + "movhlps %%xmm6,%%xmm7 \n" + "punpcklbw %%xmm5,%%xmm6 \n" + "punpcklbw %%xmm5,%%xmm7 \n" + "paddusw %%xmm6,%%xmm0 \n" + "paddusw %%xmm7,%%xmm1 \n" + "movdqa %%xmm0,%%xmm6 \n" + "psrldq $0x2,%%xmm0 \n" + "paddusw %%xmm0,%%xmm6 \n" + "psrldq $0x2,%%xmm0 \n" + "paddusw %%xmm0,%%xmm6 \n" + "pshufb %%xmm2,%%xmm6 \n" + "movdqa %%xmm1,%%xmm7 \n" + "psrldq $0x2,%%xmm1 \n" + "paddusw %%xmm1,%%xmm7 \n" + "psrldq $0x2,%%xmm1 \n" + "paddusw %%xmm1,%%xmm7 \n" + "pshufb %%xmm3,%%xmm7 \n" + "paddusw %%xmm7,%%xmm6 \n" + "pmulhuw %%xmm4,%%xmm6 \n" + "packuswb %%xmm6,%%xmm6 \n" + "movd %%xmm6,(%1) \n" + "psrlq $0x10,%%xmm6 \n" + "movd %%xmm6,0x2(%1) \n" + "lea 0x6(%1),%1 \n" + "sub $0x6,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", + "xmm6", "xmm7"); +} + +static const uvec8 kLinearShuffleFar = {2, 3, 0, 1, 6, 7, 4, 5, + 10, 11, 8, 9, 14, 15, 12, 13}; + +static const uvec8 kLinearMadd31 = {3, 1, 1, 3, 3, 1, 1, 3, + 3, 1, 1, 3, 3, 1, 1, 3}; + +#ifdef HAS_SCALEROWUP2LINEAR_SSE2 +void ScaleRowUp2_Linear_SSE2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "pxor %%xmm0,%%xmm0 \n" // 0 + "pcmpeqw %%xmm6,%%xmm6 \n" + "psrlw $15,%%xmm6 \n" + "psllw $1,%%xmm6 \n" // all 2 + + LABELALIGN + "1: \n" + "movq (%0),%%xmm1 \n" // 01234567 + "movq 1(%0),%%xmm2 \n" // 12345678 + "movdqa %%xmm1,%%xmm3 \n" + "punpcklbw %%xmm2,%%xmm3 \n" // 0112233445566778 + "punpcklbw %%xmm1,%%xmm1 \n" // 0011223344556677 + "punpcklbw %%xmm2,%%xmm2 \n" // 1122334455667788 + "movdqa %%xmm1,%%xmm4 \n" + "punpcklbw %%xmm0,%%xmm4 \n" // 00112233 (16) + "movdqa %%xmm2,%%xmm5 \n" + "punpcklbw %%xmm0,%%xmm5 \n" // 11223344 (16) + "paddw %%xmm5,%%xmm4 \n" + "movdqa %%xmm3,%%xmm5 \n" + "paddw %%xmm6,%%xmm4 \n" + "punpcklbw %%xmm0,%%xmm5 \n" // 01122334 (16) + "paddw %%xmm5,%%xmm5 \n" + "paddw %%xmm4,%%xmm5 \n" // 3*near+far+2 (lo) + "psrlw $2,%%xmm5 \n" // 3/4*near+1/4*far (lo) + + "punpckhbw %%xmm0,%%xmm1 \n" // 44556677 (16) + "punpckhbw %%xmm0,%%xmm2 \n" // 55667788 (16) + "paddw %%xmm2,%%xmm1 \n" + "punpckhbw %%xmm0,%%xmm3 \n" // 45566778 (16) + "paddw %%xmm6,%%xmm1 \n" + "paddw %%xmm3,%%xmm3 \n" + "paddw %%xmm3,%%xmm1 \n" // 3*near+far+2 (hi) + "psrlw $2,%%xmm1 \n" // 3/4*near+1/4*far (hi) + + "packuswb %%xmm1,%%xmm5 \n" + "movdqu %%xmm5,(%1) \n" + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 8 sample to 16 sample + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_SSE2 +void ScaleRowUp2_Bilinear_SSE2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + LABELALIGN + "1: \n" + "pxor %%xmm0,%%xmm0 \n" // 0 + // above line + "movq (%0),%%xmm1 \n" // 01234567 + "movq 1(%0),%%xmm2 \n" // 12345678 + "movdqa %%xmm1,%%xmm3 \n" + "punpcklbw %%xmm2,%%xmm3 \n" // 0112233445566778 + "punpcklbw %%xmm1,%%xmm1 \n" // 0011223344556677 + "punpcklbw %%xmm2,%%xmm2 \n" // 1122334455667788 + + "movdqa %%xmm1,%%xmm4 \n" + "punpcklbw %%xmm0,%%xmm4 \n" // 00112233 (16) + "movdqa %%xmm2,%%xmm5 \n" + "punpcklbw %%xmm0,%%xmm5 \n" // 11223344 (16) + "paddw %%xmm5,%%xmm4 \n" // near+far + "movdqa %%xmm3,%%xmm5 \n" + "punpcklbw %%xmm0,%%xmm5 \n" // 01122334 (16) + "paddw %%xmm5,%%xmm5 \n" // 2*near + "paddw %%xmm5,%%xmm4 \n" // 3*near+far (1, lo) + + "punpckhbw %%xmm0,%%xmm1 \n" // 44556677 (16) + "punpckhbw %%xmm0,%%xmm2 \n" // 55667788 (16) + "paddw %%xmm2,%%xmm1 \n" + "punpckhbw %%xmm0,%%xmm3 \n" // 45566778 (16) + "paddw %%xmm3,%%xmm3 \n" // 2*near + "paddw %%xmm3,%%xmm1 \n" // 3*near+far (1, hi) + + // below line + "movq (%0,%3),%%xmm6 \n" // 01234567 + "movq 1(%0,%3),%%xmm2 \n" // 12345678 + "movdqa %%xmm6,%%xmm3 \n" + "punpcklbw %%xmm2,%%xmm3 \n" // 0112233445566778 + "punpcklbw %%xmm6,%%xmm6 \n" // 0011223344556677 + "punpcklbw %%xmm2,%%xmm2 \n" // 1122334455667788 + + "movdqa %%xmm6,%%xmm5 \n" + "punpcklbw %%xmm0,%%xmm5 \n" // 00112233 (16) + "movdqa %%xmm2,%%xmm7 \n" + "punpcklbw %%xmm0,%%xmm7 \n" // 11223344 (16) + "paddw %%xmm7,%%xmm5 \n" // near+far + "movdqa %%xmm3,%%xmm7 \n" + "punpcklbw %%xmm0,%%xmm7 \n" // 01122334 (16) + "paddw %%xmm7,%%xmm7 \n" // 2*near + "paddw %%xmm7,%%xmm5 \n" // 3*near+far (2, lo) + + "punpckhbw %%xmm0,%%xmm6 \n" // 44556677 (16) + "punpckhbw %%xmm0,%%xmm2 \n" // 55667788 (16) + "paddw %%xmm6,%%xmm2 \n" // near+far + "punpckhbw %%xmm0,%%xmm3 \n" // 45566778 (16) + "paddw %%xmm3,%%xmm3 \n" // 2*near + "paddw %%xmm3,%%xmm2 \n" // 3*near+far (2, hi) + + // xmm4 xmm1 + // xmm5 xmm2 + "pcmpeqw %%xmm0,%%xmm0 \n" + "psrlw $15,%%xmm0 \n" + "psllw $3,%%xmm0 \n" // all 8 + + "movdqa %%xmm4,%%xmm3 \n" + "movdqa %%xmm5,%%xmm6 \n" + "paddw %%xmm3,%%xmm3 \n" // 6*near+2*far (1, lo) + "paddw %%xmm0,%%xmm6 \n" // 3*near+far+8 (2, lo) + "paddw %%xmm4,%%xmm3 \n" // 9*near+3*far (1, lo) + "paddw %%xmm6,%%xmm3 \n" // 9 3 3 1 + 8 (1, lo) + "psrlw $4,%%xmm3 \n" // ^ div by 16 + + "movdqa %%xmm1,%%xmm7 \n" + "movdqa %%xmm2,%%xmm6 \n" + "paddw %%xmm7,%%xmm7 \n" // 6*near+2*far (1, hi) + "paddw %%xmm0,%%xmm6 \n" // 3*near+far+8 (2, hi) + "paddw %%xmm1,%%xmm7 \n" // 9*near+3*far (1, hi) + "paddw %%xmm6,%%xmm7 \n" // 9 3 3 1 + 8 (1, hi) + "psrlw $4,%%xmm7 \n" // ^ div by 16 + + "packuswb %%xmm7,%%xmm3 \n" + "movdqu %%xmm3,(%1) \n" // save above line + + "movdqa %%xmm5,%%xmm3 \n" + "paddw %%xmm0,%%xmm4 \n" // 3*near+far+8 (1, lo) + "paddw %%xmm3,%%xmm3 \n" // 6*near+2*far (2, lo) + "paddw %%xmm3,%%xmm5 \n" // 9*near+3*far (2, lo) + "paddw %%xmm4,%%xmm5 \n" // 9 3 3 1 + 8 (lo) + "psrlw $4,%%xmm5 \n" // ^ div by 16 + + "movdqa %%xmm2,%%xmm3 \n" + "paddw %%xmm0,%%xmm1 \n" // 3*near+far+8 (1, hi) + "paddw %%xmm3,%%xmm3 \n" // 6*near+2*far (2, hi) + "paddw %%xmm3,%%xmm2 \n" // 9*near+3*far (2, hi) + "paddw %%xmm1,%%xmm2 \n" // 9 3 3 1 + 8 (hi) + "psrlw $4,%%xmm2 \n" // ^ div by 16 + + "packuswb %%xmm2,%%xmm5 \n" + "movdqu %%xmm5,(%1,%4) \n" // save below line + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 8 sample to 16 sample + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_12_SSSE3 +void ScaleRowUp2_Linear_12_SSSE3(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + asm volatile( + "movdqa %3,%%xmm5 \n" + "pcmpeqw %%xmm4,%%xmm4 \n" + "psrlw $15,%%xmm4 \n" + "psllw $1,%%xmm4 \n" // all 2 + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" // 01234567 (16) + "movdqu 2(%0),%%xmm1 \n" // 12345678 (16) + + "movdqa %%xmm0,%%xmm2 \n" + "punpckhwd %%xmm1,%%xmm2 \n" // 45566778 (16) + "punpcklwd %%xmm1,%%xmm0 \n" // 01122334 (16) + + "movdqa %%xmm2,%%xmm3 \n" + "movdqa %%xmm0,%%xmm1 \n" + "pshufb %%xmm5,%%xmm3 \n" // 54657687 (far) + "pshufb %%xmm5,%%xmm1 \n" // 10213243 (far) + + "paddw %%xmm4,%%xmm1 \n" // far+2 + "paddw %%xmm4,%%xmm3 \n" // far+2 + "paddw %%xmm0,%%xmm1 \n" // near+far+2 + "paddw %%xmm2,%%xmm3 \n" // near+far+2 + "paddw %%xmm0,%%xmm0 \n" // 2*near + "paddw %%xmm2,%%xmm2 \n" // 2*near + "paddw %%xmm1,%%xmm0 \n" // 3*near+far+2 (lo) + "paddw %%xmm3,%%xmm2 \n" // 3*near+far+2 (hi) + + "psrlw $2,%%xmm0 \n" // 3/4*near+1/4*far + "psrlw $2,%%xmm2 \n" // 3/4*near+1/4*far + "movdqu %%xmm0,(%1) \n" + "movdqu %%xmm2,16(%1) \n" + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 8 sample to 16 sample + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "m"(kLinearShuffleFar) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_12_SSSE3 +void ScaleRowUp2_Bilinear_12_SSSE3(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "pcmpeqw %%xmm7,%%xmm7 \n" + "psrlw $15,%%xmm7 \n" + "psllw $3,%%xmm7 \n" // all 8 + "movdqa %5,%%xmm6 \n" + + LABELALIGN + "1: \n" + // above line + "movdqu (%0),%%xmm0 \n" // 01234567 (16) + "movdqu 2(%0),%%xmm1 \n" // 12345678 (16) + "movdqa %%xmm0,%%xmm2 \n" + "punpckhwd %%xmm1,%%xmm2 \n" // 45566778 (16) + "punpcklwd %%xmm1,%%xmm0 \n" // 01122334 (16) + "movdqa %%xmm2,%%xmm3 \n" + "movdqa %%xmm0,%%xmm1 \n" + "pshufb %%xmm6,%%xmm3 \n" // 54657687 (far) + "pshufb %%xmm6,%%xmm1 \n" // 10213243 (far) + "paddw %%xmm0,%%xmm1 \n" // near+far + "paddw %%xmm2,%%xmm3 \n" // near+far + "paddw %%xmm0,%%xmm0 \n" // 2*near + "paddw %%xmm2,%%xmm2 \n" // 2*near + "paddw %%xmm1,%%xmm0 \n" // 3*near+far (1, lo) + "paddw %%xmm3,%%xmm2 \n" // 3*near+far (1, hi) + + // below line + "movdqu (%0,%3,2),%%xmm1 \n" // 01234567 (16) + "movdqu 2(%0,%3,2),%%xmm4 \n" // 12345678 (16) + "movdqa %%xmm1,%%xmm3 \n" + "punpckhwd %%xmm4,%%xmm3 \n" // 45566778 (16) + "punpcklwd %%xmm4,%%xmm1 \n" // 01122334 (16) + "movdqa %%xmm3,%%xmm5 \n" + "movdqa %%xmm1,%%xmm4 \n" + "pshufb %%xmm6,%%xmm5 \n" // 54657687 (far) + "pshufb %%xmm6,%%xmm4 \n" // 10213243 (far) + "paddw %%xmm1,%%xmm4 \n" // near+far + "paddw %%xmm3,%%xmm5 \n" // near+far + "paddw %%xmm1,%%xmm1 \n" // 2*near + "paddw %%xmm3,%%xmm3 \n" // 2*near + "paddw %%xmm4,%%xmm1 \n" // 3*near+far (2, lo) + "paddw %%xmm5,%%xmm3 \n" // 3*near+far (2, hi) + + // xmm0 xmm2 + // xmm1 xmm3 + + "movdqa %%xmm0,%%xmm4 \n" + "movdqa %%xmm1,%%xmm5 \n" + "paddw %%xmm4,%%xmm4 \n" // 6*near+2*far (1, lo) + "paddw %%xmm7,%%xmm5 \n" // 3*near+far+8 (2, lo) + "paddw %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo) + "paddw %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo) + "psrlw $4,%%xmm4 \n" // ^ div by 16 + "movdqu %%xmm4,(%1) \n" + + "movdqa %%xmm2,%%xmm4 \n" + "movdqa %%xmm3,%%xmm5 \n" + "paddw %%xmm4,%%xmm4 \n" // 6*near+2*far (1, hi) + "paddw %%xmm7,%%xmm5 \n" // 3*near+far+8 (2, hi) + "paddw %%xmm2,%%xmm4 \n" // 9*near+3*far (1, hi) + "paddw %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, hi) + "psrlw $4,%%xmm4 \n" // ^ div by 16 + "movdqu %%xmm4,0x10(%1) \n" + + "movdqa %%xmm1,%%xmm4 \n" + "paddw %%xmm7,%%xmm0 \n" // 3*near+far+8 (1, lo) + "paddw %%xmm4,%%xmm4 \n" // 6*near+2*far (2, lo) + "paddw %%xmm4,%%xmm1 \n" // 9*near+3*far (2, lo) + "paddw %%xmm0,%%xmm1 \n" // 9 3 3 1 + 8 (2, lo) + "psrlw $4,%%xmm1 \n" // ^ div by 16 + "movdqu %%xmm1,(%1,%4,2) \n" + + "movdqa %%xmm3,%%xmm4 \n" + "paddw %%xmm7,%%xmm2 \n" // 3*near+far+8 (1, hi) + "paddw %%xmm4,%%xmm4 \n" // 6*near+2*far (2, hi) + "paddw %%xmm4,%%xmm3 \n" // 9*near+3*far (2, hi) + "paddw %%xmm2,%%xmm3 \n" // 9 3 3 1 + 8 (2, hi) + "psrlw $4,%%xmm3 \n" // ^ div by 16 + "movdqu %%xmm3,0x10(%1,%4,2) \n" + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 8 sample to 16 sample + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)), // %4 + "m"(kLinearShuffleFar) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_16_SSE2 +void ScaleRowUp2_Linear_16_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + asm volatile( + "pxor %%xmm5,%%xmm5 \n" + "pcmpeqd %%xmm4,%%xmm4 \n" + "psrld $31,%%xmm4 \n" + "pslld $1,%%xmm4 \n" // all 2 + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" // 0123 (16b) + "movq 2(%0),%%xmm1 \n" // 1234 (16b) + + "punpcklwd %%xmm5,%%xmm0 \n" // 0123 (32b) + "punpcklwd %%xmm5,%%xmm1 \n" // 1234 (32b) + + "movdqa %%xmm0,%%xmm2 \n" + "movdqa %%xmm1,%%xmm3 \n" + + "pshufd $0b10110001,%%xmm2,%%xmm2 \n" // 1032 (even, far) + "pshufd $0b10110001,%%xmm3,%%xmm3 \n" // 2143 (odd, far) + + "paddd %%xmm4,%%xmm2 \n" // far+2 (lo) + "paddd %%xmm4,%%xmm3 \n" // far+2 (hi) + "paddd %%xmm0,%%xmm2 \n" // near+far+2 (lo) + "paddd %%xmm1,%%xmm3 \n" // near+far+2 (hi) + "paddd %%xmm0,%%xmm0 \n" // 2*near (lo) + "paddd %%xmm1,%%xmm1 \n" // 2*near (hi) + "paddd %%xmm2,%%xmm0 \n" // 3*near+far+2 (lo) + "paddd %%xmm3,%%xmm1 \n" // 3*near+far+2 (hi) + + "psrld $2,%%xmm0 \n" // 3/4*near+1/4*far (lo) + "psrld $2,%%xmm1 \n" // 3/4*near+1/4*far (hi) + "packssdw %%xmm1,%%xmm0 \n" + "pshufd $0b11011000,%%xmm0,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 4 pixel to 8 pixel + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_16_SSE2 +void ScaleRowUp2_Bilinear_16_SSE2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "pxor %%xmm7,%%xmm7 \n" + "pcmpeqd %%xmm6,%%xmm6 \n" + "psrld $31,%%xmm6 \n" + "pslld $3,%%xmm6 \n" // all 8 + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" // 0011 (16b, 1u1v) + "movq 4(%0),%%xmm1 \n" // 1122 (16b, 1u1v) + "punpcklwd %%xmm7,%%xmm0 \n" // 0011 (near) (32b, 1u1v) + "punpcklwd %%xmm7,%%xmm1 \n" // 1122 (near) (32b, 1u1v) + "movdqa %%xmm0,%%xmm2 \n" + "movdqa %%xmm1,%%xmm3 \n" + "pshufd $0b01001110,%%xmm2,%%xmm2 \n" // 1100 (far) (1, lo) + "pshufd $0b01001110,%%xmm3,%%xmm3 \n" // 2211 (far) (1, hi) + "paddd %%xmm0,%%xmm2 \n" // near+far (1, lo) + "paddd %%xmm1,%%xmm3 \n" // near+far (1, hi) + "paddd %%xmm0,%%xmm0 \n" // 2*near (1, lo) + "paddd %%xmm1,%%xmm1 \n" // 2*near (1, hi) + "paddd %%xmm2,%%xmm0 \n" // 3*near+far (1, lo) + "paddd %%xmm3,%%xmm1 \n" // 3*near+far (1, hi) + + "movq (%0),%%xmm0 \n" // 0123 (16b) + "movq 2(%0),%%xmm1 \n" // 1234 (16b) + "punpcklwd %%xmm7,%%xmm0 \n" // 0123 (32b) + "punpcklwd %%xmm7,%%xmm1 \n" // 1234 (32b) + "movdqa %%xmm0,%%xmm2 \n" + "movdqa %%xmm1,%%xmm3 \n" + "pshufd $0b10110001,%%xmm2,%%xmm2 \n" // 1032 (even, far) + "pshufd $0b10110001,%%xmm3,%%xmm3 \n" // 2143 (odd, far) + "paddd %%xmm0,%%xmm2 \n" // near+far (lo) + "paddd %%xmm1,%%xmm3 \n" // near+far (hi) + "paddd %%xmm0,%%xmm0 \n" // 2*near (lo) + "paddd %%xmm1,%%xmm1 \n" // 2*near (hi) + "paddd %%xmm2,%%xmm0 \n" // 3*near+far (1, lo) + "paddd %%xmm3,%%xmm1 \n" // 3*near+far (1, hi) + + "movq (%0,%3,2),%%xmm2 \n" + "movq 2(%0,%3,2),%%xmm3 \n" + "punpcklwd %%xmm7,%%xmm2 \n" // 0123 (32b) + "punpcklwd %%xmm7,%%xmm3 \n" // 1234 (32b) + "movdqa %%xmm2,%%xmm4 \n" + "movdqa %%xmm3,%%xmm5 \n" + "pshufd $0b10110001,%%xmm4,%%xmm4 \n" // 1032 (even, far) + "pshufd $0b10110001,%%xmm5,%%xmm5 \n" // 2143 (odd, far) + "paddd %%xmm2,%%xmm4 \n" // near+far (lo) + "paddd %%xmm3,%%xmm5 \n" // near+far (hi) + "paddd %%xmm2,%%xmm2 \n" // 2*near (lo) + "paddd %%xmm3,%%xmm3 \n" // 2*near (hi) + "paddd %%xmm4,%%xmm2 \n" // 3*near+far (2, lo) + "paddd %%xmm5,%%xmm3 \n" // 3*near+far (2, hi) + + "movdqa %%xmm0,%%xmm4 \n" + "movdqa %%xmm2,%%xmm5 \n" + "paddd %%xmm0,%%xmm4 \n" // 6*near+2*far (1, lo) + "paddd %%xmm6,%%xmm5 \n" // 3*near+far+8 (2, lo) + "paddd %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo) + "paddd %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo) + "psrld $4,%%xmm4 \n" // ^ div by 16 (1, lo) + + "movdqa %%xmm2,%%xmm5 \n" + "paddd %%xmm2,%%xmm5 \n" // 6*near+2*far (2, lo) + "paddd %%xmm6,%%xmm0 \n" // 3*near+far+8 (1, lo) + "paddd %%xmm2,%%xmm5 \n" // 9*near+3*far (2, lo) + "paddd %%xmm0,%%xmm5 \n" // 9 3 3 1 + 8 (2, lo) + "psrld $4,%%xmm5 \n" // ^ div by 16 (2, lo) + + "movdqa %%xmm1,%%xmm0 \n" + "movdqa %%xmm3,%%xmm2 \n" + "paddd %%xmm1,%%xmm0 \n" // 6*near+2*far (1, hi) + "paddd %%xmm6,%%xmm2 \n" // 3*near+far+8 (2, hi) + "paddd %%xmm1,%%xmm0 \n" // 9*near+3*far (1, hi) + "paddd %%xmm2,%%xmm0 \n" // 9 3 3 1 + 8 (1, hi) + "psrld $4,%%xmm0 \n" // ^ div by 16 (1, hi) + + "movdqa %%xmm3,%%xmm2 \n" + "paddd %%xmm3,%%xmm2 \n" // 6*near+2*far (2, hi) + "paddd %%xmm6,%%xmm1 \n" // 3*near+far+8 (1, hi) + "paddd %%xmm3,%%xmm2 \n" // 9*near+3*far (2, hi) + "paddd %%xmm1,%%xmm2 \n" // 9 3 3 1 + 8 (2, hi) + "psrld $4,%%xmm2 \n" // ^ div by 16 (2, hi) + + "packssdw %%xmm0,%%xmm4 \n" + "pshufd $0b11011000,%%xmm4,%%xmm4 \n" + "movdqu %%xmm4,(%1) \n" // store above + "packssdw %%xmm2,%%xmm5 \n" + "pshufd $0b11011000,%%xmm4,%%xmm4 \n" + "movdqu %%xmm5,(%1,%4,2) \n" // store below + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 4 pixel to 8 pixel + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_SSSE3 +void ScaleRowUp2_Linear_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "pcmpeqw %%xmm4,%%xmm4 \n" + "psrlw $15,%%xmm4 \n" + "psllw $1,%%xmm4 \n" // all 2 + "movdqa %3,%%xmm3 \n" + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" // 01234567 + "movq 1(%0),%%xmm1 \n" // 12345678 + "punpcklwd %%xmm0,%%xmm0 \n" // 0101232345456767 + "punpcklwd %%xmm1,%%xmm1 \n" // 1212343456567878 + "movdqa %%xmm0,%%xmm2 \n" + "punpckhdq %%xmm1,%%xmm2 \n" // 4545565667677878 + "punpckldq %%xmm1,%%xmm0 \n" // 0101121223233434 + "pmaddubsw %%xmm3,%%xmm2 \n" // 3*near+far (hi) + "pmaddubsw %%xmm3,%%xmm0 \n" // 3*near+far (lo) + "paddw %%xmm4,%%xmm0 \n" // 3*near+far+2 (lo) + "paddw %%xmm4,%%xmm2 \n" // 3*near+far+2 (hi) + "psrlw $2,%%xmm0 \n" // 3/4*near+1/4*far (lo) + "psrlw $2,%%xmm2 \n" // 3/4*near+1/4*far (hi) + "vpackuswb %%xmm2,%%xmm0,%%xmm0 \n" + "vmovdqu %%xmm0,(%1) \n" + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 8 sample to 16 sample + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "m"(kLinearMadd31) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_SSSE3 +void ScaleRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "pcmpeqw %%xmm6,%%xmm6 \n" + "psrlw $15,%%xmm6 \n" + "psllw $3,%%xmm6 \n" // all 8 + "movdqa %5,%%xmm7 \n" + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" // 01234567 + "movq 1(%0),%%xmm1 \n" // 12345678 + "punpcklwd %%xmm0,%%xmm0 \n" // 0101232345456767 + "punpcklwd %%xmm1,%%xmm1 \n" // 1212343456567878 + "movdqa %%xmm0,%%xmm2 \n" + "punpckhdq %%xmm1,%%xmm2 \n" // 4545565667677878 + "punpckldq %%xmm1,%%xmm0 \n" // 0101121223233434 + "pmaddubsw %%xmm7,%%xmm2 \n" // 3*near+far (1, hi) + "pmaddubsw %%xmm7,%%xmm0 \n" // 3*near+far (1, lo) + + "movq (%0,%3),%%xmm1 \n" + "movq 1(%0,%3),%%xmm4 \n" + "punpcklwd %%xmm1,%%xmm1 \n" + "punpcklwd %%xmm4,%%xmm4 \n" + "movdqa %%xmm1,%%xmm3 \n" + "punpckhdq %%xmm4,%%xmm3 \n" + "punpckldq %%xmm4,%%xmm1 \n" + "pmaddubsw %%xmm7,%%xmm3 \n" // 3*near+far (2, hi) + "pmaddubsw %%xmm7,%%xmm1 \n" // 3*near+far (2, lo) + + // xmm0 xmm2 + // xmm1 xmm3 + + "movdqa %%xmm0,%%xmm4 \n" + "movdqa %%xmm1,%%xmm5 \n" + "paddw %%xmm0,%%xmm4 \n" // 6*near+2*far (1, lo) + "paddw %%xmm6,%%xmm5 \n" // 3*near+far+8 (2, lo) + "paddw %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo) + "paddw %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo) + "psrlw $4,%%xmm4 \n" // ^ div by 16 (1, lo) + + "movdqa %%xmm1,%%xmm5 \n" + "paddw %%xmm1,%%xmm5 \n" // 6*near+2*far (2, lo) + "paddw %%xmm6,%%xmm0 \n" // 3*near+far+8 (1, lo) + "paddw %%xmm1,%%xmm5 \n" // 9*near+3*far (2, lo) + "paddw %%xmm0,%%xmm5 \n" // 9 3 3 1 + 8 (2, lo) + "psrlw $4,%%xmm5 \n" // ^ div by 16 (2, lo) + + "movdqa %%xmm2,%%xmm0 \n" + "movdqa %%xmm3,%%xmm1 \n" + "paddw %%xmm2,%%xmm0 \n" // 6*near+2*far (1, hi) + "paddw %%xmm6,%%xmm1 \n" // 3*near+far+8 (2, hi) + "paddw %%xmm2,%%xmm0 \n" // 9*near+3*far (1, hi) + "paddw %%xmm1,%%xmm0 \n" // 9 3 3 1 + 8 (1, hi) + "psrlw $4,%%xmm0 \n" // ^ div by 16 (1, hi) + + "movdqa %%xmm3,%%xmm1 \n" + "paddw %%xmm3,%%xmm1 \n" // 6*near+2*far (2, hi) + "paddw %%xmm6,%%xmm2 \n" // 3*near+far+8 (1, hi) + "paddw %%xmm3,%%xmm1 \n" // 9*near+3*far (2, hi) + "paddw %%xmm2,%%xmm1 \n" // 9 3 3 1 + 8 (2, hi) + "psrlw $4,%%xmm1 \n" // ^ div by 16 (2, hi) + + "packuswb %%xmm0,%%xmm4 \n" + "movdqu %%xmm4,(%1) \n" // store above + "packuswb %%xmm1,%%xmm5 \n" + "movdqu %%xmm5,(%1,%4) \n" // store below + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 8 sample to 16 sample + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)), // %4 + "m"(kLinearMadd31) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_AVX2 +void ScaleRowUp2_Linear_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "vpcmpeqw %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrlw $15,%%ymm4,%%ymm4 \n" + "vpsllw $1,%%ymm4,%%ymm4 \n" // all 2 + "vbroadcastf128 %3,%%ymm3 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%xmm0 \n" // 0123456789ABCDEF + "vmovdqu 1(%0),%%xmm1 \n" // 123456789ABCDEF0 + "vpermq $0b11011000,%%ymm0,%%ymm0 \n" + "vpermq $0b11011000,%%ymm1,%%ymm1 \n" + "vpunpcklwd %%ymm0,%%ymm0,%%ymm0 \n" + "vpunpcklwd %%ymm1,%%ymm1,%%ymm1 \n" + "vpunpckhdq %%ymm1,%%ymm0,%%ymm2 \n" + "vpunpckldq %%ymm1,%%ymm0,%%ymm0 \n" + "vpmaddubsw %%ymm3,%%ymm2,%%ymm1 \n" // 3*near+far (hi) + "vpmaddubsw %%ymm3,%%ymm0,%%ymm0 \n" // 3*near+far (lo) + "vpaddw %%ymm4,%%ymm0,%%ymm0 \n" // 3*near+far+2 (lo) + "vpaddw %%ymm4,%%ymm1,%%ymm1 \n" // 3*near+far+2 (hi) + "vpsrlw $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far (lo) + "vpsrlw $2,%%ymm1,%%ymm1 \n" // 3/4*near+1/4*far (hi) + "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 16 sample to 32 sample + "sub $0x20,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "m"(kLinearMadd31) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); +} +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_AVX2 +void ScaleRowUp2_Bilinear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "vpcmpeqw %%ymm6,%%ymm6,%%ymm6 \n" + "vpsrlw $15,%%ymm6,%%ymm6 \n" + "vpsllw $3,%%ymm6,%%ymm6 \n" // all 8 + "vbroadcastf128 %5,%%ymm7 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%xmm0 \n" // 0123456789ABCDEF + "vmovdqu 1(%0),%%xmm1 \n" // 123456789ABCDEF0 + "vpermq $0b11011000,%%ymm0,%%ymm0 \n" + "vpermq $0b11011000,%%ymm1,%%ymm1 \n" + "vpunpcklwd %%ymm0,%%ymm0,%%ymm0 \n" + "vpunpcklwd %%ymm1,%%ymm1,%%ymm1 \n" + "vpunpckhdq %%ymm1,%%ymm0,%%ymm2 \n" + "vpunpckldq %%ymm1,%%ymm0,%%ymm0 \n" + "vpmaddubsw %%ymm7,%%ymm2,%%ymm1 \n" // 3*near+far (1, hi) + "vpmaddubsw %%ymm7,%%ymm0,%%ymm0 \n" // 3*near+far (1, lo) + + "vmovdqu (%0,%3),%%xmm2 \n" // 0123456789ABCDEF + "vmovdqu 1(%0,%3),%%xmm3 \n" // 123456789ABCDEF0 + "vpermq $0b11011000,%%ymm2,%%ymm2 \n" + "vpermq $0b11011000,%%ymm3,%%ymm3 \n" + "vpunpcklwd %%ymm2,%%ymm2,%%ymm2 \n" + "vpunpcklwd %%ymm3,%%ymm3,%%ymm3 \n" + "vpunpckhdq %%ymm3,%%ymm2,%%ymm4 \n" + "vpunpckldq %%ymm3,%%ymm2,%%ymm2 \n" + "vpmaddubsw %%ymm7,%%ymm4,%%ymm3 \n" // 3*near+far (2, hi) + "vpmaddubsw %%ymm7,%%ymm2,%%ymm2 \n" // 3*near+far (2, lo) + + // ymm0 ymm1 + // ymm2 ymm3 + + "vpaddw %%ymm0,%%ymm0,%%ymm4 \n" // 6*near+2*far (1, lo) + "vpaddw %%ymm6,%%ymm2,%%ymm5 \n" // 3*near+far+8 (2, lo) + "vpaddw %%ymm4,%%ymm0,%%ymm4 \n" // 9*near+3*far (1, lo) + "vpaddw %%ymm4,%%ymm5,%%ymm4 \n" // 9 3 3 1 + 8 (1, lo) + "vpsrlw $4,%%ymm4,%%ymm4 \n" // ^ div by 16 (1, lo) + + "vpaddw %%ymm2,%%ymm2,%%ymm5 \n" // 6*near+2*far (2, lo) + "vpaddw %%ymm6,%%ymm0,%%ymm0 \n" // 3*near+far+8 (1, lo) + "vpaddw %%ymm5,%%ymm2,%%ymm5 \n" // 9*near+3*far (2, lo) + "vpaddw %%ymm5,%%ymm0,%%ymm5 \n" // 9 3 3 1 + 8 (2, lo) + "vpsrlw $4,%%ymm5,%%ymm5 \n" // ^ div by 16 (2, lo) + + "vpaddw %%ymm1,%%ymm1,%%ymm0 \n" // 6*near+2*far (1, hi) + "vpaddw %%ymm6,%%ymm3,%%ymm2 \n" // 3*near+far+8 (2, hi) + "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 9*near+3*far (1, hi) + "vpaddw %%ymm0,%%ymm2,%%ymm0 \n" // 9 3 3 1 + 8 (1, hi) + "vpsrlw $4,%%ymm0,%%ymm0 \n" // ^ div by 16 (1, hi) + + "vpaddw %%ymm3,%%ymm3,%%ymm2 \n" // 6*near+2*far (2, hi) + "vpaddw %%ymm6,%%ymm1,%%ymm1 \n" // 3*near+far+8 (1, hi) + "vpaddw %%ymm2,%%ymm3,%%ymm2 \n" // 9*near+3*far (2, hi) + "vpaddw %%ymm2,%%ymm1,%%ymm2 \n" // 9 3 3 1 + 8 (2, hi) + "vpsrlw $4,%%ymm2,%%ymm2 \n" // ^ div by 16 (2, hi) + + "vpackuswb %%ymm0,%%ymm4,%%ymm4 \n" + "vmovdqu %%ymm4,(%1) \n" // store above + "vpackuswb %%ymm2,%%ymm5,%%ymm5 \n" + "vmovdqu %%ymm5,(%1,%4) \n" // store below + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 16 sample to 32 sample + "sub $0x20,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)), // %4 + "m"(kLinearMadd31) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_12_AVX2 +void ScaleRowUp2_Linear_12_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + asm volatile( + "vbroadcastf128 %3,%%ymm5 \n" + "vpcmpeqw %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrlw $15,%%ymm4,%%ymm4 \n" + "vpsllw $1,%%ymm4,%%ymm4 \n" // all 2 + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" // 0123456789ABCDEF (16b) + "vmovdqu 2(%0),%%ymm1 \n" // 123456789ABCDEF0 (16b) + + "vpermq $0b11011000,%%ymm0,%%ymm0 \n" // 012389AB4567CDEF + "vpermq $0b11011000,%%ymm1,%%ymm1 \n" // 12349ABC5678DEF0 + + "vpunpckhwd %%ymm1,%%ymm0,%%ymm2 \n" // 899AABBCCDDEEFF0 (near) + "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" // 0112233445566778 (near) + "vpshufb %%ymm5,%%ymm2,%%ymm3 \n" // 98A9BACBDCEDFE0F (far) + "vpshufb %%ymm5,%%ymm0,%%ymm1 \n" // 1021324354657687 (far) + + "vpaddw %%ymm4,%%ymm1,%%ymm1 \n" // far+2 + "vpaddw %%ymm4,%%ymm3,%%ymm3 \n" // far+2 + "vpaddw %%ymm0,%%ymm1,%%ymm1 \n" // near+far+2 + "vpaddw %%ymm2,%%ymm3,%%ymm3 \n" // near+far+2 + "vpaddw %%ymm0,%%ymm0,%%ymm0 \n" // 2*near + "vpaddw %%ymm2,%%ymm2,%%ymm2 \n" // 2*near + "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 3*near+far+2 + "vpaddw %%ymm2,%%ymm3,%%ymm2 \n" // 3*near+far+2 + + "vpsrlw $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far + "vpsrlw $2,%%ymm2,%%ymm2 \n" // 3/4*near+1/4*far + "vmovdqu %%ymm0,(%1) \n" + "vmovdqu %%ymm2,32(%1) \n" + + "lea 0x20(%0),%0 \n" + "lea 0x40(%1),%1 \n" // 16 sample to 32 sample + "sub $0x20,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "m"(kLinearShuffleFar) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_12_AVX2 +void ScaleRowUp2_Bilinear_12_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "vbroadcastf128 %5,%%ymm5 \n" + "vpcmpeqw %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrlw $15,%%ymm4,%%ymm4 \n" + "vpsllw $3,%%ymm4,%%ymm4 \n" // all 8 + + LABELALIGN + "1: \n" + + "vmovdqu (%0),%%xmm0 \n" // 01234567 (16b) + "vmovdqu 2(%0),%%xmm1 \n" // 12345678 (16b) + "vpermq $0b11011000,%%ymm0,%%ymm0 \n" // 0123000045670000 + "vpermq $0b11011000,%%ymm1,%%ymm1 \n" // 1234000056780000 + "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" // 0112233445566778 (near) + "vpshufb %%ymm5,%%ymm0,%%ymm1 \n" // 1021324354657687 (far) + "vpaddw %%ymm0,%%ymm1,%%ymm1 \n" // near+far + "vpaddw %%ymm0,%%ymm0,%%ymm0 \n" // 2*near + "vpaddw %%ymm0,%%ymm1,%%ymm2 \n" // 3*near+far (1) + + "vmovdqu (%0,%3,2),%%xmm0 \n" // 01234567 (16b) + "vmovdqu 2(%0,%3,2),%%xmm1 \n" // 12345678 (16b) + "vpermq $0b11011000,%%ymm0,%%ymm0 \n" // 0123000045670000 + "vpermq $0b11011000,%%ymm1,%%ymm1 \n" // 1234000056780000 + "vpunpcklwd %%ymm1,%%ymm0,%%ymm0 \n" // 0112233445566778 (near) + "vpshufb %%ymm5,%%ymm0,%%ymm1 \n" // 1021324354657687 (far) + "vpaddw %%ymm0,%%ymm1,%%ymm1 \n" // near+far + "vpaddw %%ymm0,%%ymm0,%%ymm0 \n" // 2*near + "vpaddw %%ymm0,%%ymm1,%%ymm3 \n" // 3*near+far (2) + + "vpaddw %%ymm2,%%ymm2,%%ymm0 \n" // 6*near+2*far (1) + "vpaddw %%ymm4,%%ymm3,%%ymm1 \n" // 3*near+far+8 (2) + "vpaddw %%ymm0,%%ymm2,%%ymm0 \n" // 9*near+3*far (1) + "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 9 3 3 1 + 8 (1) + "vpsrlw $4,%%ymm0,%%ymm0 \n" // ^ div by 16 + "vmovdqu %%ymm0,(%1) \n" // store above + + "vpaddw %%ymm3,%%ymm3,%%ymm0 \n" // 6*near+2*far (2) + "vpaddw %%ymm4,%%ymm2,%%ymm1 \n" // 3*near+far+8 (1) + "vpaddw %%ymm0,%%ymm3,%%ymm0 \n" // 9*near+3*far (2) + "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 9 3 3 1 + 8 (2) + "vpsrlw $4,%%ymm0,%%ymm0 \n" // ^ div by 16 + "vmovdqu %%ymm0,(%1,%4,2) \n" // store below + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 8 sample to 16 sample + "sub $0x10,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)), // %4 + "m"(kLinearShuffleFar) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif + +#ifdef HAS_SCALEROWUP2LINEAR_16_AVX2 +void ScaleRowUp2_Linear_16_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + asm volatile( + "vpcmpeqd %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrld $31,%%ymm4,%%ymm4 \n" + "vpslld $1,%%ymm4,%%ymm4 \n" // all 2 + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%xmm0 \n" // 01234567 (16b, 1u1v) + "vmovdqu 2(%0),%%xmm1 \n" // 12345678 (16b, 1u1v) + + "vpmovzxwd %%xmm0,%%ymm0 \n" // 01234567 (32b, 1u1v) + "vpmovzxwd %%xmm1,%%ymm1 \n" // 12345678 (32b, 1u1v) + + "vpshufd $0b10110001,%%ymm0,%%ymm2 \n" // 10325476 (lo, far) + "vpshufd $0b10110001,%%ymm1,%%ymm3 \n" // 21436587 (hi, far) + + "vpaddd %%ymm4,%%ymm2,%%ymm2 \n" // far+2 (lo) + "vpaddd %%ymm4,%%ymm3,%%ymm3 \n" // far+2 (hi) + "vpaddd %%ymm0,%%ymm2,%%ymm2 \n" // near+far+2 (lo) + "vpaddd %%ymm1,%%ymm3,%%ymm3 \n" // near+far+2 (hi) + "vpaddd %%ymm0,%%ymm0,%%ymm0 \n" // 2*near (lo) + "vpaddd %%ymm1,%%ymm1,%%ymm1 \n" // 2*near (hi) + "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 3*near+far+2 (lo) + "vpaddd %%ymm1,%%ymm3,%%ymm1 \n" // 3*near+far+2 (hi) + + "vpsrld $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far (lo) + "vpsrld $2,%%ymm1,%%ymm1 \n" // 3/4*near+1/4*far (hi) + "vpackusdw %%ymm1,%%ymm0,%%ymm0 \n" + "vpshufd $0b11011000,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 8 pixel to 16 pixel + "sub $0x10,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); +} +#endif + +#ifdef HAS_SCALEROWUP2BILINEAR_16_AVX2 +void ScaleRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "vpcmpeqd %%ymm6,%%ymm6,%%ymm6 \n" + "vpsrld $31,%%ymm6,%%ymm6 \n" + "vpslld $3,%%ymm6,%%ymm6 \n" // all 8 + + LABELALIGN + "1: \n" + + "vmovdqu (%0),%%xmm0 \n" // 01234567 (16b, 1u1v) + "vmovdqu 2(%0),%%xmm1 \n" // 12345678 (16b, 1u1v) + "vpmovzxwd %%xmm0,%%ymm0 \n" // 01234567 (32b, 1u1v) + "vpmovzxwd %%xmm1,%%ymm1 \n" // 12345678 (32b, 1u1v) + "vpshufd $0b10110001,%%ymm0,%%ymm2 \n" // 10325476 (lo, far) + "vpshufd $0b10110001,%%ymm1,%%ymm3 \n" // 21436587 (hi, far) + "vpaddd %%ymm0,%%ymm2,%%ymm2 \n" // near+far (lo) + "vpaddd %%ymm1,%%ymm3,%%ymm3 \n" // near+far (hi) + "vpaddd %%ymm0,%%ymm0,%%ymm0 \n" // 2*near (lo) + "vpaddd %%ymm1,%%ymm1,%%ymm1 \n" // 2*near (hi) + "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 3*near+far (1, lo) + "vpaddd %%ymm1,%%ymm3,%%ymm1 \n" // 3*near+far (1, hi) + + "vmovdqu (%0,%3,2),%%xmm2 \n" // 01234567 (16b, 1u1v) + "vmovdqu 2(%0,%3,2),%%xmm3 \n" // 12345678 (16b, 1u1v) + "vpmovzxwd %%xmm2,%%ymm2 \n" // 01234567 (32b, 1u1v) + "vpmovzxwd %%xmm3,%%ymm3 \n" // 12345678 (32b, 1u1v) + "vpshufd $0b10110001,%%ymm2,%%ymm4 \n" // 10325476 (lo, far) + "vpshufd $0b10110001,%%ymm3,%%ymm5 \n" // 21436587 (hi, far) + "vpaddd %%ymm2,%%ymm4,%%ymm4 \n" // near+far (lo) + "vpaddd %%ymm3,%%ymm5,%%ymm5 \n" // near+far (hi) + "vpaddd %%ymm2,%%ymm2,%%ymm2 \n" // 2*near (lo) + "vpaddd %%ymm3,%%ymm3,%%ymm3 \n" // 2*near (hi) + "vpaddd %%ymm2,%%ymm4,%%ymm2 \n" // 3*near+far (2, lo) + "vpaddd %%ymm3,%%ymm5,%%ymm3 \n" // 3*near+far (2, hi) + + "vpaddd %%ymm0,%%ymm0,%%ymm4 \n" // 6*near+2*far (1, lo) + "vpaddd %%ymm6,%%ymm2,%%ymm5 \n" // 3*near+far+8 (2, lo) + "vpaddd %%ymm4,%%ymm0,%%ymm4 \n" // 9*near+3*far (1, lo) + "vpaddd %%ymm4,%%ymm5,%%ymm4 \n" // 9 3 3 1 + 8 (1, lo) + "vpsrld $4,%%ymm4,%%ymm4 \n" // ^ div by 16 (1, lo) + + "vpaddd %%ymm2,%%ymm2,%%ymm5 \n" // 6*near+2*far (2, lo) + "vpaddd %%ymm6,%%ymm0,%%ymm0 \n" // 3*near+far+8 (1, lo) + "vpaddd %%ymm5,%%ymm2,%%ymm5 \n" // 9*near+3*far (2, lo) + "vpaddd %%ymm5,%%ymm0,%%ymm5 \n" // 9 3 3 1 + 8 (2, lo) + "vpsrld $4,%%ymm5,%%ymm5 \n" // ^ div by 16 (2, lo) + + "vpaddd %%ymm1,%%ymm1,%%ymm0 \n" // 6*near+2*far (1, hi) + "vpaddd %%ymm6,%%ymm3,%%ymm2 \n" // 3*near+far+8 (2, hi) + "vpaddd %%ymm0,%%ymm1,%%ymm0 \n" // 9*near+3*far (1, hi) + "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 9 3 3 1 + 8 (1, hi) + "vpsrld $4,%%ymm0,%%ymm0 \n" // ^ div by 16 (1, hi) + + "vpaddd %%ymm3,%%ymm3,%%ymm2 \n" // 6*near+2*far (2, hi) + "vpaddd %%ymm6,%%ymm1,%%ymm1 \n" // 3*near+far+8 (1, hi) + "vpaddd %%ymm2,%%ymm3,%%ymm2 \n" // 9*near+3*far (2, hi) + "vpaddd %%ymm2,%%ymm1,%%ymm2 \n" // 9 3 3 1 + 8 (2, hi) + "vpsrld $4,%%ymm2,%%ymm2 \n" // ^ div by 16 (2, hi) + + "vpackusdw %%ymm0,%%ymm4,%%ymm4 \n" + "vpshufd $0b11011000,%%ymm4,%%ymm4 \n" + "vmovdqu %%ymm4,(%1) \n" // store above + "vpackusdw %%ymm2,%%ymm5,%%ymm5 \n" + "vpshufd $0b11011000,%%ymm5,%%ymm5 \n" + "vmovdqu %%ymm5,(%1,%4,2) \n" // store below + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 8 pixel to 16 pixel + "sub $0x10,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + +// Reads 16xN bytes and produces 16 shorts at a time. +void ScaleAddRow_SSE2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width) { + asm volatile("pxor %%xmm5,%%xmm5 \n" + + // 16 pixel loop. + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm3 \n" + "lea 0x10(%0),%0 \n" // src_ptr += 16 + "movdqu (%1),%%xmm0 \n" + "movdqu 0x10(%1),%%xmm1 \n" + "movdqa %%xmm3,%%xmm2 \n" + "punpcklbw %%xmm5,%%xmm2 \n" + "punpckhbw %%xmm5,%%xmm3 \n" + "paddusw %%xmm2,%%xmm0 \n" + "paddusw %%xmm3,%%xmm1 \n" + "movdqu %%xmm0,(%1) \n" + "movdqu %%xmm1,0x10(%1) \n" + "lea 0x20(%1),%1 \n" + "sub $0x10,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(src_width) // %2 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); +} + +#ifdef HAS_SCALEADDROW_AVX2 +// Reads 32 bytes and accumulates to 32 shorts at a time. +void ScaleAddRow_AVX2(const uint8_t* src_ptr, + uint16_t* dst_ptr, + int src_width) { + asm volatile("vpxor %%ymm5,%%ymm5,%%ymm5 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm3 \n" + "lea 0x20(%0),%0 \n" // src_ptr += 32 + "vpermq $0xd8,%%ymm3,%%ymm3 \n" + "vpunpcklbw %%ymm5,%%ymm3,%%ymm2 \n" + "vpunpckhbw %%ymm5,%%ymm3,%%ymm3 \n" + "vpaddusw (%1),%%ymm2,%%ymm0 \n" + "vpaddusw 0x20(%1),%%ymm3,%%ymm1 \n" + "vmovdqu %%ymm0,(%1) \n" + "vmovdqu %%ymm1,0x20(%1) \n" + "lea 0x40(%1),%1 \n" + "sub $0x20,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(src_width) // %2 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); +} +#endif // HAS_SCALEADDROW_AVX2 + +// Constant for making pixels signed to avoid pmaddubsw +// saturation. +static const uvec8 kFsub80 = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}; + +// Constant for making pixels unsigned and adding .5 for rounding. +static const uvec16 kFadd40 = {0x4040, 0x4040, 0x4040, 0x4040, + 0x4040, 0x4040, 0x4040, 0x4040}; + +// Bilinear column filtering. SSSE3 version. +void ScaleFilterCols_SSSE3(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx) { + intptr_t x0, x1, temp_pixel; + asm volatile( + "movd %6,%%xmm2 \n" + "movd %7,%%xmm3 \n" + "movl $0x04040000,%k2 \n" + "movd %k2,%%xmm5 \n" + "pcmpeqb %%xmm6,%%xmm6 \n" + "psrlw $0x9,%%xmm6 \n" // 0x007f007f + "pcmpeqb %%xmm7,%%xmm7 \n" + "psrlw $15,%%xmm7 \n" // 0x00010001 + + "pextrw $0x1,%%xmm2,%k3 \n" + "subl $0x2,%5 \n" + "jl 29f \n" + "movdqa %%xmm2,%%xmm0 \n" + "paddd %%xmm3,%%xmm0 \n" + "punpckldq %%xmm0,%%xmm2 \n" + "punpckldq %%xmm3,%%xmm3 \n" + "paddd %%xmm3,%%xmm3 \n" + "pextrw $0x3,%%xmm2,%k4 \n" + + LABELALIGN + "2: \n" + "movdqa %%xmm2,%%xmm1 \n" + "paddd %%xmm3,%%xmm2 \n" + "movzwl 0x00(%1,%3,1),%k2 \n" + "movd %k2,%%xmm0 \n" + "psrlw $0x9,%%xmm1 \n" + "movzwl 0x00(%1,%4,1),%k2 \n" + "movd %k2,%%xmm4 \n" + "pshufb %%xmm5,%%xmm1 \n" + "punpcklwd %%xmm4,%%xmm0 \n" + "psubb %8,%%xmm0 \n" // make pixels signed. + "pxor %%xmm6,%%xmm1 \n" // 128 - f = (f ^ 127 ) + + // 1 + "paddusb %%xmm7,%%xmm1 \n" + "pmaddubsw %%xmm0,%%xmm1 \n" + "pextrw $0x1,%%xmm2,%k3 \n" + "pextrw $0x3,%%xmm2,%k4 \n" + "paddw %9,%%xmm1 \n" // make pixels unsigned. + "psrlw $0x7,%%xmm1 \n" + "packuswb %%xmm1,%%xmm1 \n" + "movd %%xmm1,%k2 \n" + "mov %w2,(%0) \n" + "lea 0x2(%0),%0 \n" + "subl $0x2,%5 \n" + "jge 2b \n" + + LABELALIGN + "29: \n" + "addl $0x1,%5 \n" + "jl 99f \n" + "movzwl 0x00(%1,%3,1),%k2 \n" + "movd %k2,%%xmm0 \n" + "psrlw $0x9,%%xmm2 \n" + "pshufb %%xmm5,%%xmm2 \n" + "psubb %8,%%xmm0 \n" // make pixels signed. + "pxor %%xmm6,%%xmm2 \n" + "paddusb %%xmm7,%%xmm2 \n" + "pmaddubsw %%xmm0,%%xmm2 \n" + "paddw %9,%%xmm2 \n" // make pixels unsigned. + "psrlw $0x7,%%xmm2 \n" + "packuswb %%xmm2,%%xmm2 \n" + "movd %%xmm2,%k2 \n" + "mov %b2,(%0) \n" + "99: \n" + : "+r"(dst_ptr), // %0 + "+r"(src_ptr), // %1 + "=&a"(temp_pixel), // %2 + "=&r"(x0), // %3 + "=&r"(x1), // %4 +#if defined(__x86_64__) + "+rm"(dst_width) // %5 +#else + "+m"(dst_width) // %5 +#endif + : "rm"(x), // %6 + "rm"(dx), // %7 +#if defined(__x86_64__) + "x"(kFsub80), // %8 + "x"(kFadd40) // %9 +#else + "m"(kFsub80), // %8 + "m"(kFadd40) // %9 +#endif + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} + +// Reads 4 pixels, duplicates them and writes 8 pixels. +// Alignment requirement: src_argb 16 byte aligned, dst_argb 16 byte aligned. +void ScaleColsUp2_SSE2(uint8_t* dst_ptr, + const uint8_t* src_ptr, + int dst_width, + int x, + int dx) { + (void)x; + (void)dx; + asm volatile(LABELALIGN + "1: \n" + "movdqu (%1),%%xmm0 \n" + "lea 0x10(%1),%1 \n" + "movdqa %%xmm0,%%xmm1 \n" + "punpcklbw %%xmm0,%%xmm0 \n" + "punpckhbw %%xmm1,%%xmm1 \n" + "movdqu %%xmm0,(%0) \n" + "movdqu %%xmm1,0x10(%0) \n" + "lea 0x20(%0),%0 \n" + "sub $0x20,%2 \n" + "jg 1b \n" + + : "+r"(dst_ptr), // %0 + "+r"(src_ptr), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1"); +} + +void ScaleARGBRowDown2_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width) { + (void)src_stride; + asm volatile(LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "lea 0x20(%0),%0 \n" + "shufps $0xdd,%%xmm1,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_argb), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1"); +} + +void ScaleARGBRowDown2Linear_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width) { + (void)src_stride; + asm volatile(LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "lea 0x20(%0),%0 \n" + "movdqa %%xmm0,%%xmm2 \n" + "shufps $0x88,%%xmm1,%%xmm0 \n" + "shufps $0xdd,%%xmm1,%%xmm2 \n" + "pavgb %%xmm2,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_argb), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1"); +} + +void ScaleARGBRowDown2Box_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + uint8_t* dst_argb, + int dst_width) { + asm volatile(LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" + "movdqu 0x10(%0),%%xmm1 \n" + "movdqu 0x00(%0,%3,1),%%xmm2 \n" + "movdqu 0x10(%0,%3,1),%%xmm3 \n" + "lea 0x20(%0),%0 \n" + "pavgb %%xmm2,%%xmm0 \n" + "pavgb %%xmm3,%%xmm1 \n" + "movdqa %%xmm0,%%xmm2 \n" + "shufps $0x88,%%xmm1,%%xmm0 \n" + "shufps $0xdd,%%xmm1,%%xmm2 \n" + "pavgb %%xmm2,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(dst_argb), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3"); +} + +// Reads 4 pixels at a time. +// Alignment requirement: dst_argb 16 byte aligned. +void ScaleARGBRowDownEven_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width) { + intptr_t src_stepx_x4 = (intptr_t)(src_stepx); + intptr_t src_stepx_x12; + (void)src_stride; + asm volatile( + "lea 0x00(,%1,4),%1 \n" + "lea 0x00(%1,%1,2),%4 \n" + + LABELALIGN + "1: \n" + "movd (%0),%%xmm0 \n" + "movd 0x00(%0,%1,1),%%xmm1 \n" + "punpckldq %%xmm1,%%xmm0 \n" + "movd 0x00(%0,%1,2),%%xmm2 \n" + "movd 0x00(%0,%4,1),%%xmm3 \n" + "lea 0x00(%0,%1,4),%0 \n" + "punpckldq %%xmm3,%%xmm2 \n" + "punpcklqdq %%xmm2,%%xmm0 \n" + "movdqu %%xmm0,(%2) \n" + "lea 0x10(%2),%2 \n" + "sub $0x4,%3 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(src_stepx_x4), // %1 + "+r"(dst_argb), // %2 + "+r"(dst_width), // %3 + "=&r"(src_stepx_x12) // %4 + ::"memory", + "cc", "xmm0", "xmm1", "xmm2", "xmm3"); +} + +// Blends four 2x2 to 4x1. +// Alignment requirement: dst_argb 16 byte aligned. +void ScaleARGBRowDownEvenBox_SSE2(const uint8_t* src_argb, + ptrdiff_t src_stride, + int src_stepx, + uint8_t* dst_argb, + int dst_width) { + intptr_t src_stepx_x4 = (intptr_t)(src_stepx); + intptr_t src_stepx_x12; + intptr_t row1 = (intptr_t)(src_stride); + asm volatile( + "lea 0x00(,%1,4),%1 \n" + "lea 0x00(%1,%1,2),%4 \n" + "lea 0x00(%0,%5,1),%5 \n" + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" + "movhps 0x00(%0,%1,1),%%xmm0 \n" + "movq 0x00(%0,%1,2),%%xmm1 \n" + "movhps 0x00(%0,%4,1),%%xmm1 \n" + "lea 0x00(%0,%1,4),%0 \n" + "movq (%5),%%xmm2 \n" + "movhps 0x00(%5,%1,1),%%xmm2 \n" + "movq 0x00(%5,%1,2),%%xmm3 \n" + "movhps 0x00(%5,%4,1),%%xmm3 \n" + "lea 0x00(%5,%1,4),%5 \n" + "pavgb %%xmm2,%%xmm0 \n" + "pavgb %%xmm3,%%xmm1 \n" + "movdqa %%xmm0,%%xmm2 \n" + "shufps $0x88,%%xmm1,%%xmm0 \n" + "shufps $0xdd,%%xmm1,%%xmm2 \n" + "pavgb %%xmm2,%%xmm0 \n" + "movdqu %%xmm0,(%2) \n" + "lea 0x10(%2),%2 \n" + "sub $0x4,%3 \n" + "jg 1b \n" + : "+r"(src_argb), // %0 + "+r"(src_stepx_x4), // %1 + "+r"(dst_argb), // %2 + "+rm"(dst_width), // %3 + "=&r"(src_stepx_x12), // %4 + "+r"(row1) // %5 + ::"memory", + "cc", "xmm0", "xmm1", "xmm2", "xmm3"); +} + +void ScaleARGBCols_SSE2(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx) { + intptr_t x0, x1; + asm volatile( + "movd %5,%%xmm2 \n" + "movd %6,%%xmm3 \n" + "pshufd $0x0,%%xmm2,%%xmm2 \n" + "pshufd $0x11,%%xmm3,%%xmm0 \n" + "paddd %%xmm0,%%xmm2 \n" + "paddd %%xmm3,%%xmm3 \n" + "pshufd $0x5,%%xmm3,%%xmm0 \n" + "paddd %%xmm0,%%xmm2 \n" + "paddd %%xmm3,%%xmm3 \n" + "pshufd $0x0,%%xmm3,%%xmm3 \n" + "pextrw $0x1,%%xmm2,%k0 \n" + "pextrw $0x3,%%xmm2,%k1 \n" + "cmp $0x0,%4 \n" + "jl 99f \n" + "sub $0x4,%4 \n" + "jl 49f \n" + + LABELALIGN + "40: \n" + "movd 0x00(%3,%0,4),%%xmm0 \n" + "movd 0x00(%3,%1,4),%%xmm1 \n" + "pextrw $0x5,%%xmm2,%k0 \n" + "pextrw $0x7,%%xmm2,%k1 \n" + "paddd %%xmm3,%%xmm2 \n" + "punpckldq %%xmm1,%%xmm0 \n" + "movd 0x00(%3,%0,4),%%xmm1 \n" + "movd 0x00(%3,%1,4),%%xmm4 \n" + "pextrw $0x1,%%xmm2,%k0 \n" + "pextrw $0x3,%%xmm2,%k1 \n" + "punpckldq %%xmm4,%%xmm1 \n" + "punpcklqdq %%xmm1,%%xmm0 \n" + "movdqu %%xmm0,(%2) \n" + "lea 0x10(%2),%2 \n" + "sub $0x4,%4 \n" + "jge 40b \n" + + "49: \n" + "test $0x2,%4 \n" + "je 29f \n" + "movd 0x00(%3,%0,4),%%xmm0 \n" + "movd 0x00(%3,%1,4),%%xmm1 \n" + "pextrw $0x5,%%xmm2,%k0 \n" + "punpckldq %%xmm1,%%xmm0 \n" + "movq %%xmm0,(%2) \n" + "lea 0x8(%2),%2 \n" + "29: \n" + "test $0x1,%4 \n" + "je 99f \n" + "movd 0x00(%3,%0,4),%%xmm0 \n" + "movd %%xmm0,(%2) \n" + "99: \n" + : "=&a"(x0), // %0 + "=&d"(x1), // %1 + "+r"(dst_argb), // %2 + "+r"(src_argb), // %3 + "+r"(dst_width) // %4 + : "rm"(x), // %5 + "rm"(dx) // %6 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); +} + +// Reads 4 pixels, duplicates them and writes 8 pixels. +// Alignment requirement: src_argb 16 byte aligned, dst_argb 16 byte aligned. +void ScaleARGBColsUp2_SSE2(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx) { + (void)x; + (void)dx; + asm volatile(LABELALIGN + "1: \n" + "movdqu (%1),%%xmm0 \n" + "lea 0x10(%1),%1 \n" + "movdqa %%xmm0,%%xmm1 \n" + "punpckldq %%xmm0,%%xmm0 \n" + "punpckhdq %%xmm1,%%xmm1 \n" + "movdqu %%xmm0,(%0) \n" + "movdqu %%xmm1,0x10(%0) \n" + "lea 0x20(%0),%0 \n" + "sub $0x8,%2 \n" + "jg 1b \n" + + : "+r"(dst_argb), // %0 + "+r"(src_argb), // %1 + "+r"(dst_width) // %2 + ::"memory", + "cc", "xmm0", "xmm1"); +} + +// Shuffle table for arranging 2 pixels into pairs for pmaddubsw +static const uvec8 kShuffleColARGB = { + 0u, 4u, 1u, 5u, 2u, 6u, 3u, 7u, // bbggrraa 1st pixel + 8u, 12u, 9u, 13u, 10u, 14u, 11u, 15u // bbggrraa 2nd pixel +}; + +// Shuffle table for duplicating 2 fractions into 8 bytes each +static const uvec8 kShuffleFractions = { + 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, +}; + +// Bilinear row filtering combines 4x2 -> 4x1. SSSE3 version +void ScaleARGBFilterCols_SSSE3(uint8_t* dst_argb, + const uint8_t* src_argb, + int dst_width, + int x, + int dx) { + intptr_t x0, x1; + asm volatile( + "movdqa %0,%%xmm4 \n" + "movdqa %1,%%xmm5 \n" + : + : "m"(kShuffleColARGB), // %0 + "m"(kShuffleFractions) // %1 + ); + + asm volatile( + "movd %5,%%xmm2 \n" + "movd %6,%%xmm3 \n" + "pcmpeqb %%xmm6,%%xmm6 \n" + "psrlw $0x9,%%xmm6 \n" + "pextrw $0x1,%%xmm2,%k3 \n" + "sub $0x2,%2 \n" + "jl 29f \n" + "movdqa %%xmm2,%%xmm0 \n" + "paddd %%xmm3,%%xmm0 \n" + "punpckldq %%xmm0,%%xmm2 \n" + "punpckldq %%xmm3,%%xmm3 \n" + "paddd %%xmm3,%%xmm3 \n" + "pextrw $0x3,%%xmm2,%k4 \n" + + LABELALIGN + "2: \n" + "movdqa %%xmm2,%%xmm1 \n" + "paddd %%xmm3,%%xmm2 \n" + "movq 0x00(%1,%3,4),%%xmm0 \n" + "psrlw $0x9,%%xmm1 \n" + "movhps 0x00(%1,%4,4),%%xmm0 \n" + "pshufb %%xmm5,%%xmm1 \n" + "pshufb %%xmm4,%%xmm0 \n" + "pxor %%xmm6,%%xmm1 \n" + "pmaddubsw %%xmm1,%%xmm0 \n" + "psrlw $0x7,%%xmm0 \n" + "pextrw $0x1,%%xmm2,%k3 \n" + "pextrw $0x3,%%xmm2,%k4 \n" + "packuswb %%xmm0,%%xmm0 \n" + "movq %%xmm0,(%0) \n" + "lea 0x8(%0),%0 \n" + "sub $0x2,%2 \n" + "jge 2b \n" + + LABELALIGN + "29: \n" + "add $0x1,%2 \n" + "jl 99f \n" + "psrlw $0x9,%%xmm2 \n" + "movq 0x00(%1,%3,4),%%xmm0 \n" + "pshufb %%xmm5,%%xmm2 \n" + "pshufb %%xmm4,%%xmm0 \n" + "pxor %%xmm6,%%xmm2 \n" + "pmaddubsw %%xmm2,%%xmm0 \n" + "psrlw $0x7,%%xmm0 \n" + "packuswb %%xmm0,%%xmm0 \n" + "movd %%xmm0,(%0) \n" + + LABELALIGN + "99: \n" // clang-format error. + + : "+r"(dst_argb), // %0 + "+r"(src_argb), // %1 + "+rm"(dst_width), // %2 + "=&r"(x0), // %3 + "=&r"(x1) // %4 + : "rm"(x), // %5 + "rm"(dx) // %6 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} + +// Divide num by div and return as 16.16 fixed point result. +int FixedDiv_X86(int num, int div) { + asm volatile( + "cdq \n" + "shld $0x10,%%eax,%%edx \n" + "shl $0x10,%%eax \n" + "idiv %1 \n" + "mov %0, %%eax \n" + : "+a"(num) // %0 + : "c"(div) // %1 + : "memory", "cc", "edx"); + return num; +} + +// Divide num - 1 by div - 1 and return as 16.16 fixed point result. +int FixedDiv1_X86(int num, int div) { + asm volatile( + "cdq \n" + "shld $0x10,%%eax,%%edx \n" + "shl $0x10,%%eax \n" + "sub $0x10001,%%eax \n" + "sbb $0x0,%%edx \n" + "sub $0x1,%1 \n" + "idiv %1 \n" + "mov %0, %%eax \n" + : "+a"(num) // %0 + : "c"(div) // %1 + : "memory", "cc", "edx"); + return num; +} + +#ifdef HAS_SCALEUVROWDOWN2BOX_SSSE3 +// Shuffle table for splitting UV into upper and lower part of register. +static const uvec8 kShuffleSplitUV = {0u, 2u, 4u, 6u, 8u, 10u, 12u, 14u, + 1u, 3u, 5u, 7u, 9u, 11u, 13u, 15u}; +static const uvec8 kShuffleMergeUV = {0u, 8u, 2u, 10u, 4u, 12u, + 6u, 14u, 0x80, 0x80, 0x80, 0x80, + 0x80, 0x80, 0x80, 0x80}; + +void ScaleUVRowDown2Box_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "pcmpeqb %%xmm4,%%xmm4 \n" // 01010101 + "psrlw $0xf,%%xmm4 \n" + "packuswb %%xmm4,%%xmm4 \n" + "pxor %%xmm5, %%xmm5 \n" // zero + "movdqa %4,%%xmm1 \n" // split shuffler + "movdqa %5,%%xmm3 \n" // merge shuffler + + LABELALIGN + "1: \n" + "movdqu (%0),%%xmm0 \n" // 8 UV row 0 + "movdqu 0x00(%0,%3,1),%%xmm2 \n" // 8 UV row 1 + "lea 0x10(%0),%0 \n" + "pshufb %%xmm1,%%xmm0 \n" // uuuuvvvv + "pshufb %%xmm1,%%xmm2 \n" + "pmaddubsw %%xmm4,%%xmm0 \n" // horizontal add + "pmaddubsw %%xmm4,%%xmm2 \n" + "paddw %%xmm2,%%xmm0 \n" // vertical add + "psrlw $0x1,%%xmm0 \n" // round + "pavgw %%xmm5,%%xmm0 \n" + "pshufb %%xmm3,%%xmm0 \n" // merge uv + "movq %%xmm0,(%1) \n" + "lea 0x8(%1),%1 \n" // 4 UV + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "m"(kShuffleSplitUV), // %4 + "m"(kShuffleMergeUV) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif // HAS_SCALEUVROWDOWN2BOX_SSSE3 + +#ifdef HAS_SCALEUVROWDOWN2BOX_AVX2 +void ScaleUVRowDown2Box_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" // 01010101 + "vpsrlw $0xf,%%ymm4,%%ymm4 \n" + "vpackuswb %%ymm4,%%ymm4,%%ymm4 \n" + "vpxor %%ymm5,%%ymm5,%%ymm5 \n" // zero + "vbroadcastf128 %4,%%ymm1 \n" // split shuffler + "vbroadcastf128 %5,%%ymm3 \n" // merge shuffler + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%ymm0 \n" // 16 UV row 0 + "vmovdqu 0x00(%0,%3,1),%%ymm2 \n" // 16 UV row 1 + "lea 0x20(%0),%0 \n" + "vpshufb %%ymm1,%%ymm0,%%ymm0 \n" // uuuuvvvv + "vpshufb %%ymm1,%%ymm2,%%ymm2 \n" + "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" // horizontal add + "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" + "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" // vertical add + "vpsrlw $0x1,%%ymm0,%%ymm0 \n" // round + "vpavgw %%ymm5,%%ymm0,%%ymm0 \n" + "vpshufb %%ymm3,%%ymm0,%%ymm0 \n" // merge uv + "vpermq $0xd8,%%ymm0,%%ymm0 \n" // combine qwords + "vmovdqu %%xmm0,(%1) \n" + "lea 0x10(%1),%1 \n" // 8 UV + "sub $0x8,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "m"(kShuffleSplitUV), // %4 + "m"(kShuffleMergeUV) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif // HAS_SCALEUVROWDOWN2BOX_AVX2 + +static const uvec8 kUVLinearMadd31 = {3, 1, 3, 1, 1, 3, 1, 3, + 3, 1, 3, 1, 1, 3, 1, 3}; + +#ifdef HAS_SCALEUVROWUP2LINEAR_SSSE3 +void ScaleUVRowUp2_Linear_SSSE3(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "pcmpeqw %%xmm4,%%xmm4 \n" + "psrlw $15,%%xmm4 \n" + "psllw $1,%%xmm4 \n" // all 2 + "movdqa %3,%%xmm3 \n" + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" // 00112233 (1u1v) + "movq 2(%0),%%xmm1 \n" // 11223344 (1u1v) + "punpcklbw %%xmm1,%%xmm0 \n" // 0101121223233434 (2u2v) + "movdqa %%xmm0,%%xmm2 \n" + "punpckhdq %%xmm0,%%xmm2 \n" // 2323232334343434 (2u2v) + "punpckldq %%xmm0,%%xmm0 \n" // 0101010112121212 (2u2v) + "pmaddubsw %%xmm3,%%xmm2 \n" // 3*near+far (1u1v16, hi) + "pmaddubsw %%xmm3,%%xmm0 \n" // 3*near+far (1u1v16, lo) + "paddw %%xmm4,%%xmm0 \n" // 3*near+far+2 (lo) + "paddw %%xmm4,%%xmm2 \n" // 3*near+far+2 (hi) + "psrlw $2,%%xmm0 \n" // 3/4*near+1/4*far (lo) + "psrlw $2,%%xmm2 \n" // 3/4*near+1/4*far (hi) + "packuswb %%xmm2,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 4 uv to 8 uv + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "m"(kUVLinearMadd31) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_SSSE3 +void ScaleUVRowUp2_Bilinear_SSSE3(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "pcmpeqw %%xmm6,%%xmm6 \n" + "psrlw $15,%%xmm6 \n" + "psllw $3,%%xmm6 \n" // all 8 + "movdqa %5,%%xmm7 \n" + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" // 00112233 (1u1v) + "movq 2(%0),%%xmm1 \n" // 11223344 (1u1v) + "punpcklbw %%xmm1,%%xmm0 \n" // 0101121223233434 (2u2v) + "movdqa %%xmm0,%%xmm2 \n" + "punpckhdq %%xmm0,%%xmm2 \n" // 2323232334343434 (2u2v) + "punpckldq %%xmm0,%%xmm0 \n" // 0101010112121212 (2u2v) + "pmaddubsw %%xmm7,%%xmm2 \n" // 3*near+far (1u1v16, hi) + "pmaddubsw %%xmm7,%%xmm0 \n" // 3*near+far (1u1v16, lo) + + "movq (%0,%3),%%xmm1 \n" + "movq 2(%0,%3),%%xmm4 \n" + "punpcklbw %%xmm4,%%xmm1 \n" + "movdqa %%xmm1,%%xmm3 \n" + "punpckhdq %%xmm1,%%xmm3 \n" + "punpckldq %%xmm1,%%xmm1 \n" + "pmaddubsw %%xmm7,%%xmm3 \n" // 3*near+far (2, hi) + "pmaddubsw %%xmm7,%%xmm1 \n" // 3*near+far (2, lo) + + // xmm0 xmm2 + // xmm1 xmm3 + + "movdqa %%xmm0,%%xmm4 \n" + "movdqa %%xmm1,%%xmm5 \n" + "paddw %%xmm0,%%xmm4 \n" // 6*near+2*far (1, lo) + "paddw %%xmm6,%%xmm5 \n" // 3*near+far+8 (2, lo) + "paddw %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo) + "paddw %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo) + "psrlw $4,%%xmm4 \n" // ^ div by 16 (1, lo) + + "movdqa %%xmm1,%%xmm5 \n" + "paddw %%xmm1,%%xmm5 \n" // 6*near+2*far (2, lo) + "paddw %%xmm6,%%xmm0 \n" // 3*near+far+8 (1, lo) + "paddw %%xmm1,%%xmm5 \n" // 9*near+3*far (2, lo) + "paddw %%xmm0,%%xmm5 \n" // 9 3 3 1 + 8 (2, lo) + "psrlw $4,%%xmm5 \n" // ^ div by 16 (2, lo) + + "movdqa %%xmm2,%%xmm0 \n" + "movdqa %%xmm3,%%xmm1 \n" + "paddw %%xmm2,%%xmm0 \n" // 6*near+2*far (1, hi) + "paddw %%xmm6,%%xmm1 \n" // 3*near+far+8 (2, hi) + "paddw %%xmm2,%%xmm0 \n" // 9*near+3*far (1, hi) + "paddw %%xmm1,%%xmm0 \n" // 9 3 3 1 + 8 (1, hi) + "psrlw $4,%%xmm0 \n" // ^ div by 16 (1, hi) + + "movdqa %%xmm3,%%xmm1 \n" + "paddw %%xmm3,%%xmm1 \n" // 6*near+2*far (2, hi) + "paddw %%xmm6,%%xmm2 \n" // 3*near+far+8 (1, hi) + "paddw %%xmm3,%%xmm1 \n" // 9*near+3*far (2, hi) + "paddw %%xmm2,%%xmm1 \n" // 9 3 3 1 + 8 (2, hi) + "psrlw $4,%%xmm1 \n" // ^ div by 16 (2, hi) + + "packuswb %%xmm0,%%xmm4 \n" + "movdqu %%xmm4,(%1) \n" // store above + "packuswb %%xmm1,%%xmm5 \n" + "movdqu %%xmm5,(%1,%4) \n" // store below + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 4 uv to 8 uv + "sub $0x8,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)), // %4 + "m"(kUVLinearMadd31) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_AVX2 + +void ScaleUVRowUp2_Linear_AVX2(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + asm volatile( + "vpcmpeqw %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrlw $15,%%ymm4,%%ymm4 \n" + "vpsllw $1,%%ymm4,%%ymm4 \n" // all 2 + "vbroadcastf128 %3,%%ymm3 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%xmm0 \n" + "vmovdqu 2(%0),%%xmm1 \n" + "vpermq $0b11011000,%%ymm0,%%ymm0 \n" + "vpermq $0b11011000,%%ymm1,%%ymm1 \n" + "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n" + "vpunpckhdq %%ymm0,%%ymm0,%%ymm2 \n" + "vpunpckldq %%ymm0,%%ymm0,%%ymm0 \n" + "vpmaddubsw %%ymm3,%%ymm2,%%ymm1 \n" // 3*near+far (hi) + "vpmaddubsw %%ymm3,%%ymm0,%%ymm0 \n" // 3*near+far (lo) + "vpaddw %%ymm4,%%ymm0,%%ymm0 \n" // 3*near+far+2 (lo) + "vpaddw %%ymm4,%%ymm1,%%ymm1 \n" // 3*near+far+2 (hi) + "vpsrlw $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far (lo) + "vpsrlw $2,%%ymm1,%%ymm1 \n" // 3/4*near+1/4*far (hi) + "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 8 uv to 16 uv + "sub $0x10,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "m"(kUVLinearMadd31) // %3 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); +} +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_AVX2 +void ScaleUVRowUp2_Bilinear_AVX2(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "vpcmpeqw %%ymm6,%%ymm6,%%ymm6 \n" + "vpsrlw $15,%%ymm6,%%ymm6 \n" + "vpsllw $3,%%ymm6,%%ymm6 \n" // all 8 + "vbroadcastf128 %5,%%ymm7 \n" + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%xmm0 \n" + "vmovdqu 2(%0),%%xmm1 \n" + "vpermq $0b11011000,%%ymm0,%%ymm0 \n" + "vpermq $0b11011000,%%ymm1,%%ymm1 \n" + "vpunpcklbw %%ymm1,%%ymm0,%%ymm0 \n" + "vpunpckhdq %%ymm0,%%ymm0,%%ymm2 \n" + "vpunpckldq %%ymm0,%%ymm0,%%ymm0 \n" + "vpmaddubsw %%ymm7,%%ymm2,%%ymm1 \n" // 3*near+far (1, hi) + "vpmaddubsw %%ymm7,%%ymm0,%%ymm0 \n" // 3*near+far (1, lo) + + "vmovdqu (%0,%3),%%xmm2 \n" // 0123456789ABCDEF + "vmovdqu 2(%0,%3),%%xmm3 \n" // 123456789ABCDEF0 + "vpermq $0b11011000,%%ymm2,%%ymm2 \n" + "vpermq $0b11011000,%%ymm3,%%ymm3 \n" + "vpunpcklbw %%ymm3,%%ymm2,%%ymm2 \n" + "vpunpckhdq %%ymm2,%%ymm2,%%ymm4 \n" + "vpunpckldq %%ymm2,%%ymm2,%%ymm2 \n" + "vpmaddubsw %%ymm7,%%ymm4,%%ymm3 \n" // 3*near+far (2, hi) + "vpmaddubsw %%ymm7,%%ymm2,%%ymm2 \n" // 3*near+far (2, lo) + + // ymm0 ymm1 + // ymm2 ymm3 + + "vpaddw %%ymm0,%%ymm0,%%ymm4 \n" // 6*near+2*far (1, lo) + "vpaddw %%ymm6,%%ymm2,%%ymm5 \n" // 3*near+far+8 (2, lo) + "vpaddw %%ymm4,%%ymm0,%%ymm4 \n" // 9*near+3*far (1, lo) + "vpaddw %%ymm4,%%ymm5,%%ymm4 \n" // 9 3 3 1 + 8 (1, lo) + "vpsrlw $4,%%ymm4,%%ymm4 \n" // ^ div by 16 (1, lo) + + "vpaddw %%ymm2,%%ymm2,%%ymm5 \n" // 6*near+2*far (2, lo) + "vpaddw %%ymm6,%%ymm0,%%ymm0 \n" // 3*near+far+8 (1, lo) + "vpaddw %%ymm5,%%ymm2,%%ymm5 \n" // 9*near+3*far (2, lo) + "vpaddw %%ymm5,%%ymm0,%%ymm5 \n" // 9 3 3 1 + 8 (2, lo) + "vpsrlw $4,%%ymm5,%%ymm5 \n" // ^ div by 16 (2, lo) + + "vpaddw %%ymm1,%%ymm1,%%ymm0 \n" // 6*near+2*far (1, hi) + "vpaddw %%ymm6,%%ymm3,%%ymm2 \n" // 3*near+far+8 (2, hi) + "vpaddw %%ymm0,%%ymm1,%%ymm0 \n" // 9*near+3*far (1, hi) + "vpaddw %%ymm0,%%ymm2,%%ymm0 \n" // 9 3 3 1 + 8 (1, hi) + "vpsrlw $4,%%ymm0,%%ymm0 \n" // ^ div by 16 (1, hi) + + "vpaddw %%ymm3,%%ymm3,%%ymm2 \n" // 6*near+2*far (2, hi) + "vpaddw %%ymm6,%%ymm1,%%ymm1 \n" // 3*near+far+8 (1, hi) + "vpaddw %%ymm2,%%ymm3,%%ymm2 \n" // 9*near+3*far (2, hi) + "vpaddw %%ymm2,%%ymm1,%%ymm2 \n" // 9 3 3 1 + 8 (2, hi) + "vpsrlw $4,%%ymm2,%%ymm2 \n" // ^ div by 16 (2, hi) + + "vpackuswb %%ymm0,%%ymm4,%%ymm4 \n" + "vmovdqu %%ymm4,(%1) \n" // store above + "vpackuswb %%ymm2,%%ymm5,%%ymm5 \n" + "vmovdqu %%ymm5,(%1,%4) \n" // store below + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 8 uv to 16 uv + "sub $0x10,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)), // %4 + "m"(kUVLinearMadd31) // %5 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_16_SSE2 +void ScaleUVRowUp2_Linear_16_SSE2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + asm volatile( + "pxor %%xmm5,%%xmm5 \n" + "pcmpeqd %%xmm4,%%xmm4 \n" + "psrld $31,%%xmm4 \n" + "pslld $1,%%xmm4 \n" // all 2 + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" // 0011 (16b, 1u1v) + "movq 4(%0),%%xmm1 \n" // 1122 (16b, 1u1v) + + "punpcklwd %%xmm5,%%xmm0 \n" // 0011 (32b, 1u1v) + "punpcklwd %%xmm5,%%xmm1 \n" // 1122 (32b, 1u1v) + + "movdqa %%xmm0,%%xmm2 \n" + "movdqa %%xmm1,%%xmm3 \n" + + "pshufd $0b01001110,%%xmm2,%%xmm2 \n" // 1100 (lo, far) + "pshufd $0b01001110,%%xmm3,%%xmm3 \n" // 2211 (hi, far) + + "paddd %%xmm4,%%xmm2 \n" // far+2 (lo) + "paddd %%xmm4,%%xmm3 \n" // far+2 (hi) + "paddd %%xmm0,%%xmm2 \n" // near+far+2 (lo) + "paddd %%xmm1,%%xmm3 \n" // near+far+2 (hi) + "paddd %%xmm0,%%xmm0 \n" // 2*near (lo) + "paddd %%xmm1,%%xmm1 \n" // 2*near (hi) + "paddd %%xmm2,%%xmm0 \n" // 3*near+far+2 (lo) + "paddd %%xmm3,%%xmm1 \n" // 3*near+far+2 (hi) + + "psrld $2,%%xmm0 \n" // 3/4*near+1/4*far (lo) + "psrld $2,%%xmm1 \n" // 3/4*near+1/4*far (hi) + "packusdw %%xmm1,%%xmm0 \n" + "movdqu %%xmm0,(%1) \n" + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 2 uv to 4 uv + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); +} +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_16_SSE2 +void ScaleUVRowUp2_Bilinear_16_SSE2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "pxor %%xmm7,%%xmm7 \n" + "pcmpeqd %%xmm6,%%xmm6 \n" + "psrld $31,%%xmm6 \n" + "pslld $3,%%xmm6 \n" // all 8 + + LABELALIGN + "1: \n" + "movq (%0),%%xmm0 \n" // 0011 (16b, 1u1v) + "movq 4(%0),%%xmm1 \n" // 1122 (16b, 1u1v) + "punpcklwd %%xmm7,%%xmm0 \n" // 0011 (near) (32b, 1u1v) + "punpcklwd %%xmm7,%%xmm1 \n" // 1122 (near) (32b, 1u1v) + "movdqa %%xmm0,%%xmm2 \n" + "movdqa %%xmm1,%%xmm3 \n" + "pshufd $0b01001110,%%xmm2,%%xmm2 \n" // 1100 (far) (1, lo) + "pshufd $0b01001110,%%xmm3,%%xmm3 \n" // 2211 (far) (1, hi) + "paddd %%xmm0,%%xmm2 \n" // near+far (1, lo) + "paddd %%xmm1,%%xmm3 \n" // near+far (1, hi) + "paddd %%xmm0,%%xmm0 \n" // 2*near (1, lo) + "paddd %%xmm1,%%xmm1 \n" // 2*near (1, hi) + "paddd %%xmm2,%%xmm0 \n" // 3*near+far (1, lo) + "paddd %%xmm3,%%xmm1 \n" // 3*near+far (1, hi) + + "movq (%0,%3,2),%%xmm2 \n" + "movq 4(%0,%3,2),%%xmm3 \n" + "punpcklwd %%xmm7,%%xmm2 \n" + "punpcklwd %%xmm7,%%xmm3 \n" + "movdqa %%xmm2,%%xmm4 \n" + "movdqa %%xmm3,%%xmm5 \n" + "pshufd $0b01001110,%%xmm4,%%xmm4 \n" // 1100 (far) (2, lo) + "pshufd $0b01001110,%%xmm5,%%xmm5 \n" // 2211 (far) (2, hi) + "paddd %%xmm2,%%xmm4 \n" // near+far (2, lo) + "paddd %%xmm3,%%xmm5 \n" // near+far (2, hi) + "paddd %%xmm2,%%xmm2 \n" // 2*near (2, lo) + "paddd %%xmm3,%%xmm3 \n" // 2*near (2, hi) + "paddd %%xmm4,%%xmm2 \n" // 3*near+far (2, lo) + "paddd %%xmm5,%%xmm3 \n" // 3*near+far (2, hi) + + "movdqa %%xmm0,%%xmm4 \n" + "movdqa %%xmm2,%%xmm5 \n" + "paddd %%xmm0,%%xmm4 \n" // 6*near+2*far (1, lo) + "paddd %%xmm6,%%xmm5 \n" // 3*near+far+8 (2, lo) + "paddd %%xmm0,%%xmm4 \n" // 9*near+3*far (1, lo) + "paddd %%xmm5,%%xmm4 \n" // 9 3 3 1 + 8 (1, lo) + "psrld $4,%%xmm4 \n" // ^ div by 16 (1, lo) + + "movdqa %%xmm2,%%xmm5 \n" + "paddd %%xmm2,%%xmm5 \n" // 6*near+2*far (2, lo) + "paddd %%xmm6,%%xmm0 \n" // 3*near+far+8 (1, lo) + "paddd %%xmm2,%%xmm5 \n" // 9*near+3*far (2, lo) + "paddd %%xmm0,%%xmm5 \n" // 9 3 3 1 + 8 (2, lo) + "psrld $4,%%xmm5 \n" // ^ div by 16 (2, lo) + + "movdqa %%xmm1,%%xmm0 \n" + "movdqa %%xmm3,%%xmm2 \n" + "paddd %%xmm1,%%xmm0 \n" // 6*near+2*far (1, hi) + "paddd %%xmm6,%%xmm2 \n" // 3*near+far+8 (2, hi) + "paddd %%xmm1,%%xmm0 \n" // 9*near+3*far (1, hi) + "paddd %%xmm2,%%xmm0 \n" // 9 3 3 1 + 8 (1, hi) + "psrld $4,%%xmm0 \n" // ^ div by 16 (1, hi) + + "movdqa %%xmm3,%%xmm2 \n" + "paddd %%xmm3,%%xmm2 \n" // 6*near+2*far (2, hi) + "paddd %%xmm6,%%xmm1 \n" // 3*near+far+8 (1, hi) + "paddd %%xmm3,%%xmm2 \n" // 9*near+3*far (2, hi) + "paddd %%xmm1,%%xmm2 \n" // 9 3 3 1 + 8 (2, hi) + "psrld $4,%%xmm2 \n" // ^ div by 16 (2, hi) + + "packusdw %%xmm0,%%xmm4 \n" + "movdqu %%xmm4,(%1) \n" // store above + "packusdw %%xmm2,%%xmm5 \n" + "movdqu %%xmm5,(%1,%4,2) \n" // store below + + "lea 0x8(%0),%0 \n" + "lea 0x10(%1),%1 \n" // 2 uv to 4 uv + "sub $0x4,%2 \n" + "jg 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", + "xmm7"); +} +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_16_AVX2 +void ScaleUVRowUp2_Linear_16_AVX2(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + asm volatile( + "vpcmpeqd %%ymm4,%%ymm4,%%ymm4 \n" + "vpsrld $31,%%ymm4,%%ymm4 \n" + "vpslld $1,%%ymm4,%%ymm4 \n" // all 2 + + LABELALIGN + "1: \n" + "vmovdqu (%0),%%xmm0 \n" // 00112233 (16b, 1u1v) + "vmovdqu 4(%0),%%xmm1 \n" // 11223344 (16b, 1u1v) + + "vpmovzxwd %%xmm0,%%ymm0 \n" // 01234567 (32b, 1u1v) + "vpmovzxwd %%xmm1,%%ymm1 \n" // 12345678 (32b, 1u1v) + + "vpshufd $0b01001110,%%ymm0,%%ymm2 \n" // 11003322 (lo, far) + "vpshufd $0b01001110,%%ymm1,%%ymm3 \n" // 22114433 (hi, far) + + "vpaddd %%ymm4,%%ymm2,%%ymm2 \n" // far+2 (lo) + "vpaddd %%ymm4,%%ymm3,%%ymm3 \n" // far+2 (hi) + "vpaddd %%ymm0,%%ymm2,%%ymm2 \n" // near+far+2 (lo) + "vpaddd %%ymm1,%%ymm3,%%ymm3 \n" // near+far+2 (hi) + "vpaddd %%ymm0,%%ymm0,%%ymm0 \n" // 2*near (lo) + "vpaddd %%ymm1,%%ymm1,%%ymm1 \n" // 2*near (hi) + "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 3*near+far+2 (lo) + "vpaddd %%ymm1,%%ymm3,%%ymm1 \n" // 3*near+far+2 (hi) + + "vpsrld $2,%%ymm0,%%ymm0 \n" // 3/4*near+1/4*far (lo) + "vpsrld $2,%%ymm1,%%ymm1 \n" // 3/4*near+1/4*far (hi) + "vpackusdw %%ymm1,%%ymm0,%%ymm0 \n" + "vmovdqu %%ymm0,(%1) \n" + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 4 uv to 8 uv + "sub $0x8,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); +} +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_16_AVX2 +void ScaleUVRowUp2_Bilinear_16_AVX2(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + asm volatile( + "vpcmpeqd %%ymm6,%%ymm6,%%ymm6 \n" + "vpsrld $31,%%ymm6,%%ymm6 \n" + "vpslld $3,%%ymm6,%%ymm6 \n" // all 8 + + LABELALIGN + "1: \n" + + "vmovdqu (%0),%%xmm0 \n" // 00112233 (16b, 1u1v) + "vmovdqu 4(%0),%%xmm1 \n" // 11223344 (16b, 1u1v) + "vpmovzxwd %%xmm0,%%ymm0 \n" // 01234567 (32b, 1u1v) + "vpmovzxwd %%xmm1,%%ymm1 \n" // 12345678 (32b, 1u1v) + "vpshufd $0b01001110,%%ymm0,%%ymm2 \n" // 11003322 (lo, far) + "vpshufd $0b01001110,%%ymm1,%%ymm3 \n" // 22114433 (hi, far) + "vpaddd %%ymm0,%%ymm2,%%ymm2 \n" // near+far (lo) + "vpaddd %%ymm1,%%ymm3,%%ymm3 \n" // near+far (hi) + "vpaddd %%ymm0,%%ymm0,%%ymm0 \n" // 2*near (lo) + "vpaddd %%ymm1,%%ymm1,%%ymm1 \n" // 2*near (hi) + "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 3*near+far (lo) + "vpaddd %%ymm1,%%ymm3,%%ymm1 \n" // 3*near+far (hi) + + "vmovdqu (%0,%3,2),%%xmm2 \n" // 00112233 (16b, 1u1v) + "vmovdqu 4(%0,%3,2),%%xmm3 \n" // 11223344 (16b, 1u1v) + "vpmovzxwd %%xmm2,%%ymm2 \n" // 01234567 (32b, 1u1v) + "vpmovzxwd %%xmm3,%%ymm3 \n" // 12345678 (32b, 1u1v) + "vpshufd $0b01001110,%%ymm2,%%ymm4 \n" // 11003322 (lo, far) + "vpshufd $0b01001110,%%ymm3,%%ymm5 \n" // 22114433 (hi, far) + "vpaddd %%ymm2,%%ymm4,%%ymm4 \n" // near+far (lo) + "vpaddd %%ymm3,%%ymm5,%%ymm5 \n" // near+far (hi) + "vpaddd %%ymm2,%%ymm2,%%ymm2 \n" // 2*near (lo) + "vpaddd %%ymm3,%%ymm3,%%ymm3 \n" // 2*near (hi) + "vpaddd %%ymm2,%%ymm4,%%ymm2 \n" // 3*near+far (lo) + "vpaddd %%ymm3,%%ymm5,%%ymm3 \n" // 3*near+far (hi) + + "vpaddd %%ymm0,%%ymm0,%%ymm4 \n" // 6*near+2*far (1, lo) + "vpaddd %%ymm6,%%ymm2,%%ymm5 \n" // 3*near+far+8 (2, lo) + "vpaddd %%ymm4,%%ymm0,%%ymm4 \n" // 9*near+3*far (1, lo) + "vpaddd %%ymm4,%%ymm5,%%ymm4 \n" // 9 3 3 1 + 8 (1, lo) + "vpsrld $4,%%ymm4,%%ymm4 \n" // ^ div by 16 (1, lo) + + "vpaddd %%ymm2,%%ymm2,%%ymm5 \n" // 6*near+2*far (2, lo) + "vpaddd %%ymm6,%%ymm0,%%ymm0 \n" // 3*near+far+8 (1, lo) + "vpaddd %%ymm5,%%ymm2,%%ymm5 \n" // 9*near+3*far (2, lo) + "vpaddd %%ymm5,%%ymm0,%%ymm5 \n" // 9 3 3 1 + 8 (2, lo) + "vpsrld $4,%%ymm5,%%ymm5 \n" // ^ div by 16 (2, lo) + + "vpaddd %%ymm1,%%ymm1,%%ymm0 \n" // 6*near+2*far (1, hi) + "vpaddd %%ymm6,%%ymm3,%%ymm2 \n" // 3*near+far+8 (2, hi) + "vpaddd %%ymm0,%%ymm1,%%ymm0 \n" // 9*near+3*far (1, hi) + "vpaddd %%ymm0,%%ymm2,%%ymm0 \n" // 9 3 3 1 + 8 (1, hi) + "vpsrld $4,%%ymm0,%%ymm0 \n" // ^ div by 16 (1, hi) + + "vpaddd %%ymm3,%%ymm3,%%ymm2 \n" // 6*near+2*far (2, hi) + "vpaddd %%ymm6,%%ymm1,%%ymm1 \n" // 3*near+far+8 (1, hi) + "vpaddd %%ymm2,%%ymm3,%%ymm2 \n" // 9*near+3*far (2, hi) + "vpaddd %%ymm2,%%ymm1,%%ymm2 \n" // 9 3 3 1 + 8 (2, hi) + "vpsrld $4,%%ymm2,%%ymm2 \n" // ^ div by 16 (2, hi) + + "vpackusdw %%ymm0,%%ymm4,%%ymm4 \n" + "vmovdqu %%ymm4,(%1) \n" // store above + "vpackusdw %%ymm2,%%ymm5,%%ymm5 \n" + "vmovdqu %%ymm5,(%1,%4,2) \n" // store below + + "lea 0x10(%0),%0 \n" + "lea 0x20(%1),%1 \n" // 4 uv to 8 uv + "sub $0x8,%2 \n" + "jg 1b \n" + "vzeroupper \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width) // %2 + : "r"((intptr_t)(src_stride)), // %3 + "r"((intptr_t)(dst_stride)) // %4 + : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); +} +#endif + +#endif // defined(__x86_64__) || defined(__i386__) + +#ifdef __cplusplus +} // extern "C" +} // namespace libyuv +#endif diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_mmi.cc b/third-party/libyuv/third_party/libyuv/source/scale_mmi.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_mmi.cc rename to third-party/libyuv/third_party/libyuv/source/scale_mmi.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_msa.cc b/third-party/libyuv/third_party/libyuv/source/scale_msa.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_msa.cc rename to third-party/libyuv/third_party/libyuv/source/scale_msa.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_neon.cc b/third-party/libyuv/third_party/libyuv/source/scale_neon.cc similarity index 65% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_neon.cc rename to third-party/libyuv/third_party/libyuv/source/scale_neon.cc index 572b4bfa9b..6a0d6e1b49 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_neon.cc +++ b/third-party/libyuv/third_party/libyuv/source/scale_neon.cc @@ -194,21 +194,21 @@ void ScaleRowDown34_0_Box_NEON(const uint8_t* src_ptr, "vmlal.u8 q10, d2, d24 \n" "vmlal.u8 q11, d3, d24 \n" - // (3 * line_0 + line_1) >> 2 + // (3 * line_0 + line_1 + 2) >> 2 "vqrshrn.u16 d0, q8, #2 \n" "vqrshrn.u16 d1, q9, #2 \n" "vqrshrn.u16 d2, q10, #2 \n" "vqrshrn.u16 d3, q11, #2 \n" - // a0 = (src[0] * 3 + s[1] * 1) >> 2 + // a0 = (src[0] * 3 + s[1] * 1 + 2) >> 2 "vmovl.u8 q8, d1 \n" "vmlal.u8 q8, d0, d24 \n" "vqrshrn.u16 d0, q8, #2 \n" - // a1 = (src[1] * 1 + s[2] * 1) >> 1 + // a1 = (src[1] * 1 + s[2] * 1 + 1) >> 1 "vrhadd.u8 d1, d1, d2 \n" - // a2 = (src[2] * 1 + s[3] * 3) >> 2 + // a2 = (src[2] * 1 + s[3] * 3 + 2) >> 2 "vmovl.u8 q8, d2 \n" "vmlal.u8 q8, d3, d24 \n" "vqrshrn.u16 d2, q8, #2 \n" @@ -240,15 +240,15 @@ void ScaleRowDown34_1_Box_NEON(const uint8_t* src_ptr, "vrhadd.u8 q0, q0, q2 \n" "vrhadd.u8 q1, q1, q3 \n" - // a0 = (src[0] * 3 + s[1] * 1) >> 2 + // a0 = (src[0] * 3 + s[1] * 1 + 2) >> 2 "vmovl.u8 q3, d1 \n" "vmlal.u8 q3, d0, d24 \n" "vqrshrn.u16 d0, q3, #2 \n" - // a1 = (src[1] * 1 + s[2] * 1) >> 1 + // a1 = (src[1] * 1 + s[2] * 1 + 1) >> 1 "vrhadd.u8 d1, d1, d2 \n" - // a2 = (src[2] * 1 + s[3] * 3) >> 2 + // a2 = (src[2] * 1 + s[3] * 3 + 2) >> 2 "vmovl.u8 q3, d2 \n" "vmlal.u8 q3, d3, d24 \n" "vqrshrn.u16 d2, q3, #2 \n" @@ -504,6 +504,484 @@ void ScaleRowDown38_2_Box_NEON(const uint8_t* src_ptr, : "q0", "q1", "q2", "q3", "q13", "q14", "memory", "cc"); } +void ScaleRowUp2_Linear_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + const uint8_t* src_temp = src_ptr + 1; + asm volatile( + "vmov.u8 d30, #3 \n" + + "1: \n" + "vld1.8 {d4}, [%0]! \n" // 01234567 + "vld1.8 {d5}, [%3]! \n" // 12345678 + + "vmovl.u8 q0, d4 \n" // 01234567 (16b) + "vmovl.u8 q1, d5 \n" // 12345678 (16b) + "vmlal.u8 q0, d5, d30 \n" // 3*near+far (odd) + "vmlal.u8 q1, d4, d30 \n" // 3*near+far (even) + + "vrshrn.u16 d1, q0, #2 \n" // 3/4*near+1/4*far (odd) + "vrshrn.u16 d0, q1, #2 \n" // 3/4*near+1/4*far (even) + + "vst2.8 {d0, d1}, [%1]! \n" // store + "subs %2, %2, #16 \n" // 8 sample -> 16 sample + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width), // %2 + "+r"(src_temp) // %3 + : + : "memory", "cc", "q0", "q1", "q2", "q15" // Clobber List + ); +} + +void ScaleRowUp2_Bilinear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint8_t* src_ptr1 = src_ptr + src_stride; + uint8_t* dst_ptr1 = dst_ptr + dst_stride; + const uint8_t* src_temp = src_ptr + 1; + const uint8_t* src_temp1 = src_ptr1 + 1; + + asm volatile( + "vmov.u16 q15, #3 \n" + "vmov.u8 d28, #3 \n" + + "1: \n" + "vld1.8 {d4}, [%0]! \n" // 01234567 + "vld1.8 {d5}, [%5]! \n" // 12345678 + + "vmovl.u8 q0, d4 \n" // 01234567 (16b) + "vmovl.u8 q1, d5 \n" // 12345678 (16b) + "vmlal.u8 q0, d5, d28 \n" // 3*near+far (1, odd) + "vmlal.u8 q1, d4, d28 \n" // 3*near+far (1, even) + + "vld1.8 {d8}, [%1]! \n" + "vld1.8 {d9}, [%6]! \n" + + "vmovl.u8 q2, d8 \n" + "vmovl.u8 q3, d9 \n" + "vmlal.u8 q2, d9, d28 \n" // 3*near+far (2, odd) + "vmlal.u8 q3, d8, d28 \n" // 3*near+far (2, even) + + // e o + // q1 q0 + // q3 q2 + + "vmovq q4, q2 \n" + "vmovq q5, q3 \n" + "vmla.u16 q4, q0, q15 \n" // 9 3 3 1 (1, odd) + "vmla.u16 q5, q1, q15 \n" // 9 3 3 1 (1, even) + "vmla.u16 q0, q2, q15 \n" // 9 3 3 1 (2, odd) + "vmla.u16 q1, q3, q15 \n" // 9 3 3 1 (2, even) + + // e o + // q5 q4 + // q1 q0 + + "vrshrn.u16 d2, q1, #4 \n" // 2, even + "vrshrn.u16 d3, q0, #4 \n" // 2, odd + "vrshrn.u16 d0, q5, #4 \n" // 1, even + "vrshrn.u16 d1, q4, #4 \n" // 1, odd + + "vst2.8 {d0, d1}, [%2]! \n" // store + "vst2.8 {d2, d3}, [%3]! \n" // store + "subs %4, %4, #16 \n" // 8 sample -> 16 sample + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_ptr1), // %3 + "+r"(dst_width), // %4 + "+r"(src_temp), // %5 + "+r"(src_temp1) // %6 + : + : "memory", "cc", "q0", "q1", "q2", "q3", "q4", "q5", "d28", + "q15" // Clobber List + ); +} + +void ScaleRowUp2_Linear_12_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + const uint16_t* src_temp = src_ptr + 1; + asm volatile( + "vmov.u16 q15, #3 \n" + + "1: \n" + "vld1.16 {q1}, [%0]! \n" // 01234567 (16b) + "vld1.16 {q0}, [%3]! \n" // 12345678 (16b) + + "vmovq q2, q0 \n" + "vmla.u16 q0, q1, q15 \n" // 3*near+far (odd) + "vmla.u16 q1, q2, q15 \n" // 3*near+far (even) + + "vrshr.u16 q0, q0, #2 \n" // 3/4*near+1/4*far (odd) + "vrshr.u16 q1, q1, #2 \n" // 3/4*near+1/4*far (even) + + "vst2.16 {d0, d1, d2, d3}, [%1]! \n" // store + "subs %2, %2, #16 \n" // 8 sample -> 16 sample + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width), // %2 + "+r"(src_temp) // %3 + : + : "memory", "cc", "q0", "q1", "q2", "q15" // Clobber List + ); +} + +void ScaleRowUp2_Bilinear_12_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint16_t* src_ptr1 = src_ptr + src_stride; + uint16_t* dst_ptr1 = dst_ptr + dst_stride; + const uint16_t* src_temp = src_ptr + 1; + const uint16_t* src_temp1 = src_ptr1 + 1; + + asm volatile( + "vmov.u16 q15, #3 \n" + + "1: \n" + "vld1.16 {q0}, [%0]! \n" // 01234567 (16b) + "vld1.16 {q1}, [%5]! \n" // 12345678 (16b) + + "vmovq q2, q0 \n" + "vmla.u16 q0, q1, q15 \n" // 3*near+far (odd) + "vmla.u16 q1, q2, q15 \n" // 3*near+far (even) + + "vld1.16 {q2}, [%1]! \n" // 01234567 (16b) + "vld1.16 {q3}, [%6]! \n" // 12345678 (16b) + + "vmovq q4, q2 \n" + "vmla.u16 q2, q3, q15 \n" // 3*near+far (odd) + "vmla.u16 q3, q4, q15 \n" // 3*near+far (even) + + "vmovq q4, q2 \n" + "vmovq q5, q3 \n" + "vmla.u16 q4, q0, q15 \n" // 9 3 3 1 (1, odd) + "vmla.u16 q5, q1, q15 \n" // 9 3 3 1 (1, even) + "vmla.u16 q0, q2, q15 \n" // 9 3 3 1 (2, odd) + "vmla.u16 q1, q3, q15 \n" // 9 3 3 1 (2, even) + + "vrshr.u16 q2, q1, #4 \n" // 2, even + "vrshr.u16 q3, q0, #4 \n" // 2, odd + "vrshr.u16 q0, q5, #4 \n" // 1, even + "vrshr.u16 q1, q4, #4 \n" // 1, odd + + "vst2.16 {d0, d1, d2, d3}, [%2]! \n" // store + "vst2.16 {d4, d5, d6, d7}, [%3]! \n" // store + "subs %4, %4, #16 \n" // 8 sample -> 16 sample + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_ptr1), // %3 + "+r"(dst_width), // %4 + "+r"(src_temp), // %5 + "+r"(src_temp1) // %6 + : + : "memory", "cc", "q0", "q1", "q2", "q3", "q4", "q5", + "q15" // Clobber List + ); +} + +void ScaleRowUp2_Linear_16_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + const uint16_t* src_temp = src_ptr + 1; + asm volatile( + "vmov.u16 d31, #3 \n" + + "1: \n" + "vld1.16 {q0}, [%0]! \n" // 01234567 (16b) + "vld1.16 {q1}, [%3]! \n" // 12345678 (16b) + + "vmovl.u16 q2, d0 \n" // 0123 (32b) + "vmovl.u16 q3, d1 \n" // 4567 (32b) + "vmovl.u16 q4, d2 \n" // 1234 (32b) + "vmovl.u16 q5, d3 \n" // 5678 (32b) + + "vmlal.u16 q2, d2, d31 \n" + "vmlal.u16 q3, d3, d31 \n" + "vmlal.u16 q4, d0, d31 \n" + "vmlal.u16 q5, d1, d31 \n" + + "vrshrn.u32 d0, q4, #2 \n" + "vrshrn.u32 d1, q5, #2 \n" + "vrshrn.u32 d2, q2, #2 \n" + "vrshrn.u32 d3, q3, #2 \n" + + "vst2.16 {q0, q1}, [%1]! \n" // store + "subs %2, %2, #16 \n" // 8 sample -> 16 sample + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width), // %2 + "+r"(src_temp) // %3 + : + : "memory", "cc", "q0", "q1", "q2", "q15" // Clobber List + ); +} + +void ScaleRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint16_t* src_ptr1 = src_ptr + src_stride; + uint16_t* dst_ptr1 = dst_ptr + dst_stride; + const uint16_t* src_temp = src_ptr + 1; + const uint16_t* src_temp1 = src_ptr1 + 1; + + asm volatile( + "vmov.u16 d31, #3 \n" + "vmov.u32 q14, #3 \n" + + "1: \n" + "vld1.16 {d0}, [%0]! \n" // 0123 (16b) + "vld1.16 {d1}, [%5]! \n" // 1234 (16b) + "vmovl.u16 q2, d0 \n" // 0123 (32b) + "vmovl.u16 q3, d1 \n" // 1234 (32b) + "vmlal.u16 q2, d1, d31 \n" + "vmlal.u16 q3, d0, d31 \n" + + "vld1.16 {d0}, [%1]! \n" // 0123 (16b) + "vld1.16 {d1}, [%6]! \n" // 1234 (16b) + "vmovl.u16 q4, d0 \n" // 0123 (32b) + "vmovl.u16 q5, d1 \n" // 1234 (32b) + "vmlal.u16 q4, d1, d31 \n" + "vmlal.u16 q5, d0, d31 \n" + + "vmovq q0, q4 \n" + "vmovq q1, q5 \n" + "vmla.u32 q4, q2, q14 \n" + "vmla.u32 q5, q3, q14 \n" + "vmla.u32 q2, q0, q14 \n" + "vmla.u32 q3, q1, q14 \n" + + "vrshrn.u32 d1, q4, #4 \n" + "vrshrn.u32 d0, q5, #4 \n" + "vrshrn.u32 d3, q2, #4 \n" + "vrshrn.u32 d2, q3, #4 \n" + + "vst2.16 {d0, d1}, [%2]! \n" // store + "vst2.16 {d2, d3}, [%3]! \n" // store + "subs %4, %4, #8 \n" // 4 sample -> 8 sample + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_ptr1), // %3 + "+r"(dst_width), // %4 + "+r"(src_temp), // %5 + "+r"(src_temp1) // %6 + : + : "memory", "cc", "q0", "q1", "q2", "q3", "q4", "q5", "q14", + "d31" // Clobber List + ); +} + +void ScaleUVRowUp2_Linear_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + const uint8_t* src_temp = src_ptr + 2; + asm volatile( + "vmov.u8 d30, #3 \n" + + "1: \n" + "vld1.8 {d4}, [%0]! \n" // 00112233 (1u1v) + "vld1.8 {d5}, [%3]! \n" // 11223344 (1u1v) + + "vmovl.u8 q0, d4 \n" // 00112233 (1u1v, 16b) + "vmovl.u8 q1, d5 \n" // 11223344 (1u1v, 16b) + "vmlal.u8 q0, d5, d30 \n" // 3*near+far (odd) + "vmlal.u8 q1, d4, d30 \n" // 3*near+far (even) + + "vrshrn.u16 d1, q0, #2 \n" // 3/4*near+1/4*far (odd) + "vrshrn.u16 d0, q1, #2 \n" // 3/4*near+1/4*far (even) + + "vst2.16 {d0, d1}, [%1]! \n" // store + "subs %2, %2, #8 \n" // 4 uv -> 8 uv + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width), // %2 + "+r"(src_temp) // %3 + : + : "memory", "cc", "q0", "q1", "q2", "d30" // Clobber List + ); +} + +void ScaleUVRowUp2_Bilinear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint8_t* src_ptr1 = src_ptr + src_stride; + uint8_t* dst_ptr1 = dst_ptr + dst_stride; + const uint8_t* src_temp = src_ptr + 2; + const uint8_t* src_temp1 = src_ptr1 + 2; + + asm volatile( + "vmov.u16 q15, #3 \n" + "vmov.u8 d28, #3 \n" + + "1: \n" + "vld1.8 {d4}, [%0]! \n" // 00112233 (1u1v) + "vld1.8 {d5}, [%5]! \n" // 11223344 (1u1v) + + "vmovl.u8 q0, d4 \n" // 00112233 (1u1v, 16b) + "vmovl.u8 q1, d5 \n" // 11223344 (1u1v, 16b) + "vmlal.u8 q0, d5, d28 \n" // 3*near+far (1, odd) + "vmlal.u8 q1, d4, d28 \n" // 3*near+far (1, even) + + "vld1.8 {d8}, [%1]! \n" // 00112233 (1u1v) + "vld1.8 {d9}, [%6]! \n" // 11223344 (1u1v) + + "vmovl.u8 q2, d8 \n" // 00112233 (1u1v, 16b) + "vmovl.u8 q3, d9 \n" // 11223344 (1u1v, 16b) + "vmlal.u8 q2, d9, d28 \n" // 3*near+far (2, odd) + "vmlal.u8 q3, d8, d28 \n" // 3*near+far (2, even) + + // e o + // q1 q0 + // q3 q2 + + "vmovq q4, q2 \n" + "vmovq q5, q3 \n" + "vmla.u16 q4, q0, q15 \n" // 9 3 3 1 (1, odd) + "vmla.u16 q5, q1, q15 \n" // 9 3 3 1 (1, even) + "vmla.u16 q0, q2, q15 \n" // 9 3 3 1 (2, odd) + "vmla.u16 q1, q3, q15 \n" // 9 3 3 1 (2, even) + + // e o + // q5 q4 + // q1 q0 + + "vrshrn.u16 d2, q1, #4 \n" // 2, even + "vrshrn.u16 d3, q0, #4 \n" // 2, odd + "vrshrn.u16 d0, q5, #4 \n" // 1, even + "vrshrn.u16 d1, q4, #4 \n" // 1, odd + + "vst2.16 {d0, d1}, [%2]! \n" // store + "vst2.16 {d2, d3}, [%3]! \n" // store + "subs %4, %4, #8 \n" // 4 uv -> 8 uv + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_ptr1), // %3 + "+r"(dst_width), // %4 + "+r"(src_temp), // %5 + "+r"(src_temp1) // %6 + : + : "memory", "cc", "q0", "q1", "q2", "q3", "q4", "q5", "d28", + "q15" // Clobber List + ); +} + +void ScaleUVRowUp2_Linear_16_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + const uint16_t* src_temp = src_ptr + 2; + asm volatile( + "vmov.u16 d30, #3 \n" + + "1: \n" + "vld1.16 {q0}, [%0]! \n" // 00112233 (1u1v, 16) + "vld1.16 {q1}, [%3]! \n" // 11223344 (1u1v, 16) + + "vmovl.u16 q2, d0 \n" // 0011 (1u1v, 32b) + "vmovl.u16 q3, d2 \n" // 1122 (1u1v, 32b) + "vmovl.u16 q4, d1 \n" // 2233 (1u1v, 32b) + "vmovl.u16 q5, d3 \n" // 3344 (1u1v, 32b) + "vmlal.u16 q2, d2, d30 \n" // 3*near+far (odd) + "vmlal.u16 q3, d0, d30 \n" // 3*near+far (even) + "vmlal.u16 q4, d3, d30 \n" // 3*near+far (odd) + "vmlal.u16 q5, d1, d30 \n" // 3*near+far (even) + + "vrshrn.u32 d1, q2, #2 \n" // 3/4*near+1/4*far (odd) + "vrshrn.u32 d0, q3, #2 \n" // 3/4*near+1/4*far (even) + "vrshrn.u32 d3, q4, #2 \n" // 3/4*near+1/4*far (odd) + "vrshrn.u32 d2, q5, #2 \n" // 3/4*near+1/4*far (even) + + "vst2.32 {d0, d1}, [%1]! \n" // store + "vst2.32 {d2, d3}, [%1]! \n" // store + "subs %2, %2, #8 \n" // 4 uv -> 8 uv + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(dst_ptr), // %1 + "+r"(dst_width), // %2 + "+r"(src_temp) // %3 + : + : "memory", "cc", "q0", "q1", "q2", "q3", "q4", "q5", + "d30" // Clobber List + ); +} + +void ScaleUVRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint16_t* src_ptr1 = src_ptr + src_stride; + uint16_t* dst_ptr1 = dst_ptr + dst_stride; + const uint16_t* src_temp = src_ptr + 2; + const uint16_t* src_temp1 = src_ptr1 + 2; + + asm volatile( + "vmov.u16 d30, #3 \n" + "vmov.u32 q14, #3 \n" + + "1: \n" + "vld1.8 {d0}, [%0]! \n" // 0011 (1u1v) + "vld1.8 {d1}, [%5]! \n" // 1122 (1u1v) + "vmovl.u16 q2, d0 \n" // 0011 (1u1v, 32b) + "vmovl.u16 q3, d1 \n" // 1122 (1u1v, 32b) + "vmlal.u16 q2, d1, d30 \n" // 3*near+far (1, odd) + "vmlal.u16 q3, d0, d30 \n" // 3*near+far (1, even) + + "vld1.8 {d0}, [%1]! \n" // 0011 (1u1v) + "vld1.8 {d1}, [%6]! \n" // 1122 (1u1v) + "vmovl.u16 q4, d0 \n" // 0011 (1u1v, 32b) + "vmovl.u16 q5, d1 \n" // 1122 (1u1v, 32b) + "vmlal.u16 q4, d1, d30 \n" // 3*near+far (2, odd) + "vmlal.u16 q5, d0, d30 \n" // 3*near+far (2, even) + + "vmovq q0, q4 \n" + "vmovq q1, q5 \n" + "vmla.u32 q4, q2, q14 \n" // 9 3 3 1 (1, odd) + "vmla.u32 q5, q3, q14 \n" // 9 3 3 1 (1, even) + "vmla.u32 q2, q0, q14 \n" // 9 3 3 1 (2, odd) + "vmla.u32 q3, q1, q14 \n" // 9 3 3 1 (2, even) + + "vrshrn.u32 d1, q4, #4 \n" // 1, odd + "vrshrn.u32 d0, q5, #4 \n" // 1, even + "vrshrn.u32 d3, q2, #4 \n" // 2, odd + "vrshrn.u32 d2, q3, #4 \n" // 2, even + + "vst2.32 {d0, d1}, [%2]! \n" // store + "vst2.32 {d2, d3}, [%3]! \n" // store + "subs %4, %4, #4 \n" // 2 uv -> 4 uv + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_ptr1), // %3 + "+r"(dst_width), // %4 + "+r"(src_temp), // %5 + "+r"(src_temp1) // %6 + : + : "memory", "cc", "q0", "q1", "q2", "q3", "q4", "q5", "q14", + "d30" // Clobber List + ); +} + // Add a row of bytes to a row of shorts. Used for box filter. // Reads 16 bytes and accumulates to 16 shorts at a time. void ScaleAddRow_NEON(const uint8_t* src_ptr, @@ -991,20 +1469,20 @@ void ScaleUVRowDownEven_NEON(const uint8_t* src_ptr, (void)src_stride; asm volatile( "1: \n" - "vld1.16 {d0[0]}, [%0], %6 \n" - "vld1.16 {d0[1]}, [%1], %6 \n" - "vld1.16 {d0[2]}, [%2], %6 \n" - "vld1.16 {d0[3]}, [%3], %6 \n" - "subs %5, %5, #4 \n" // 4 pixels per loop. - "vst1.8 {d0}, [%4]! \n" - "bgt 1b \n" - : "+r"(src_ptr), // %0 - "+r"(src1_ptr), // %1 - "+r"(src2_ptr), // %2 - "+r"(src3_ptr), // %3 - "+r"(dst_ptr), // %4 - "+r"(dst_width) // %5 - : "r"(src_stepx * 8) // %6 + "vld1.16 {d0[0]}, [%0], %6 \n" + "vld1.16 {d0[1]}, [%1], %6 \n" + "vld1.16 {d0[2]}, [%2], %6 \n" + "vld1.16 {d0[3]}, [%3], %6 \n" + "subs %5, %5, #4 \n" // 4 pixels per loop. + "vst1.8 {d0}, [%4]! \n" + "bgt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src1_ptr), // %1 + "+r"(src2_ptr), // %2 + "+r"(src3_ptr), // %3 + "+r"(dst_ptr), // %4 + "+r"(dst_width) // %5 + : "r"(src_stepx * 8) // %6 : "memory", "cc", "d0"); } diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_neon64.cc b/third-party/libyuv/third_party/libyuv/source/scale_neon64.cc similarity index 68% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_neon64.cc rename to third-party/libyuv/third_party/libyuv/source/scale_neon64.cc index 185591cb55..9f9636e646 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_neon64.cc +++ b/third-party/libyuv/third_party/libyuv/source/scale_neon64.cc @@ -201,22 +201,22 @@ void ScaleRowDown34_0_Box_NEON(const uint8_t* src_ptr, "umlal v19.8h, v3.8b, v20.8b \n" "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead - // (3 * line_0 + line_1) >> 2 + // (3 * line_0 + line_1 + 2) >> 2 "uqrshrn v0.8b, v16.8h, #2 \n" "uqrshrn v1.8b, v17.8h, #2 \n" "uqrshrn v2.8b, v18.8h, #2 \n" "uqrshrn v3.8b, v19.8h, #2 \n" "prfm pldl1keep, [%3, 448] \n" - // a0 = (src[0] * 3 + s[1] * 1) >> 2 + // a0 = (src[0] * 3 + s[1] * 1 + 2) >> 2 "ushll v16.8h, v1.8b, #0 \n" "umlal v16.8h, v0.8b, v20.8b \n" "uqrshrn v0.8b, v16.8h, #2 \n" - // a1 = (src[1] * 1 + s[2] * 1) >> 1 + // a1 = (src[1] * 1 + s[2] * 1 + 1) >> 1 "urhadd v1.8b, v1.8b, v2.8b \n" - // a2 = (src[2] * 1 + s[3] * 3) >> 2 + // a2 = (src[2] * 1 + s[3] * 3 + 2) >> 2 "ushll v16.8h, v2.8b, #0 \n" "umlal v16.8h, v3.8b, v20.8b \n" "uqrshrn v2.8b, v16.8h, #2 \n" @@ -251,16 +251,16 @@ void ScaleRowDown34_1_Box_NEON(const uint8_t* src_ptr, "urhadd v3.8b, v3.8b, v7.8b \n" "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead - // a0 = (src[0] * 3 + s[1] * 1) >> 2 + // a0 = (src[0] * 3 + s[1] * 1 + 2) >> 2 "ushll v4.8h, v1.8b, #0 \n" "umlal v4.8h, v0.8b, v20.8b \n" "uqrshrn v0.8b, v4.8h, #2 \n" "prfm pldl1keep, [%3, 448] \n" - // a1 = (src[1] * 1 + s[2] * 1) >> 1 + // a1 = (src[1] * 1 + s[2] * 1 + 1) >> 1 "urhadd v1.8b, v1.8b, v2.8b \n" - // a2 = (src[2] * 1 + s[3] * 3) >> 2 + // a2 = (src[2] * 1 + s[3] * 3 + 2) >> 2 "ushll v4.8h, v2.8b, #0 \n" "umlal v4.8h, v3.8b, v20.8b \n" "uqrshrn v2.8b, v4.8h, #2 \n" @@ -535,6 +535,488 @@ void ScaleRowDown38_2_Box_NEON(const uint8_t* src_ptr, "v19", "v30", "v31", "memory", "cc"); } +void ScaleRowUp2_Linear_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + const uint8_t* src_temp = src_ptr + 1; + asm volatile( + "movi v31.8b, #3 \n" + + "1: \n" + "ldr d0, [%0], #8 \n" // 01234567 + "ldr d1, [%1], #8 \n" // 12345678 + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + + "ushll v2.8h, v0.8b, #0 \n" // 01234567 (16b) + "ushll v3.8h, v1.8b, #0 \n" // 12345678 (16b) + + "umlal v2.8h, v1.8b, v31.8b \n" // 3*near+far (odd) + "umlal v3.8h, v0.8b, v31.8b \n" // 3*near+far (even) + + "rshrn v2.8b, v2.8h, #2 \n" // 3/4*near+1/4*far (odd) + "rshrn v1.8b, v3.8h, #2 \n" // 3/4*near+1/4*far (even) + + "st2 {v1.8b, v2.8b}, [%2], #16 \n" // store + "subs %w3, %w3, #16 \n" // 8 sample -> 16 sample + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_temp), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_width) // %3 + : + : "memory", "cc", "v0", "v1", "v2", "v3", "v31" // Clobber List + ); +} + +void ScaleRowUp2_Bilinear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint8_t* src_ptr1 = src_ptr + src_stride; + uint8_t* dst_ptr1 = dst_ptr + dst_stride; + const uint8_t* src_temp = src_ptr + 1; + const uint8_t* src_temp1 = src_ptr1 + 1; + + asm volatile( + "movi v31.8b, #3 \n" + "movi v30.8h, #3 \n" + + "1: \n" + "ldr d0, [%0], #8 \n" // 01234567 + "ldr d1, [%2], #8 \n" // 12345678 + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + + "ushll v2.8h, v0.8b, #0 \n" // 01234567 (16b) + "ushll v3.8h, v1.8b, #0 \n" // 12345678 (16b) + "umlal v2.8h, v1.8b, v31.8b \n" // 3*near+far (1, odd) + "umlal v3.8h, v0.8b, v31.8b \n" // 3*near+far (1, even) + + "ldr d0, [%1], #8 \n" + "ldr d1, [%3], #8 \n" + "prfm pldl1keep, [%1, 448] \n" // prefetch 7 lines ahead + + "ushll v4.8h, v0.8b, #0 \n" // 01234567 (16b) + "ushll v5.8h, v1.8b, #0 \n" // 12345678 (16b) + "umlal v4.8h, v1.8b, v31.8b \n" // 3*near+far (2, odd) + "umlal v5.8h, v0.8b, v31.8b \n" // 3*near+far (2, even) + + "mov v0.16b, v4.16b \n" + "mov v1.16b, v5.16b \n" + "mla v4.8h, v2.8h, v30.8h \n" // 9 3 3 1 (1, odd) + "mla v5.8h, v3.8h, v30.8h \n" // 9 3 3 1 (1, even) + "mla v2.8h, v0.8h, v30.8h \n" // 9 3 3 1 (2, odd) + "mla v3.8h, v1.8h, v30.8h \n" // 9 3 3 1 (2, even) + + "rshrn v2.8b, v2.8h, #4 \n" // 2, odd + "rshrn v1.8b, v3.8h, #4 \n" // 2, even + "rshrn v4.8b, v4.8h, #4 \n" // 1, odd + "rshrn v3.8b, v5.8h, #4 \n" // 1, even + + "st2 {v1.8b, v2.8b}, [%5], #16 \n" // store 1 + "st2 {v3.8b, v4.8b}, [%4], #16 \n" // store 2 + "subs %w6, %w6, #16 \n" // 8 sample -> 16 sample + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(src_temp), // %2 + "+r"(src_temp1), // %3 + "+r"(dst_ptr), // %4 + "+r"(dst_ptr1), // %5 + "+r"(dst_width) // %6 + : + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v30", + "v31" // Clobber List + ); +} + +void ScaleRowUp2_Linear_12_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + const uint16_t* src_temp = src_ptr + 1; + asm volatile( + "movi v31.8h, #3 \n" + + "1: \n" + "ld1 {v0.8h}, [%0], #16 \n" // 01234567 (16b) + "ld1 {v1.8h}, [%1], #16 \n" // 12345678 (16b) + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + + "mov v2.16b, v0.16b \n" + "mla v0.8h, v1.8h, v31.8h \n" // 3*near+far (odd) + "mla v1.8h, v2.8h, v31.8h \n" // 3*near+far (even) + + "urshr v2.8h, v0.8h, #2 \n" // 3/4*near+1/4*far (odd) + "urshr v1.8h, v1.8h, #2 \n" // 3/4*near+1/4*far (even) + + "st2 {v1.8h, v2.8h}, [%2], #32 \n" // store + "subs %w3, %w3, #16 \n" // 8 sample -> 16 sample + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_temp), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_width) // %3 + : + : "memory", "cc", "v0", "v1", "v2", "v31" // Clobber List + ); +} + +void ScaleRowUp2_Bilinear_12_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint16_t* src_ptr1 = src_ptr + src_stride; + uint16_t* dst_ptr1 = dst_ptr + dst_stride; + const uint16_t* src_temp = src_ptr + 1; + const uint16_t* src_temp1 = src_ptr1 + 1; + + asm volatile( + "movi v31.8h, #3 \n" + + "1: \n" + "ld1 {v2.8h}, [%0], #16 \n" // 01234567 (16b) + "ld1 {v3.8h}, [%2], #16 \n" // 12345678 (16b) + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + + "mov v0.16b, v2.16b \n" + "mla v2.8h, v3.8h, v31.8h \n" // 3*near+far (odd) + "mla v3.8h, v0.8h, v31.8h \n" // 3*near+far (even) + + "ld1 {v4.8h}, [%1], #16 \n" // 01234567 (16b) + "ld1 {v5.8h}, [%3], #16 \n" // 12345678 (16b) + "prfm pldl1keep, [%1, 448] \n" // prefetch 7 lines ahead + + "mov v0.16b, v4.16b \n" + "mla v4.8h, v5.8h, v31.8h \n" // 3*near+far (odd) + "mla v5.8h, v0.8h, v31.8h \n" // 3*near+far (even) + + "mov v0.16b, v4.16b \n" + "mov v1.16b, v5.16b \n" + "mla v4.8h, v2.8h, v31.8h \n" // 9 3 3 1 (1, odd) + "mla v5.8h, v3.8h, v31.8h \n" // 9 3 3 1 (1, even) + "mla v2.8h, v0.8h, v31.8h \n" // 9 3 3 1 (2, odd) + "mla v3.8h, v1.8h, v31.8h \n" // 9 3 3 1 (2, even) + + "urshr v2.8h, v2.8h, #4 \n" // 2, odd + "urshr v1.8h, v3.8h, #4 \n" // 2, even + "urshr v4.8h, v4.8h, #4 \n" // 1, odd + "urshr v3.8h, v5.8h, #4 \n" // 1, even + + "st2 {v3.8h, v4.8h}, [%4], #32 \n" // store 1 + "st2 {v1.8h, v2.8h}, [%5], #32 \n" // store 2 + + "subs %w6, %w6, #16 \n" // 8 sample -> 16 sample + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(src_temp), // %2 + "+r"(src_temp1), // %3 + "+r"(dst_ptr), // %4 + "+r"(dst_ptr1), // %5 + "+r"(dst_width) // %6 + : + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", + "v31" // Clobber List + ); +} + +void ScaleRowUp2_Linear_16_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + const uint16_t* src_temp = src_ptr + 1; + asm volatile( + "movi v31.8h, #3 \n" + + "1: \n" + "ld1 {v0.8h}, [%0], #16 \n" // 01234567 (16b) + "ld1 {v1.8h}, [%1], #16 \n" // 12345678 (16b) + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + + "ushll v2.4s, v0.4h, #0 \n" // 0123 (32b) + "ushll2 v3.4s, v0.8h, #0 \n" // 4567 (32b) + "ushll v4.4s, v1.4h, #0 \n" // 1234 (32b) + "ushll2 v5.4s, v1.8h, #0 \n" // 5678 (32b) + + "umlal v2.4s, v1.4h, v31.4h \n" // 3*near+far (1, odd) + "umlal2 v3.4s, v1.8h, v31.8h \n" // 3*near+far (2, odd) + "umlal v4.4s, v0.4h, v31.4h \n" // 3*near+far (1, even) + "umlal2 v5.4s, v0.8h, v31.8h \n" // 3*near+far (2, even) + + "rshrn v0.4h, v4.4s, #2 \n" // 3/4*near+1/4*far + "rshrn2 v0.8h, v5.4s, #2 \n" // 3/4*near+1/4*far (even) + "rshrn v1.4h, v2.4s, #2 \n" // 3/4*near+1/4*far + "rshrn2 v1.8h, v3.4s, #2 \n" // 3/4*near+1/4*far (odd) + + "st2 {v0.8h, v1.8h}, [%2], #32 \n" // store + "subs %w3, %w3, #16 \n" // 8 sample -> 16 sample + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_temp), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_width) // %3 + : + : "memory", "cc", "v0", "v1", "v2", "v31" // Clobber List + ); +} + +void ScaleRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint16_t* src_ptr1 = src_ptr + src_stride; + uint16_t* dst_ptr1 = dst_ptr + dst_stride; + const uint16_t* src_temp = src_ptr + 1; + const uint16_t* src_temp1 = src_ptr1 + 1; + + asm volatile( + "movi v31.4h, #3 \n" + "movi v30.4s, #3 \n" + + "1: \n" + "ldr d0, [%0], #8 \n" // 0123 (16b) + "ldr d1, [%2], #8 \n" // 1234 (16b) + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + "ushll v2.4s, v0.4h, #0 \n" // 0123 (32b) + "ushll v3.4s, v1.4h, #0 \n" // 1234 (32b) + "umlal v2.4s, v1.4h, v31.4h \n" // 3*near+far (1, odd) + "umlal v3.4s, v0.4h, v31.4h \n" // 3*near+far (1, even) + + "ldr d0, [%1], #8 \n" // 0123 (16b) + "ldr d1, [%3], #8 \n" // 1234 (16b) + "prfm pldl1keep, [%1, 448] \n" // prefetch 7 lines ahead + "ushll v4.4s, v0.4h, #0 \n" // 0123 (32b) + "ushll v5.4s, v1.4h, #0 \n" // 1234 (32b) + "umlal v4.4s, v1.4h, v31.4h \n" // 3*near+far (2, odd) + "umlal v5.4s, v0.4h, v31.4h \n" // 3*near+far (2, even) + + "mov v0.16b, v4.16b \n" + "mov v1.16b, v5.16b \n" + "mla v4.4s, v2.4s, v30.4s \n" // 9 3 3 1 (1, odd) + "mla v5.4s, v3.4s, v30.4s \n" // 9 3 3 1 (1, even) + "mla v2.4s, v0.4s, v30.4s \n" // 9 3 3 1 (2, odd) + "mla v3.4s, v1.4s, v30.4s \n" // 9 3 3 1 (2, even) + + "rshrn v1.4h, v4.4s, #4 \n" // 3/4*near+1/4*far + "rshrn v0.4h, v5.4s, #4 \n" // 3/4*near+1/4*far + "rshrn v5.4h, v2.4s, #4 \n" // 3/4*near+1/4*far + "rshrn v4.4h, v3.4s, #4 \n" // 3/4*near+1/4*far + + "st2 {v0.4h, v1.4h}, [%4], #16 \n" // store 1 + "st2 {v4.4h, v5.4h}, [%5], #16 \n" // store 2 + + "subs %w6, %w6, #8 \n" // 4 sample -> 8 sample + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(src_temp), // %2 + "+r"(src_temp1), // %3 + "+r"(dst_ptr), // %4 + "+r"(dst_ptr1), // %5 + "+r"(dst_width) // %6 + : + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v30", + "v31" // Clobber List + ); +} + +void ScaleUVRowUp2_Linear_NEON(const uint8_t* src_ptr, + uint8_t* dst_ptr, + int dst_width) { + const uint8_t* src_temp = src_ptr + 2; + asm volatile( + "movi v31.8b, #3 \n" + + "1: \n" + "ldr d0, [%0], #8 \n" // 00112233 (1u1v) + "ldr d1, [%1], #8 \n" // 11223344 (1u1v) + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + + "ushll v2.8h, v0.8b, #0 \n" // 00112233 (1u1v, 16b) + "ushll v3.8h, v1.8b, #0 \n" // 11223344 (1u1v, 16b) + + "umlal v2.8h, v1.8b, v31.8b \n" // 3*near+far (odd) + "umlal v3.8h, v0.8b, v31.8b \n" // 3*near+far (even) + + "rshrn v2.8b, v2.8h, #2 \n" // 3/4*near+1/4*far (odd) + "rshrn v1.8b, v3.8h, #2 \n" // 3/4*near+1/4*far (even) + + "st2 {v1.4h, v2.4h}, [%2], #16 \n" // store + "subs %w3, %w3, #8 \n" // 4 uv -> 8 uv + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_temp), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_width) // %3 + : + : "memory", "cc", "v0", "v1", "v2", "v3", "v31" // Clobber List + ); +} + +void ScaleUVRowUp2_Bilinear_NEON(const uint8_t* src_ptr, + ptrdiff_t src_stride, + uint8_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint8_t* src_ptr1 = src_ptr + src_stride; + uint8_t* dst_ptr1 = dst_ptr + dst_stride; + const uint8_t* src_temp = src_ptr + 2; + const uint8_t* src_temp1 = src_ptr1 + 2; + + asm volatile( + "movi v31.8b, #3 \n" + "movi v30.8h, #3 \n" + + "1: \n" + "ldr d0, [%0], #8 \n" + "ldr d1, [%2], #8 \n" + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + + "ushll v2.8h, v0.8b, #0 \n" + "ushll v3.8h, v1.8b, #0 \n" + "umlal v2.8h, v1.8b, v31.8b \n" // 3*near+far (1, odd) + "umlal v3.8h, v0.8b, v31.8b \n" // 3*near+far (1, even) + + "ldr d0, [%1], #8 \n" + "ldr d1, [%3], #8 \n" + "prfm pldl1keep, [%1, 448] \n" // prefetch 7 lines ahead + + "ushll v4.8h, v0.8b, #0 \n" + "ushll v5.8h, v1.8b, #0 \n" + "umlal v4.8h, v1.8b, v31.8b \n" // 3*near+far (2, odd) + "umlal v5.8h, v0.8b, v31.8b \n" // 3*near+far (2, even) + + "mov v0.16b, v4.16b \n" + "mov v1.16b, v5.16b \n" + "mla v4.8h, v2.8h, v30.8h \n" // 9 3 3 1 (1, odd) + "mla v5.8h, v3.8h, v30.8h \n" // 9 3 3 1 (1, even) + "mla v2.8h, v0.8h, v30.8h \n" // 9 3 3 1 (2, odd) + "mla v3.8h, v1.8h, v30.8h \n" // 9 3 3 1 (2, even) + + "rshrn v2.8b, v2.8h, #4 \n" // 2, odd + "rshrn v1.8b, v3.8h, #4 \n" // 2, even + "rshrn v4.8b, v4.8h, #4 \n" // 1, odd + "rshrn v3.8b, v5.8h, #4 \n" // 1, even + + "st2 {v1.4h, v2.4h}, [%5], #16 \n" // store 2 + "st2 {v3.4h, v4.4h}, [%4], #16 \n" // store 1 + "subs %w6, %w6, #8 \n" // 4 uv -> 8 uv + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(src_temp), // %2 + "+r"(src_temp1), // %3 + "+r"(dst_ptr), // %4 + "+r"(dst_ptr1), // %5 + "+r"(dst_width) // %6 + : + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v30", + "v31" // Clobber List + ); +} + +void ScaleUVRowUp2_Linear_16_NEON(const uint16_t* src_ptr, + uint16_t* dst_ptr, + int dst_width) { + const uint16_t* src_temp = src_ptr + 2; + asm volatile( + "movi v31.8h, #3 \n" + + "1: \n" + "ld1 {v0.8h}, [%0], #16 \n" // 01234567 (16b) + "ld1 {v1.8h}, [%1], #16 \n" // 12345678 (16b) + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + + "ushll v2.4s, v0.4h, #0 \n" // 0011 (1u1v, 32b) + "ushll v3.4s, v1.4h, #0 \n" // 1122 (1u1v, 32b) + "ushll2 v4.4s, v0.8h, #0 \n" // 2233 (1u1v, 32b) + "ushll2 v5.4s, v1.8h, #0 \n" // 3344 (1u1v, 32b) + + "umlal v2.4s, v1.4h, v31.4h \n" // 3*near+far (odd) + "umlal v3.4s, v0.4h, v31.4h \n" // 3*near+far (even) + "umlal2 v4.4s, v1.8h, v31.8h \n" // 3*near+far (odd) + "umlal2 v5.4s, v0.8h, v31.8h \n" // 3*near+far (even) + + "rshrn v2.4h, v2.4s, #2 \n" // 3/4*near+1/4*far (odd) + "rshrn v1.4h, v3.4s, #2 \n" // 3/4*near+1/4*far (even) + "rshrn v4.4h, v4.4s, #2 \n" // 3/4*near+1/4*far (odd) + "rshrn v3.4h, v5.4s, #2 \n" // 3/4*near+1/4*far (even) + + "st2 {v1.2s, v2.2s}, [%2], #16 \n" // store + "st2 {v3.2s, v4.2s}, [%2], #16 \n" // store + "subs %w3, %w3, #8 \n" // 4 uv -> 8 uv + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_temp), // %1 + "+r"(dst_ptr), // %2 + "+r"(dst_width) // %3 + : + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", + "v31" // Clobber List + ); +} + +void ScaleUVRowUp2_Bilinear_16_NEON(const uint16_t* src_ptr, + ptrdiff_t src_stride, + uint16_t* dst_ptr, + ptrdiff_t dst_stride, + int dst_width) { + const uint16_t* src_ptr1 = src_ptr + src_stride; + uint16_t* dst_ptr1 = dst_ptr + dst_stride; + const uint16_t* src_temp = src_ptr + 2; + const uint16_t* src_temp1 = src_ptr1 + 2; + + asm volatile( + "movi v31.4h, #3 \n" + "movi v30.4s, #3 \n" + + "1: \n" + "ldr d0, [%0], #8 \n" + "ldr d1, [%2], #8 \n" + "prfm pldl1keep, [%0, 448] \n" // prefetch 7 lines ahead + "ushll v2.4s, v0.4h, #0 \n" // 0011 (1u1v, 32b) + "ushll v3.4s, v1.4h, #0 \n" // 1122 (1u1v, 32b) + "umlal v2.4s, v1.4h, v31.4h \n" // 3*near+far (1, odd) + "umlal v3.4s, v0.4h, v31.4h \n" // 3*near+far (1, even) + + "ldr d0, [%1], #8 \n" + "ldr d1, [%3], #8 \n" + "prfm pldl1keep, [%1, 448] \n" // prefetch 7 lines ahead + "ushll v4.4s, v0.4h, #0 \n" // 0011 (1u1v, 32b) + "ushll v5.4s, v1.4h, #0 \n" // 1122 (1u1v, 32b) + "umlal v4.4s, v1.4h, v31.4h \n" // 3*near+far (2, odd) + "umlal v5.4s, v0.4h, v31.4h \n" // 3*near+far (2, even) + + "mov v0.16b, v4.16b \n" + "mov v1.16b, v5.16b \n" + "mla v4.4s, v2.4s, v30.4s \n" // 9 3 3 1 (1, odd) + "mla v5.4s, v3.4s, v30.4s \n" // 9 3 3 1 (1, even) + "mla v2.4s, v0.4s, v30.4s \n" // 9 3 3 1 (2, odd) + "mla v3.4s, v1.4s, v30.4s \n" // 9 3 3 1 (2, even) + + "rshrn v1.4h, v2.4s, #4 \n" // 2, odd + "rshrn v0.4h, v3.4s, #4 \n" // 2, even + "rshrn v3.4h, v4.4s, #4 \n" // 1, odd + "rshrn v2.4h, v5.4s, #4 \n" // 1, even + + "st2 {v0.2s, v1.2s}, [%5], #16 \n" // store 2 + "st2 {v2.2s, v3.2s}, [%4], #16 \n" // store 1 + "subs %w6, %w6, #4 \n" // 2 uv -> 4 uv + "b.gt 1b \n" + : "+r"(src_ptr), // %0 + "+r"(src_ptr1), // %1 + "+r"(src_temp), // %2 + "+r"(src_temp1), // %3 + "+r"(dst_ptr), // %4 + "+r"(dst_ptr1), // %5 + "+r"(dst_width) // %6 + : + : "memory", "cc", "v0", "v1", "v2", "v3", "v4", "v5", "v30", + "v31" // Clobber List + ); +} + // Add a row of bytes to a row of shorts. Used for box filter. // Reads 16 bytes and accumulates to 16 shorts at a time. void ScaleAddRow_NEON(const uint8_t* src_ptr, @@ -1127,13 +1609,13 @@ void ScaleUVRowDownEven_NEON(const uint8_t* src_ptr, (void)src_stride; asm volatile( "1: \n" - "ld1 {v0.h}[0], [%0], %6 \n" - "ld1 {v1.h}[0], [%1], %6 \n" - "ld1 {v2.h}[0], [%2], %6 \n" - "ld1 {v3.h}[0], [%3], %6 \n" - "subs %w5, %w5, #4 \n" // 4 pixels per loop. - "st4 {v0.h, v1.h, v2.h, v3.h}[0], [%4], #8 \n" - "b.gt 1b \n" + "ld1 {v0.h}[0], [%0], %6 \n" + "ld1 {v1.h}[0], [%1], %6 \n" + "ld1 {v2.h}[0], [%2], %6 \n" + "ld1 {v3.h}[0], [%3], %6 \n" + "subs %w5, %w5, #4 \n" // 4 pixels per loop. + "st4 {v0.h, v1.h, v2.h, v3.h}[0], [%4], #8 \n" + "b.gt 1b \n" : "+r"(src_ptr), // %0 "+r"(src1_ptr), // %1 "+r"(src2_ptr), // %2 diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_uv.cc b/third-party/libyuv/third_party/libyuv/source/scale_uv.cc similarity index 73% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_uv.cc rename to third-party/libyuv/third_party/libyuv/source/scale_uv.cc index b0469f09b8..d9a314453e 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_uv.cc +++ b/third-party/libyuv/third_party/libyuv/source/scale_uv.cc @@ -305,7 +305,7 @@ static void ScaleUVDownEven(int src_width, ScaleUVRowDownEven = ScaleUVRowDownEven_NEON; } } -#endif// TODO(fbarchard): Enable Box filter +#endif // TODO(fbarchard): Enable Box filter #if defined(HAS_SCALEUVROWDOWNEVENBOX_NEON) if (TestCpuFlag(kCpuHasNEON)) { ScaleUVRowDownEven = filtering ? ScaleUVRowDownEvenBox_Any_NEON @@ -492,7 +492,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_INTERPOLATEROW_SSSE3) if (TestCpuFlag(kCpuHasSSSE3)) { InterpolateRow = InterpolateRow_Any_SSSE3; - if (IS_ALIGNED(dst_width, 4)) { + if (IS_ALIGNED(dst_width, 8)) { InterpolateRow = InterpolateRow_SSSE3; } } @@ -500,7 +500,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_INTERPOLATEROW_AVX2) if (TestCpuFlag(kCpuHasAVX2)) { InterpolateRow = InterpolateRow_Any_AVX2; - if (IS_ALIGNED(dst_width, 8)) { + if (IS_ALIGNED(dst_width, 16)) { InterpolateRow = InterpolateRow_AVX2; } } @@ -508,7 +508,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_INTERPOLATEROW_NEON) if (TestCpuFlag(kCpuHasNEON)) { InterpolateRow = InterpolateRow_Any_NEON; - if (IS_ALIGNED(dst_width, 4)) { + if (IS_ALIGNED(dst_width, 8)) { InterpolateRow = InterpolateRow_NEON; } } @@ -516,7 +516,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_INTERPOLATEROW_MMI) if (TestCpuFlag(kCpuHasMMI)) { InterpolateRow = InterpolateRow_Any_MMI; - if (IS_ALIGNED(dst_width, 2)) { + if (IS_ALIGNED(dst_width, 4)) { InterpolateRow = InterpolateRow_MMI; } } @@ -524,7 +524,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_INTERPOLATEROW_MSA) if (TestCpuFlag(kCpuHasMSA)) { InterpolateRow = InterpolateRow_Any_MSA; - if (IS_ALIGNED(dst_width, 8)) { + if (IS_ALIGNED(dst_width, 16)) { InterpolateRow = InterpolateRow_MSA; } } @@ -540,7 +540,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_SCALEUVFILTERCOLS_NEON) if (filtering && TestCpuFlag(kCpuHasNEON)) { ScaleUVFilterCols = ScaleUVFilterCols_Any_NEON; - if (IS_ALIGNED(dst_width, 4)) { + if (IS_ALIGNED(dst_width, 8)) { ScaleUVFilterCols = ScaleUVFilterCols_NEON; } } @@ -548,7 +548,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_SCALEUVFILTERCOLS_MSA) if (filtering && TestCpuFlag(kCpuHasMSA)) { ScaleUVFilterCols = ScaleUVFilterCols_Any_MSA; - if (IS_ALIGNED(dst_width, 8)) { + if (IS_ALIGNED(dst_width, 16)) { ScaleUVFilterCols = ScaleUVFilterCols_MSA; } } @@ -561,7 +561,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_SCALEUVCOLS_NEON) if (!filtering && TestCpuFlag(kCpuHasNEON)) { ScaleUVFilterCols = ScaleUVCols_Any_NEON; - if (IS_ALIGNED(dst_width, 8)) { + if (IS_ALIGNED(dst_width, 16)) { ScaleUVFilterCols = ScaleUVCols_NEON; } } @@ -577,7 +577,7 @@ static void ScaleUVBilinearUp(int src_width, #if defined(HAS_SCALEUVCOLS_MSA) if (!filtering && TestCpuFlag(kCpuHasMSA)) { ScaleUVFilterCols = ScaleUVCols_Any_MSA; - if (IS_ALIGNED(dst_width, 4)) { + if (IS_ALIGNED(dst_width, 8)) { ScaleUVFilterCols = ScaleUVCols_MSA; } } @@ -649,6 +649,218 @@ static void ScaleUVBilinearUp(int src_width, } #endif // HAS_SCALEUVBILINEARUP +// Scale UV, horizontally up by 2 times. +// Uses linear filter horizontally, nearest vertically. +// This is an optimized version for scaling up a plane to 2 times of +// its original width, using linear interpolation. +// This is used to scale U and V planes of NV16 to NV24. +void ScaleUVLinearUp2(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint8_t* src_uv, + uint8_t* dst_uv) { + void (*ScaleRowUp)(const uint8_t* src_uv, uint8_t* dst_uv, int dst_width) = + ScaleUVRowUp2_Linear_Any_C; + int i; + int y; + int dy; + + // This function can only scale up by 2 times horizontally. + assert(src_width == ((dst_width + 1) / 2)); + +#ifdef HAS_SCALEUVROWUP2LINEAR_SSSE3 + if (TestCpuFlag(kCpuHasSSSE3)) { + ScaleRowUp = ScaleUVRowUp2_Linear_Any_SSSE3; + } +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + ScaleRowUp = ScaleUVRowUp2_Linear_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_NEON + if (TestCpuFlag(kCpuHasNEON)) { + ScaleRowUp = ScaleUVRowUp2_Linear_Any_NEON; + } +#endif + + if (dst_height == 1) { + ScaleRowUp(src_uv + ((src_height - 1) / 2) * src_stride, dst_uv, dst_width); + } else { + dy = FixedDiv(src_height - 1, dst_height - 1); + y = (1 << 15) - 1; + for (i = 0; i < dst_height; ++i) { + ScaleRowUp(src_uv + (y >> 16) * src_stride, dst_uv, dst_width); + dst_uv += dst_stride; + y += dy; + } + } +} + +// Scale plane, up by 2 times. +// This is an optimized version for scaling up a plane to 2 times of +// its original size, using bilinear interpolation. +// This is used to scale U and V planes of NV12 to NV24. +void ScaleUVBilinearUp2(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint8_t* src_ptr, + uint8_t* dst_ptr) { + void (*Scale2RowUp)(const uint8_t* src_ptr, ptrdiff_t src_stride, + uint8_t* dst_ptr, ptrdiff_t dst_stride, int dst_width) = + ScaleUVRowUp2_Bilinear_Any_C; + int x; + + // This function can only scale up by 2 times. + assert(src_width == ((dst_width + 1) / 2)); + assert(src_height == ((dst_height + 1) / 2)); + +#ifdef HAS_SCALEUVROWUP2BILINEAR_SSSE3 + if (TestCpuFlag(kCpuHasSSSE3)) { + Scale2RowUp = ScaleUVRowUp2_Bilinear_Any_SSSE3; + } +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + Scale2RowUp = ScaleUVRowUp2_Bilinear_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_NEON + if (TestCpuFlag(kCpuHasNEON)) { + Scale2RowUp = ScaleUVRowUp2_Bilinear_Any_NEON; + } +#endif + + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + dst_ptr += dst_stride; + for (x = 0; x < src_height - 1; ++x) { + Scale2RowUp(src_ptr, src_stride, dst_ptr, dst_stride, dst_width); + src_ptr += src_stride; + // TODO(fbarchard): Test performance of writing one row of destination at a + // time. + dst_ptr += 2 * dst_stride; + } + if (!(dst_height & 1)) { + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + } +} + +// Scale 16 bit UV, horizontally up by 2 times. +// Uses linear filter horizontally, nearest vertically. +// This is an optimized version for scaling up a plane to 2 times of +// its original width, using linear interpolation. +// This is used to scale U and V planes of P210 to P410. +void ScaleUVLinearUp2_16(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint16_t* src_uv, + uint16_t* dst_uv) { + void (*ScaleRowUp)(const uint16_t* src_uv, uint16_t* dst_uv, int dst_width) = + ScaleUVRowUp2_Linear_16_Any_C; + int i; + int y; + int dy; + + // This function can only scale up by 2 times horizontally. + assert(src_width == ((dst_width + 1) / 2)); + +#ifdef HAS_SCALEUVROWUP2LINEAR_16_SSE2 + if (TestCpuFlag(kCpuHasSSE2)) { + ScaleRowUp = ScaleUVRowUp2_Linear_16_Any_SSE2; + } +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_16_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + ScaleRowUp = ScaleUVRowUp2_Linear_16_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEUVROWUP2LINEAR_16_NEON + if (TestCpuFlag(kCpuHasNEON)) { + ScaleRowUp = ScaleUVRowUp2_Linear_16_Any_NEON; + } +#endif + + if (dst_height == 1) { + ScaleRowUp(src_uv + ((src_height - 1) / 2) * src_stride, dst_uv, dst_width); + } else { + dy = FixedDiv(src_height - 1, dst_height - 1); + y = (1 << 15) - 1; + for (i = 0; i < dst_height; ++i) { + ScaleRowUp(src_uv + (y >> 16) * src_stride, dst_uv, dst_width); + dst_uv += dst_stride; + y += dy; + } + } +} + +// Scale 16 bit UV, up by 2 times. +// This is an optimized version for scaling up a plane to 2 times of +// its original size, using bilinear interpolation. +// This is used to scale U and V planes of P010 to P410. +void ScaleUVBilinearUp2_16(int src_width, + int src_height, + int dst_width, + int dst_height, + int src_stride, + int dst_stride, + const uint16_t* src_ptr, + uint16_t* dst_ptr) { + void (*Scale2RowUp)(const uint16_t* src_ptr, ptrdiff_t src_stride, + uint16_t* dst_ptr, ptrdiff_t dst_stride, int dst_width) = + ScaleUVRowUp2_Bilinear_16_Any_C; + int x; + + // This function can only scale up by 2 times. + assert(src_width == ((dst_width + 1) / 2)); + assert(src_height == ((dst_height + 1) / 2)); + +#ifdef HAS_SCALEUVROWUP2BILINEAR_16_SSE2 + if (TestCpuFlag(kCpuHasSSE2)) { + Scale2RowUp = ScaleUVRowUp2_Bilinear_16_Any_SSE2; + } +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_16_AVX2 + if (TestCpuFlag(kCpuHasAVX2)) { + Scale2RowUp = ScaleUVRowUp2_Bilinear_16_Any_AVX2; + } +#endif + +#ifdef HAS_SCALEUVROWUP2BILINEAR_16_NEON + if (TestCpuFlag(kCpuHasNEON)) { + Scale2RowUp = ScaleUVRowUp2_Bilinear_16_Any_NEON; + } +#endif + + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + dst_ptr += dst_stride; + for (x = 0; x < src_height - 1; ++x) { + Scale2RowUp(src_ptr, src_stride, dst_ptr, dst_stride, dst_width); + src_ptr += src_stride; + // TODO(fbarchard): Test performance of writing one row of destination at a + // time. + dst_ptr += 2 * dst_stride; + } + if (!(dst_height & 1)) { + Scale2RowUp(src_ptr, 0, dst_ptr, 0, dst_width); + } +} + // Scale UV to/from any dimensions, without interpolation. // Fixed point math is used for performance: The upper 16 bits // of x and dx is the integer part of the source position and @@ -724,9 +936,9 @@ static void ScaleUVSimple(int src_width, // Copy UV with optional flipping #if HAS_UVCOPY static int UVCopy(const uint8_t* src_UV, - int src_stride_UV, + int src_stride_uv, uint8_t* dst_UV, - int dst_stride_UV, + int dst_stride_uv, int width, int height) { if (!src_UV || !dst_UV || width <= 0 || height == 0) { @@ -735,11 +947,31 @@ static int UVCopy(const uint8_t* src_UV, // Negative height means invert the image. if (height < 0) { height = -height; - src_UV = src_UV + (height - 1) * src_stride_UV; - src_stride_UV = -src_stride_UV; + src_UV = src_UV + (height - 1) * src_stride_uv; + src_stride_uv = -src_stride_uv; } - CopyPlane(src_UV, src_stride_UV, dst_UV, dst_stride_UV, width * 2, height); + CopyPlane(src_UV, src_stride_uv, dst_UV, dst_stride_uv, width * 2, height); + return 0; +} + +static int UVCopy_16(const uint16_t* src_UV, + int src_stride_uv, + uint16_t* dst_UV, + int dst_stride_uv, + int width, + int height) { + if (!src_UV || !dst_UV || width <= 0 || height == 0) { + return -1; + } + // Negative height means invert the image. + if (height < 0) { + height = -height; + src_UV = src_UV + (height - 1) * src_stride_uv; + src_stride_uv = -src_stride_uv; + } + + CopyPlane_16(src_UV, src_stride_uv, dst_UV, dst_stride_uv, width * 2, height); return 0; } #endif // HAS_UVCOPY @@ -844,7 +1076,18 @@ static void ScaleUV(const uint8_t* src, dst_stride, src, dst, x, y, dy, 4, filtering); return; } - + if (filtering && (dst_width + 1) / 2 == src_width) { + ScaleUVLinearUp2(src_width, src_height, clip_width, clip_height, src_stride, + dst_stride, src, dst); + return; + } + if ((clip_height + 1) / 2 == src_height && + (clip_width + 1) / 2 == src_width && + (filtering == kFilterBilinear || filtering == kFilterBox)) { + ScaleUVBilinearUp2(src_width, src_height, clip_width, clip_height, + src_stride, dst_stride, src, dst); + return; + } #if HAS_SCALEUVBILINEARUP if (filtering && dy < 65536) { ScaleUVBilinearUp(src_width, src_height, clip_width, clip_height, @@ -876,7 +1119,7 @@ int UVScale(const uint8_t* src_uv, int dst_width, int dst_height, enum FilterMode filtering) { - if (!src_uv || src_width == 0 || src_height == 0 || src_width > 32768 || + if (!src_uv || src_width <= 0 || src_height == 0 || src_width > 32768 || src_height > 32768 || !dst_uv || dst_width <= 0 || dst_height <= 0) { return -1; } @@ -885,6 +1128,69 @@ int UVScale(const uint8_t* src_uv, return 0; } +// Scale a 16 bit UV image. +// This function is currently incomplete, it can't handle all cases. +LIBYUV_API +int UVScale_16(const uint16_t* src_uv, + int src_stride_uv, + int src_width, + int src_height, + uint16_t* dst_uv, + int dst_stride_uv, + int dst_width, + int dst_height, + enum FilterMode filtering) { + int dy = 0; + + if (!src_uv || src_width <= 0 || src_height == 0 || src_width > 32768 || + src_height > 32768 || !dst_uv || dst_width <= 0 || dst_height <= 0) { + return -1; + } + + // UV does not support box filter yet, but allow the user to pass it. + // Simplify filtering when possible. + filtering = ScaleFilterReduce(src_width, src_height, dst_width, dst_height, + filtering); + + // Negative src_height means invert the image. + if (src_height < 0) { + src_height = -src_height; + src_uv = src_uv + (src_height - 1) * src_stride_uv; + src_stride_uv = -src_stride_uv; + } + src_width = Abs(src_width); + +#ifdef HAS_UVCOPY + if (!filtering && src_width == dst_width && (src_height % dst_height == 0)) { + if (dst_height == 1) { + UVCopy_16(src_uv + ((src_height - 1) / 2) * src_stride_uv, src_stride_uv, + dst_uv, dst_stride_uv, dst_width, dst_height); + } else { + dy = src_height / dst_height; + UVCopy_16(src_uv + src_stride_uv * ((dy - 1) / 2), src_stride_uv * dy, + dst_uv, dst_stride_uv, dst_width, dst_height); + } + + return 0; + } +#endif + + if (filtering && (dst_width + 1) / 2 == src_width) { + ScaleUVLinearUp2_16(src_width, src_height, dst_width, dst_height, + src_stride_uv, dst_stride_uv, src_uv, dst_uv); + return 0; + } + + if ((dst_height + 1) / 2 == src_height && (dst_width + 1) / 2 == src_width && + (filtering == kFilterBilinear || filtering == kFilterBox)) { + ScaleUVBilinearUp2_16(src_width, src_height, dst_width, dst_height, + src_stride_uv, dst_stride_uv, src_uv, dst_uv); + return 0; + } + + return -1; +} + #ifdef __cplusplus } // extern "C" } // namespace libyuv diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_win.cc b/third-party/libyuv/third_party/libyuv/source/scale_win.cc similarity index 99% rename from third-party/webrtc/dependencies/third_party/libyuv/source/scale_win.cc rename to third-party/libyuv/third_party/libyuv/source/scale_win.cc index c5fc86f3e9..ea1f95c6c3 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_win.cc +++ b/third-party/libyuv/third_party/libyuv/source/scale_win.cc @@ -16,8 +16,9 @@ namespace libyuv { extern "C" { #endif -// This module is for 32 bit Visual C x86 and clangcl -#if !defined(LIBYUV_DISABLE_X86) && defined(_M_IX86) && defined(_MSC_VER) +// This module is for 32 bit Visual C x86 +#if !defined(LIBYUV_DISABLE_X86) && defined(_MSC_VER) && \ + !defined(__clang__) && defined(_M_IX86) // Offsets for source bytes 0 to 9 static const uvec8 kShuf0 = {0, 1, 3, 4, 5, 7, 8, 9, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/test.sh b/third-party/libyuv/third_party/libyuv/source/test.sh similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/test.sh rename to third-party/libyuv/third_party/libyuv/source/test.sh diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/video_common.cc b/third-party/libyuv/third_party/libyuv/source/video_common.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/source/video_common.cc rename to third-party/libyuv/third_party/libyuv/source/video_common.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/OWNERS b/third-party/libyuv/third_party/libyuv/tools_libyuv/OWNERS similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/OWNERS rename to third-party/libyuv/third_party/libyuv/tools_libyuv/OWNERS diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/roll_deps.py b/third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/roll_deps.py similarity index 98% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/roll_deps.py rename to third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/roll_deps.py index 9b9660de0b..5b3cf8d6ee 100755 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/roll_deps.py +++ b/third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/roll_deps.py @@ -46,7 +46,7 @@ CHECKOUT_SRC_DIR = os.path.realpath(os.path.join(SCRIPT_DIR, os.pardir, CHECKOUT_ROOT_DIR = os.path.realpath(os.path.join(CHECKOUT_SRC_DIR, os.pardir)) sys.path.append(os.path.join(CHECKOUT_SRC_DIR, 'build')) -import find_depot_tools +import find_depot_tools # pylint: disable=wrong-import-position find_depot_tools.add_depot_tools_to_path() CLANG_UPDATE_SCRIPT_URL_PATH = 'tools/clang/scripts/update.py' @@ -366,12 +366,12 @@ def _IsTreeClean(): def _EnsureUpdatedMasterBranch(dry_run): current_branch = _RunCommand( ['git', 'rev-parse', '--abbrev-ref', 'HEAD'])[0].splitlines()[0] - if current_branch != 'master': - logging.error('Please checkout the master branch and re-run this script.') + if current_branch != 'main': + logging.error('Please checkout the main branch and re-run this script.') if not dry_run: sys.exit(-1) - logging.info('Updating master branch...') + logging.info('Updating main branch...') _RunCommand(['git', 'pull']) @@ -384,7 +384,7 @@ def _CreateRollBranch(dry_run): def _RemovePreviousRollBranch(dry_run): active_branch, branches = _GetBranches() if active_branch == ROLL_BRANCH_NAME: - active_branch = 'master' + active_branch = 'main' if ROLL_BRANCH_NAME in branches: logging.info('Removing previous roll branch (%s)', ROLL_BRANCH_NAME) if not dry_run: @@ -444,7 +444,7 @@ def main(): 'tryjobs.')) p.add_argument('-i', '--ignore-unclean-workdir', action='store_true', default=False, - help=('Ignore if the current branch is not master or if there ' + help=('Ignore if the current branch is not main or if there ' 'are uncommitted changes (default: %(default)s).')) grp = p.add_mutually_exclusive_group() grp.add_argument('--skip-cq', action='store_true', default=False, diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py b/third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py similarity index 97% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py rename to third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py index 477b6e402a..a7e3f8a87e 100755 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py +++ b/third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/roll_deps_test.py @@ -18,9 +18,10 @@ import unittest SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) PARENT_DIR = os.path.join(SCRIPT_DIR, os.pardir) sys.path.append(PARENT_DIR) -import roll_deps +import roll_deps # pylint: disable=wrong-import-position from roll_deps import CalculateChangedDeps, GetMatchingDepsEntries, \ - ParseDepsDict, ParseLocalDepsFile, UpdateDepsFile + ParseDepsDict, ParseLocalDepsFile, \ + UpdateDepsFile # pylint: disable=wrong-import-position TEST_DATA_VARS = { diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS b/third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS rename to third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new b/third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new rename to third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.new diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old b/third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old rename to third-party/libyuv/third_party/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/get_landmines.py b/third-party/libyuv/third_party/libyuv/tools_libyuv/get_landmines.py similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/get_landmines.py rename to third-party/libyuv/third_party/libyuv/tools_libyuv/get_landmines.py diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/msan/OWNERS b/third-party/libyuv/third_party/libyuv/tools_libyuv/msan/OWNERS similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/msan/OWNERS rename to third-party/libyuv/third_party/libyuv/tools_libyuv/msan/OWNERS diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/msan/blacklist.txt b/third-party/libyuv/third_party/libyuv/tools_libyuv/msan/blacklist.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/msan/blacklist.txt rename to third-party/libyuv/third_party/libyuv/tools_libyuv/msan/blacklist.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/ubsan/OWNERS b/third-party/libyuv/third_party/libyuv/tools_libyuv/ubsan/OWNERS similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/ubsan/OWNERS rename to third-party/libyuv/third_party/libyuv/tools_libyuv/ubsan/OWNERS diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/ubsan/blacklist.txt b/third-party/libyuv/third_party/libyuv/tools_libyuv/ubsan/blacklist.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/ubsan/blacklist.txt rename to third-party/libyuv/third_party/libyuv/tools_libyuv/ubsan/blacklist.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt b/third-party/libyuv/third_party/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt rename to third-party/libyuv/third_party/libyuv/tools_libyuv/ubsan/vptr_blacklist.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/basictypes_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/basictypes_test.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/basictypes_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/basictypes_test.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/color_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/color_test.cc similarity index 85% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/color_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/color_test.cc index 842fd99444..e2d037ff79 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/color_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/color_test.cc @@ -22,8 +22,7 @@ namespace libyuv { // TODO(fbarchard): clang x86 has a higher accuracy YUV to RGB. // Port to Visual C and other CPUs -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) +#if !defined(LIBYUV_DISABLE_X86) && (defined(__x86_64__) || defined(__i386__)) #define ERROR_FULL 5 #define ERROR_J420 4 #else @@ -32,7 +31,11 @@ namespace libyuv { #endif #define ERROR_R 1 #define ERROR_G 1 -#define ERROR_B 3 +#ifdef LIBYUV_UNLIMITED_DATA +#define ERROR_B 1 +#else +#define ERROR_B 18 +#endif #define TESTCS(TESTNAME, YUVTOARGB, ARGBTOYUV, HS1, HS, HN, DIFF) \ TEST_F(LibYUVColorTest, TESTNAME) { \ @@ -208,7 +211,33 @@ static void YUVHToRGB(int y, int u, int v, int* r, int* g, int* b) { *r = orig_pixels[2]; } -static void YUVRec2020ToRGB(int y, int u, int v, int* r, int* g, int* b) { +#define F422ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I422ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j) + +static void YUVFToRGB(int y, int u, int v, int* r, int* g, int* b) { + const int kWidth = 16; + const int kHeight = 1; + const int kPixels = kWidth * kHeight; + const int kHalfPixels = ((kWidth + 1) / 2) * ((kHeight + 1) / 2); + + SIMD_ALIGNED(uint8_t orig_y[16]); + SIMD_ALIGNED(uint8_t orig_u[8]); + SIMD_ALIGNED(uint8_t orig_v[8]); + SIMD_ALIGNED(uint8_t orig_pixels[16 * 4]); + memset(orig_y, y, kPixels); + memset(orig_u, u, kHalfPixels); + memset(orig_v, v, kHalfPixels); + + /* YUV converted to ARGB. */ + F422ToARGB(orig_y, kWidth, orig_u, (kWidth + 1) / 2, orig_v, (kWidth + 1) / 2, + orig_pixels, kWidth * 4, kWidth, kHeight); + + *b = orig_pixels[0]; + *g = orig_pixels[1]; + *r = orig_pixels[2]; +} + +static void YUVUToRGB(int y, int u, int v, int* r, int* g, int* b) { const int kWidth = 16; const int kHeight = 1; const int kPixels = kWidth * kHeight; @@ -231,6 +260,32 @@ static void YUVRec2020ToRGB(int y, int u, int v, int* r, int* g, int* b) { *r = orig_pixels[2]; } +#define V422ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I422ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j) + +static void YUVVToRGB(int y, int u, int v, int* r, int* g, int* b) { + const int kWidth = 16; + const int kHeight = 1; + const int kPixels = kWidth * kHeight; + const int kHalfPixels = ((kWidth + 1) / 2) * ((kHeight + 1) / 2); + + SIMD_ALIGNED(uint8_t orig_y[16]); + SIMD_ALIGNED(uint8_t orig_u[8]); + SIMD_ALIGNED(uint8_t orig_v[8]); + SIMD_ALIGNED(uint8_t orig_pixels[16 * 4]); + memset(orig_y, y, kPixels); + memset(orig_u, u, kHalfPixels); + memset(orig_v, v, kHalfPixels); + + /* YUV converted to ARGB. */ + V422ToARGB(orig_y, kWidth, orig_u, (kWidth + 1) / 2, orig_v, (kWidth + 1) / 2, + orig_pixels, kWidth * 4, kWidth, kHeight); + + *b = orig_pixels[0]; + *g = orig_pixels[1]; + *r = orig_pixels[2]; +} + static void YToRGB(int y, int* r, int* g, int* b) { const int kWidth = 16; const int kHeight = 1; @@ -379,21 +434,21 @@ TEST_F(LibYUVColorTest, TestRoundToByte) { EXPECT_LE(allb, 255); } -// BT.601 YUV to RGB reference +// BT.601 limited range YUV to RGB reference static void YUVToRGBReference(int y, int u, int v, int* r, int* g, int* b) { *r = RoundToByte((y - 16) * 1.164 - (v - 128) * -1.596); *g = RoundToByte((y - 16) * 1.164 - (u - 128) * 0.391 - (v - 128) * 0.813); *b = RoundToByte((y - 16) * 1.164 - (u - 128) * -2.018); } -// JPEG YUV to RGB reference +// BT.601 full range YUV to RGB reference (aka JPEG) static void YUVJToRGBReference(int y, int u, int v, int* r, int* g, int* b) { *r = RoundToByte(y - (v - 128) * -1.40200); *g = RoundToByte(y - (u - 128) * 0.34414 - (v - 128) * 0.71414); *b = RoundToByte(y - (u - 128) * -1.77200); } -// BT.709 YUV to RGB reference +// BT.709 limited range YUV to RGB reference // See also http://www.equasys.de/colorconversion.html static void YUVHToRGBReference(int y, int u, int v, int* r, int* g, int* b) { *r = RoundToByte((y - 16) * 1.164 - (v - 128) * -1.793); @@ -401,19 +456,28 @@ static void YUVHToRGBReference(int y, int u, int v, int* r, int* g, int* b) { *b = RoundToByte((y - 16) * 1.164 - (u - 128) * -2.112); } -// BT.2020 YUV to RGB reference -static void YUVRec2020ToRGBReference(int y, - int u, - int v, - int* r, - int* g, - int* b) { +// BT.709 full range YUV to RGB reference +static void YUVFToRGBReference(int y, int u, int v, int* r, int* g, int* b) { + *r = RoundToByte(y - (v - 128) * -1.5748); + *g = RoundToByte(y - (u - 128) * 0.18732 - (v - 128) * 0.46812); + *b = RoundToByte(y - (u - 128) * -1.8556); +} + +// BT.2020 limited range YUV to RGB reference +static void YUVUToRGBReference(int y, int u, int v, int* r, int* g, int* b) { *r = RoundToByte((y - 16) * 1.164384 - (v - 128) * -1.67867); *g = RoundToByte((y - 16) * 1.164384 - (u - 128) * 0.187326 - (v - 128) * 0.65042); *b = RoundToByte((y - 16) * 1.164384 - (u - 128) * -2.14177); } +// BT.2020 full range YUV to RGB reference +static void YUVVToRGBReference(int y, int u, int v, int* r, int* g, int* b) { + *r = RoundToByte(y + (v - 128) * 1.474600); + *g = RoundToByte(y - (u - 128) * 0.164553 - (v - 128) * 0.571353); + *b = RoundToByte(y + (u - 128) * 1.881400); +} + TEST_F(LibYUVColorTest, TestYUV) { int r0, g0, b0, r1, g1, b1; @@ -437,7 +501,11 @@ TEST_F(LibYUVColorTest, TestYUV) { YUVToRGB(240, 0, 0, &r1, &g1, &b1); EXPECT_EQ(57, r1); EXPECT_EQ(255, g1); +#ifdef LIBYUV_UNLIMITED_DATA + EXPECT_EQ(3, b1); +#else EXPECT_EQ(5, b1); +#endif for (int i = 0; i < 256; ++i) { YUVToRGBReference(i, 128, 128, &r0, &g0, &b0); @@ -545,6 +613,8 @@ static void PrintHistogram(int rh[256], int gh[256], int bh[256]) { #else #define FASTSTEP 5 #endif + +// BT.601 limited range. TEST_F(LibYUVColorTest, TestFullYUV) { int rh[256] = { 0, @@ -574,6 +644,7 @@ TEST_F(LibYUVColorTest, TestFullYUV) { PrintHistogram(rh, gh, bh); } +// BT.601 full range. TEST_F(LibYUVColorTest, TestFullYUVJ) { int rh[256] = { 0, @@ -591,9 +662,9 @@ TEST_F(LibYUVColorTest, TestFullYUVJ) { int y = RANDOM256(y2); YUVJToRGBReference(y, u, v, &r0, &g0, &b0); YUVJToRGB(y, u, v, &r1, &g1, &b1); - EXPECT_NEAR(r0, r1, 1); - EXPECT_NEAR(g0, g1, 1); - EXPECT_NEAR(b0, b1, 1); + EXPECT_NEAR(r0, r1, ERROR_R); + EXPECT_NEAR(g0, g1, ERROR_G); + EXPECT_NEAR(b0, b1, ERROR_B); ++rh[r1 - r0 + 128]; ++gh[g1 - g0 + 128]; ++bh[b1 - b0 + 128]; @@ -603,6 +674,7 @@ TEST_F(LibYUVColorTest, TestFullYUVJ) { PrintHistogram(rh, gh, bh); } +// BT.709 limited range. TEST_F(LibYUVColorTest, TestFullYUVH) { int rh[256] = { 0, @@ -622,8 +694,7 @@ TEST_F(LibYUVColorTest, TestFullYUVH) { YUVHToRGB(y, u, v, &r1, &g1, &b1); EXPECT_NEAR(r0, r1, ERROR_R); EXPECT_NEAR(g0, g1, ERROR_G); - // TODO(crbug.com/libyuv/862): Reduce the errors in the B channel. - EXPECT_NEAR(b0, b1, 15); + EXPECT_NEAR(b0, b1, ERROR_B); ++rh[r1 - r0 + 128]; ++gh[g1 - g0 + 128]; ++bh[b1 - b0 + 128]; @@ -633,7 +704,8 @@ TEST_F(LibYUVColorTest, TestFullYUVH) { PrintHistogram(rh, gh, bh); } -TEST_F(LibYUVColorTest, TestFullYUVRec2020) { +// BT.709 full range. +TEST_F(LibYUVColorTest, TestFullYUVF) { int rh[256] = { 0, }; @@ -648,12 +720,71 @@ TEST_F(LibYUVColorTest, TestFullYUVRec2020) { for (int y2 = 0; y2 < 256; y2 += FASTSTEP) { int r0, g0, b0, r1, g1, b1; int y = RANDOM256(y2); - YUVRec2020ToRGBReference(y, u, v, &r0, &g0, &b0); - YUVRec2020ToRGB(y, u, v, &r1, &g1, &b1); + YUVFToRGBReference(y, u, v, &r0, &g0, &b0); + YUVFToRGB(y, u, v, &r1, &g1, &b1); EXPECT_NEAR(r0, r1, ERROR_R); EXPECT_NEAR(g0, g1, ERROR_G); - // TODO(crbug.com/libyuv/863): Reduce the errors in the B channel. - EXPECT_NEAR(b0, b1, 18); + EXPECT_NEAR(b0, b1, ERROR_B); + ++rh[r1 - r0 + 128]; + ++gh[g1 - g0 + 128]; + ++bh[b1 - b0 + 128]; + } + } + } + PrintHistogram(rh, gh, bh); +} + +// BT.2020 limited range. +TEST_F(LibYUVColorTest, TestFullYUVU) { + int rh[256] = { + 0, + }; + int gh[256] = { + 0, + }; + int bh[256] = { + 0, + }; + for (int u = 0; u < 256; ++u) { + for (int v = 0; v < 256; ++v) { + for (int y2 = 0; y2 < 256; y2 += FASTSTEP) { + int r0, g0, b0, r1, g1, b1; + int y = RANDOM256(y2); + YUVUToRGBReference(y, u, v, &r0, &g0, &b0); + YUVUToRGB(y, u, v, &r1, &g1, &b1); + EXPECT_NEAR(r0, r1, ERROR_R); + EXPECT_NEAR(g0, g1, ERROR_G); + EXPECT_NEAR(b0, b1, ERROR_B); + ++rh[r1 - r0 + 128]; + ++gh[g1 - g0 + 128]; + ++bh[b1 - b0 + 128]; + } + } + } + PrintHistogram(rh, gh, bh); +} + +// BT.2020 full range. +TEST_F(LibYUVColorTest, TestFullYUVV) { + int rh[256] = { + 0, + }; + int gh[256] = { + 0, + }; + int bh[256] = { + 0, + }; + for (int u = 0; u < 256; ++u) { + for (int v = 0; v < 256; ++v) { + for (int y2 = 0; y2 < 256; y2 += FASTSTEP) { + int r0, g0, b0, r1, g1, b1; + int y = RANDOM256(y2); + YUVVToRGBReference(y, u, v, &r0, &g0, &b0); + YUVVToRGB(y, u, v, &r1, &g1, &b1); + EXPECT_NEAR(r0, r1, ERROR_R); + EXPECT_NEAR(g0, g1, 2); + EXPECT_NEAR(b0, b1, ERROR_B); ++rh[r1 - r0 + 128]; ++gh[g1 - g0 + 128]; ++bh[b1 - b0 + 128]; diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/compare_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/compare_test.cc similarity index 99% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/compare_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/compare_test.cc index bd99cdd3ac..c29562cb86 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/compare_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/compare_test.cc @@ -344,7 +344,7 @@ static const int kMaxOptCount = (1 << (32 - 3)) - 64; // 536870848 TEST_F(LibYUVCompareTest, TestHammingDistance_Opt) { uint32_t h1 = 0; - const int kMaxWidth = (benchmark_width_ * benchmark_height_ + 31) & ~31; + const int kMaxWidth = (benchmark_width_ * benchmark_height_ + 63) & ~63; align_buffer_page_end(src_a, kMaxWidth); align_buffer_page_end(src_b, kMaxWidth); memset(src_a, 255u, kMaxWidth); diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/convert_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/convert_test.cc similarity index 69% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/convert_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/convert_test.cc index 59a9480d67..3855838381 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/convert_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/convert_test.cc @@ -49,19 +49,20 @@ namespace libyuv { #define TESTPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, \ - DST_SUBSAMP_X, DST_SUBSAMP_Y, W1280, N, NEG, OFF) \ + DST_SUBSAMP_X, DST_SUBSAMP_Y, W1280, N, NEG, OFF, \ + SRC_DEPTH) \ TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \ static_assert(SRC_BPC == 1 || SRC_BPC == 2, "SRC BPC unsupported"); \ static_assert(DST_BPC == 1 || DST_BPC == 2, "DST BPC unsupported"); \ static_assert(SRC_SUBSAMP_X == 1 || SRC_SUBSAMP_X == 2, \ - "DST SRC_SUBSAMP_X unsupported"); \ + "SRC_SUBSAMP_X unsupported"); \ static_assert(SRC_SUBSAMP_Y == 1 || SRC_SUBSAMP_Y == 2, \ - "DST SRC_SUBSAMP_Y unsupported"); \ + "SRC_SUBSAMP_Y unsupported"); \ static_assert(DST_SUBSAMP_X == 1 || DST_SUBSAMP_X == 2, \ - "DST DST_SUBSAMP_X unsupported"); \ + "DST_SUBSAMP_X unsupported"); \ static_assert(DST_SUBSAMP_Y == 1 || DST_SUBSAMP_Y == 2, \ - "DST DST_SUBSAMP_Y unsupported"); \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + "DST_SUBSAMP_Y unsupported"); \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kSrcHalfWidth = SUBSAMPLE(kWidth, SRC_SUBSAMP_X); \ const int kSrcHalfHeight = SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); \ @@ -81,6 +82,16 @@ namespace libyuv { MemRandomize(src_y + OFF, kWidth * kHeight * SRC_BPC); \ MemRandomize(src_u + OFF, kSrcHalfWidth * kSrcHalfHeight * SRC_BPC); \ MemRandomize(src_v + OFF, kSrcHalfWidth * kSrcHalfHeight * SRC_BPC); \ + SRC_T* src_y_p = reinterpret_cast(src_y + OFF); \ + SRC_T* src_u_p = reinterpret_cast(src_u + OFF); \ + SRC_T* src_v_p = reinterpret_cast(src_v + OFF); \ + for (int i = 0; i < kWidth * kHeight; ++i) { \ + src_y_p[i] = src_y_p[i] & ((1 << SRC_DEPTH) - 1); \ + } \ + for (int i = 0; i < kSrcHalfWidth * kSrcHalfHeight; ++i) { \ + src_u_p[i] = src_u_p[i] & ((1 << SRC_DEPTH) - 1); \ + src_v_p[i] = src_v_p[i] & ((1 << SRC_DEPTH) - 1); \ + } \ memset(dst_y_c, 1, kWidth* kHeight* DST_BPC); \ memset(dst_u_c, 2, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ memset(dst_v_c, 3, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ @@ -89,9 +100,7 @@ namespace libyuv { memset(dst_v_opt, 103, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ MaskCpuFlags(disable_cpu_flags_); \ SRC_FMT_PLANAR##To##FMT_PLANAR( \ - reinterpret_cast(src_y + OFF), kWidth, \ - reinterpret_cast(src_u + OFF), kSrcHalfWidth, \ - reinterpret_cast(src_v + OFF), kSrcHalfWidth, \ + src_y_p, kWidth, src_u_p, kSrcHalfWidth, src_v_p, kSrcHalfWidth, \ reinterpret_cast(dst_y_c), kWidth, \ reinterpret_cast(dst_u_c), kDstHalfWidth, \ reinterpret_cast(dst_v_c), kDstHalfWidth, kWidth, \ @@ -99,9 +108,7 @@ namespace libyuv { MaskCpuFlags(benchmark_cpu_info_); \ for (int i = 0; i < benchmark_iterations_; ++i) { \ SRC_FMT_PLANAR##To##FMT_PLANAR( \ - reinterpret_cast(src_y + OFF), kWidth, \ - reinterpret_cast(src_u + OFF), kSrcHalfWidth, \ - reinterpret_cast(src_v + OFF), kSrcHalfWidth, \ + src_y_p, kWidth, src_u_p, kSrcHalfWidth, src_v_p, kSrcHalfWidth, \ reinterpret_cast(dst_y_opt), kWidth, \ reinterpret_cast(dst_u_opt), kDstHalfWidth, \ reinterpret_cast(dst_v_opt), kDstHalfWidth, kWidth, \ @@ -127,41 +134,57 @@ namespace libyuv { #define TESTPLANARTOP(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, \ - DST_SUBSAMP_X, DST_SUBSAMP_Y) \ + DST_SUBSAMP_X, DST_SUBSAMP_Y, SRC_DEPTH) \ TESTPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \ - benchmark_width_ - 4, _Any, +, 0) \ + benchmark_width_ + 1, _Any, +, 0, SRC_DEPTH) \ TESTPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \ - benchmark_width_, _Unaligned, +, 1) \ + benchmark_width_, _Unaligned, +, 1, SRC_DEPTH) \ TESTPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \ - benchmark_width_, _Invert, -, 0) \ + benchmark_width_, _Invert, -, 0, SRC_DEPTH) \ TESTPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, DST_SUBSAMP_Y, \ - benchmark_width_, _Opt, +, 0) + benchmark_width_, _Opt, +, 0, SRC_DEPTH) -TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2) -TESTPLANARTOP(I422, uint8_t, 1, 2, 1, I420, uint8_t, 1, 2, 2) -TESTPLANARTOP(I444, uint8_t, 1, 1, 1, I420, uint8_t, 1, 2, 2) -TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I422, uint8_t, 1, 2, 1) -TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I444, uint8_t, 1, 1, 1) -TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I420Mirror, uint8_t, 1, 2, 2) -TESTPLANARTOP(I422, uint8_t, 1, 2, 1, I422, uint8_t, 1, 2, 1) -TESTPLANARTOP(I444, uint8_t, 1, 1, 1, I444, uint8_t, 1, 1, 1) -TESTPLANARTOP(I010, uint16_t, 2, 2, 2, I010, uint16_t, 2, 2, 2) -TESTPLANARTOP(I010, uint16_t, 2, 2, 2, I420, uint8_t, 1, 2, 2) -TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I010, uint16_t, 2, 2, 2) -TESTPLANARTOP(H010, uint16_t, 2, 2, 2, H010, uint16_t, 2, 2, 2) -TESTPLANARTOP(H010, uint16_t, 2, 2, 2, H420, uint8_t, 1, 2, 2) -TESTPLANARTOP(H420, uint8_t, 1, 2, 2, H010, uint16_t, 2, 2, 2) +TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8) +TESTPLANARTOP(I422, uint8_t, 1, 2, 1, I420, uint8_t, 1, 2, 2, 8) +TESTPLANARTOP(I444, uint8_t, 1, 1, 1, I420, uint8_t, 1, 2, 2, 8) +TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I422, uint8_t, 1, 2, 1, 8) +TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I444, uint8_t, 1, 1, 1, 8) +TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I420Mirror, uint8_t, 1, 2, 2, 8) +TESTPLANARTOP(I422, uint8_t, 1, 2, 1, I422, uint8_t, 1, 2, 1, 8) +TESTPLANARTOP(I422, uint8_t, 1, 2, 1, I444, uint8_t, 1, 1, 1, 8) +TESTPLANARTOP(I444, uint8_t, 1, 1, 1, I444, uint8_t, 1, 1, 1, 8) +TESTPLANARTOP(I010, uint16_t, 2, 2, 2, I010, uint16_t, 2, 2, 2, 10) +TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I010, uint16_t, 2, 2, 2, 8) +TESTPLANARTOP(I420, uint8_t, 1, 2, 2, I012, uint16_t, 2, 2, 2, 8) +TESTPLANARTOP(H010, uint16_t, 2, 2, 2, H010, uint16_t, 2, 2, 2, 10) +TESTPLANARTOP(H010, uint16_t, 2, 2, 2, H420, uint8_t, 1, 2, 2, 10) +TESTPLANARTOP(H420, uint8_t, 1, 2, 2, H010, uint16_t, 2, 2, 2, 8) +TESTPLANARTOP(H420, uint8_t, 1, 2, 2, H012, uint16_t, 2, 2, 2, 8) +TESTPLANARTOP(I010, uint16_t, 2, 2, 2, I410, uint16_t, 2, 1, 1, 10) +TESTPLANARTOP(I210, uint16_t, 2, 2, 1, I410, uint16_t, 2, 1, 1, 10) +TESTPLANARTOP(I012, uint16_t, 2, 2, 2, I412, uint16_t, 2, 1, 1, 12) +TESTPLANARTOP(I212, uint16_t, 2, 2, 1, I412, uint16_t, 2, 1, 1, 12) +TESTPLANARTOP(I410, uint16_t, 2, 1, 1, I010, uint16_t, 2, 2, 2, 10) +TESTPLANARTOP(I210, uint16_t, 2, 2, 1, I010, uint16_t, 2, 2, 2, 10) +TESTPLANARTOP(I412, uint16_t, 2, 1, 1, I012, uint16_t, 2, 2, 2, 12) +TESTPLANARTOP(I212, uint16_t, 2, 2, 1, I012, uint16_t, 2, 2, 2, 12) +TESTPLANARTOP(I010, uint16_t, 2, 2, 2, I420, uint8_t, 1, 2, 2, 10) +TESTPLANARTOP(I210, uint16_t, 2, 2, 1, I422, uint8_t, 1, 2, 1, 10) +TESTPLANARTOP(I410, uint16_t, 2, 1, 1, I444, uint8_t, 1, 1, 1, 10) +TESTPLANARTOP(I012, uint16_t, 2, 2, 2, I420, uint8_t, 1, 2, 2, 12) +TESTPLANARTOP(I212, uint16_t, 2, 2, 1, I422, uint8_t, 1, 2, 1, 12) +TESTPLANARTOP(I412, uint16_t, 2, 1, 1, I444, uint8_t, 1, 1, 1, 12) // Test Android 420 to I420 #define TESTAPLANARTOPI(SRC_FMT_PLANAR, PIXEL_STRIDE, SRC_SUBSAMP_X, \ SRC_SUBSAMP_Y, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \ W1280, N, NEG, OFF, PN, OFF_U, OFF_V) \ - TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##_##PN##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##To##PN##N) { \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kSizeUV = \ SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); \ @@ -247,7 +270,7 @@ TESTPLANARTOP(H420, uint8_t, 1, 2, 2, H010, uint16_t, 2, 2, 2) SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, SUBSAMP_X, \ SUBSAMP_Y) \ TESTAPLANARTOPI(SRC_FMT_PLANAR, PIXEL_STRIDE, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, benchmark_width_ - 4, \ + FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, benchmark_width_ + 1, \ _Any, +, 0, PN, OFF_U, OFF_V) \ TESTAPLANARTOPI(SRC_FMT_PLANAR, PIXEL_STRIDE, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, benchmark_width_, \ @@ -280,63 +303,74 @@ int I400ToNV21(const uint8_t* src_y, dst_stride_vu, width, height); } -#define TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, OFF) \ +#define TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, \ + DST_SUBSAMP_X, DST_SUBSAMP_Y, W1280, N, NEG, OFF, \ + SRC_DEPTH) \ TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + static_assert(SRC_BPC == 1 || SRC_BPC == 2, "SRC BPC unsupported"); \ + static_assert(DST_BPC == 1 || DST_BPC == 2, "DST BPC unsupported"); \ + static_assert(SRC_SUBSAMP_X == 1 || SRC_SUBSAMP_X == 2, \ + "SRC_SUBSAMP_X unsupported"); \ + static_assert(SRC_SUBSAMP_Y == 1 || SRC_SUBSAMP_Y == 2, \ + "SRC_SUBSAMP_Y unsupported"); \ + static_assert(DST_SUBSAMP_X == 1 || DST_SUBSAMP_X == 2, \ + "DST_SUBSAMP_X unsupported"); \ + static_assert(DST_SUBSAMP_Y == 1 || DST_SUBSAMP_Y == 2, \ + "DST_SUBSAMP_Y unsupported"); \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ - align_buffer_page_end(src_y, kWidth* kHeight + OFF); \ - align_buffer_page_end(src_u, SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \ - OFF); \ - align_buffer_page_end(src_v, SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \ - OFF); \ - align_buffer_page_end(dst_y_c, kWidth* kHeight); \ - align_buffer_page_end(dst_uv_c, SUBSAMPLE(kWidth, SUBSAMP_X) * 2 * \ - SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - align_buffer_page_end(dst_y_opt, kWidth* kHeight); \ - align_buffer_page_end(dst_uv_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * 2 * \ - SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - for (int i = 0; i < kHeight; ++i) \ - for (int j = 0; j < kWidth; ++j) \ - src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \ - for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \ - for (int j = 0; j < SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \ - src_u[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \ - (fastrand() & 0xff); \ - src_v[(i * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \ - (fastrand() & 0xff); \ - } \ + const int kSrcHalfWidth = SUBSAMPLE(kWidth, SRC_SUBSAMP_X); \ + const int kSrcHalfHeight = SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); \ + const int kDstHalfWidth = SUBSAMPLE(kWidth, DST_SUBSAMP_X); \ + const int kDstHalfHeight = SUBSAMPLE(kHeight, DST_SUBSAMP_Y); \ + align_buffer_page_end(src_y, kWidth* kHeight* SRC_BPC + OFF); \ + align_buffer_page_end(src_u, \ + kSrcHalfWidth* kSrcHalfHeight* SRC_BPC + OFF); \ + align_buffer_page_end(src_v, \ + kSrcHalfWidth* kSrcHalfHeight* SRC_BPC + OFF); \ + align_buffer_page_end(dst_y_c, kWidth* kHeight* DST_BPC); \ + align_buffer_page_end(dst_uv_c, \ + kDstHalfWidth* kDstHalfHeight* DST_BPC * 2); \ + align_buffer_page_end(dst_y_opt, kWidth* kHeight* DST_BPC); \ + align_buffer_page_end(dst_uv_opt, \ + kDstHalfWidth* kDstHalfHeight* DST_BPC * 2); \ + MemRandomize(src_y + OFF, kWidth * kHeight * SRC_BPC); \ + MemRandomize(src_u + OFF, kSrcHalfWidth * kSrcHalfHeight * SRC_BPC); \ + MemRandomize(src_v + OFF, kSrcHalfWidth * kSrcHalfHeight * SRC_BPC); \ + SRC_T* src_y_p = reinterpret_cast(src_y + OFF); \ + SRC_T* src_u_p = reinterpret_cast(src_u + OFF); \ + SRC_T* src_v_p = reinterpret_cast(src_v + OFF); \ + for (int i = 0; i < kWidth * kHeight; ++i) { \ + src_y_p[i] = src_y_p[i] & ((1 << SRC_DEPTH) - 1); \ } \ - memset(dst_y_c, 1, kWidth* kHeight); \ - memset(dst_uv_c, 2, \ - SUBSAMPLE(kWidth, SUBSAMP_X) * 2 * SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - memset(dst_y_opt, 101, kWidth* kHeight); \ - memset(dst_uv_opt, 102, \ - SUBSAMPLE(kWidth, SUBSAMP_X) * 2 * SUBSAMPLE(kHeight, SUBSAMP_Y)); \ + for (int i = 0; i < kSrcHalfWidth * kSrcHalfHeight; ++i) { \ + src_u_p[i] = src_u_p[i] & ((1 << SRC_DEPTH) - 1); \ + src_v_p[i] = src_v_p[i] & ((1 << SRC_DEPTH) - 1); \ + } \ + memset(dst_y_c, 1, kWidth* kHeight* DST_BPC); \ + memset(dst_uv_c, 2, kDstHalfWidth* kDstHalfHeight* DST_BPC * 2); \ + memset(dst_y_opt, 101, kWidth* kHeight* DST_BPC); \ + memset(dst_uv_opt, 102, kDstHalfWidth* kDstHalfHeight* DST_BPC * 2); \ MaskCpuFlags(disable_cpu_flags_); \ - SRC_FMT_PLANAR##To##FMT_PLANAR( \ - src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \ - src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_c, kWidth, \ - dst_uv_c, SUBSAMPLE(kWidth, SUBSAMP_X) * 2, kWidth, NEG kHeight); \ + SRC_FMT_PLANAR##To##FMT_PLANAR(src_y_p, kWidth, src_u_p, kSrcHalfWidth, \ + src_v_p, kSrcHalfWidth, \ + reinterpret_cast(dst_y_c), kWidth, \ + reinterpret_cast(dst_uv_c), \ + kDstHalfWidth * 2, kWidth, NEG kHeight); \ MaskCpuFlags(benchmark_cpu_info_); \ for (int i = 0; i < benchmark_iterations_; ++i) { \ SRC_FMT_PLANAR##To##FMT_PLANAR( \ - src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), \ - src_v + OFF, SUBSAMPLE(kWidth, SRC_SUBSAMP_X), dst_y_opt, kWidth, \ - dst_uv_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * 2, kWidth, NEG kHeight); \ + src_y_p, kWidth, src_u_p, kSrcHalfWidth, src_v_p, kSrcHalfWidth, \ + reinterpret_cast(dst_y_opt), kWidth, \ + reinterpret_cast(dst_uv_opt), kDstHalfWidth * 2, kWidth, \ + NEG kHeight); \ } \ - for (int i = 0; i < kHeight; ++i) { \ - for (int j = 0; j < kWidth; ++j) { \ - EXPECT_EQ(dst_y_c[i * kWidth + j], dst_y_opt[i * kWidth + j]); \ - } \ + for (int i = 0; i < kHeight * kWidth * DST_BPC; ++i) { \ + EXPECT_EQ(dst_y_c[i], dst_y_opt[i]); \ } \ - for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \ - for (int j = 0; j < SUBSAMPLE(kWidth, SUBSAMP_X) * 2; ++j) { \ - EXPECT_EQ(dst_uv_c[i * SUBSAMPLE(kWidth, SUBSAMP_X) * 2 + j], \ - dst_uv_opt[i * SUBSAMPLE(kWidth, SUBSAMP_X) * 2 + j]); \ - } \ + for (int i = 0; i < kDstHalfWidth * kDstHalfHeight * DST_BPC * 2; ++i) { \ + EXPECT_EQ(dst_uv_c[i], dst_uv_opt[i]); \ } \ free_aligned_buffer_page_end(dst_y_c); \ free_aligned_buffer_page_end(dst_uv_c); \ @@ -347,158 +381,91 @@ int I400ToNV21(const uint8_t* src_y, free_aligned_buffer_page_end(src_v); \ } -#define TESTPLANARTOBP(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y) \ - TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_ - 4, _Any, +, 0) \ - TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Unaligned, +, 1) \ - TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Invert, -, 0) \ - TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Opt, +, 0) +#define TESTPLANARTOBP(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, \ + DST_SUBSAMP_X, DST_SUBSAMP_Y, SRC_DEPTH) \ + TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_ + 1, _Any, +, 0, SRC_DEPTH) \ + TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Unaligned, +, 1, \ + SRC_DEPTH) \ + TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Invert, -, 0, SRC_DEPTH) \ + TESTPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Opt, +, 0, SRC_DEPTH) -TESTPLANARTOBP(I420, 2, 2, NV12, 2, 2) -TESTPLANARTOBP(I420, 2, 2, NV21, 2, 2) -TESTPLANARTOBP(I422, 2, 1, NV21, 2, 2) -TESTPLANARTOBP(I444, 1, 1, NV12, 2, 2) -TESTPLANARTOBP(I444, 1, 1, NV21, 2, 2) -TESTPLANARTOBP(I400, 2, 2, NV21, 2, 2) +TESTPLANARTOBP(I420, uint8_t, 1, 2, 2, NV12, uint8_t, 1, 2, 2, 8) +TESTPLANARTOBP(I420, uint8_t, 1, 2, 2, NV21, uint8_t, 1, 2, 2, 8) +TESTPLANARTOBP(I422, uint8_t, 1, 2, 1, NV21, uint8_t, 1, 2, 2, 8) +TESTPLANARTOBP(I444, uint8_t, 1, 1, 1, NV12, uint8_t, 1, 2, 2, 8) +TESTPLANARTOBP(I444, uint8_t, 1, 1, 1, NV21, uint8_t, 1, 2, 2, 8) +TESTPLANARTOBP(I400, uint8_t, 1, 2, 2, NV21, uint8_t, 1, 2, 2, 8) +TESTPLANARTOBP(I010, uint16_t, 2, 2, 2, P010, uint16_t, 2, 2, 2, 10) +TESTPLANARTOBP(I210, uint16_t, 2, 2, 1, P210, uint16_t, 2, 2, 1, 10) +TESTPLANARTOBP(I012, uint16_t, 2, 2, 2, P012, uint16_t, 2, 2, 2, 12) +TESTPLANARTOBP(I212, uint16_t, 2, 2, 1, P212, uint16_t, 2, 2, 1, 12) -#define TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, \ - OFF, DOY) \ - TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ - const int kHeight = benchmark_height_; \ - align_buffer_page_end(src_y, kWidth* kHeight + OFF); \ - align_buffer_page_end(src_uv, 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \ - OFF); \ - align_buffer_page_end(dst_y_c, kWidth* kHeight); \ - align_buffer_page_end(dst_uv_c, 2 * SUBSAMPLE(kWidth, SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - align_buffer_page_end(dst_y_opt, kWidth* kHeight); \ - align_buffer_page_end(dst_uv_opt, 2 * SUBSAMPLE(kWidth, SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - for (int i = 0; i < kHeight; ++i) \ - for (int j = 0; j < kWidth; ++j) \ - src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \ - for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \ - for (int j = 0; j < 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \ - src_uv[(i * 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \ - (fastrand() & 0xff); \ - } \ - } \ - memset(dst_y_c, 1, kWidth* kHeight); \ - memset(dst_uv_c, 2, \ - 2 * SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - memset(dst_y_opt, 101, kWidth* kHeight); \ - memset(dst_uv_opt, 102, \ - 2 * SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - MaskCpuFlags(disable_cpu_flags_); \ - SRC_FMT_PLANAR##To##FMT_PLANAR( \ - src_y + OFF, kWidth, src_uv + OFF, \ - 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X), DOY ? dst_y_c : NULL, kWidth, \ - dst_uv_c, 2 * SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \ - MaskCpuFlags(benchmark_cpu_info_); \ - for (int i = 0; i < benchmark_iterations_; ++i) { \ - SRC_FMT_PLANAR##To##FMT_PLANAR( \ - src_y + OFF, kWidth, src_uv + OFF, \ - 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X), DOY ? dst_y_opt : NULL, \ - kWidth, dst_uv_opt, 2 * SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, \ - NEG kHeight); \ - } \ - if (DOY) { \ - for (int i = 0; i < kHeight; ++i) { \ - for (int j = 0; j < kWidth; ++j) { \ - EXPECT_EQ(dst_y_c[i * kWidth + j], dst_y_opt[i * kWidth + j]); \ - } \ - } \ - } \ - for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \ - for (int j = 0; j < 2 * SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \ - EXPECT_EQ(dst_uv_c[i * 2 * SUBSAMPLE(kWidth, SUBSAMP_X) + j], \ - dst_uv_opt[i * 2 * SUBSAMPLE(kWidth, SUBSAMP_X) + j]); \ - } \ - } \ - free_aligned_buffer_page_end(dst_y_c); \ - free_aligned_buffer_page_end(dst_uv_c); \ - free_aligned_buffer_page_end(dst_y_opt); \ - free_aligned_buffer_page_end(dst_uv_opt); \ - free_aligned_buffer_page_end(src_y); \ - free_aligned_buffer_page_end(src_uv); \ - } - -#define TESTBIPLANARTOBP(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y) \ - TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_ - 4, _Any, +, 0, 1) \ - TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Unaligned, +, 1, \ - 1) \ - TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Invert, -, 0, 1) \ - TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Opt, +, 0, 1) \ - TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _NullY, +, 0, 0) - -TESTBIPLANARTOBP(NV21, 2, 2, NV12, 2, 2) -TESTBIPLANARTOBP(NV12, 2, 2, NV12Mirror, 2, 2) - -#define TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, W1280, N, NEG, OFF, \ - DOY) \ +#define TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, \ + DST_SUBSAMP_X, DST_SUBSAMP_Y, W1280, N, NEG, OFF, \ + DOY, SRC_DEPTH) \ TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + static_assert(SRC_BPC == 1 || SRC_BPC == 2, "SRC BPC unsupported"); \ + static_assert(DST_BPC == 1 || DST_BPC == 2, "DST BPC unsupported"); \ + static_assert(SRC_SUBSAMP_X == 1 || SRC_SUBSAMP_X == 2, \ + "SRC_SUBSAMP_X unsupported"); \ + static_assert(SRC_SUBSAMP_Y == 1 || SRC_SUBSAMP_Y == 2, \ + "SRC_SUBSAMP_Y unsupported"); \ + static_assert(DST_SUBSAMP_X == 1 || DST_SUBSAMP_X == 2, \ + "DST_SUBSAMP_X unsupported"); \ + static_assert(DST_SUBSAMP_Y == 1 || DST_SUBSAMP_Y == 2, \ + "DST_SUBSAMP_Y unsupported"); \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ - align_buffer_page_end(src_y, kWidth* kHeight + OFF); \ - align_buffer_page_end(src_uv, 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SRC_SUBSAMP_Y) + \ - OFF); \ - align_buffer_page_end(dst_y_c, kWidth* kHeight); \ - align_buffer_page_end(dst_u_c, SUBSAMPLE(kWidth, SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - align_buffer_page_end(dst_v_c, SUBSAMPLE(kWidth, SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - align_buffer_page_end(dst_y_opt, kWidth* kHeight); \ - align_buffer_page_end(dst_u_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - align_buffer_page_end(dst_v_opt, SUBSAMPLE(kWidth, SUBSAMP_X) * \ - SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - for (int i = 0; i < kHeight; ++i) \ - for (int j = 0; j < kWidth; ++j) \ - src_y[i * kWidth + j + OFF] = (fastrand() & 0xff); \ - for (int i = 0; i < SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); ++i) { \ - for (int j = 0; j < 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X); ++j) { \ - src_uv[(i * 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X)) + j + OFF] = \ - (fastrand() & 0xff); \ - } \ + const int kSrcHalfWidth = SUBSAMPLE(kWidth, SRC_SUBSAMP_X); \ + const int kSrcHalfHeight = SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); \ + const int kDstHalfWidth = SUBSAMPLE(kWidth, DST_SUBSAMP_X); \ + const int kDstHalfHeight = SUBSAMPLE(kHeight, DST_SUBSAMP_Y); \ + align_buffer_page_end(src_y, kWidth* kHeight* SRC_BPC + OFF); \ + align_buffer_page_end(src_uv, \ + 2 * kSrcHalfWidth * kSrcHalfHeight * SRC_BPC + OFF); \ + align_buffer_page_end(dst_y_c, kWidth* kHeight* DST_BPC); \ + align_buffer_page_end(dst_uv_c, \ + 2 * kDstHalfWidth * kDstHalfHeight * DST_BPC); \ + align_buffer_page_end(dst_y_opt, kWidth* kHeight* DST_BPC); \ + align_buffer_page_end(dst_uv_opt, \ + 2 * kDstHalfWidth * kDstHalfHeight * DST_BPC); \ + SRC_T* src_y_p = reinterpret_cast(src_y + OFF); \ + SRC_T* src_uv_p = reinterpret_cast(src_uv + OFF); \ + for (int i = 0; i < kWidth * kHeight; ++i) { \ + src_y_p[i] = \ + (fastrand() & (((SRC_T)(-1)) << ((8 * SRC_BPC) - SRC_DEPTH))); \ } \ - memset(dst_y_c, 1, kWidth* kHeight); \ - memset(dst_u_c, 2, \ - SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - memset(dst_v_c, 3, \ - SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - memset(dst_y_opt, 101, kWidth* kHeight); \ - memset(dst_u_opt, 102, \ - SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \ - memset(dst_v_opt, 103, \ - SUBSAMPLE(kWidth, SUBSAMP_X) * SUBSAMPLE(kHeight, SUBSAMP_Y)); \ + for (int i = 0; i < kSrcHalfWidth * kSrcHalfHeight * 2; ++i) { \ + src_uv_p[i] = \ + (fastrand() & (((SRC_T)(-1)) << ((8 * SRC_BPC) - SRC_DEPTH))); \ + } \ + memset(dst_y_c, 1, kWidth* kHeight* DST_BPC); \ + memset(dst_uv_c, 2, 2 * kDstHalfWidth * kDstHalfHeight * DST_BPC); \ + memset(dst_y_opt, 101, kWidth* kHeight* DST_BPC); \ + memset(dst_uv_opt, 102, 2 * kDstHalfWidth * kDstHalfHeight * DST_BPC); \ MaskCpuFlags(disable_cpu_flags_); \ SRC_FMT_PLANAR##To##FMT_PLANAR( \ - src_y + OFF, kWidth, src_uv + OFF, \ - 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X), DOY ? dst_y_c : NULL, kWidth, \ - dst_u_c, SUBSAMPLE(kWidth, SUBSAMP_X), dst_v_c, \ - SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \ + src_y_p, kWidth, src_uv_p, 2 * kSrcHalfWidth, \ + DOY ? reinterpret_cast(dst_y_c) : NULL, kWidth, \ + reinterpret_cast(dst_uv_c), 2 * kDstHalfWidth, kWidth, \ + NEG kHeight); \ MaskCpuFlags(benchmark_cpu_info_); \ for (int i = 0; i < benchmark_iterations_; ++i) { \ SRC_FMT_PLANAR##To##FMT_PLANAR( \ - src_y + OFF, kWidth, src_uv + OFF, \ - 2 * SUBSAMPLE(kWidth, SRC_SUBSAMP_X), DOY ? dst_y_opt : NULL, \ - kWidth, dst_u_opt, SUBSAMPLE(kWidth, SUBSAMP_X), dst_v_opt, \ - SUBSAMPLE(kWidth, SUBSAMP_X), kWidth, NEG kHeight); \ + src_y_p, kWidth, src_uv_p, 2 * kSrcHalfWidth, \ + DOY ? reinterpret_cast(dst_y_opt) : NULL, kWidth, \ + reinterpret_cast(dst_uv_opt), 2 * kDstHalfWidth, kWidth, \ + NEG kHeight); \ } \ if (DOY) { \ for (int i = 0; i < kHeight; ++i) { \ @@ -507,51 +474,187 @@ TESTBIPLANARTOBP(NV12, 2, 2, NV12Mirror, 2, 2) } \ } \ } \ - for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \ - for (int j = 0; j < SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \ - EXPECT_EQ(dst_u_c[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j], \ - dst_u_opt[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j]); \ - } \ - } \ - for (int i = 0; i < SUBSAMPLE(kHeight, SUBSAMP_Y); ++i) { \ - for (int j = 0; j < SUBSAMPLE(kWidth, SUBSAMP_X); ++j) { \ - EXPECT_EQ(dst_v_c[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j], \ - dst_v_opt[i * SUBSAMPLE(kWidth, SUBSAMP_X) + j]); \ + for (int i = 0; i < kDstHalfHeight; ++i) { \ + for (int j = 0; j < 2 * kDstHalfWidth; ++j) { \ + EXPECT_EQ(dst_uv_c[i * 2 * kDstHalfWidth + j], \ + dst_uv_opt[i * 2 * kDstHalfWidth + j]); \ } \ } \ free_aligned_buffer_page_end(dst_y_c); \ - free_aligned_buffer_page_end(dst_u_c); \ - free_aligned_buffer_page_end(dst_v_c); \ + free_aligned_buffer_page_end(dst_uv_c); \ free_aligned_buffer_page_end(dst_y_opt); \ - free_aligned_buffer_page_end(dst_u_opt); \ - free_aligned_buffer_page_end(dst_v_opt); \ + free_aligned_buffer_page_end(dst_uv_opt); \ free_aligned_buffer_page_end(src_y); \ free_aligned_buffer_page_end(src_uv); \ } -#define TESTBIPLANARTOP(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, \ - FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y) \ - TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_ - 4, _Any, +, 0, 1) \ - TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Unaligned, +, 1, \ - 1) \ - TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Invert, -, 0, 1) \ - TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _Opt, +, 0, 1) \ - TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_SUBSAMP_X, SRC_SUBSAMP_Y, FMT_PLANAR, \ - SUBSAMP_X, SUBSAMP_Y, benchmark_width_, _NullY, +, 0, 0) +#define TESTBIPLANARTOBP(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, \ + DST_SUBSAMP_X, DST_SUBSAMP_Y, SRC_DEPTH) \ + TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_ + 1, _Any, +, 0, 1, \ + SRC_DEPTH) \ + TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Unaligned, +, 1, 1, \ + SRC_DEPTH) \ + TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Invert, -, 0, 1, \ + SRC_DEPTH) \ + TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Opt, +, 0, 1, SRC_DEPTH) \ + TESTBIPLANARTOBPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _NullY, +, 0, 0, \ + SRC_DEPTH) -TESTBIPLANARTOP(NV12, 2, 2, I420, 2, 2) -TESTBIPLANARTOP(NV21, 2, 2, I420, 2, 2) +TESTBIPLANARTOBP(NV21, uint8_t, 1, 2, 2, NV12, uint8_t, 1, 2, 2, 8) +TESTBIPLANARTOBP(NV12, uint8_t, 1, 2, 2, NV12Mirror, uint8_t, 1, 2, 2, 8) +TESTBIPLANARTOBP(NV12, uint8_t, 1, 2, 2, NV24, uint8_t, 1, 1, 1, 8) +TESTBIPLANARTOBP(NV16, uint8_t, 1, 2, 1, NV24, uint8_t, 1, 1, 1, 8) +TESTBIPLANARTOBP(P010, uint16_t, 2, 2, 2, P410, uint16_t, 2, 1, 1, 10) +TESTBIPLANARTOBP(P210, uint16_t, 2, 2, 1, P410, uint16_t, 2, 1, 1, 10) +TESTBIPLANARTOBP(P012, uint16_t, 2, 2, 2, P412, uint16_t, 2, 1, 1, 10) +TESTBIPLANARTOBP(P212, uint16_t, 2, 2, 1, P412, uint16_t, 2, 1, 1, 12) +TESTBIPLANARTOBP(P016, uint16_t, 2, 2, 2, P416, uint16_t, 2, 1, 1, 12) +TESTBIPLANARTOBP(P216, uint16_t, 2, 2, 1, P416, uint16_t, 2, 1, 1, 12) + +#define TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, \ + DST_SUBSAMP_X, DST_SUBSAMP_Y, W1280, N, NEG, OFF, \ + SRC_DEPTH) \ + TEST_F(LibYUVConvertTest, SRC_FMT_PLANAR##To##FMT_PLANAR##N) { \ + static_assert(SRC_BPC == 1 || SRC_BPC == 2, "SRC BPC unsupported"); \ + static_assert(DST_BPC == 1 || DST_BPC == 2, "DST BPC unsupported"); \ + static_assert(SRC_SUBSAMP_X == 1 || SRC_SUBSAMP_X == 2, \ + "SRC_SUBSAMP_X unsupported"); \ + static_assert(SRC_SUBSAMP_Y == 1 || SRC_SUBSAMP_Y == 2, \ + "SRC_SUBSAMP_Y unsupported"); \ + static_assert(DST_SUBSAMP_X == 1 || DST_SUBSAMP_X == 2, \ + "DST_SUBSAMP_X unsupported"); \ + static_assert(DST_SUBSAMP_Y == 1 || DST_SUBSAMP_Y == 2, \ + "DST_SUBSAMP_Y unsupported"); \ + const int kWidth = W1280; \ + const int kHeight = benchmark_height_; \ + const int kSrcHalfWidth = SUBSAMPLE(kWidth, SRC_SUBSAMP_X); \ + const int kSrcHalfHeight = SUBSAMPLE(kHeight, SRC_SUBSAMP_Y); \ + const int kDstHalfWidth = SUBSAMPLE(kWidth, DST_SUBSAMP_X); \ + const int kDstHalfHeight = SUBSAMPLE(kHeight, DST_SUBSAMP_Y); \ + align_buffer_page_end(src_y, kWidth* kHeight* SRC_BPC + OFF); \ + align_buffer_page_end(src_uv, \ + kSrcHalfWidth* kSrcHalfHeight* SRC_BPC * 2 + OFF); \ + align_buffer_page_end(dst_y_c, kWidth* kHeight* DST_BPC); \ + align_buffer_page_end(dst_u_c, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ + align_buffer_page_end(dst_v_c, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ + align_buffer_page_end(dst_y_opt, kWidth* kHeight* DST_BPC); \ + align_buffer_page_end(dst_u_opt, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ + align_buffer_page_end(dst_v_opt, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ + SRC_T* src_y_p = reinterpret_cast(src_y + OFF); \ + SRC_T* src_uv_p = reinterpret_cast(src_uv + OFF); \ + for (int i = 0; i < kWidth * kHeight; ++i) { \ + src_y_p[i] = \ + (fastrand() & (((SRC_T)(-1)) << ((8 * SRC_BPC) - SRC_DEPTH))); \ + } \ + for (int i = 0; i < kSrcHalfWidth * kSrcHalfHeight * 2; ++i) { \ + src_uv_p[i] = \ + (fastrand() & (((SRC_T)(-1)) << ((8 * SRC_BPC) - SRC_DEPTH))); \ + } \ + memset(dst_y_c, 1, kWidth* kHeight* DST_BPC); \ + memset(dst_u_c, 2, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ + memset(dst_v_c, 3, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ + memset(dst_y_opt, 101, kWidth* kHeight* DST_BPC); \ + memset(dst_u_opt, 102, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ + memset(dst_v_opt, 103, kDstHalfWidth* kDstHalfHeight* DST_BPC); \ + MaskCpuFlags(disable_cpu_flags_); \ + SRC_FMT_PLANAR##To##FMT_PLANAR( \ + src_y_p, kWidth, src_uv_p, kSrcHalfWidth * 2, \ + reinterpret_cast(dst_y_c), kWidth, \ + reinterpret_cast(dst_u_c), kDstHalfWidth, \ + reinterpret_cast(dst_v_c), kDstHalfWidth, kWidth, \ + NEG kHeight); \ + MaskCpuFlags(benchmark_cpu_info_); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + SRC_FMT_PLANAR##To##FMT_PLANAR( \ + src_y_p, kWidth, src_uv_p, kSrcHalfWidth * 2, \ + reinterpret_cast(dst_y_opt), kWidth, \ + reinterpret_cast(dst_u_opt), kDstHalfWidth, \ + reinterpret_cast(dst_v_opt), kDstHalfWidth, kWidth, \ + NEG kHeight); \ + } \ + for (int i = 0; i < kHeight * kWidth * DST_BPC; ++i) { \ + EXPECT_EQ(dst_y_c[i], dst_y_opt[i]); \ + } \ + for (int i = 0; i < kDstHalfWidth * kDstHalfHeight * DST_BPC; ++i) { \ + EXPECT_EQ(dst_u_c[i], dst_u_opt[i]); \ + EXPECT_EQ(dst_v_c[i], dst_v_opt[i]); \ + } \ + free_aligned_buffer_page_end(dst_y_c); \ + free_aligned_buffer_page_end(dst_u_c); \ + free_aligned_buffer_page_end(dst_v_c); \ + free_aligned_buffer_page_end(dst_y_opt); \ + free_aligned_buffer_page_end(dst_u_opt); \ + free_aligned_buffer_page_end(dst_v_opt); \ + free_aligned_buffer_page_end(src_y); \ + free_aligned_buffer_page_end(src_uv); \ + } + +#define TESTBIPLANARTOP(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, \ + DST_SUBSAMP_X, DST_SUBSAMP_Y, SRC_DEPTH) \ + TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_ + 1, _Any, +, 0, SRC_DEPTH) \ + TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Unaligned, +, 1, \ + SRC_DEPTH) \ + TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Invert, -, 0, SRC_DEPTH) \ + TESTBIPLANARTOPI(SRC_FMT_PLANAR, SRC_T, SRC_BPC, SRC_SUBSAMP_X, \ + SRC_SUBSAMP_Y, FMT_PLANAR, DST_T, DST_BPC, DST_SUBSAMP_X, \ + DST_SUBSAMP_Y, benchmark_width_, _Opt, +, 0, SRC_DEPTH) + +TESTBIPLANARTOP(NV12, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8) +TESTBIPLANARTOP(NV21, uint8_t, 1, 2, 2, I420, uint8_t, 1, 2, 2, 8) + +// Provide matrix wrappers for full range bt.709 +#define F420ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I420ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j) +#define F420ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I420ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j) +#define F422ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I422ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j) +#define F422ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I422ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j) +#define F444ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I444ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuF709Constants, i, j) +#define F444ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I444ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvF709Constants, i, j) + +// Provide matrix wrappers for full range bt.2020 +#define V420ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I420ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j) +#define V420ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I420ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j) +#define V422ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I422ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j) +#define V422ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I422ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j) +#define V444ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I444ToARGBMatrix(a, b, e, f, c, d, g, h, &kYvuV2020Constants, i, j) +#define V444ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I444ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvV2020Constants, i, j) #define ALIGNINT(V, ALIGN) (((V) + (ALIGN)-1) / (ALIGN) * (ALIGN)) #define TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN, W1280, N, NEG, OFF) \ TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \ const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \ const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ @@ -599,7 +702,7 @@ TESTBIPLANARTOP(NV21, 2, 2, I420, 2, 2) #define TESTPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN) \ TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - YALIGN, benchmark_width_ - 4, _Any, +, 0) \ + YALIGN, benchmark_width_ + 1, _Any, +, 0) \ TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN, benchmark_width_, _Unaligned, +, 1) \ TESTPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ @@ -611,10 +714,14 @@ TESTPLANARTOB(I420, 2, 2, ARGB, 4, 4, 1) TESTPLANARTOB(I420, 2, 2, ABGR, 4, 4, 1) TESTPLANARTOB(J420, 2, 2, ARGB, 4, 4, 1) TESTPLANARTOB(J420, 2, 2, ABGR, 4, 4, 1) +TESTPLANARTOB(F420, 2, 2, ARGB, 4, 4, 1) +TESTPLANARTOB(F420, 2, 2, ABGR, 4, 4, 1) TESTPLANARTOB(H420, 2, 2, ARGB, 4, 4, 1) TESTPLANARTOB(H420, 2, 2, ABGR, 4, 4, 1) TESTPLANARTOB(U420, 2, 2, ARGB, 4, 4, 1) TESTPLANARTOB(U420, 2, 2, ABGR, 4, 4, 1) +TESTPLANARTOB(V420, 2, 2, ARGB, 4, 4, 1) +TESTPLANARTOB(V420, 2, 2, ABGR, 4, 4, 1) TESTPLANARTOB(I420, 2, 2, BGRA, 4, 4, 1) TESTPLANARTOB(I420, 2, 2, RGBA, 4, 4, 1) TESTPLANARTOB(I420, 2, 2, RAW, 3, 3, 1) @@ -639,6 +746,8 @@ TESTPLANARTOB(H422, 2, 1, ARGB, 4, 4, 1) TESTPLANARTOB(H422, 2, 1, ABGR, 4, 4, 1) TESTPLANARTOB(U422, 2, 1, ARGB, 4, 4, 1) TESTPLANARTOB(U422, 2, 1, ABGR, 4, 4, 1) +TESTPLANARTOB(V422, 2, 1, ARGB, 4, 4, 1) +TESTPLANARTOB(V422, 2, 1, ABGR, 4, 4, 1) TESTPLANARTOB(I422, 2, 1, BGRA, 4, 4, 1) TESTPLANARTOB(I422, 2, 1, RGBA, 4, 4, 1) TESTPLANARTOB(I444, 1, 1, ARGB, 4, 4, 1) @@ -649,6 +758,8 @@ TESTPLANARTOB(H444, 1, 1, ARGB, 4, 4, 1) TESTPLANARTOB(H444, 1, 1, ABGR, 4, 4, 1) TESTPLANARTOB(U444, 1, 1, ARGB, 4, 4, 1) TESTPLANARTOB(U444, 1, 1, ABGR, 4, 4, 1) +TESTPLANARTOB(V444, 1, 1, ARGB, 4, 4, 1) +TESTPLANARTOB(V444, 1, 1, ABGR, 4, 4, 1) TESTPLANARTOB(I420, 2, 2, YUY2, 2, 4, 1) TESTPLANARTOB(I420, 2, 2, UYVY, 2, 4, 1) TESTPLANARTOB(I422, 2, 1, YUY2, 2, 4, 1) @@ -658,12 +769,14 @@ TESTPLANARTOB(J420, 2, 2, J400, 1, 1, 1) #ifdef LITTLE_ENDIAN_ONLY_TEST TESTPLANARTOB(I420, 2, 2, AR30, 4, 4, 1) TESTPLANARTOB(H420, 2, 2, AR30, 4, 4, 1) +TESTPLANARTOB(I420, 2, 2, AB30, 4, 4, 1) +TESTPLANARTOB(H420, 2, 2, AB30, 4, 4, 1) #endif #define TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN, W1280, N, NEG, OFF, ATTEN) \ TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \ const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \ const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ @@ -710,7 +823,7 @@ TESTPLANARTOB(H420, 2, 2, AR30, 4, 4, 1) #define TESTQPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN) \ TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - YALIGN, benchmark_width_ - 4, _Any, +, 0, 0) \ + YALIGN, benchmark_width_ + 1, _Any, +, 0, 0) \ TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN, benchmark_width_, _Unaligned, +, 1, 0) \ TESTQPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ @@ -726,6 +839,12 @@ TESTPLANARTOB(H420, 2, 2, AR30, 4, 4, 1) #define J420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ l, m) +#define F420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define F420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) #define H420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ l, m) @@ -738,6 +857,72 @@ TESTPLANARTOB(H420, 2, 2, AR30, 4, 4, 1) #define U420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ l, m) +#define V420AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I420AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define V420AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I420AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define J422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define J422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define F422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define F422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define H422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define H422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define U422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define U422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define V422AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define V422AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I422AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define J444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define J444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define F444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define F444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define H444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define H444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define U444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define U444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define V444AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define V444AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I444AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) TESTQPLANARTOB(I420Alpha, 2, 2, ARGB, 4, 4, 1) TESTQPLANARTOB(I420Alpha, 2, 2, ABGR, 4, 4, 1) @@ -745,13 +930,41 @@ TESTQPLANARTOB(J420Alpha, 2, 2, ARGB, 4, 4, 1) TESTQPLANARTOB(J420Alpha, 2, 2, ABGR, 4, 4, 1) TESTQPLANARTOB(H420Alpha, 2, 2, ARGB, 4, 4, 1) TESTQPLANARTOB(H420Alpha, 2, 2, ABGR, 4, 4, 1) +TESTQPLANARTOB(F420Alpha, 2, 2, ARGB, 4, 4, 1) +TESTQPLANARTOB(F420Alpha, 2, 2, ABGR, 4, 4, 1) TESTQPLANARTOB(U420Alpha, 2, 2, ARGB, 4, 4, 1) TESTQPLANARTOB(U420Alpha, 2, 2, ABGR, 4, 4, 1) +TESTQPLANARTOB(V420Alpha, 2, 2, ARGB, 4, 4, 1) +TESTQPLANARTOB(V420Alpha, 2, 2, ABGR, 4, 4, 1) +TESTQPLANARTOB(I422Alpha, 2, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(I422Alpha, 2, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(J422Alpha, 2, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(J422Alpha, 2, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(H422Alpha, 2, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(H422Alpha, 2, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(F422Alpha, 2, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(F422Alpha, 2, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(U422Alpha, 2, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(U422Alpha, 2, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(V422Alpha, 2, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(V422Alpha, 2, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(I444Alpha, 1, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(I444Alpha, 1, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(J444Alpha, 1, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(J444Alpha, 1, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(H444Alpha, 1, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(H444Alpha, 1, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(F444Alpha, 1, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(F444Alpha, 1, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(U444Alpha, 1, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(U444Alpha, 1, 1, ABGR, 4, 4, 1) +TESTQPLANARTOB(V444Alpha, 1, 1, ARGB, 4, 4, 1) +TESTQPLANARTOB(V444Alpha, 1, 1, ABGR, 4, 4, 1) #define TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, \ BPP_B, W1280, N, NEG, OFF) \ TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kStrideB = kWidth * BPP_B; \ const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ @@ -804,7 +1017,7 @@ TESTQPLANARTOB(U420Alpha, 2, 2, ABGR, 4, 4, 1) #define TESTBIPLANARTOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B) \ TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \ - benchmark_width_ - 4, _Any, +, 0) \ + benchmark_width_ + 1, _Any, +, 0) \ TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \ benchmark_width_, _Unaligned, +, 1) \ TESTBIPLANARTOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, FMT_C, BPP_B, \ @@ -859,7 +1072,7 @@ TESTBIPLANARTOB(NV12, 2, 2, RGB565, RGB565, 2) #define TESTATOPLANARI(FMT_A, BPP_A, YALIGN, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \ W1280, N, NEG, OFF) \ TEST_F(LibYUVConvertTest, FMT_A##To##FMT_PLANAR##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \ const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ const int kStride = (kStrideUV * SUBSAMP_X * 8 * BPP_A + 7) / 8; \ @@ -906,7 +1119,7 @@ TESTBIPLANARTOB(NV12, 2, 2, RGB565, RGB565, 2) #define TESTATOPLANAR(FMT_A, BPP_A, YALIGN, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y) \ TESTATOPLANARI(FMT_A, BPP_A, YALIGN, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \ - benchmark_width_ - 4, _Any, +, 0) \ + benchmark_width_ + 1, _Any, +, 0) \ TESTATOPLANARI(FMT_A, BPP_A, YALIGN, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \ benchmark_width_, _Unaligned, +, 1) \ TESTATOPLANARI(FMT_A, BPP_A, YALIGN, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \ @@ -929,6 +1142,7 @@ TESTATOPLANAR(BGRA, 4, 1, I420, 2, 2) TESTATOPLANAR(I400, 1, 1, I420, 2, 2) TESTATOPLANAR(J400, 1, 1, J420, 2, 2) TESTATOPLANAR(RAW, 3, 1, I420, 2, 2) +TESTATOPLANAR(RAW, 3, 1, J420, 2, 2) TESTATOPLANAR(RGB24, 3, 1, I420, 2, 2) TESTATOPLANAR(RGB24, 3, 1, J420, 2, 2) TESTATOPLANAR(RGBA, 4, 1, I420, 2, 2) @@ -940,7 +1154,7 @@ TESTATOPLANAR(YUY2, 2, 1, I422, 2, 1) #define TESTATOBIPLANARI(FMT_A, SUB_A, BPP_A, FMT_PLANAR, SUBSAMP_X, \ SUBSAMP_Y, W1280, N, NEG, OFF) \ TEST_F(LibYUVConvertTest, FMT_A##To##FMT_PLANAR##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kStride = SUBSAMPLE(kWidth, SUB_A) * BPP_A; \ const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ @@ -986,7 +1200,7 @@ TESTATOPLANAR(YUY2, 2, 1, I422, 2, 1) #define TESTATOBIPLANAR(FMT_A, SUB_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y) \ TESTATOBIPLANARI(FMT_A, SUB_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \ - benchmark_width_ - 4, _Any, +, 0) \ + benchmark_width_ + 1, _Any, +, 0) \ TESTATOBIPLANARI(FMT_A, SUB_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \ benchmark_width_, _Unaligned, +, 1) \ TESTATOBIPLANARI(FMT_A, SUB_A, BPP_A, FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, \ @@ -1003,152 +1217,166 @@ TESTATOBIPLANAR(UYVY, 2, 4, NV12, 2, 2) TESTATOBIPLANAR(AYUV, 1, 4, NV12, 2, 2) TESTATOBIPLANAR(AYUV, 1, 4, NV21, 2, 2) -#define TESTATOBI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ - HEIGHT_B, W1280, N, NEG, OFF) \ - TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ - const int kHeight = benchmark_height_; \ - const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \ - const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \ - const int kStrideA = \ - (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \ - const int kStrideB = \ - (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \ - align_buffer_page_end(src_argb, kStrideA* kHeightA + OFF); \ - align_buffer_page_end(dst_argb_c, kStrideB* kHeightB); \ - align_buffer_page_end(dst_argb_opt, kStrideB* kHeightB); \ - for (int i = 0; i < kStrideA * kHeightA; ++i) { \ - src_argb[i + OFF] = (fastrand() & 0xff); \ - } \ - memset(dst_argb_c, 1, kStrideB* kHeightB); \ - memset(dst_argb_opt, 101, kStrideB* kHeightB); \ - MaskCpuFlags(disable_cpu_flags_); \ - FMT_A##To##FMT_B(src_argb + OFF, kStrideA, dst_argb_c, kStrideB, kWidth, \ - NEG kHeight); \ - MaskCpuFlags(benchmark_cpu_info_); \ - for (int i = 0; i < benchmark_iterations_; ++i) { \ - FMT_A##To##FMT_B(src_argb + OFF, kStrideA, dst_argb_opt, kStrideB, \ - kWidth, NEG kHeight); \ - } \ - for (int i = 0; i < kStrideB * kHeightB; ++i) { \ - EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \ - } \ - free_aligned_buffer_page_end(src_argb); \ - free_aligned_buffer_page_end(dst_argb_c); \ - free_aligned_buffer_page_end(dst_argb_opt); \ +#define TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \ + EPP_B, STRIDE_B, HEIGHT_B, W1280, N, NEG, OFF) \ + TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##N) { \ + const int kWidth = W1280; \ + const int kHeight = benchmark_height_; \ + const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \ + const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \ + const int kStrideA = \ + (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \ + const int kStrideB = \ + (kWidth * EPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \ + align_buffer_page_end(src_argb, \ + kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \ + align_buffer_page_end(dst_argb_c, kStrideB* kHeightB*(int)sizeof(TYPE_B)); \ + align_buffer_page_end(dst_argb_opt, \ + kStrideB* kHeightB*(int)sizeof(TYPE_B)); \ + for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \ + src_argb[i + OFF] = (fastrand() & 0xff); \ + } \ + memset(dst_argb_c, 1, kStrideB* kHeightB); \ + memset(dst_argb_opt, 101, kStrideB* kHeightB); \ + MaskCpuFlags(disable_cpu_flags_); \ + FMT_A##To##FMT_B((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_B*)dst_argb_c, \ + kStrideB, kWidth, NEG kHeight); \ + MaskCpuFlags(benchmark_cpu_info_); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FMT_A##To##FMT_B((TYPE_A*)(src_argb + OFF), kStrideA, \ + (TYPE_B*)dst_argb_opt, kStrideB, kWidth, NEG kHeight); \ + } \ + for (int i = 0; i < kStrideB * kHeightB * (int)sizeof(TYPE_B); ++i) { \ + EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \ + } \ + free_aligned_buffer_page_end(src_argb); \ + free_aligned_buffer_page_end(dst_argb_c); \ + free_aligned_buffer_page_end(dst_argb_opt); \ } -#define TESTATOBRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, \ - STRIDE_B, HEIGHT_B) \ - TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##_Random) { \ - for (int times = 0; times < benchmark_iterations_; ++times) { \ - const int kWidth = (fastrand() & 63) + 1; \ - const int kHeight = (fastrand() & 31) + 1; \ - const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \ - const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \ - const int kStrideA = \ - (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \ - const int kStrideB = \ - (kWidth * BPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \ - align_buffer_page_end(src_argb, kStrideA* kHeightA); \ - align_buffer_page_end(dst_argb_c, kStrideB* kHeightB); \ - align_buffer_page_end(dst_argb_opt, kStrideB* kHeightB); \ - for (int i = 0; i < kStrideA * kHeightA; ++i) { \ - src_argb[i] = (fastrand() & 0xff); \ - } \ - memset(dst_argb_c, 123, kStrideB* kHeightB); \ - memset(dst_argb_opt, 123, kStrideB* kHeightB); \ - MaskCpuFlags(disable_cpu_flags_); \ - FMT_A##To##FMT_B(src_argb, kStrideA, dst_argb_c, kStrideB, kWidth, \ - kHeight); \ - MaskCpuFlags(benchmark_cpu_info_); \ - FMT_A##To##FMT_B(src_argb, kStrideA, dst_argb_opt, kStrideB, kWidth, \ - kHeight); \ - for (int i = 0; i < kStrideB * kHeightB; ++i) { \ - EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \ - } \ - free_aligned_buffer_page_end(src_argb); \ - free_aligned_buffer_page_end(dst_argb_c); \ - free_aligned_buffer_page_end(dst_argb_opt); \ - } \ +#define TESTATOBRANDOM(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, \ + TYPE_B, EPP_B, STRIDE_B, HEIGHT_B) \ + TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##_Random) { \ + for (int times = 0; times < benchmark_iterations_; ++times) { \ + const int kWidth = (fastrand() & 63) + 1; \ + const int kHeight = (fastrand() & 31) + 1; \ + const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \ + const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \ + const int kStrideA = \ + (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \ + const int kStrideB = \ + (kWidth * EPP_B + STRIDE_B - 1) / STRIDE_B * STRIDE_B; \ + align_buffer_page_end(src_argb, kStrideA* kHeightA*(int)sizeof(TYPE_A)); \ + align_buffer_page_end(dst_argb_c, \ + kStrideB* kHeightB*(int)sizeof(TYPE_B)); \ + align_buffer_page_end(dst_argb_opt, \ + kStrideB* kHeightB*(int)sizeof(TYPE_B)); \ + for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \ + src_argb[i] = 0xfe; \ + } \ + memset(dst_argb_c, 123, kStrideB* kHeightB); \ + memset(dst_argb_opt, 123, kStrideB* kHeightB); \ + MaskCpuFlags(disable_cpu_flags_); \ + FMT_A##To##FMT_B((TYPE_A*)src_argb, kStrideA, (TYPE_B*)dst_argb_c, \ + kStrideB, kWidth, kHeight); \ + MaskCpuFlags(benchmark_cpu_info_); \ + FMT_A##To##FMT_B((TYPE_A*)src_argb, kStrideA, (TYPE_B*)dst_argb_opt, \ + kStrideB, kWidth, kHeight); \ + for (int i = 0; i < kStrideB * kHeightB * (int)sizeof(TYPE_B); ++i) { \ + EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \ + } \ + free_aligned_buffer_page_end(src_argb); \ + free_aligned_buffer_page_end(dst_argb_c); \ + free_aligned_buffer_page_end(dst_argb_opt); \ + } \ } -#define TESTATOB(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ - HEIGHT_B) \ - TESTATOBI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ - HEIGHT_B, benchmark_width_ - 4, _Any, +, 0) \ - TESTATOBI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ - HEIGHT_B, benchmark_width_, _Unaligned, +, 1) \ - TESTATOBI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ - HEIGHT_B, benchmark_width_, _Invert, -, 0) \ - TESTATOBI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ - HEIGHT_B, benchmark_width_, _Opt, +, 0) \ - TESTATOBRANDOM(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ - HEIGHT_B) +#define TESTATOB(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \ + EPP_B, STRIDE_B, HEIGHT_B) \ + TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \ + STRIDE_B, HEIGHT_B, benchmark_width_ + 1, _Any, +, 0) \ + TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \ + STRIDE_B, HEIGHT_B, benchmark_width_, _Unaligned, +, 1) \ + TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \ + STRIDE_B, HEIGHT_B, benchmark_width_, _Invert, -, 0) \ + TESTATOBI(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, EPP_B, \ + STRIDE_B, HEIGHT_B, benchmark_width_, _Opt, +, 0) \ + TESTATOBRANDOM(FMT_A, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, FMT_B, TYPE_B, \ + EPP_B, STRIDE_B, HEIGHT_B) -TESTATOB(AB30, 4, 4, 1, ABGR, 4, 4, 1) -TESTATOB(AB30, 4, 4, 1, ARGB, 4, 4, 1) +TESTATOB(AB30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1) +TESTATOB(AB30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1) #ifdef LITTLE_ENDIAN_ONLY_TEST -TESTATOB(ABGR, 4, 4, 1, AR30, 4, 4, 1) +TESTATOB(ABGR, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1) #endif -TESTATOB(ABGR, 4, 4, 1, ARGB, 4, 4, 1) +TESTATOB(ABGR, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1) #ifdef LITTLE_ENDIAN_ONLY_TEST -TESTATOB(AR30, 4, 4, 1, AB30, 4, 4, 1) +TESTATOB(AR30, uint8_t, 4, 4, 1, AB30, uint8_t, 4, 4, 1) #endif -TESTATOB(AR30, 4, 4, 1, ABGR, 4, 4, 1) +TESTATOB(AR30, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1) #ifdef LITTLE_ENDIAN_ONLY_TEST -TESTATOB(AR30, 4, 4, 1, AR30, 4, 4, 1) -TESTATOB(AR30, 4, 4, 1, ARGB, 4, 4, 1) +TESTATOB(AR30, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1) +TESTATOB(AR30, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1) #endif -TESTATOB(ARGB, 4, 4, 1, ABGR, 4, 4, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1) #ifdef LITTLE_ENDIAN_ONLY_TEST -TESTATOB(ARGB, 4, 4, 1, AR30, 4, 4, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, AR30, uint8_t, 4, 4, 1) #endif -TESTATOB(ARGB, 4, 4, 1, ARGB, 4, 4, 1) -TESTATOB(ARGB, 4, 4, 1, ARGB1555, 2, 2, 1) -TESTATOB(ARGB, 4, 4, 1, ARGB4444, 2, 2, 1) -TESTATOB(ARGB, 4, 4, 1, ARGBMirror, 4, 4, 1) -TESTATOB(ARGB, 4, 4, 1, BGRA, 4, 4, 1) -TESTATOB(ARGB, 4, 4, 1, I400, 1, 1, 1) -TESTATOB(ARGB, 4, 4, 1, J400, 1, 1, 1) -TESTATOB(RGBA, 4, 4, 1, J400, 1, 1, 1) -TESTATOB(ARGB, 4, 4, 1, RAW, 3, 3, 1) -TESTATOB(ARGB, 4, 4, 1, RGB24, 3, 3, 1) -TESTATOB(ABGR, 4, 4, 1, RAW, 3, 3, 1) -TESTATOB(ABGR, 4, 4, 1, RGB24, 3, 3, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB1555, uint8_t, 2, 2, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGB4444, uint8_t, 2, 2, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, ARGBMirror, uint8_t, 4, 4, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, BGRA, uint8_t, 4, 4, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, I400, uint8_t, 1, 1, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1) +TESTATOB(RGBA, uint8_t, 4, 4, 1, J400, uint8_t, 1, 1, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1) +TESTATOB(ABGR, uint8_t, 4, 4, 1, RAW, uint8_t, 3, 3, 1) +TESTATOB(ABGR, uint8_t, 4, 4, 1, RGB24, uint8_t, 3, 3, 1) #ifdef LITTLE_ENDIAN_ONLY_TEST -TESTATOB(ARGB, 4, 4, 1, RGB565, 2, 2, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, RGB565, uint8_t, 2, 2, 1) #endif -TESTATOB(ARGB, 4, 4, 1, RGBA, 4, 4, 1) -TESTATOB(ARGB, 4, 4, 1, UYVY, 2, 4, 1) -TESTATOB(ARGB, 4, 4, 1, YUY2, 2, 4, 1) // 4 -TESTATOB(ARGB1555, 2, 2, 1, ARGB, 4, 4, 1) -TESTATOB(ARGB4444, 2, 2, 1, ARGB, 4, 4, 1) -TESTATOB(BGRA, 4, 4, 1, ARGB, 4, 4, 1) -TESTATOB(I400, 1, 1, 1, ARGB, 4, 4, 1) -TESTATOB(I400, 1, 1, 1, I400, 1, 1, 1) -TESTATOB(I400, 1, 1, 1, I400Mirror, 1, 1, 1) -TESTATOB(J400, 1, 1, 1, ARGB, 4, 4, 1) -TESTATOB(J400, 1, 1, 1, J400, 1, 1, 1) -TESTATOB(RAW, 3, 3, 1, ARGB, 4, 4, 1) -TESTATOB(RAW, 3, 3, 1, RGBA, 4, 4, 1) -TESTATOB(RAW, 3, 3, 1, RGB24, 3, 3, 1) -TESTATOB(RGB24, 3, 3, 1, ARGB, 4, 4, 1) -TESTATOB(RGB24, 3, 3, 1, J400, 1, 1, 1) -TESTATOB(RGB24, 3, 3, 1, RGB24Mirror, 3, 3, 1) -TESTATOB(RAW, 3, 3, 1, J400, 1, 1, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, RGBA, uint8_t, 4, 4, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, UYVY, uint8_t, 2, 4, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, YUY2, uint8_t, 2, 4, 1) // 4 +TESTATOB(ARGB1555, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(ARGB4444, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(BGRA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(I400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(I400, uint8_t, 1, 1, 1, I400, uint8_t, 1, 1, 1) +TESTATOB(I400, uint8_t, 1, 1, 1, I400Mirror, uint8_t, 1, 1, 1) +TESTATOB(J400, uint8_t, 1, 1, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(J400, uint8_t, 1, 1, 1, J400, uint8_t, 1, 1, 1) +TESTATOB(RAW, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(RAW, uint8_t, 3, 3, 1, RGBA, uint8_t, 4, 4, 1) +TESTATOB(RAW, uint8_t, 3, 3, 1, RGB24, uint8_t, 3, 3, 1) +TESTATOB(RGB24, uint8_t, 3, 3, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(RGB24, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1) +TESTATOB(RGB24, uint8_t, 3, 3, 1, RGB24Mirror, uint8_t, 3, 3, 1) +TESTATOB(RAW, uint8_t, 3, 3, 1, J400, uint8_t, 1, 1, 1) #ifdef LITTLE_ENDIAN_ONLY_TEST -TESTATOB(RGB565, 2, 2, 1, ARGB, 4, 4, 1) +TESTATOB(RGB565, uint8_t, 2, 2, 1, ARGB, uint8_t, 4, 4, 1) #endif -TESTATOB(RGBA, 4, 4, 1, ARGB, 4, 4, 1) -TESTATOB(UYVY, 2, 4, 1, ARGB, 4, 4, 1) -TESTATOB(YUY2, 2, 4, 1, ARGB, 4, 4, 1) -TESTATOB(YUY2, 2, 4, 1, Y, 1, 1, 1) +TESTATOB(RGBA, uint8_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(UYVY, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(YUY2, uint8_t, 2, 4, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(YUY2, uint8_t, 2, 4, 1, Y, uint8_t, 1, 1, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1) +TESTATOB(ARGB, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1) +TESTATOB(ABGR, uint8_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1) +TESTATOB(ABGR, uint8_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1) +TESTATOB(AR64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(AB64, uint16_t, 4, 4, 1, ARGB, uint8_t, 4, 4, 1) +TESTATOB(AR64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1) +TESTATOB(AB64, uint16_t, 4, 4, 1, ABGR, uint8_t, 4, 4, 1) +TESTATOB(AR64, uint16_t, 4, 4, 1, AB64, uint16_t, 4, 4, 1) +TESTATOB(AB64, uint16_t, 4, 4, 1, AR64, uint16_t, 4, 4, 1) #define TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ HEIGHT_B, W1280, N, NEG, OFF) \ TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##Dither##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \ const int kHeightB = (kHeight + HEIGHT_B - 1) / HEIGHT_B * HEIGHT_B; \ @@ -1218,7 +1446,7 @@ TESTATOB(YUY2, 2, 4, 1, Y, 1, 1, 1) #define TESTATOBD(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ HEIGHT_B) \ TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ - HEIGHT_B, benchmark_width_ - 4, _Any, +, 0) \ + HEIGHT_B, benchmark_width_ + 1, _Any, +, 0) \ TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ HEIGHT_B, benchmark_width_, _Unaligned, +, 1) \ TESTATOBDI(FMT_A, BPP_A, STRIDE_A, HEIGHT_A, FMT_B, BPP_B, STRIDE_B, \ @@ -1232,35 +1460,39 @@ TESTATOB(YUY2, 2, 4, 1, Y, 1, 1, 1) TESTATOBD(ARGB, 4, 4, 1, RGB565, 2, 2, 1) #endif -#define TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, W1280, N, NEG, OFF) \ +#define TESTSYMI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, W1280, N, NEG, \ + OFF) \ TEST_F(LibYUVConvertTest, FMT_ATOB##_Symetric##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kHeightA = (kHeight + HEIGHT_A - 1) / HEIGHT_A * HEIGHT_A; \ const int kStrideA = \ - (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \ - align_buffer_page_end(src_argb, kStrideA* kHeightA + OFF); \ - align_buffer_page_end(dst_argb_c, kStrideA* kHeightA); \ - align_buffer_page_end(dst_argb_opt, kStrideA* kHeightA); \ - for (int i = 0; i < kStrideA * kHeightA; ++i) { \ + (kWidth * EPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \ + align_buffer_page_end(src_argb, \ + kStrideA* kHeightA*(int)sizeof(TYPE_A) + OFF); \ + align_buffer_page_end(dst_argb_c, kStrideA* kHeightA*(int)sizeof(TYPE_A)); \ + align_buffer_page_end(dst_argb_opt, \ + kStrideA* kHeightA*(int)sizeof(TYPE_A)); \ + for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \ src_argb[i + OFF] = (fastrand() & 0xff); \ } \ memset(dst_argb_c, 1, kStrideA* kHeightA); \ memset(dst_argb_opt, 101, kStrideA* kHeightA); \ MaskCpuFlags(disable_cpu_flags_); \ - FMT_ATOB(src_argb + OFF, kStrideA, dst_argb_c, kStrideA, kWidth, \ - NEG kHeight); \ + FMT_ATOB((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_A*)dst_argb_c, \ + kStrideA, kWidth, NEG kHeight); \ MaskCpuFlags(benchmark_cpu_info_); \ for (int i = 0; i < benchmark_iterations_; ++i) { \ - FMT_ATOB(src_argb + OFF, kStrideA, dst_argb_opt, kStrideA, kWidth, \ - NEG kHeight); \ + FMT_ATOB((TYPE_A*)(src_argb + OFF), kStrideA, (TYPE_A*)dst_argb_opt, \ + kStrideA, kWidth, NEG kHeight); \ } \ MaskCpuFlags(disable_cpu_flags_); \ - FMT_ATOB(dst_argb_c, kStrideA, dst_argb_c, kStrideA, kWidth, NEG kHeight); \ + FMT_ATOB((TYPE_A*)dst_argb_c, kStrideA, (TYPE_A*)dst_argb_c, kStrideA, \ + kWidth, NEG kHeight); \ MaskCpuFlags(benchmark_cpu_info_); \ - FMT_ATOB(dst_argb_opt, kStrideA, dst_argb_opt, kStrideA, kWidth, \ - NEG kHeight); \ - for (int i = 0; i < kStrideA * kHeightA; ++i) { \ + FMT_ATOB((TYPE_A*)dst_argb_opt, kStrideA, (TYPE_A*)dst_argb_opt, kStrideA, \ + kWidth, NEG kHeight); \ + for (int i = 0; i < kStrideA * kHeightA * (int)sizeof(TYPE_A); ++i) { \ EXPECT_EQ(src_argb[i + OFF], dst_argb_opt[i]); \ EXPECT_EQ(dst_argb_c[i], dst_argb_opt[i]); \ } \ @@ -1269,18 +1501,20 @@ TESTATOBD(ARGB, 4, 4, 1, RGB565, 2, 2, 1) free_aligned_buffer_page_end(dst_argb_opt); \ } -#define TESTSYM(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A) \ - TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, benchmark_width_ - 4, _Any, +, \ - 0) \ - TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, _Unaligned, \ - +, 1) \ - TESTSYMI(FMT_ATOB, BPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, _Opt, +, 0) +#define TESTSYM(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A) \ + TESTSYMI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_ + 1, \ + _Any, +, 0) \ + TESTSYMI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, \ + _Unaligned, +, 1) \ + TESTSYMI(FMT_ATOB, TYPE_A, EPP_A, STRIDE_A, HEIGHT_A, benchmark_width_, \ + _Opt, +, 0) -TESTSYM(ARGBToARGB, 4, 4, 1) -TESTSYM(ARGBToBGRA, 4, 4, 1) -TESTSYM(ARGBToABGR, 4, 4, 1) -TESTSYM(BGRAToARGB, 4, 4, 1) -TESTSYM(ABGRToARGB, 4, 4, 1) +TESTSYM(ARGBToARGB, uint8_t, 4, 4, 1) +TESTSYM(ARGBToBGRA, uint8_t, 4, 4, 1) +TESTSYM(ARGBToABGR, uint8_t, 4, 4, 1) +TESTSYM(BGRAToARGB, uint8_t, 4, 4, 1) +TESTSYM(ABGRToARGB, uint8_t, 4, 4, 1) +TESTSYM(AB64ToAR64, uint16_t, 4, 4, 1) TEST_F(LibYUVConvertTest, Test565) { SIMD_ALIGNED(uint8_t orig_pixels[256][4]); @@ -2144,7 +2378,11 @@ TEST_F(LibYUVConvertTest, TestMJPGToARGB) { // Test result matches known hash value. uint32_t dst_argb_hash = HashDjb2(dst_argb, width * height, 5381); +#ifdef LIBYUV_UNLIMITED_DATA + EXPECT_EQ(dst_argb_hash, 3900633302u); +#else EXPECT_EQ(dst_argb_hash, 2355976473u); +#endif free_aligned_buffer_page_end(dst_argb); } @@ -2453,7 +2691,7 @@ TEST_F(LibYUVConvertTest, TestDither) { #define TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN, W1280, N, NEG, OFF, FMT_C, BPP_C) \ TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##Dither##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \ const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \ const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ @@ -2506,7 +2744,7 @@ TEST_F(LibYUVConvertTest, TestDither) { #define TESTPLANARTOBD(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN, FMT_C, BPP_C) \ TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - YALIGN, benchmark_width_ - 4, _Any, +, 0, FMT_C, BPP_C) \ + YALIGN, benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \ TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ YALIGN, benchmark_width_, _Unaligned, +, 1, FMT_C, BPP_C) \ TESTPLANARTOBID(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ @@ -2579,11 +2817,12 @@ TESTPTOB(TestYUY2ToNV12, YUY2ToI420, YUY2ToNV12) TESTPTOB(TestUYVYToNV12, UYVYToI420, UYVYToNV12) // Transitive tests. A to B to C is same as A to C. +// Benchmarks A To B to C for comparison to 1 step, benchmarked elsewhere. #define TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ W1280, N, NEG, OFF, FMT_C, BPP_C) \ - TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##_##FMT_C##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##To##FMT_C##N) { \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \ const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ @@ -2600,23 +2839,23 @@ TESTPTOB(TestUYVYToNV12, UYVYToI420, UYVYToNV12) src_v[i + OFF] = (fastrand() & 0xff); \ } \ memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \ - for (int i = 0; i < benchmark_iterations_; ++i) { \ - FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \ - src_v + OFF, kStrideUV, dst_argb_b + OFF, \ - kStrideB, kWidth, NEG kHeight); \ - } \ + FMT_PLANAR##To##FMT_B(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \ + src_v + OFF, kStrideUV, dst_argb_b + OFF, kStrideB, \ + kWidth, NEG kHeight); \ /* Convert to a 3rd format in 1 step and 2 steps and compare */ \ const int kStrideC = kWidth * BPP_C; \ align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \ align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \ memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \ memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \ - FMT_PLANAR##To##FMT_C(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \ - src_v + OFF, kStrideUV, dst_argb_c + OFF, kStrideC, \ - kWidth, NEG kHeight); \ - /* Convert B to C */ \ - FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, kStrideC, \ - kWidth, kHeight); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FMT_PLANAR##To##FMT_C(src_y + OFF, kWidth, src_u + OFF, kStrideUV, \ + src_v + OFF, kStrideUV, dst_argb_c + OFF, \ + kStrideC, kWidth, NEG kHeight); \ + /* Convert B to C */ \ + FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \ + kStrideC, kWidth, kHeight); \ + } \ for (int i = 0; i < kStrideC * kHeight; ++i) { \ EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_bc[i + OFF]); \ } \ @@ -2631,7 +2870,7 @@ TESTPTOB(TestUYVYToNV12, UYVYToI420, UYVYToNV12) #define TESTPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ FMT_C, BPP_C) \ TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ - benchmark_width_ - 4, _Any, +, 0, FMT_C, BPP_C) \ + benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \ TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ benchmark_width_, _Unaligned, +, 1, FMT_C, BPP_C) \ TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ @@ -2639,26 +2878,28 @@ TESTPTOB(TestUYVYToNV12, UYVYToI420, UYVYToNV12) TESTPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ benchmark_width_, _Opt, +, 0, FMT_C, BPP_C) -TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ABGR, 4) TESTPLANARTOE(I420, 2, 2, ABGR, 1, 4, ARGB, 4) -TESTPLANARTOE(J420, 2, 2, ARGB, 1, 4, ARGB, 4) -TESTPLANARTOE(J420, 2, 2, ABGR, 1, 4, ARGB, 4) -TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, ARGB, 4) -TESTPLANARTOE(H420, 2, 2, ABGR, 1, 4, ARGB, 4) -TESTPLANARTOE(U420, 2, 2, ARGB, 1, 4, ARGB, 4) -TESTPLANARTOE(U420, 2, 2, ABGR, 1, 4, ARGB, 4) -TESTPLANARTOE(I420, 2, 2, BGRA, 1, 4, ARGB, 4) -TESTPLANARTOE(I420, 2, 2, RGBA, 1, 4, ARGB, 4) -TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, ARGB, 4) -TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, RGB24, 3) -TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, RAW, 3) +TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ABGR, 4) TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RAW, 3) +TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB24, 3) +TESTPLANARTOE(I420, 2, 2, BGRA, 1, 4, ARGB, 4) TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, ARGB, 4) -TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, ARGB, 4) -TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, RGB24, 3) -TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, RAW, 3) +TESTPLANARTOE(I420, 2, 2, RAW, 1, 3, RGB24, 3) +TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, ARGB, 4) +TESTPLANARTOE(I420, 2, 2, RGB24, 1, 3, RAW, 3) +TESTPLANARTOE(I420, 2, 2, RGBA, 1, 4, ARGB, 4) +TESTPLANARTOE(H420, 2, 2, ABGR, 1, 4, ARGB, 4) +TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, ABGR, 4) TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RAW, 3) +TESTPLANARTOE(H420, 2, 2, ARGB, 1, 4, RGB24, 3) TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, ARGB, 4) +TESTPLANARTOE(H420, 2, 2, RAW, 1, 3, RGB24, 3) +TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, ARGB, 4) +TESTPLANARTOE(H420, 2, 2, RGB24, 1, 3, RAW, 3) +TESTPLANARTOE(J420, 2, 2, ABGR, 1, 4, ARGB, 4) +TESTPLANARTOE(J420, 2, 2, ARGB, 1, 4, ARGB, 4) +TESTPLANARTOE(U420, 2, 2, ABGR, 1, 4, ARGB, 4) +TESTPLANARTOE(U420, 2, 2, ARGB, 1, 4, ARGB, 4) #ifdef LITTLE_ENDIAN_ONLY_TEST TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, RGB565, 2) TESTPLANARTOE(I420, 2, 2, ARGB, 1, 4, ARGB1555, 2) @@ -2673,6 +2914,8 @@ TESTPLANARTOE(H422, 2, 1, ARGB, 1, 4, ARGB, 4) TESTPLANARTOE(H422, 2, 1, ABGR, 1, 4, ARGB, 4) TESTPLANARTOE(U422, 2, 1, ARGB, 1, 4, ARGB, 4) TESTPLANARTOE(U422, 2, 1, ABGR, 1, 4, ARGB, 4) +TESTPLANARTOE(V422, 2, 1, ARGB, 1, 4, ARGB, 4) +TESTPLANARTOE(V422, 2, 1, ABGR, 1, 4, ARGB, 4) TESTPLANARTOE(I422, 2, 1, BGRA, 1, 4, ARGB, 4) TESTPLANARTOE(I422, 2, 1, RGBA, 1, 4, ARGB, 4) TESTPLANARTOE(I444, 1, 1, ARGB, 1, 4, ABGR, 4) @@ -2683,6 +2926,8 @@ TESTPLANARTOE(H444, 1, 1, ARGB, 1, 4, ARGB, 4) TESTPLANARTOE(H444, 1, 1, ABGR, 1, 4, ARGB, 4) TESTPLANARTOE(U444, 1, 1, ARGB, 1, 4, ARGB, 4) TESTPLANARTOE(U444, 1, 1, ABGR, 1, 4, ARGB, 4) +TESTPLANARTOE(V444, 1, 1, ARGB, 1, 4, ARGB, 4) +TESTPLANARTOE(V444, 1, 1, ABGR, 1, 4, ARGB, 4) TESTPLANARTOE(I420, 2, 2, YUY2, 2, 4, ARGB, 4) TESTPLANARTOE(I420, 2, 2, UYVY, 2, 4, ARGB, 4) TESTPLANARTOE(I422, 2, 1, YUY2, 2, 4, ARGB, 4) @@ -2690,8 +2935,8 @@ TESTPLANARTOE(I422, 2, 1, UYVY, 2, 4, ARGB, 4) #define TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ W1280, N, NEG, OFF, FMT_C, BPP_C, ATTEN) \ - TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##_##FMT_C##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##To##FMT_C##N) { \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \ const int kSizeUV = \ @@ -2710,25 +2955,25 @@ TESTPLANARTOE(I422, 2, 1, UYVY, 2, 4, ARGB, 4) src_v[i + OFF] = (fastrand() & 0xff); \ } \ memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \ - for (int i = 0; i < benchmark_iterations_; ++i) { \ - FMT_PLANAR##To##FMT_B( \ - src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), \ - src_v + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), src_a + OFF, kWidth, \ - dst_argb_b + OFF, kStrideB, kWidth, NEG kHeight, ATTEN); \ - } \ + FMT_PLANAR##To##FMT_B( \ + src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), \ + src_v + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), src_a + OFF, kWidth, \ + dst_argb_b + OFF, kStrideB, kWidth, NEG kHeight, ATTEN); \ /* Convert to a 3rd format in 1 step and 2 steps and compare */ \ const int kStrideC = kWidth * BPP_C; \ align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \ align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \ memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \ memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \ - FMT_PLANAR##To##FMT_C( \ - src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), \ - src_v + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), src_a + OFF, kWidth, \ - dst_argb_c + OFF, kStrideC, kWidth, NEG kHeight, ATTEN); \ - /* Convert B to C */ \ - FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, kStrideC, \ - kWidth, kHeight); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FMT_PLANAR##To##FMT_C( \ + src_y + OFF, kWidth, src_u + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), \ + src_v + OFF, SUBSAMPLE(kWidth, SUBSAMP_X), src_a + OFF, kWidth, \ + dst_argb_c + OFF, kStrideC, kWidth, NEG kHeight, ATTEN); \ + /* Convert B to C */ \ + FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \ + kStrideC, kWidth, kHeight); \ + } \ for (int i = 0; i < kStrideC * kHeight; ++i) { \ EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_bc[i + OFF]); \ } \ @@ -2744,7 +2989,7 @@ TESTPLANARTOE(I422, 2, 1, UYVY, 2, 4, ARGB, 4) #define TESTQPLANARTOE(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ FMT_C, BPP_C) \ TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ - benchmark_width_ - 4, _Any, +, 0, FMT_C, BPP_C, 0) \ + benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C, 0) \ TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ benchmark_width_, _Unaligned, +, 1, FMT_C, BPP_C, 0) \ TESTQPLANARTOEI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, SUB_B, BPP_B, \ @@ -2760,13 +3005,39 @@ TESTQPLANARTOE(J420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4) TESTQPLANARTOE(J420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4) TESTQPLANARTOE(H420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4) TESTQPLANARTOE(H420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(F420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(F420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4) TESTQPLANARTOE(U420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4) TESTQPLANARTOE(U420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(V420Alpha, 2, 2, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(V420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(I422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(I422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(J422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(J422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(F422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(F422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(H422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(H422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(U422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(U422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(V422Alpha, 2, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(V422Alpha, 2, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(I444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(I444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(J444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(J444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(H444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(H444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(U444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(U444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4) +TESTQPLANARTOE(V444Alpha, 1, 1, ARGB, 1, 4, ABGR, 4) +TESTQPLANARTOE(V444Alpha, 1, 1, ABGR, 1, 4, ARGB, 4) #define TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, W1280, N, NEG, \ OFF, FMT_C, BPP_C) \ - TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##_##FMT_C##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + TEST_F(LibYUVConvertTest, FMT_A##To##FMT_B##To##FMT_C##N) { \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kStrideA = SUBSAMPLE(kWidth, SUB_A) * BPP_A; \ const int kStrideB = SUBSAMPLE(kWidth, SUB_B) * BPP_B; \ @@ -2774,21 +3045,21 @@ TESTQPLANARTOE(U420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4) align_buffer_page_end(dst_argb_b, kStrideB* kHeight + OFF); \ MemRandomize(src_argb_a + OFF, kStrideA * kHeight); \ memset(dst_argb_b + OFF, 1, kStrideB * kHeight); \ - for (int i = 0; i < benchmark_iterations_; ++i) { \ - FMT_A##To##FMT_B(src_argb_a + OFF, kStrideA, dst_argb_b + OFF, kStrideB, \ - kWidth, NEG kHeight); \ - } \ + FMT_A##To##FMT_B(src_argb_a + OFF, kStrideA, dst_argb_b + OFF, kStrideB, \ + kWidth, NEG kHeight); \ /* Convert to a 3rd format in 1 step and 2 steps and compare */ \ const int kStrideC = kWidth * BPP_C; \ align_buffer_page_end(dst_argb_c, kStrideC* kHeight + OFF); \ align_buffer_page_end(dst_argb_bc, kStrideC* kHeight + OFF); \ memset(dst_argb_c + OFF, 2, kStrideC * kHeight); \ memset(dst_argb_bc + OFF, 3, kStrideC * kHeight); \ - FMT_A##To##FMT_C(src_argb_a + OFF, kStrideA, dst_argb_c + OFF, kStrideC, \ - kWidth, NEG kHeight); \ - /* Convert B to C */ \ - FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, kStrideC, \ - kWidth, kHeight); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FMT_A##To##FMT_C(src_argb_a + OFF, kStrideA, dst_argb_c + OFF, kStrideC, \ + kWidth, NEG kHeight); \ + /* Convert B to C */ \ + FMT_B##To##FMT_C(dst_argb_b + OFF, kStrideB, dst_argb_bc + OFF, \ + kStrideC, kWidth, kHeight); \ + } \ for (int i = 0; i < kStrideC * kHeight; i += 4) { \ EXPECT_EQ(dst_argb_c[i + OFF + 0], dst_argb_bc[i + OFF + 0]); \ EXPECT_EQ(dst_argb_c[i + OFF + 1], dst_argb_bc[i + OFF + 1]); \ @@ -2803,7 +3074,7 @@ TESTQPLANARTOE(U420Alpha, 2, 2, ABGR, 1, 4, ARGB, 4) #define TESTPLANETOE(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, FMT_C, BPP_C) \ TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, \ - benchmark_width_ - 4, _Any, +, 0, FMT_C, BPP_C) \ + benchmark_width_ + 1, _Any, +, 0, FMT_C, BPP_C) \ TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \ _Unaligned, +, 1, FMT_C, BPP_C) \ TESTPLANETOEI(FMT_A, SUB_A, BPP_A, FMT_B, SUB_B, BPP_B, benchmark_width_, \ @@ -2926,91 +3197,457 @@ TEST_F(LibYUVConvertTest, ABGRToAR30Row_Opt) { } #endif // HAS_ABGRTOAR30ROW_AVX2 +// Provide matrix wrappers for 12 bit YUV +#define I012ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I012ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j) +#define I012ToAR30(a, b, c, d, e, f, g, h, i, j) \ + I012ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j) + +#define I410ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j) +#define I410ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j) +#define H410ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j) +#define H410ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j) +#define U410ToARGB(a, b, c, d, e, f, g, h, i, j) \ + I410ToARGBMatrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j) +#define U410ToABGR(a, b, c, d, e, f, g, h, i, j) \ + I410ToABGRMatrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j) +#define I410ToAR30(a, b, c, d, e, f, g, h, i, j) \ + I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j) +#define I410ToAB30(a, b, c, d, e, f, g, h, i, j) \ + I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuvI601Constants, i, j) +#define H410ToAR30(a, b, c, d, e, f, g, h, i, j) \ + I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j) +#define H410ToAB30(a, b, c, d, e, f, g, h, i, j) \ + I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuvH709Constants, i, j) +#define U410ToAR30(a, b, c, d, e, f, g, h, i, j) \ + I410ToAR30Matrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j) +#define U410ToAB30(a, b, c, d, e, f, g, h, i, j) \ + I410ToAB30Matrix(a, b, c, d, e, f, g, h, &kYuv2020Constants, i, j) + // TODO(fbarchard): Fix clamping issue affected by U channel. -#define TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \ - ALIGN, YALIGN, W1280, N, NEG, SOFF, DOFF) \ - TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ - const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \ - const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \ - const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ - const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \ - const int kBpc = 2; \ - align_buffer_page_end(src_y, kWidth* kHeight* kBpc + SOFF); \ - align_buffer_page_end(src_u, kSizeUV* kBpc + SOFF); \ - align_buffer_page_end(src_v, kSizeUV* kBpc + SOFF); \ - align_buffer_page_end(dst_argb_c, kStrideB* kHeight + DOFF); \ - align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + DOFF); \ - for (int i = 0; i < kWidth * kHeight; ++i) { \ - reinterpret_cast(src_y + SOFF)[i] = (fastrand() & 0x3ff); \ - } \ - for (int i = 0; i < kSizeUV; ++i) { \ - reinterpret_cast(src_u + SOFF)[i] = (fastrand() & 0x3ff); \ - reinterpret_cast(src_v + SOFF)[i] = (fastrand() & 0x3ff); \ - } \ - memset(dst_argb_c + DOFF, 1, kStrideB * kHeight); \ - memset(dst_argb_opt + DOFF, 101, kStrideB * kHeight); \ - MaskCpuFlags(disable_cpu_flags_); \ - FMT_PLANAR##To##FMT_B( \ - reinterpret_cast(src_y + SOFF), kWidth, \ - reinterpret_cast(src_u + SOFF), kStrideUV, \ - reinterpret_cast(src_v + SOFF), kStrideUV, \ - dst_argb_c + DOFF, kStrideB, kWidth, NEG kHeight); \ - MaskCpuFlags(benchmark_cpu_info_); \ - for (int i = 0; i < benchmark_iterations_; ++i) { \ - FMT_PLANAR##To##FMT_B( \ - reinterpret_cast(src_y + SOFF), kWidth, \ - reinterpret_cast(src_u + SOFF), kStrideUV, \ - reinterpret_cast(src_v + SOFF), kStrideUV, \ - dst_argb_opt + DOFF, kStrideB, kWidth, NEG kHeight); \ - } \ - for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \ - EXPECT_EQ(dst_argb_c[i + DOFF], dst_argb_opt[i + DOFF]); \ - } \ - free_aligned_buffer_page_end(src_y); \ - free_aligned_buffer_page_end(src_u); \ - free_aligned_buffer_page_end(src_v); \ - free_aligned_buffer_page_end(dst_argb_c); \ - free_aligned_buffer_page_end(dst_argb_opt); \ +#define TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, \ + BPP_B, ALIGN, YALIGN, W1280, N, NEG, SOFF, DOFF) \ + TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \ + const int kWidth = W1280; \ + const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \ + const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \ + const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ + const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \ + const int kBpc = 2; \ + align_buffer_page_end(src_y, kWidth* kHeight* kBpc + SOFF); \ + align_buffer_page_end(src_u, kSizeUV* kBpc + SOFF); \ + align_buffer_page_end(src_v, kSizeUV* kBpc + SOFF); \ + align_buffer_page_end(dst_argb_c, kStrideB* kHeight + DOFF); \ + align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + DOFF); \ + for (int i = 0; i < kWidth * kHeight; ++i) { \ + reinterpret_cast(src_y + SOFF)[i] = (fastrand() & FMT_MASK); \ + } \ + for (int i = 0; i < kSizeUV; ++i) { \ + reinterpret_cast(src_u + SOFF)[i] = (fastrand() & FMT_MASK); \ + reinterpret_cast(src_v + SOFF)[i] = (fastrand() & FMT_MASK); \ + } \ + memset(dst_argb_c + DOFF, 1, kStrideB * kHeight); \ + memset(dst_argb_opt + DOFF, 101, kStrideB * kHeight); \ + MaskCpuFlags(disable_cpu_flags_); \ + FMT_PLANAR##To##FMT_B( \ + reinterpret_cast(src_y + SOFF), kWidth, \ + reinterpret_cast(src_u + SOFF), kStrideUV, \ + reinterpret_cast(src_v + SOFF), kStrideUV, \ + dst_argb_c + DOFF, kStrideB, kWidth, NEG kHeight); \ + MaskCpuFlags(benchmark_cpu_info_); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FMT_PLANAR##To##FMT_B( \ + reinterpret_cast(src_y + SOFF), kWidth, \ + reinterpret_cast(src_u + SOFF), kStrideUV, \ + reinterpret_cast(src_v + SOFF), kStrideUV, \ + dst_argb_opt + DOFF, kStrideB, kWidth, NEG kHeight); \ + } \ + for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \ + EXPECT_EQ(dst_argb_c[i + DOFF], dst_argb_opt[i + DOFF]); \ + } \ + free_aligned_buffer_page_end(src_y); \ + free_aligned_buffer_page_end(src_u); \ + free_aligned_buffer_page_end(src_v); \ + free_aligned_buffer_page_end(dst_argb_c); \ + free_aligned_buffer_page_end(dst_argb_opt); \ } -#define TESTPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - YALIGN) \ - TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - YALIGN, benchmark_width_ - 4, _Any, +, 0, 0) \ - TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - YALIGN, benchmark_width_, _Unaligned, +, 1, 1) \ - TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - YALIGN, benchmark_width_, _Invert, -, 0, 0) \ - TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ - YALIGN, benchmark_width_, _Opt, +, 0, 0) +#define TESTPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, \ + BPP_B, ALIGN, YALIGN) \ + TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \ + ALIGN, YALIGN, benchmark_width_ + 1, _Any, +, 0, 0) \ + TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \ + ALIGN, YALIGN, benchmark_width_, _Unaligned, +, 1, 1) \ + TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \ + ALIGN, YALIGN, benchmark_width_, _Invert, -, 0, 0) \ + TESTPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_MASK, FMT_B, BPP_B, \ + ALIGN, YALIGN, benchmark_width_, _Opt, +, 0, 0) + +// These conversions are only optimized for x86 +#if defined(ENABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__) +TESTPLANAR16TOB(I010, 2, 2, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(I010, 2, 2, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(H010, 2, 2, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(H010, 2, 2, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(U010, 2, 2, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(U010, 2, 2, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(I210, 2, 1, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(I210, 2, 1, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(H210, 2, 1, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(H210, 2, 1, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(U210, 2, 1, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(U210, 2, 1, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(I410, 1, 1, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(I410, 1, 1, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(H410, 1, 1, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(H410, 1, 1, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(U410, 1, 1, 0x3ff, ARGB, 4, 4, 1) +TESTPLANAR16TOB(U410, 1, 1, 0x3ff, ABGR, 4, 4, 1) +TESTPLANAR16TOB(I012, 2, 2, 0xfff, ARGB, 4, 4, 1) -TESTPLANAR16TOB(I010, 2, 2, ARGB, 4, 4, 1) -TESTPLANAR16TOB(I010, 2, 2, ABGR, 4, 4, 1) -TESTPLANAR16TOB(H010, 2, 2, ARGB, 4, 4, 1) -TESTPLANAR16TOB(H010, 2, 2, ABGR, 4, 4, 1) -TESTPLANAR16TOB(U010, 2, 2, ARGB, 4, 4, 1) -TESTPLANAR16TOB(U010, 2, 2, ABGR, 4, 4, 1) -TESTPLANAR16TOB(I210, 2, 1, ARGB, 4, 4, 1) -TESTPLANAR16TOB(I210, 2, 1, ABGR, 4, 4, 1) -TESTPLANAR16TOB(H210, 2, 1, ARGB, 4, 4, 1) -TESTPLANAR16TOB(H210, 2, 1, ABGR, 4, 4, 1) -TESTPLANAR16TOB(U210, 2, 1, ARGB, 4, 4, 1) -TESTPLANAR16TOB(U210, 2, 1, ABGR, 4, 4, 1) #ifdef LITTLE_ENDIAN_ONLY_TEST -TESTPLANAR16TOB(I010, 2, 2, AR30, 4, 4, 1) -TESTPLANAR16TOB(I010, 2, 2, AB30, 4, 4, 1) -TESTPLANAR16TOB(H010, 2, 2, AR30, 4, 4, 1) -TESTPLANAR16TOB(H010, 2, 2, AB30, 4, 4, 1) -TESTPLANAR16TOB(U010, 2, 2, AR30, 4, 4, 1) -TESTPLANAR16TOB(U010, 2, 2, AB30, 4, 4, 1) -TESTPLANAR16TOB(I210, 2, 1, AR30, 4, 4, 1) -TESTPLANAR16TOB(I210, 2, 1, AB30, 4, 4, 1) -TESTPLANAR16TOB(H210, 2, 1, AR30, 4, 4, 1) -TESTPLANAR16TOB(H210, 2, 1, AB30, 4, 4, 1) -TESTPLANAR16TOB(U210, 2, 1, AR30, 4, 4, 1) -TESTPLANAR16TOB(U210, 2, 1, AB30, 4, 4, 1) -#endif +TESTPLANAR16TOB(I010, 2, 2, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(I010, 2, 2, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(H010, 2, 2, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(H010, 2, 2, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(U010, 2, 2, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(U010, 2, 2, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(I210, 2, 1, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(I210, 2, 1, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(H210, 2, 1, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(H210, 2, 1, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(U210, 2, 1, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(U210, 2, 1, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(I410, 1, 1, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(I410, 1, 1, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(H410, 1, 1, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(H410, 1, 1, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(U410, 1, 1, 0x3ff, AR30, 4, 4, 1) +TESTPLANAR16TOB(U410, 1, 1, 0x3ff, AB30, 4, 4, 1) +TESTPLANAR16TOB(I012, 2, 2, 0xfff, AR30, 4, 4, 1) +#endif // LITTLE_ENDIAN_ONLY_TEST +#endif // ENABLE_SLOW_TESTS + +#define TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \ + ALIGN, YALIGN, W1280, N, NEG, OFF, ATTEN, S_DEPTH) \ + TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \ + const int kWidth = W1280; \ + const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \ + const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \ + const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X); \ + const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y); \ + const int kBpc = 2; \ + align_buffer_page_end(src_y, kWidth* kHeight* kBpc + OFF); \ + align_buffer_page_end(src_u, kSizeUV* kBpc + OFF); \ + align_buffer_page_end(src_v, kSizeUV* kBpc + OFF); \ + align_buffer_page_end(src_a, kWidth* kHeight* kBpc + OFF); \ + align_buffer_page_end(dst_argb_c, kStrideB* kHeight + OFF); \ + align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + OFF); \ + for (int i = 0; i < kWidth * kHeight; ++i) { \ + reinterpret_cast(src_y + OFF)[i] = \ + (fastrand() & ((1 << S_DEPTH) - 1)); \ + reinterpret_cast(src_a + OFF)[i] = \ + (fastrand() & ((1 << S_DEPTH) - 1)); \ + } \ + for (int i = 0; i < kSizeUV; ++i) { \ + reinterpret_cast(src_u + OFF)[i] = \ + (fastrand() & ((1 << S_DEPTH) - 1)); \ + reinterpret_cast(src_v + OFF)[i] = \ + (fastrand() & ((1 << S_DEPTH) - 1)); \ + } \ + memset(dst_argb_c + OFF, 1, kStrideB * kHeight); \ + memset(dst_argb_opt + OFF, 101, kStrideB * kHeight); \ + MaskCpuFlags(disable_cpu_flags_); \ + FMT_PLANAR##To##FMT_B(reinterpret_cast(src_y + OFF), kWidth, \ + reinterpret_cast(src_u + OFF), kStrideUV, \ + reinterpret_cast(src_v + OFF), kStrideUV, \ + reinterpret_cast(src_a + OFF), kWidth, \ + dst_argb_c + OFF, kStrideB, kWidth, NEG kHeight, \ + ATTEN); \ + MaskCpuFlags(benchmark_cpu_info_); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FMT_PLANAR##To##FMT_B( \ + reinterpret_cast(src_y + OFF), kWidth, \ + reinterpret_cast(src_u + OFF), kStrideUV, \ + reinterpret_cast(src_v + OFF), kStrideUV, \ + reinterpret_cast(src_a + OFF), kWidth, \ + dst_argb_opt + OFF, kStrideB, kWidth, NEG kHeight, ATTEN); \ + } \ + for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \ + EXPECT_EQ(dst_argb_c[i + OFF], dst_argb_opt[i + OFF]); \ + } \ + free_aligned_buffer_page_end(src_y); \ + free_aligned_buffer_page_end(src_u); \ + free_aligned_buffer_page_end(src_v); \ + free_aligned_buffer_page_end(src_a); \ + free_aligned_buffer_page_end(dst_argb_c); \ + free_aligned_buffer_page_end(dst_argb_opt); \ + } + +#define TESTQPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \ + ALIGN, YALIGN, S_DEPTH) \ + TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_ + 1, _Any, +, 0, 0, S_DEPTH) \ + TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_, _Unaligned, +, 1, 0, S_DEPTH) \ + TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_, _Invert, -, 0, 0, S_DEPTH) \ + TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_, _Opt, +, 0, 0, S_DEPTH) \ + TESTQPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_, _Premult, +, 0, 1, S_DEPTH) + +#define I010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \ + l, m) +#define I010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \ + l, m) +#define J010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define J010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define F010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define F010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define H010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define H010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define U010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define U010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define V010AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define V010AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I010AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define I210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \ + l, m) +#define I210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \ + l, m) +#define J210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define J210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define F210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define F210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define H210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define H210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define U210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define U210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define V210AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define V210AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I210AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define I410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \ + l, m) +#define I410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvI601Constants, k, \ + l, m) +#define J410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define J410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvJPEGConstants, k, \ + l, m) +#define F410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define F410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvF709Constants, k, \ + l, m) +#define H410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define H410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvH709Constants, k, \ + l, m) +#define U410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define U410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuv2020Constants, k, \ + l, m) +#define V410AlphaToARGB(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToARGBMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) +#define V410AlphaToABGR(a, b, c, d, e, f, g, h, i, j, k, l, m) \ + I410AlphaToABGRMatrix(a, b, c, d, e, f, g, h, i, j, &kYuvV2020Constants, k, \ + l, m) + +// These conversions are only optimized for x86 +#if defined(ENABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__) +TESTQPLANAR16TOB(I010Alpha, 2, 2, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(I010Alpha, 2, 2, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(J010Alpha, 2, 2, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(J010Alpha, 2, 2, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(H010Alpha, 2, 2, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(H010Alpha, 2, 2, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(F010Alpha, 2, 2, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(F010Alpha, 2, 2, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(U010Alpha, 2, 2, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(U010Alpha, 2, 2, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(V010Alpha, 2, 2, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(V010Alpha, 2, 2, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(I210Alpha, 2, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(I210Alpha, 2, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(J210Alpha, 2, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(J210Alpha, 2, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(H210Alpha, 2, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(H210Alpha, 2, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(F210Alpha, 2, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(F210Alpha, 2, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(U210Alpha, 2, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(U210Alpha, 2, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(V210Alpha, 2, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(V210Alpha, 2, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(I410Alpha, 1, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(I410Alpha, 1, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(J410Alpha, 1, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(J410Alpha, 1, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(H410Alpha, 1, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(H410Alpha, 1, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(F410Alpha, 1, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(F410Alpha, 1, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(U410Alpha, 1, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(U410Alpha, 1, 1, ABGR, 4, 4, 1, 10) +TESTQPLANAR16TOB(V410Alpha, 1, 1, ARGB, 4, 4, 1, 10) +TESTQPLANAR16TOB(V410Alpha, 1, 1, ABGR, 4, 4, 1, 10) +#endif // ENABLE_SLOW_TESTS + +#define TESTBIPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \ + ALIGN, YALIGN, W1280, N, NEG, SOFF, DOFF, S_DEPTH) \ + TEST_F(LibYUVConvertTest, FMT_PLANAR##To##FMT_B##N) { \ + const int kWidth = W1280; \ + const int kHeight = ALIGNINT(benchmark_height_, YALIGN); \ + const int kStrideB = ALIGNINT(kWidth * BPP_B, ALIGN); \ + const int kStrideUV = SUBSAMPLE(kWidth, SUBSAMP_X) * 2; \ + const int kSizeUV = kStrideUV * SUBSAMPLE(kHeight, SUBSAMP_Y) * 2; \ + const int kBpc = 2; \ + align_buffer_page_end(src_y, kWidth* kHeight* kBpc + SOFF); \ + align_buffer_page_end(src_uv, kSizeUV* kBpc + SOFF); \ + align_buffer_page_end(dst_argb_c, kStrideB* kHeight + DOFF); \ + align_buffer_page_end(dst_argb_opt, kStrideB* kHeight + DOFF); \ + for (int i = 0; i < kWidth * kHeight; ++i) { \ + reinterpret_cast(src_y + SOFF)[i] = \ + (fastrand() & (((uint16_t)(-1)) << (16 - S_DEPTH))); \ + } \ + for (int i = 0; i < kSizeUV; ++i) { \ + reinterpret_cast(src_uv + SOFF)[i] = \ + (fastrand() & (((uint16_t)(-1)) << (16 - S_DEPTH))); \ + } \ + memset(dst_argb_c + DOFF, 1, kStrideB * kHeight); \ + memset(dst_argb_opt + DOFF, 101, kStrideB * kHeight); \ + MaskCpuFlags(disable_cpu_flags_); \ + FMT_PLANAR##To##FMT_B(reinterpret_cast(src_y + SOFF), kWidth, \ + reinterpret_cast(src_uv + SOFF), \ + kStrideUV, dst_argb_c + DOFF, kStrideB, kWidth, \ + NEG kHeight); \ + MaskCpuFlags(benchmark_cpu_info_); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FMT_PLANAR##To##FMT_B(reinterpret_cast(src_y + SOFF), kWidth, \ + reinterpret_cast(src_uv + SOFF), \ + kStrideUV, dst_argb_opt + DOFF, kStrideB, kWidth, \ + NEG kHeight); \ + } \ + for (int i = 0; i < kWidth * BPP_B * kHeight; ++i) { \ + EXPECT_EQ(dst_argb_c[i + DOFF], dst_argb_opt[i + DOFF]); \ + } \ + free_aligned_buffer_page_end(src_y); \ + free_aligned_buffer_page_end(src_uv); \ + free_aligned_buffer_page_end(dst_argb_c); \ + free_aligned_buffer_page_end(dst_argb_opt); \ + } + +#define TESTBIPLANAR16TOB(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, \ + ALIGN, YALIGN, S_DEPTH) \ + TESTBIPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_ + 1, _Any, +, 0, 0, S_DEPTH) \ + TESTBIPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_, _Unaligned, +, 1, 1, S_DEPTH) \ + TESTBIPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_, _Invert, -, 0, 0, S_DEPTH) \ + TESTBIPLANAR16TOBI(FMT_PLANAR, SUBSAMP_X, SUBSAMP_Y, FMT_B, BPP_B, ALIGN, \ + YALIGN, benchmark_width_, _Opt, +, 0, 0, S_DEPTH) + +#define P010ToARGB(a, b, c, d, e, f, g, h) \ + P010ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P210ToARGB(a, b, c, d, e, f, g, h) \ + P210ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P010ToAR30(a, b, c, d, e, f, g, h) \ + P010ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P210ToAR30(a, b, c, d, e, f, g, h) \ + P210ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) + +#define P012ToARGB(a, b, c, d, e, f, g, h) \ + P012ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P212ToARGB(a, b, c, d, e, f, g, h) \ + P212ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P012ToAR30(a, b, c, d, e, f, g, h) \ + P012ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P212ToAR30(a, b, c, d, e, f, g, h) \ + P212ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) + +#define P016ToARGB(a, b, c, d, e, f, g, h) \ + P016ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P216ToARGB(a, b, c, d, e, f, g, h) \ + P216ToARGBMatrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P016ToAR30(a, b, c, d, e, f, g, h) \ + P016ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) +#define P216ToAR30(a, b, c, d, e, f, g, h) \ + P216ToAR30Matrix(a, b, c, d, e, f, &kYuvH709Constants, g, h) + +#if defined(ENABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__) +TESTBIPLANAR16TOB(P010, 2, 2, ARGB, 4, 4, 1, 10) +TESTBIPLANAR16TOB(P210, 2, 1, ARGB, 4, 4, 1, 10) +TESTBIPLANAR16TOB(P012, 2, 2, ARGB, 4, 4, 1, 12) +TESTBIPLANAR16TOB(P212, 2, 1, ARGB, 4, 4, 1, 12) +TESTBIPLANAR16TOB(P016, 2, 2, ARGB, 4, 4, 1, 16) +TESTBIPLANAR16TOB(P216, 2, 1, ARGB, 4, 4, 1, 16) +#ifdef LITTLE_ENDIAN_ONLY_TEST +TESTBIPLANAR16TOB(P010, 2, 2, AR30, 4, 4, 1, 10) +TESTBIPLANAR16TOB(P210, 2, 1, AR30, 4, 4, 1, 10) +TESTBIPLANAR16TOB(P012, 2, 2, AR30, 4, 4, 1, 12) +TESTBIPLANAR16TOB(P212, 2, 1, AR30, 4, 4, 1, 12) +TESTBIPLANAR16TOB(P016, 2, 2, AR30, 4, 4, 1, 16) +TESTBIPLANAR16TOB(P216, 2, 1, AR30, 4, 4, 1, 16) +#endif // LITTLE_ENDIAN_ONLY_TEST +#endif // defined(ENABLE_SLOW_TESTS) static int Clamp(int y) { if (y < 0) { diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/cpu_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/cpu_test.cc similarity index 72% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/cpu_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/cpu_test.cc index 7264de0801..e528558167 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/cpu_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/cpu_test.cc @@ -72,26 +72,98 @@ TEST_F(LibYUVBaseTest, TestCpuHas) { #endif } -TEST_F(LibYUVBaseTest, TestCpuCompilerEnabled) { -#if defined(__aarch64__) - printf("Arm64 build\n"); +TEST_F(LibYUVBaseTest, TestCompilerMacros) { + // Tests all macros used in public headers. +#ifdef __ATOMIC_RELAXED + printf("__ATOMIC_RELAXED %d\n", __ATOMIC_RELAXED); #endif -#if defined(__aarch64__) || defined(__ARM_NEON__) || defined(LIBYUV_NEON) - printf("Neon build enabled\n"); +#ifdef __cplusplus + printf("__cplusplus %ld\n", __cplusplus); #endif -#if defined(__x86_64__) || defined(_M_X64) - printf("x64 build\n"); +#ifdef __clang_major__ + printf("__clang_major__ %d\n", __clang_major__); +#endif +#ifdef __clang_minor__ + printf("__clang_minor__ %d\n", __clang_minor__); +#endif +#ifdef __GNUC__ + printf("__GNUC__ %d\n", __GNUC__); +#endif +#ifdef __GNUC_MINOR__ + printf("__GNUC_MINOR__ %d\n", __GNUC_MINOR__); +#endif +#ifdef __i386__ + printf("__i386__ %d\n", __i386__); +#endif +#ifdef __mips + printf("__mips %d\n", __mips); +#endif +#ifdef __mips_isa_rev + printf("__mips_isa_rev %d\n", __mips_isa_rev); +#endif +#ifdef __x86_64__ + printf("__x86_64__ %d\n", __x86_64__); #endif #ifdef _MSC_VER printf("_MSC_VER %d\n", _MSC_VER); #endif -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(GCC_HAS_AVX2) || defined(CLANG_HAS_AVX2) || \ - defined(VISUALC_HAS_AVX2)) - printf("Has AVX2 1\n"); -#else - printf("Has AVX2 0\n"); -// If compiler does not support AVX2, the following function not expected: +#ifdef __aarch64__ + printf("__aarch64__ %d\n", __aarch64__); +#endif +#ifdef __APPLE__ + printf("__APPLE__ %d\n", __APPLE__); +#endif +#ifdef __arm__ + printf("__arm__ %d\n", __arm__); +#endif +#ifdef __clang__ + printf("__clang__ %d\n", __clang__); +#endif +#ifdef __CLR_VER + printf("__CLR_VER %d\n", __CLR_VER); +#endif +#ifdef __CYGWIN__ + printf("__CYGWIN__ %d\n", __CYGWIN__); +#endif +#ifdef __llvm__ + printf("__llvm__ %d\n", __llvm__); +#endif +#ifdef __mips_msa + printf("__mips_msa %d\n", __mips_msa); +#endif +#ifdef __native_client__ + printf("__native_client__ %d\n", __native_client__); +#endif +#ifdef __pic__ + printf("__pic__ %d\n", __pic__); +#endif +#ifdef __pnacl__ + printf("__pnacl__ %d\n", __pnacl__); +#endif +#ifdef _M_IX86 + printf("_M_IX86 %d\n", _M_IX86); +#endif +#ifdef _M_X64 + printf("_M_X64 %d\n", _M_X64); +#endif +#ifdef _MIPS_ARCH_LOONGSON3A + printf("_MIPS_ARCH_LOONGSON3A %d\n", _MIPS_ARCH_LOONGSON3A); +#endif +#ifdef _WIN32 + printf("_WIN32 %d\n", _WIN32); +#endif +#ifdef GG_LONGLONG + printf("GG_LONGLONG %d\n", GG_LONGLONG); +#endif +#ifdef INT_TYPES_DEFINED + printf("INT_TYPES_DEFINED\n"); +#endif +#ifdef __has_feature + printf("__has_feature\n"); +#if __has_feature(memory_sanitizer) + printf("__has_feature(memory_sanitizer) %d\n", + __has_feature(memory_sanitizer)); +#endif #endif } @@ -156,7 +228,14 @@ TEST_F(LibYUVBaseTest, TestLinuxNeon) { printf("WARNING: unable to load \"../../unit_test/testdata/arm_v7.txt\"\n"); } #if defined(__linux__) && defined(__ARM_NEON__) - EXPECT_EQ(kCpuHasNEON, ArmCpuCaps("/proc/cpuinfo")); + if (FileExists("/proc/cpuinfo")) { + if (kCpuHasNEON != ArmCpuCaps("/proc/cpuinfo")) { + // This can happen on ARM emulator but /proc/cpuinfo is from host. + printf("WARNING: Neon build enabled but CPU does not have NEON\n"); + } + } else { + printf("WARNING: unable to load \"/proc/cpuinfo\"\n"); + } #endif } diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/cpu_thread_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/cpu_thread_test.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/cpu_thread_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/cpu_thread_test.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/math_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/math_test.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/math_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/math_test.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/planar_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/planar_test.cc similarity index 82% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/planar_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/planar_test.cc index e05ff15640..5c60842136 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/planar_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/planar_test.cc @@ -155,7 +155,7 @@ static int TestAttenuateI(int width, } TEST_F(LibYUVPlanarTest, ARGBAttenuate_Any) { - int max_diff = TestAttenuateI(benchmark_width_ - 1, benchmark_height_, + int max_diff = TestAttenuateI(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); EXPECT_LE(max_diff, 2); @@ -228,7 +228,7 @@ static int TestUnattenuateI(int width, } TEST_F(LibYUVPlanarTest, ARGBUnattenuate_Any) { - int max_diff = TestUnattenuateI(benchmark_width_ - 1, benchmark_height_, + int max_diff = TestUnattenuateI(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); EXPECT_LE(max_diff, 2); @@ -1076,7 +1076,7 @@ TEST_F(LibYUVPlanarTest, TestInterpolatePlane) { #define TESTTERP(FMT_A, BPP_A, STRIDE_A, FMT_B, BPP_B, STRIDE_B, W1280, TERP, \ N, NEG, OFF) \ TEST_F(LibYUVPlanarTest, ARGBInterpolate##TERP##N) { \ - const int kWidth = ((W1280) > 0) ? (W1280) : 1; \ + const int kWidth = W1280; \ const int kHeight = benchmark_height_; \ const int kStrideA = \ (kWidth * BPP_A + STRIDE_A - 1) / STRIDE_A * STRIDE_A; \ @@ -1108,7 +1108,7 @@ TEST_F(LibYUVPlanarTest, TestInterpolatePlane) { } #define TESTINTERPOLATE(TERP) \ - TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_ - 1, TERP, _Any, +, 0) \ + TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_ + 1, TERP, _Any, +, 0) \ TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Unaligned, +, 1) \ TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Invert, -, 0) \ TESTTERP(ARGB, 4, 1, ARGB, 4, 1, benchmark_width_, TERP, _Opt, +, 0) @@ -1174,7 +1174,7 @@ static int TestBlend(int width, TEST_F(LibYUVPlanarTest, ARGBBlend_Any) { int max_diff = - TestBlend(benchmark_width_ - 4, benchmark_height_, benchmark_iterations_, + TestBlend(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 1); EXPECT_LE(max_diff, 1); } @@ -1280,7 +1280,7 @@ TEST_F(LibYUVPlanarTest, BlendPlane_Unaligned) { disable_cpu_flags_, benchmark_cpu_info_, +1, 1); } TEST_F(LibYUVPlanarTest, BlendPlane_Any) { - TestBlendPlane(benchmark_width_ - 4, benchmark_height_, benchmark_iterations_, + TestBlendPlane(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 1); } TEST_F(LibYUVPlanarTest, BlendPlane_Invert) { @@ -1375,7 +1375,7 @@ TEST_F(LibYUVPlanarTest, I420Blend_Unaligned) { // TODO(fbarchard): DISABLED because _Any uses C. Avoid C and re-enable. TEST_F(LibYUVPlanarTest, DISABLED_I420Blend_Any) { - TestI420Blend(benchmark_width_ - 4, benchmark_height_, benchmark_iterations_, + TestI420Blend(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); } TEST_F(LibYUVPlanarTest, I420Blend_Invert) { @@ -1524,7 +1524,7 @@ static int TestMultiply(int width, } TEST_F(LibYUVPlanarTest, ARGBMultiply_Any) { - int max_diff = TestMultiply(benchmark_width_ - 1, benchmark_height_, + int max_diff = TestMultiply(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); EXPECT_LE(max_diff, 1); @@ -1599,7 +1599,7 @@ static int TestAdd(int width, TEST_F(LibYUVPlanarTest, ARGBAdd_Any) { int max_diff = - TestAdd(benchmark_width_ - 1, benchmark_height_, benchmark_iterations_, + TestAdd(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); EXPECT_LE(max_diff, 1); } @@ -1672,7 +1672,7 @@ static int TestSubtract(int width, } TEST_F(LibYUVPlanarTest, ARGBSubtract_Any) { - int max_diff = TestSubtract(benchmark_width_ - 1, benchmark_height_, + int max_diff = TestSubtract(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); EXPECT_LE(max_diff, 1); @@ -1745,7 +1745,7 @@ static int TestSobel(int width, TEST_F(LibYUVPlanarTest, ARGBSobel_Any) { int max_diff = - TestSobel(benchmark_width_ - 1, benchmark_height_, benchmark_iterations_, + TestSobel(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); EXPECT_EQ(0, max_diff); } @@ -1818,7 +1818,7 @@ static int TestSobelToPlane(int width, } TEST_F(LibYUVPlanarTest, ARGBSobelToPlane_Any) { - int max_diff = TestSobelToPlane(benchmark_width_ - 1, benchmark_height_, + int max_diff = TestSobelToPlane(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); EXPECT_EQ(0, max_diff); @@ -1890,7 +1890,7 @@ static int TestSobelXY(int width, } TEST_F(LibYUVPlanarTest, ARGBSobelXY_Any) { - int max_diff = TestSobelXY(benchmark_width_ - 1, benchmark_height_, + int max_diff = TestSobelXY(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0); EXPECT_EQ(0, max_diff); @@ -1966,29 +1966,35 @@ static int TestBlur(int width, return max_diff; } +#if defined(ENABLE_SLOW_TESTS) || defined(__x86_64__) || defined(__i386__) +#define DISABLED_ARM(name) name +#else +#define DISABLED_ARM(name) DISABLED_##name +#endif + static const int kBlurSize = 55; -TEST_F(LibYUVPlanarTest, ARGBBlur_Any) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Any)) { int max_diff = - TestBlur(benchmark_width_ - 1, benchmark_height_, benchmark_iterations_, + TestBlur(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSize); EXPECT_LE(max_diff, 1); } -TEST_F(LibYUVPlanarTest, ARGBBlur_Unaligned) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Unaligned)) { int max_diff = TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 1, kBlurSize); EXPECT_LE(max_diff, 1); } -TEST_F(LibYUVPlanarTest, ARGBBlur_Invert) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Invert)) { int max_diff = TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, -1, 0, kBlurSize); EXPECT_LE(max_diff, 1); } -TEST_F(LibYUVPlanarTest, ARGBBlur_Opt) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlur_Opt)) { int max_diff = TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSize); @@ -1996,35 +2002,35 @@ TEST_F(LibYUVPlanarTest, ARGBBlur_Opt) { } static const int kBlurSmallSize = 5; -TEST_F(LibYUVPlanarTest, ARGBBlurSmall_Any) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Any)) { int max_diff = - TestBlur(benchmark_width_ - 1, benchmark_height_, benchmark_iterations_, + TestBlur(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSmallSize); EXPECT_LE(max_diff, 1); } -TEST_F(LibYUVPlanarTest, ARGBBlurSmall_Unaligned) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Unaligned)) { int max_diff = TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 1, kBlurSmallSize); EXPECT_LE(max_diff, 1); } -TEST_F(LibYUVPlanarTest, ARGBBlurSmall_Invert) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Invert)) { int max_diff = TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, -1, 0, kBlurSmallSize); EXPECT_LE(max_diff, 1); } -TEST_F(LibYUVPlanarTest, ARGBBlurSmall_Opt) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(ARGBBlurSmall_Opt)) { int max_diff = TestBlur(benchmark_width_, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0, kBlurSmallSize); EXPECT_LE(max_diff, 1); } -TEST_F(LibYUVPlanarTest, TestARGBPolynomial) { +TEST_F(LibYUVPlanarTest, DISABLED_ARM(TestARGBPolynomial)) { SIMD_ALIGNED(uint8_t orig_pixels[1280][4]); SIMD_ALIGNED(uint8_t dst_pixels_opt[1280][4]); SIMD_ALIGNED(uint8_t dst_pixels_c[1280][4]); @@ -2398,8 +2404,7 @@ TEST_F(LibYUVPlanarTest, TestARGBCopyAlpha) { } TEST_F(LibYUVPlanarTest, TestARGBExtractAlpha) { - // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + const int kPixels = benchmark_width_ * benchmark_height_; align_buffer_page_end(src_pixels, kPixels * 4); align_buffer_page_end(dst_pixels_opt, kPixels); align_buffer_page_end(dst_pixels_c, kPixels); @@ -2427,8 +2432,7 @@ TEST_F(LibYUVPlanarTest, TestARGBExtractAlpha) { } TEST_F(LibYUVPlanarTest, TestARGBCopyYToAlpha) { - // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + const int kPixels = benchmark_width_ * benchmark_height_; align_buffer_page_end(orig_pixels, kPixels); align_buffer_page_end(dst_pixels_opt, kPixels * 4); align_buffer_page_end(dst_pixels_c, kPixels * 4); @@ -2505,7 +2509,7 @@ static int TestARGBRect(int width, } TEST_F(LibYUVPlanarTest, ARGBRect_Any) { - int max_diff = TestARGBRect(benchmark_width_ - 1, benchmark_height_, + int max_diff = TestARGBRect(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 4); EXPECT_EQ(0, max_diff); @@ -2533,7 +2537,7 @@ TEST_F(LibYUVPlanarTest, ARGBRect_Opt) { } TEST_F(LibYUVPlanarTest, SetPlane_Any) { - int max_diff = TestARGBRect(benchmark_width_ - 1, benchmark_height_, + int max_diff = TestARGBRect(benchmark_width_ + 1, benchmark_height_, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_, +1, 0, 1); EXPECT_EQ(0, max_diff); @@ -2561,35 +2565,25 @@ TEST_F(LibYUVPlanarTest, SetPlane_Opt) { } TEST_F(LibYUVPlanarTest, MergeUVPlane_Opt) { - // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; - align_buffer_page_end(src_pixels, kPixels * 2); - align_buffer_page_end(tmp_pixels_u, kPixels); - align_buffer_page_end(tmp_pixels_v, kPixels); + const int kPixels = benchmark_width_ * benchmark_height_; + align_buffer_page_end(src_pixels_u, kPixels); + align_buffer_page_end(src_pixels_v, kPixels); align_buffer_page_end(dst_pixels_opt, kPixels * 2); align_buffer_page_end(dst_pixels_c, kPixels * 2); - MemRandomize(src_pixels, kPixels * 2); - MemRandomize(tmp_pixels_u, kPixels); - MemRandomize(tmp_pixels_v, kPixels); + MemRandomize(src_pixels_u, kPixels); + MemRandomize(src_pixels_v, kPixels); MemRandomize(dst_pixels_opt, kPixels * 2); MemRandomize(dst_pixels_c, kPixels * 2); MaskCpuFlags(disable_cpu_flags_); - SplitUVPlane(src_pixels, benchmark_width_ * 2, tmp_pixels_u, benchmark_width_, - tmp_pixels_v, benchmark_width_, benchmark_width_, - benchmark_height_); - MergeUVPlane(tmp_pixels_u, benchmark_width_, tmp_pixels_v, benchmark_width_, + MergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v, benchmark_width_, dst_pixels_c, benchmark_width_ * 2, benchmark_width_, benchmark_height_); MaskCpuFlags(benchmark_cpu_info_); - SplitUVPlane(src_pixels, benchmark_width_ * 2, tmp_pixels_u, benchmark_width_, - tmp_pixels_v, benchmark_width_, benchmark_width_, - benchmark_height_); - for (int i = 0; i < benchmark_iterations_; ++i) { - MergeUVPlane(tmp_pixels_u, benchmark_width_, tmp_pixels_v, benchmark_width_, + MergeUVPlane(src_pixels_u, benchmark_width_, src_pixels_v, benchmark_width_, dst_pixels_opt, benchmark_width_ * 2, benchmark_width_, benchmark_height_); } @@ -2598,60 +2592,127 @@ TEST_F(LibYUVPlanarTest, MergeUVPlane_Opt) { EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); } - free_aligned_buffer_page_end(src_pixels); - free_aligned_buffer_page_end(tmp_pixels_u); - free_aligned_buffer_page_end(tmp_pixels_v); + free_aligned_buffer_page_end(src_pixels_u); + free_aligned_buffer_page_end(src_pixels_v); + free_aligned_buffer_page_end(dst_pixels_opt); + free_aligned_buffer_page_end(dst_pixels_c); +} + +// 16 bit channel split and merge +TEST_F(LibYUVPlanarTest, MergeUVPlane_16_Opt) { + const int kPixels = benchmark_width_ * benchmark_height_; + align_buffer_page_end(src_pixels_u, kPixels * 2); + align_buffer_page_end(src_pixels_v, kPixels * 2); + align_buffer_page_end(dst_pixels_opt, kPixels * 2 * 2); + align_buffer_page_end(dst_pixels_c, kPixels * 2 * 2); + MemRandomize(src_pixels_u, kPixels * 2); + MemRandomize(src_pixels_v, kPixels * 2); + MemRandomize(dst_pixels_opt, kPixels * 2 * 2); + MemRandomize(dst_pixels_c, kPixels * 2 * 2); + + MaskCpuFlags(disable_cpu_flags_); + MergeUVPlane_16((const uint16_t*)src_pixels_u, benchmark_width_, + (const uint16_t*)src_pixels_v, benchmark_width_, + (uint16_t*)dst_pixels_c, benchmark_width_ * 2, + benchmark_width_, benchmark_height_, 12); + MaskCpuFlags(benchmark_cpu_info_); + + for (int i = 0; i < benchmark_iterations_; ++i) { + MergeUVPlane_16((const uint16_t*)src_pixels_u, benchmark_width_, + (const uint16_t*)src_pixels_v, benchmark_width_, + (uint16_t*)dst_pixels_opt, benchmark_width_ * 2, + benchmark_width_, benchmark_height_, 12); + } + + for (int i = 0; i < kPixels * 2 * 2; ++i) { + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); + } + free_aligned_buffer_page_end(src_pixels_u); + free_aligned_buffer_page_end(src_pixels_v); free_aligned_buffer_page_end(dst_pixels_opt); free_aligned_buffer_page_end(dst_pixels_c); } TEST_F(LibYUVPlanarTest, SplitUVPlane_Opt) { - // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + const int kPixels = benchmark_width_ * benchmark_height_; align_buffer_page_end(src_pixels, kPixels * 2); - align_buffer_page_end(tmp_pixels_u, kPixels); - align_buffer_page_end(tmp_pixels_v, kPixels); - align_buffer_page_end(dst_pixels_opt, kPixels * 2); - align_buffer_page_end(dst_pixels_c, kPixels * 2); + align_buffer_page_end(dst_pixels_u_c, kPixels); + align_buffer_page_end(dst_pixels_v_c, kPixels); + align_buffer_page_end(dst_pixels_u_opt, kPixels); + align_buffer_page_end(dst_pixels_v_opt, kPixels); MemRandomize(src_pixels, kPixels * 2); - MemRandomize(tmp_pixels_u, kPixels); - MemRandomize(tmp_pixels_v, kPixels); - MemRandomize(dst_pixels_opt, kPixels * 2); - MemRandomize(dst_pixels_c, kPixels * 2); + MemRandomize(dst_pixels_u_c, kPixels); + MemRandomize(dst_pixels_v_c, kPixels); + MemRandomize(dst_pixels_u_opt, kPixels); + MemRandomize(dst_pixels_v_opt, kPixels); MaskCpuFlags(disable_cpu_flags_); - SplitUVPlane(src_pixels, benchmark_width_ * 2, tmp_pixels_u, benchmark_width_, - tmp_pixels_v, benchmark_width_, benchmark_width_, - benchmark_height_); - MergeUVPlane(tmp_pixels_u, benchmark_width_, tmp_pixels_v, benchmark_width_, - dst_pixels_c, benchmark_width_ * 2, benchmark_width_, - benchmark_height_); + SplitUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_u_c, + benchmark_width_, dst_pixels_v_c, benchmark_width_, + benchmark_width_, benchmark_height_); MaskCpuFlags(benchmark_cpu_info_); for (int i = 0; i < benchmark_iterations_; ++i) { - SplitUVPlane(src_pixels, benchmark_width_ * 2, tmp_pixels_u, - benchmark_width_, tmp_pixels_v, benchmark_width_, + SplitUVPlane(src_pixels, benchmark_width_ * 2, dst_pixels_u_opt, + benchmark_width_, dst_pixels_v_opt, benchmark_width_, benchmark_width_, benchmark_height_); } - MergeUVPlane(tmp_pixels_u, benchmark_width_, tmp_pixels_v, benchmark_width_, - dst_pixels_opt, benchmark_width_ * 2, benchmark_width_, - benchmark_height_); - for (int i = 0; i < kPixels * 2; ++i) { - EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); + for (int i = 0; i < kPixels; ++i) { + EXPECT_EQ(dst_pixels_u_c[i], dst_pixels_u_opt[i]); + EXPECT_EQ(dst_pixels_v_c[i], dst_pixels_v_opt[i]); } free_aligned_buffer_page_end(src_pixels); - free_aligned_buffer_page_end(tmp_pixels_u); - free_aligned_buffer_page_end(tmp_pixels_v); - free_aligned_buffer_page_end(dst_pixels_opt); - free_aligned_buffer_page_end(dst_pixels_c); + free_aligned_buffer_page_end(dst_pixels_u_c); + free_aligned_buffer_page_end(dst_pixels_v_c); + free_aligned_buffer_page_end(dst_pixels_u_opt); + free_aligned_buffer_page_end(dst_pixels_v_opt); +} + +// 16 bit channel split +TEST_F(LibYUVPlanarTest, SplitUVPlane_16_Opt) { + const int kPixels = benchmark_width_ * benchmark_height_; + align_buffer_page_end(src_pixels, kPixels * 2 * 2); + align_buffer_page_end(dst_pixels_u_c, kPixels * 2); + align_buffer_page_end(dst_pixels_v_c, kPixels * 2); + align_buffer_page_end(dst_pixels_u_opt, kPixels * 2); + align_buffer_page_end(dst_pixels_v_opt, kPixels * 2); + MemRandomize(src_pixels, kPixels * 2 * 2); + MemRandomize(dst_pixels_u_c, kPixels * 2); + MemRandomize(dst_pixels_v_c, kPixels * 2); + MemRandomize(dst_pixels_u_opt, kPixels * 2); + MemRandomize(dst_pixels_v_opt, kPixels * 2); + + MaskCpuFlags(disable_cpu_flags_); + SplitUVPlane_16((const uint16_t*)src_pixels, benchmark_width_ * 2, + (uint16_t*)dst_pixels_u_c, benchmark_width_, + (uint16_t*)dst_pixels_v_c, benchmark_width_, benchmark_width_, + benchmark_height_, 10); + MaskCpuFlags(benchmark_cpu_info_); + + for (int i = 0; i < benchmark_iterations_; ++i) { + SplitUVPlane_16((const uint16_t*)src_pixels, benchmark_width_ * 2, + (uint16_t*)dst_pixels_u_opt, benchmark_width_, + (uint16_t*)dst_pixels_v_opt, benchmark_width_, + benchmark_width_, benchmark_height_, 10); + } + + for (int i = 0; i < kPixels * 2; ++i) { + EXPECT_EQ(dst_pixels_u_c[i], dst_pixels_u_opt[i]); + EXPECT_EQ(dst_pixels_v_c[i], dst_pixels_v_opt[i]); + } + free_aligned_buffer_page_end(src_pixels); + free_aligned_buffer_page_end(dst_pixels_u_c); + free_aligned_buffer_page_end(dst_pixels_v_c); + free_aligned_buffer_page_end(dst_pixels_u_opt); + free_aligned_buffer_page_end(dst_pixels_v_opt); } TEST_F(LibYUVPlanarTest, SwapUVPlane_Opt) { // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + const int kPixels = benchmark_width_ * benchmark_height_; align_buffer_page_end(src_pixels, kPixels * 2); align_buffer_page_end(dst_pixels_opt, kPixels * 2); align_buffer_page_end(dst_pixels_c, kPixels * 2); @@ -2681,7 +2742,7 @@ TEST_F(LibYUVPlanarTest, SwapUVPlane_Opt) { TEST_F(LibYUVPlanarTest, MergeRGBPlane_Opt) { // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + const int kPixels = benchmark_width_ * benchmark_height_; align_buffer_page_end(src_pixels, kPixels * 3); align_buffer_page_end(tmp_pixels_r, kPixels); align_buffer_page_end(tmp_pixels_g, kPixels); @@ -2730,7 +2791,7 @@ TEST_F(LibYUVPlanarTest, MergeRGBPlane_Opt) { TEST_F(LibYUVPlanarTest, SplitRGBPlane_Opt) { // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + const int kPixels = benchmark_width_ * benchmark_height_; align_buffer_page_end(src_pixels, kPixels * 3); align_buffer_page_end(tmp_pixels_r, kPixels); align_buffer_page_end(tmp_pixels_g, kPixels); @@ -2776,11 +2837,373 @@ TEST_F(LibYUVPlanarTest, SplitRGBPlane_Opt) { free_aligned_buffer_page_end(dst_pixels_c); } +TEST_F(LibYUVPlanarTest, MergeARGBPlane_Opt) { + const int kPixels = benchmark_width_ * benchmark_height_; + align_buffer_page_end(src_pixels, kPixels * 4); + align_buffer_page_end(tmp_pixels_r, kPixels); + align_buffer_page_end(tmp_pixels_g, kPixels); + align_buffer_page_end(tmp_pixels_b, kPixels); + align_buffer_page_end(tmp_pixels_a, kPixels); + align_buffer_page_end(dst_pixels_opt, kPixels * 4); + align_buffer_page_end(dst_pixels_c, kPixels * 4); + + MemRandomize(src_pixels, kPixels * 4); + MemRandomize(tmp_pixels_r, kPixels); + MemRandomize(tmp_pixels_g, kPixels); + MemRandomize(tmp_pixels_b, kPixels); + MemRandomize(tmp_pixels_a, kPixels); + MemRandomize(dst_pixels_opt, kPixels * 4); + MemRandomize(dst_pixels_c, kPixels * 4); + + MaskCpuFlags(disable_cpu_flags_); + SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_r, + benchmark_width_, tmp_pixels_g, benchmark_width_, tmp_pixels_b, + benchmark_width_, tmp_pixels_a, benchmark_width_, + benchmark_width_, benchmark_height_); + MergeARGBPlane(tmp_pixels_r, benchmark_width_, tmp_pixels_g, benchmark_width_, + tmp_pixels_b, benchmark_width_, tmp_pixels_a, benchmark_width_, + dst_pixels_c, benchmark_width_ * 4, benchmark_width_, + benchmark_height_); + + MaskCpuFlags(benchmark_cpu_info_); + SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_r, + benchmark_width_, tmp_pixels_g, benchmark_width_, tmp_pixels_b, + benchmark_width_, tmp_pixels_a, benchmark_width_, + benchmark_width_, benchmark_height_); + + for (int i = 0; i < benchmark_iterations_; ++i) { + MergeARGBPlane(tmp_pixels_r, benchmark_width_, tmp_pixels_g, + benchmark_width_, tmp_pixels_b, benchmark_width_, + tmp_pixels_a, benchmark_width_, dst_pixels_opt, + benchmark_width_ * 4, benchmark_width_, benchmark_height_); + } + + for (int i = 0; i < kPixels * 4; ++i) { + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); + } + + free_aligned_buffer_page_end(src_pixels); + free_aligned_buffer_page_end(tmp_pixels_r); + free_aligned_buffer_page_end(tmp_pixels_g); + free_aligned_buffer_page_end(tmp_pixels_b); + free_aligned_buffer_page_end(tmp_pixels_a); + free_aligned_buffer_page_end(dst_pixels_opt); + free_aligned_buffer_page_end(dst_pixels_c); +} + +TEST_F(LibYUVPlanarTest, SplitARGBPlane_Opt) { + const int kPixels = benchmark_width_ * benchmark_height_; + align_buffer_page_end(src_pixels, kPixels * 4); + align_buffer_page_end(tmp_pixels_r, kPixels); + align_buffer_page_end(tmp_pixels_g, kPixels); + align_buffer_page_end(tmp_pixels_b, kPixels); + align_buffer_page_end(tmp_pixels_a, kPixels); + align_buffer_page_end(dst_pixels_opt, kPixels * 4); + align_buffer_page_end(dst_pixels_c, kPixels * 4); + + MemRandomize(src_pixels, kPixels * 4); + MemRandomize(tmp_pixels_r, kPixels); + MemRandomize(tmp_pixels_g, kPixels); + MemRandomize(tmp_pixels_b, kPixels); + MemRandomize(tmp_pixels_a, kPixels); + MemRandomize(dst_pixels_opt, kPixels * 4); + MemRandomize(dst_pixels_c, kPixels * 4); + + MaskCpuFlags(disable_cpu_flags_); + SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_r, + benchmark_width_, tmp_pixels_g, benchmark_width_, tmp_pixels_b, + benchmark_width_, tmp_pixels_a, benchmark_width_, + benchmark_width_, benchmark_height_); + MergeARGBPlane(tmp_pixels_r, benchmark_width_, tmp_pixels_g, benchmark_width_, + tmp_pixels_b, benchmark_width_, tmp_pixels_a, benchmark_width_, + dst_pixels_c, benchmark_width_ * 4, benchmark_width_, + benchmark_height_); + + MaskCpuFlags(benchmark_cpu_info_); + for (int i = 0; i < benchmark_iterations_; ++i) { + SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_r, + benchmark_width_, tmp_pixels_g, benchmark_width_, + tmp_pixels_b, benchmark_width_, tmp_pixels_a, + benchmark_width_, benchmark_width_, benchmark_height_); + } + + MergeARGBPlane(tmp_pixels_r, benchmark_width_, tmp_pixels_g, benchmark_width_, + tmp_pixels_b, benchmark_width_, tmp_pixels_a, benchmark_width_, + dst_pixels_opt, benchmark_width_ * 4, benchmark_width_, + benchmark_height_); + + for (int i = 0; i < kPixels * 4; ++i) { + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); + } + + free_aligned_buffer_page_end(src_pixels); + free_aligned_buffer_page_end(tmp_pixels_r); + free_aligned_buffer_page_end(tmp_pixels_g); + free_aligned_buffer_page_end(tmp_pixels_b); + free_aligned_buffer_page_end(tmp_pixels_a); + free_aligned_buffer_page_end(dst_pixels_opt); + free_aligned_buffer_page_end(dst_pixels_c); +} + +TEST_F(LibYUVPlanarTest, MergeXRGBPlane_Opt) { + const int kPixels = benchmark_width_ * benchmark_height_; + align_buffer_page_end(src_pixels, kPixels * 4); + align_buffer_page_end(tmp_pixels_r, kPixels); + align_buffer_page_end(tmp_pixels_g, kPixels); + align_buffer_page_end(tmp_pixels_b, kPixels); + align_buffer_page_end(dst_pixels_opt, kPixels * 4); + align_buffer_page_end(dst_pixels_c, kPixels * 4); + + MemRandomize(src_pixels, kPixels * 4); + MemRandomize(tmp_pixels_r, kPixels); + MemRandomize(tmp_pixels_g, kPixels); + MemRandomize(tmp_pixels_b, kPixels); + MemRandomize(dst_pixels_opt, kPixels * 4); + MemRandomize(dst_pixels_c, kPixels * 4); + + MaskCpuFlags(disable_cpu_flags_); + SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_r, + benchmark_width_, tmp_pixels_g, benchmark_width_, tmp_pixels_b, + benchmark_width_, NULL, 0, benchmark_width_, + benchmark_height_); + MergeARGBPlane(tmp_pixels_r, benchmark_width_, tmp_pixels_g, benchmark_width_, + tmp_pixels_b, benchmark_width_, NULL, 0, dst_pixels_c, + benchmark_width_ * 4, benchmark_width_, benchmark_height_); + + MaskCpuFlags(benchmark_cpu_info_); + SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_r, + benchmark_width_, tmp_pixels_g, benchmark_width_, tmp_pixels_b, + benchmark_width_, NULL, 0, benchmark_width_, + benchmark_height_); + + for (int i = 0; i < benchmark_iterations_; ++i) { + MergeARGBPlane(tmp_pixels_r, benchmark_width_, tmp_pixels_g, + benchmark_width_, tmp_pixels_b, benchmark_width_, NULL, 0, + dst_pixels_opt, benchmark_width_ * 4, benchmark_width_, + benchmark_height_); + } + + for (int i = 0; i < kPixels * 4; ++i) { + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); + } + + free_aligned_buffer_page_end(src_pixels); + free_aligned_buffer_page_end(tmp_pixels_r); + free_aligned_buffer_page_end(tmp_pixels_g); + free_aligned_buffer_page_end(tmp_pixels_b); + free_aligned_buffer_page_end(dst_pixels_opt); + free_aligned_buffer_page_end(dst_pixels_c); +} + +TEST_F(LibYUVPlanarTest, SplitXRGBPlane_Opt) { + const int kPixels = benchmark_width_ * benchmark_height_; + align_buffer_page_end(src_pixels, kPixels * 4); + align_buffer_page_end(tmp_pixels_r, kPixels); + align_buffer_page_end(tmp_pixels_g, kPixels); + align_buffer_page_end(tmp_pixels_b, kPixels); + align_buffer_page_end(dst_pixels_opt, kPixels * 4); + align_buffer_page_end(dst_pixels_c, kPixels * 4); + + MemRandomize(src_pixels, kPixels * 4); + MemRandomize(tmp_pixels_r, kPixels); + MemRandomize(tmp_pixels_g, kPixels); + MemRandomize(tmp_pixels_b, kPixels); + MemRandomize(dst_pixels_opt, kPixels * 4); + MemRandomize(dst_pixels_c, kPixels * 4); + + MaskCpuFlags(disable_cpu_flags_); + SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_r, + benchmark_width_, tmp_pixels_g, benchmark_width_, tmp_pixels_b, + benchmark_width_, NULL, 0, benchmark_width_, + benchmark_height_); + MergeARGBPlane(tmp_pixels_r, benchmark_width_, tmp_pixels_g, benchmark_width_, + tmp_pixels_b, benchmark_width_, NULL, 0, dst_pixels_c, + benchmark_width_ * 4, benchmark_width_, benchmark_height_); + + MaskCpuFlags(benchmark_cpu_info_); + for (int i = 0; i < benchmark_iterations_; ++i) { + SplitARGBPlane(src_pixels, benchmark_width_ * 4, tmp_pixels_r, + benchmark_width_, tmp_pixels_g, benchmark_width_, + tmp_pixels_b, benchmark_width_, NULL, 0, benchmark_width_, + benchmark_height_); + } + + MergeARGBPlane(tmp_pixels_r, benchmark_width_, tmp_pixels_g, benchmark_width_, + tmp_pixels_b, benchmark_width_, NULL, 0, dst_pixels_opt, + benchmark_width_ * 4, benchmark_width_, benchmark_height_); + + for (int i = 0; i < kPixels * 4; ++i) { + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); + } + + free_aligned_buffer_page_end(src_pixels); + free_aligned_buffer_page_end(tmp_pixels_r); + free_aligned_buffer_page_end(tmp_pixels_g); + free_aligned_buffer_page_end(tmp_pixels_b); + free_aligned_buffer_page_end(dst_pixels_opt); + free_aligned_buffer_page_end(dst_pixels_c); +} + +// Merge 4 channels +#define TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \ + TEST_F(LibYUVPlanarTest, FUNC##Plane_##DEPTH##N) { \ + const int kWidth = W1280; \ + const int kPixels = kWidth * benchmark_height_; \ + align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(src_memory_a, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \ + align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \ + MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \ + MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \ + MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \ + MemRandomize(src_memory_a, kPixels * sizeof(STYPE) + OFF); \ + memset(dst_memory_c, 0, kPixels * 4 * sizeof(DTYPE)); \ + memset(dst_memory_opt, 0, kPixels * 4 * sizeof(DTYPE)); \ + STYPE* src_pixels_r = reinterpret_cast(src_memory_r + OFF); \ + STYPE* src_pixels_g = reinterpret_cast(src_memory_g + OFF); \ + STYPE* src_pixels_b = reinterpret_cast(src_memory_b + OFF); \ + STYPE* src_pixels_a = reinterpret_cast(src_memory_a + OFF); \ + DTYPE* dst_pixels_c = reinterpret_cast(dst_memory_c); \ + DTYPE* dst_pixels_opt = reinterpret_cast(dst_memory_opt); \ + MaskCpuFlags(disable_cpu_flags_); \ + FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \ + kWidth, src_pixels_a, kWidth, dst_pixels_c, kWidth * 4, \ + kWidth, NEG benchmark_height_, DEPTH); \ + MaskCpuFlags(benchmark_cpu_info_); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \ + kWidth, src_pixels_a, kWidth, dst_pixels_opt, kWidth * 4, \ + kWidth, NEG benchmark_height_, DEPTH); \ + } \ + for (int i = 0; i < kPixels * 4; ++i) { \ + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \ + } \ + free_aligned_buffer_page_end(src_memory_r); \ + free_aligned_buffer_page_end(src_memory_g); \ + free_aligned_buffer_page_end(src_memory_b); \ + free_aligned_buffer_page_end(src_memory_a); \ + free_aligned_buffer_page_end(dst_memory_c); \ + free_aligned_buffer_page_end(dst_memory_opt); \ + } + +// Merge 3 channel RGB into 4 channel XRGB with opaque alpha +#define TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \ + TEST_F(LibYUVPlanarTest, FUNC##Plane_Opaque_##DEPTH##N) { \ + const int kWidth = W1280; \ + const int kPixels = kWidth * benchmark_height_; \ + align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \ + align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \ + MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \ + MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \ + MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \ + memset(dst_memory_c, 0, kPixels * 4 * sizeof(DTYPE)); \ + memset(dst_memory_opt, 0, kPixels * 4 * sizeof(DTYPE)); \ + STYPE* src_pixels_r = reinterpret_cast(src_memory_r + OFF); \ + STYPE* src_pixels_g = reinterpret_cast(src_memory_g + OFF); \ + STYPE* src_pixels_b = reinterpret_cast(src_memory_b + OFF); \ + DTYPE* dst_pixels_c = reinterpret_cast(dst_memory_c); \ + DTYPE* dst_pixels_opt = reinterpret_cast(dst_memory_opt); \ + MaskCpuFlags(disable_cpu_flags_); \ + FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \ + kWidth, NULL, 0, dst_pixels_c, kWidth * 4, kWidth, \ + NEG benchmark_height_, DEPTH); \ + MaskCpuFlags(benchmark_cpu_info_); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \ + kWidth, NULL, 0, dst_pixels_opt, kWidth * 4, kWidth, \ + NEG benchmark_height_, DEPTH); \ + } \ + for (int i = 0; i < kPixels * 4; ++i) { \ + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \ + } \ + free_aligned_buffer_page_end(src_memory_r); \ + free_aligned_buffer_page_end(src_memory_g); \ + free_aligned_buffer_page_end(src_memory_b); \ + free_aligned_buffer_page_end(dst_memory_c); \ + free_aligned_buffer_page_end(dst_memory_opt); \ + } + +#define TESTQPLANARTOP(FUNC, STYPE, DTYPE, DEPTH) \ + TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, 0) \ + TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \ + 1) \ + TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \ + TESTQPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0) \ + TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, \ + 0) \ + TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \ + 1) \ + TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \ + TESTQPLANAROTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0) + +TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 10) +TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 12) +TESTQPLANARTOP(MergeAR64, uint16_t, uint16_t, 16) +TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 10) +TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 12) +TESTQPLANARTOP(MergeARGB16To8, uint16_t, uint8_t, 16) + +#define TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, W1280, N, NEG, OFF) \ + TEST_F(LibYUVPlanarTest, FUNC##Plane_##DEPTH##N) { \ + const int kWidth = W1280; \ + const int kPixels = kWidth * benchmark_height_; \ + align_buffer_page_end(src_memory_r, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(src_memory_g, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(src_memory_b, kPixels * sizeof(STYPE) + OFF); \ + align_buffer_page_end(dst_memory_c, kPixels * 4 * sizeof(DTYPE)); \ + align_buffer_page_end(dst_memory_opt, kPixels * 4 * sizeof(DTYPE)); \ + MemRandomize(src_memory_r, kPixels * sizeof(STYPE) + OFF); \ + MemRandomize(src_memory_g, kPixels * sizeof(STYPE) + OFF); \ + MemRandomize(src_memory_b, kPixels * sizeof(STYPE) + OFF); \ + STYPE* src_pixels_r = reinterpret_cast(src_memory_r + OFF); \ + STYPE* src_pixels_g = reinterpret_cast(src_memory_g + OFF); \ + STYPE* src_pixels_b = reinterpret_cast(src_memory_b + OFF); \ + DTYPE* dst_pixels_c = reinterpret_cast(dst_memory_c); \ + DTYPE* dst_pixels_opt = reinterpret_cast(dst_memory_opt); \ + memset(dst_pixels_c, 1, kPixels * 4 * sizeof(DTYPE)); \ + memset(dst_pixels_opt, 2, kPixels * 4 * sizeof(DTYPE)); \ + MaskCpuFlags(disable_cpu_flags_); \ + FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \ + kWidth, dst_pixels_c, kWidth * 4, kWidth, \ + NEG benchmark_height_, DEPTH); \ + MaskCpuFlags(benchmark_cpu_info_); \ + for (int i = 0; i < benchmark_iterations_; ++i) { \ + FUNC##Plane(src_pixels_r, kWidth, src_pixels_g, kWidth, src_pixels_b, \ + kWidth, dst_pixels_opt, kWidth * 4, kWidth, \ + NEG benchmark_height_, DEPTH); \ + } \ + for (int i = 0; i < kPixels * 4; ++i) { \ + EXPECT_EQ(dst_pixels_c[i], dst_pixels_opt[i]); \ + } \ + free_aligned_buffer_page_end(src_memory_r); \ + free_aligned_buffer_page_end(src_memory_g); \ + free_aligned_buffer_page_end(src_memory_b); \ + free_aligned_buffer_page_end(dst_memory_c); \ + free_aligned_buffer_page_end(dst_memory_opt); \ + } + +#define TESTTPLANARTOP(FUNC, STYPE, DTYPE, DEPTH) \ + TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_ + 1, _Any, +, 0) \ + TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Unaligned, +, \ + 1) \ + TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Invert, -, 0) \ + TESTTPLANARTOPI(FUNC, STYPE, DTYPE, DEPTH, benchmark_width_, _Opt, +, 0) + +TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 10) +TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 12) +TESTTPLANARTOP(MergeXR30, uint16_t, uint8_t, 16) + // TODO(fbarchard): improve test for platforms and cpu detect #ifdef HAS_MERGEUVROW_16_AVX2 TEST_F(LibYUVPlanarTest, MergeUVRow_16_Opt) { // Round count up to multiple of 16 const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + align_buffer_page_end(src_pixels_u, kPixels * 2); align_buffer_page_end(src_pixels_v, kPixels * 2); align_buffer_page_end(dst_pixels_uv_opt, kPixels * 2 * 2); @@ -2824,8 +3247,9 @@ TEST_F(LibYUVPlanarTest, MergeUVRow_16_Opt) { // TODO(fbarchard): Improve test for more platforms. #ifdef HAS_MULTIPLYROW_16_AVX2 TEST_F(LibYUVPlanarTest, MultiplyRow_16_Opt) { - // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + // Round count up to multiple of 32 + const int kPixels = (benchmark_width_ * benchmark_height_ + 31) & ~31; + align_buffer_page_end(src_pixels_y, kPixels * 2); align_buffer_page_end(dst_pixels_y_opt, kPixels * 2); align_buffer_page_end(dst_pixels_y_c, kPixels * 2); @@ -2861,8 +3285,7 @@ TEST_F(LibYUVPlanarTest, MultiplyRow_16_Opt) { #endif // HAS_MULTIPLYROW_16_AVX2 TEST_F(LibYUVPlanarTest, Convert16To8Plane) { - // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + const int kPixels = benchmark_width_ * benchmark_height_; align_buffer_page_end(src_pixels_y, kPixels * 2); align_buffer_page_end(dst_pixels_y_opt, kPixels); align_buffer_page_end(dst_pixels_y_c, kPixels); @@ -2941,8 +3364,7 @@ TEST_F(LibYUVPlanarTest, Convert16To8Row_Opt) { #endif // ENABLE_ROW_TESTS TEST_F(LibYUVPlanarTest, Convert8To16Plane) { - // Round count up to multiple of 16 - const int kPixels = (benchmark_width_ * benchmark_height_ + 15) & ~15; + const int kPixels = benchmark_width_ * benchmark_height_; align_buffer_page_end(src_pixels_y, kPixels); align_buffer_page_end(dst_pixels_y_opt, kPixels * 2); align_buffer_page_end(dst_pixels_y_c, kPixels * 2); diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/rotate_argb_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/rotate_argb_test.cc similarity index 94% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/rotate_argb_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/rotate_argb_test.cc index 3208b66a2a..01ed69ca55 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/rotate_argb_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/rotate_argb_test.cc @@ -156,29 +156,29 @@ TEST_F(LibYUVRotateTest, RotatePlane270_Opt) { } TEST_F(LibYUVRotateTest, DISABLED_RotatePlane0_Odd) { - TestRotatePlane(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_width_ - 3, benchmark_height_ - 1, kRotate0, + TestRotatePlane(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_width_ + 1, benchmark_height_ + 1, kRotate0, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_RotatePlane90_Odd) { - TestRotatePlane(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_height_ - 1, benchmark_width_ - 3, kRotate90, + TestRotatePlane(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_height_ + 1, benchmark_width_ + 1, kRotate90, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_RotatePlane180_Odd) { - TestRotatePlane(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_width_ - 3, benchmark_height_ - 1, kRotate180, + TestRotatePlane(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_width_ + 1, benchmark_height_ + 1, kRotate180, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_RotatePlane270_Odd) { - TestRotatePlane(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_height_ - 1, benchmark_width_ - 3, kRotate270, + TestRotatePlane(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_height_ + 1, benchmark_width_ + 1, kRotate270, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/rotate_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/rotate_test.cc similarity index 90% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/rotate_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/rotate_test.cc index 61941e63e0..1bab584fa1 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/rotate_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/rotate_test.cc @@ -108,29 +108,29 @@ TEST_F(LibYUVRotateTest, I420Rotate270_Opt) { // Odd width tests work but disabled because they use C code and can be // tested by passing an odd width command line or environment variable. TEST_F(LibYUVRotateTest, DISABLED_I420Rotate0_Odd) { - I420TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_width_ - 3, benchmark_height_ - 1, kRotate0, + I420TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_width_ + 1, benchmark_height_ + 1, kRotate0, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_I420Rotate90_Odd) { - I420TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_height_ - 1, benchmark_width_ - 3, kRotate90, + I420TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_height_ + 1, benchmark_width_ + 1, kRotate90, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_I420Rotate180_Odd) { - I420TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_width_ - 3, benchmark_height_ - 1, kRotate180, + I420TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_width_ + 1, benchmark_height_ + 1, kRotate180, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_I420Rotate270_Odd) { - I420TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_height_ - 1, benchmark_width_ - 3, kRotate270, + I420TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_height_ + 1, benchmark_width_ + 1, kRotate270, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } @@ -225,29 +225,29 @@ TEST_F(LibYUVRotateTest, I444Rotate270_Opt) { // Odd width tests work but disabled because they use C code and can be // tested by passing an odd width command line or environment variable. TEST_F(LibYUVRotateTest, DISABLED_I444Rotate0_Odd) { - I444TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_width_ - 3, benchmark_height_ - 1, kRotate0, + I444TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_width_ + 1, benchmark_height_ + 1, kRotate0, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_I444Rotate90_Odd) { - I444TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_height_ - 1, benchmark_width_ - 3, kRotate90, + I444TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_height_ + 1, benchmark_width_ + 1, kRotate90, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_I444Rotate180_Odd) { - I444TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_width_ - 3, benchmark_height_ - 1, kRotate180, + I444TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_width_ + 1, benchmark_height_ + 1, kRotate180, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_I444Rotate270_Odd) { - I444TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_height_ - 1, benchmark_width_ - 3, kRotate270, + I444TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_height_ + 1, benchmark_width_ + 1, kRotate270, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } @@ -340,29 +340,29 @@ TEST_F(LibYUVRotateTest, NV12Rotate270_Opt) { } TEST_F(LibYUVRotateTest, DISABLED_NV12Rotate0_Odd) { - NV12TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_width_ - 3, benchmark_height_ - 1, kRotate0, + NV12TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_width_ + 1, benchmark_height_ + 1, kRotate0, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_NV12Rotate90_Odd) { - NV12TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_height_ - 1, benchmark_width_ - 3, kRotate90, + NV12TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_height_ + 1, benchmark_width_ + 1, kRotate90, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_NV12Rotate180_Odd) { - NV12TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_width_ - 3, benchmark_height_ - 1, kRotate180, + NV12TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_width_ + 1, benchmark_height_ + 1, kRotate180, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } TEST_F(LibYUVRotateTest, DISABLED_NV12Rotate270_Odd) { - NV12TestRotate(benchmark_width_ - 3, benchmark_height_ - 1, - benchmark_height_ - 1, benchmark_width_ - 3, kRotate270, + NV12TestRotate(benchmark_width_ + 1, benchmark_height_ + 1, + benchmark_height_ + 1, benchmark_width_ + 1, kRotate270, benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); } diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_argb_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/scale_argb_test.cc similarity index 89% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_argb_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/scale_argb_test.cc index 2fdf5f6034..48ad75eafd 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_argb_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/scale_argb_test.cc @@ -114,8 +114,8 @@ static int ARGBTestFilter(int src_width, return max_diff; } -static const int kTileX = 8; -static const int kTileY = 8; +static const int kTileX = 64; +static const int kTileY = 64; static int TileARGBScale(const uint8_t* src_argb, int src_stride_argb, @@ -232,7 +232,7 @@ static int ARGBClipTestFilter(int src_width, #define DX(x, nom, denom) static_cast((Abs(x) / nom) * nom) #define SX(x, nom, denom) static_cast((x / nom) * denom) -#define TEST_FACTOR1(name, filter, nom, denom, max_diff) \ +#define TEST_FACTOR1(DISABLED_, name, filter, nom, denom, max_diff) \ TEST_F(LibYUVScaleTest, ARGBScaleDownBy##name##_##filter) { \ int diff = ARGBTestFilter( \ SX(benchmark_width_, nom, denom), SX(benchmark_height_, nom, denom), \ @@ -241,7 +241,7 @@ static int ARGBClipTestFilter(int src_width, benchmark_cpu_info_); \ EXPECT_LE(diff, max_diff); \ } \ - TEST_F(LibYUVScaleTest, ARGBScaleDownClipBy##name##_##filter) { \ + TEST_F(LibYUVScaleTest, DISABLED_##ARGBScaleDownClipBy##name##_##filter) { \ int diff = ARGBClipTestFilter( \ SX(benchmark_width_, nom, denom), SX(benchmark_height_, nom, denom), \ DX(benchmark_width_, nom, denom), DX(benchmark_height_, nom, denom), \ @@ -251,11 +251,19 @@ static int ARGBClipTestFilter(int src_width, // Test a scale factor with all 4 filters. Expect unfiltered to be exact, but // filtering is different fixed point implementations for SSSE3, Neon and C. -#define TEST_FACTOR(name, nom, denom) \ - TEST_FACTOR1(name, None, nom, denom, 0) \ - TEST_FACTOR1(name, Linear, nom, denom, 3) \ - TEST_FACTOR1(name, Bilinear, nom, denom, 3) \ - TEST_FACTOR1(name, Box, nom, denom, 3) +#ifdef ENABLE_SLOW_TESTS +#define TEST_FACTOR(name, nom, denom) \ + TEST_FACTOR1(, name, None, nom, denom, 0) \ + TEST_FACTOR1(, name, Linear, nom, denom, 3) \ + TEST_FACTOR1(, name, Bilinear, nom, denom, 3) \ + TEST_FACTOR1(, name, Box, nom, denom, 3) +#else +#define TEST_FACTOR(name, nom, denom) \ + TEST_FACTOR1(DISABLED_, name, None, nom, denom, 0) \ + TEST_FACTOR1(DISABLED_, name, Linear, nom, denom, 3) \ + TEST_FACTOR1(DISABLED_, name, Bilinear, nom, denom, 3) \ + TEST_FACTOR1(DISABLED_, name, Box, nom, denom, 3) +#endif TEST_FACTOR(2, 1, 2) TEST_FACTOR(4, 1, 4) @@ -268,7 +276,7 @@ TEST_FACTOR(3, 1, 3) #undef SX #undef DX -#define TEST_SCALETO1(name, width, height, filter, max_diff) \ +#define TEST_SCALETO1(DISABLED_, name, width, height, filter, max_diff) \ TEST_F(LibYUVScaleTest, name##To##width##x##height##_##filter) { \ int diff = ARGBTestFilter(benchmark_width_, benchmark_height_, width, \ height, kFilter##filter, benchmark_iterations_, \ @@ -282,13 +290,15 @@ TEST_FACTOR(3, 1, 3) benchmark_cpu_info_); \ EXPECT_LE(diff, max_diff); \ } \ - TEST_F(LibYUVScaleTest, name##ClipTo##width##x##height##_##filter) { \ + TEST_F(LibYUVScaleTest, \ + DISABLED_##name##ClipTo##width##x##height##_##filter) { \ int diff = \ ARGBClipTestFilter(benchmark_width_, benchmark_height_, width, height, \ kFilter##filter, benchmark_iterations_); \ EXPECT_LE(diff, max_diff); \ } \ - TEST_F(LibYUVScaleTest, name##ClipFrom##width##x##height##_##filter) { \ + TEST_F(LibYUVScaleTest, \ + DISABLED_##name##ClipFrom##width##x##height##_##filter) { \ int diff = ARGBClipTestFilter(width, height, Abs(benchmark_width_), \ Abs(benchmark_height_), kFilter##filter, \ benchmark_iterations_); \ @@ -296,12 +306,20 @@ TEST_FACTOR(3, 1, 3) } /// Test scale to a specified size with all 4 filters. -#define TEST_SCALETO(name, width, height) \ - TEST_SCALETO1(name, width, height, None, 0) \ - TEST_SCALETO1(name, width, height, Linear, 3) \ - TEST_SCALETO1(name, width, height, Bilinear, 3) +#ifdef ENABLE_SLOW_TESTS +#define TEST_SCALETO(name, width, height) \ + TEST_SCALETO1(, name, width, height, None, 0) \ + TEST_SCALETO1(, name, width, height, Linear, 3) \ + TEST_SCALETO1(, name, width, height, Bilinear, 3) +#else +#define TEST_SCALETO(name, width, height) \ + TEST_SCALETO1(DISABLED_, name, width, height, None, 0) \ + TEST_SCALETO1(DISABLED_, name, width, height, Linear, 3) \ + TEST_SCALETO1(DISABLED_, name, width, height, Bilinear, 3) +#endif TEST_SCALETO(ARGBScale, 1, 1) +TEST_SCALETO(ARGBScale, 256, 144) /* 128x72 * 2 */ TEST_SCALETO(ARGBScale, 320, 240) TEST_SCALETO(ARGBScale, 569, 480) TEST_SCALETO(ARGBScale, 640, 360) @@ -312,6 +330,21 @@ TEST_SCALETO(ARGBScale, 1920, 1080) #undef TEST_SCALETO1 #undef TEST_SCALETO +#define TEST_SCALESWAPXY1(name, filter, max_diff) \ + TEST_F(LibYUVScaleTest, name##SwapXY_##filter) { \ + int diff = ARGBTestFilter(benchmark_width_, benchmark_height_, \ + benchmark_height_, benchmark_width_, \ + kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } + +// Test scale with swapped width and height with all 3 filters. +TEST_SCALESWAPXY1(ARGBScale, None, 0) +TEST_SCALESWAPXY1(ARGBScale, Linear, 0) +TEST_SCALESWAPXY1(ARGBScale, Bilinear, 0) +#undef TEST_SCALESWAPXY1 + // Scale with YUV conversion to ARGB and clipping. // TODO(fbarchard): Add fourcc support. All 4 ARGB formats is easy to support. LIBYUV_API diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/scale_test.cc similarity index 73% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/scale_test.cc index d627af02d6..6da6b574d1 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/scale_test.cc @@ -142,6 +142,123 @@ static int I420TestFilter(int src_width, return max_diff; } +// Test scaling with 8 bit C vs 12 bit C and return maximum pixel difference. +// 0 = exact. +static int I420TestFilter_12(int src_width, + int src_height, + int dst_width, + int dst_height, + FilterMode f, + int benchmark_iterations, + int disable_cpu_flags, + int benchmark_cpu_info) { + if (!SizeValid(src_width, src_height, dst_width, dst_height)) { + return 0; + } + + int i; + int src_width_uv = (Abs(src_width) + 1) >> 1; + int src_height_uv = (Abs(src_height) + 1) >> 1; + + int64_t src_y_plane_size = (Abs(src_width)) * (Abs(src_height)); + int64_t src_uv_plane_size = (src_width_uv) * (src_height_uv); + + int src_stride_y = Abs(src_width); + int src_stride_uv = src_width_uv; + + align_buffer_page_end(src_y, src_y_plane_size); + align_buffer_page_end(src_u, src_uv_plane_size); + align_buffer_page_end(src_v, src_uv_plane_size); + align_buffer_page_end(src_y_12, src_y_plane_size * 2); + align_buffer_page_end(src_u_12, src_uv_plane_size * 2); + align_buffer_page_end(src_v_12, src_uv_plane_size * 2); + if (!src_y || !src_u || !src_v || !src_y_12 || !src_u_12 || !src_v_12) { + printf("Skipped. Alloc failed " FILELINESTR(__FILE__, __LINE__) "\n"); + return 0; + } + uint16_t* p_src_y_12 = reinterpret_cast(src_y_12); + uint16_t* p_src_u_12 = reinterpret_cast(src_u_12); + uint16_t* p_src_v_12 = reinterpret_cast(src_v_12); + + MemRandomize(src_y, src_y_plane_size); + MemRandomize(src_u, src_uv_plane_size); + MemRandomize(src_v, src_uv_plane_size); + + for (i = 0; i < src_y_plane_size; ++i) { + p_src_y_12[i] = src_y[i]; + } + for (i = 0; i < src_uv_plane_size; ++i) { + p_src_u_12[i] = src_u[i]; + p_src_v_12[i] = src_v[i]; + } + + int dst_width_uv = (dst_width + 1) >> 1; + int dst_height_uv = (dst_height + 1) >> 1; + + int dst_y_plane_size = (dst_width) * (dst_height); + int dst_uv_plane_size = (dst_width_uv) * (dst_height_uv); + + int dst_stride_y = dst_width; + int dst_stride_uv = dst_width_uv; + + align_buffer_page_end(dst_y_8, dst_y_plane_size); + align_buffer_page_end(dst_u_8, dst_uv_plane_size); + align_buffer_page_end(dst_v_8, dst_uv_plane_size); + align_buffer_page_end(dst_y_12, dst_y_plane_size * 2); + align_buffer_page_end(dst_u_12, dst_uv_plane_size * 2); + align_buffer_page_end(dst_v_12, dst_uv_plane_size * 2); + + uint16_t* p_dst_y_12 = reinterpret_cast(dst_y_12); + uint16_t* p_dst_u_12 = reinterpret_cast(dst_u_12); + uint16_t* p_dst_v_12 = reinterpret_cast(dst_v_12); + + MaskCpuFlags(disable_cpu_flags); // Disable all CPU optimization. + I420Scale(src_y, src_stride_y, src_u, src_stride_uv, src_v, src_stride_uv, + src_width, src_height, dst_y_8, dst_stride_y, dst_u_8, + dst_stride_uv, dst_v_8, dst_stride_uv, dst_width, dst_height, f); + MaskCpuFlags(benchmark_cpu_info); // Enable all CPU optimization. + for (i = 0; i < benchmark_iterations; ++i) { + I420Scale_12(p_src_y_12, src_stride_y, p_src_u_12, src_stride_uv, + p_src_v_12, src_stride_uv, src_width, src_height, p_dst_y_12, + dst_stride_y, p_dst_u_12, dst_stride_uv, p_dst_v_12, + dst_stride_uv, dst_width, dst_height, f); + } + + // Expect an exact match. + int max_diff = 0; + for (i = 0; i < dst_y_plane_size; ++i) { + int abs_diff = Abs(dst_y_8[i] - p_dst_y_12[i]); + if (abs_diff > max_diff) { + max_diff = abs_diff; + } + } + for (i = 0; i < dst_uv_plane_size; ++i) { + int abs_diff = Abs(dst_u_8[i] - p_dst_u_12[i]); + if (abs_diff > max_diff) { + max_diff = abs_diff; + } + abs_diff = Abs(dst_v_8[i] - p_dst_v_12[i]); + if (abs_diff > max_diff) { + max_diff = abs_diff; + } + } + + free_aligned_buffer_page_end(dst_y_8); + free_aligned_buffer_page_end(dst_u_8); + free_aligned_buffer_page_end(dst_v_8); + free_aligned_buffer_page_end(dst_y_12); + free_aligned_buffer_page_end(dst_u_12); + free_aligned_buffer_page_end(dst_v_12); + free_aligned_buffer_page_end(src_y); + free_aligned_buffer_page_end(src_u); + free_aligned_buffer_page_end(src_v); + free_aligned_buffer_page_end(src_y_12); + free_aligned_buffer_page_end(src_u_12); + free_aligned_buffer_page_end(src_v_12); + + return max_diff; +} + // Test scaling with 8 bit C vs 16 bit C and return maximum pixel difference. // 0 = exact. static int I420TestFilter_16(int src_width, @@ -377,6 +494,123 @@ static int I444TestFilter(int src_width, return max_diff; } +// Test scaling with 8 bit C vs 12 bit C and return maximum pixel difference. +// 0 = exact. +static int I444TestFilter_12(int src_width, + int src_height, + int dst_width, + int dst_height, + FilterMode f, + int benchmark_iterations, + int disable_cpu_flags, + int benchmark_cpu_info) { + if (!SizeValid(src_width, src_height, dst_width, dst_height)) { + return 0; + } + + int i; + int src_width_uv = Abs(src_width); + int src_height_uv = Abs(src_height); + + int64_t src_y_plane_size = (Abs(src_width)) * (Abs(src_height)); + int64_t src_uv_plane_size = (src_width_uv) * (src_height_uv); + + int src_stride_y = Abs(src_width); + int src_stride_uv = src_width_uv; + + align_buffer_page_end(src_y, src_y_plane_size); + align_buffer_page_end(src_u, src_uv_plane_size); + align_buffer_page_end(src_v, src_uv_plane_size); + align_buffer_page_end(src_y_12, src_y_plane_size * 2); + align_buffer_page_end(src_u_12, src_uv_plane_size * 2); + align_buffer_page_end(src_v_12, src_uv_plane_size * 2); + if (!src_y || !src_u || !src_v || !src_y_12 || !src_u_12 || !src_v_12) { + printf("Skipped. Alloc failed " FILELINESTR(__FILE__, __LINE__) "\n"); + return 0; + } + uint16_t* p_src_y_12 = reinterpret_cast(src_y_12); + uint16_t* p_src_u_12 = reinterpret_cast(src_u_12); + uint16_t* p_src_v_12 = reinterpret_cast(src_v_12); + + MemRandomize(src_y, src_y_plane_size); + MemRandomize(src_u, src_uv_plane_size); + MemRandomize(src_v, src_uv_plane_size); + + for (i = 0; i < src_y_plane_size; ++i) { + p_src_y_12[i] = src_y[i]; + } + for (i = 0; i < src_uv_plane_size; ++i) { + p_src_u_12[i] = src_u[i]; + p_src_v_12[i] = src_v[i]; + } + + int dst_width_uv = dst_width; + int dst_height_uv = dst_height; + + int dst_y_plane_size = (dst_width) * (dst_height); + int dst_uv_plane_size = (dst_width_uv) * (dst_height_uv); + + int dst_stride_y = dst_width; + int dst_stride_uv = dst_width_uv; + + align_buffer_page_end(dst_y_8, dst_y_plane_size); + align_buffer_page_end(dst_u_8, dst_uv_plane_size); + align_buffer_page_end(dst_v_8, dst_uv_plane_size); + align_buffer_page_end(dst_y_12, dst_y_plane_size * 2); + align_buffer_page_end(dst_u_12, dst_uv_plane_size * 2); + align_buffer_page_end(dst_v_12, dst_uv_plane_size * 2); + + uint16_t* p_dst_y_12 = reinterpret_cast(dst_y_12); + uint16_t* p_dst_u_12 = reinterpret_cast(dst_u_12); + uint16_t* p_dst_v_12 = reinterpret_cast(dst_v_12); + + MaskCpuFlags(disable_cpu_flags); // Disable all CPU optimization. + I444Scale(src_y, src_stride_y, src_u, src_stride_uv, src_v, src_stride_uv, + src_width, src_height, dst_y_8, dst_stride_y, dst_u_8, + dst_stride_uv, dst_v_8, dst_stride_uv, dst_width, dst_height, f); + MaskCpuFlags(benchmark_cpu_info); // Enable all CPU optimization. + for (i = 0; i < benchmark_iterations; ++i) { + I444Scale_12(p_src_y_12, src_stride_y, p_src_u_12, src_stride_uv, + p_src_v_12, src_stride_uv, src_width, src_height, p_dst_y_12, + dst_stride_y, p_dst_u_12, dst_stride_uv, p_dst_v_12, + dst_stride_uv, dst_width, dst_height, f); + } + + // Expect an exact match. + int max_diff = 0; + for (i = 0; i < dst_y_plane_size; ++i) { + int abs_diff = Abs(dst_y_8[i] - p_dst_y_12[i]); + if (abs_diff > max_diff) { + max_diff = abs_diff; + } + } + for (i = 0; i < dst_uv_plane_size; ++i) { + int abs_diff = Abs(dst_u_8[i] - p_dst_u_12[i]); + if (abs_diff > max_diff) { + max_diff = abs_diff; + } + abs_diff = Abs(dst_v_8[i] - p_dst_v_12[i]); + if (abs_diff > max_diff) { + max_diff = abs_diff; + } + } + + free_aligned_buffer_page_end(dst_y_8); + free_aligned_buffer_page_end(dst_u_8); + free_aligned_buffer_page_end(dst_v_8); + free_aligned_buffer_page_end(dst_y_12); + free_aligned_buffer_page_end(dst_u_12); + free_aligned_buffer_page_end(dst_v_12); + free_aligned_buffer_page_end(src_y); + free_aligned_buffer_page_end(src_u); + free_aligned_buffer_page_end(src_v); + free_aligned_buffer_page_end(src_y_12); + free_aligned_buffer_page_end(src_u_12); + free_aligned_buffer_page_end(src_v_12); + + return max_diff; +} + // Test scaling with 8 bit C vs 16 bit C and return maximum pixel difference. // 0 = exact. static int I444TestFilter_16(int src_width, @@ -621,16 +855,16 @@ static int NV12TestFilter(int src_width, benchmark_cpu_info_); \ EXPECT_LE(diff, max_diff); \ } \ - TEST_F(LibYUVScaleTest, DISABLED_##I420ScaleDownBy##name##_##filter##_16) { \ - int diff = I420TestFilter_16( \ + TEST_F(LibYUVScaleTest, DISABLED_##I420ScaleDownBy##name##_##filter##_12) { \ + int diff = I420TestFilter_12( \ SX(benchmark_width_, nom, denom), SX(benchmark_height_, nom, denom), \ DX(benchmark_width_, nom, denom), DX(benchmark_height_, nom, denom), \ kFilter##filter, benchmark_iterations_, disable_cpu_flags_, \ benchmark_cpu_info_); \ EXPECT_LE(diff, max_diff); \ } \ - TEST_F(LibYUVScaleTest, DISABLED_##I444ScaleDownBy##name##_##filter##_16) { \ - int diff = I444TestFilter_16( \ + TEST_F(LibYUVScaleTest, DISABLED_##I444ScaleDownBy##name##_##filter##_12) { \ + int diff = I444TestFilter_12( \ SX(benchmark_width_, nom, denom), SX(benchmark_height_, nom, denom), \ DX(benchmark_width_, nom, denom), DX(benchmark_height_, nom, denom), \ kFilter##filter, benchmark_iterations_, disable_cpu_flags_, \ @@ -686,6 +920,20 @@ TEST_FACTOR(3, 1, 3, 0) disable_cpu_flags_, benchmark_cpu_info_); \ EXPECT_LE(diff, max_diff); \ } \ + TEST_F(LibYUVScaleTest, \ + DISABLED_##I420##name##To##width##x##height##_##filter##_12) { \ + int diff = I420TestFilter_12( \ + benchmark_width_, benchmark_height_, width, height, kFilter##filter, \ + benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ + TEST_F(LibYUVScaleTest, \ + DISABLED_##I444##name##To##width##x##height##_##filter##_12) { \ + int diff = I444TestFilter_12( \ + benchmark_width_, benchmark_height_, width, height, kFilter##filter, \ + benchmark_iterations_, disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ TEST_F(LibYUVScaleTest, \ DISABLED_##I420##name##To##width##x##height##_##filter##_16) { \ int diff = I420TestFilter_16( \ @@ -720,6 +968,22 @@ TEST_FACTOR(3, 1, 3, 0) benchmark_cpu_info_); \ EXPECT_LE(diff, max_diff); \ } \ + TEST_F(LibYUVScaleTest, \ + DISABLED_##I420##name##From##width##x##height##_##filter##_12) { \ + int diff = I420TestFilter_12(width, height, Abs(benchmark_width_), \ + Abs(benchmark_height_), kFilter##filter, \ + benchmark_iterations_, disable_cpu_flags_, \ + benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ + TEST_F(LibYUVScaleTest, \ + DISABLED_##I444##name##From##width##x##height##_##filter##_12) { \ + int diff = I444TestFilter_12(width, height, Abs(benchmark_width_), \ + Abs(benchmark_height_), kFilter##filter, \ + benchmark_iterations_, disable_cpu_flags_, \ + benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ TEST_F(LibYUVScaleTest, \ DISABLED_##I420##name##From##width##x##height##_##filter##_16) { \ int diff = I420TestFilter_16(width, height, Abs(benchmark_width_), \ @@ -761,6 +1025,7 @@ TEST_FACTOR(3, 1, 3, 0) #endif TEST_SCALETO(Scale, 1, 1) +TEST_SCALETO(Scale, 256, 144) /* 128x72 * 2 */ TEST_SCALETO(Scale, 320, 240) TEST_SCALETO(Scale, 569, 480) TEST_SCALETO(Scale, 640, 360) @@ -771,6 +1036,72 @@ TEST_SCALETO(Scale, 1920, 1080) #undef TEST_SCALETO1 #undef TEST_SCALETO +#define TEST_SCALESWAPXY1(DISABLED_, name, filter, max_diff) \ + TEST_F(LibYUVScaleTest, I420##name##SwapXY_##filter) { \ + int diff = I420TestFilter(benchmark_width_, benchmark_height_, \ + benchmark_height_, benchmark_width_, \ + kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ + TEST_F(LibYUVScaleTest, I444##name##SwapXY_##filter) { \ + int diff = I444TestFilter(benchmark_width_, benchmark_height_, \ + benchmark_height_, benchmark_width_, \ + kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ + TEST_F(LibYUVScaleTest, DISABLED_##I420##name##SwapXY_##filter##_12) { \ + int diff = I420TestFilter_12(benchmark_width_, benchmark_height_, \ + benchmark_height_, benchmark_width_, \ + kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ + TEST_F(LibYUVScaleTest, DISABLED_##I444##name##SwapXY_##filter##_12) { \ + int diff = I444TestFilter_12(benchmark_width_, benchmark_height_, \ + benchmark_height_, benchmark_width_, \ + kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ + TEST_F(LibYUVScaleTest, DISABLED_##I420##name##SwapXY_##filter##_16) { \ + int diff = I420TestFilter_16(benchmark_width_, benchmark_height_, \ + benchmark_height_, benchmark_width_, \ + kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ + TEST_F(LibYUVScaleTest, DISABLED_##I444##name##SwapXY_##filter##_16) { \ + int diff = I444TestFilter_16(benchmark_width_, benchmark_height_, \ + benchmark_height_, benchmark_width_, \ + kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } \ + TEST_F(LibYUVScaleTest, NV12##name##SwapXY_##filter) { \ + int diff = NV12TestFilter(benchmark_width_, benchmark_height_, \ + benchmark_height_, benchmark_width_, \ + kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } + +// Test scale to a specified size with all 4 filters. +#ifdef ENABLE_SLOW_TESTS +TEST_SCALESWAPXY1(, Scale, None, 0) +TEST_SCALESWAPXY1(, Scale, Linear, 3) +TEST_SCALESWAPXY1(, Scale, Bilinear, 3) +TEST_SCALESWAPXY1(, Scale, Box, 3) +#else +TEST_SCALESWAPXY1(DISABLED_, Scale, None, 0) +TEST_SCALESWAPXY1(DISABLED_, Scale, Linear, 3) +TEST_SCALESWAPXY1(DISABLED_, Scale, Bilinear, 3) +TEST_SCALESWAPXY1(DISABLED_, Scale, Box, 3) +#endif + +#undef TEST_SCALESWAPXY1 + #ifdef ENABLE_ROW_TESTS #ifdef HAS_SCALEROWDOWN2_SSSE3 TEST_F(LibYUVScaleTest, TestScaleRowDown2Box_Odd_SSSE3) { @@ -955,7 +1286,7 @@ TEST_F(LibYUVScaleTest, TestScaleRowDown2Box_16) { } #endif // ENABLE_ROW_TESTS -// Test scaling plane with 8 bit C vs 16 bit C and return maximum pixel +// Test scaling plane with 8 bit C vs 12 bit C and return maximum pixel // difference. // 0 = exact. static int TestPlaneFilter_16(int src_width, @@ -1119,22 +1450,16 @@ TEST_F(LibYUVScaleTest, PlaneTestRotate_None) { align_buffer_page_end(dest_opt_pixels, kSize); align_buffer_page_end(dest_c_pixels, kSize); - MaskCpuFlags(disable_cpu_flags_); // Disable all CPU optimization. - ScalePlane(orig_pixels, benchmark_width_, - benchmark_width_, benchmark_height_, - dest_c_pixels, benchmark_height_, - benchmark_height_, benchmark_width_, - kFilterNone); + ScalePlane(orig_pixels, benchmark_width_, benchmark_width_, benchmark_height_, + dest_c_pixels, benchmark_height_, benchmark_height_, + benchmark_width_, kFilterNone); MaskCpuFlags(benchmark_cpu_info_); // Enable all CPU optimization. - for (int i = 0; i < benchmark_iterations_; ++i) { - ScalePlane(orig_pixels, benchmark_width_, - benchmark_width_, benchmark_height_, - dest_opt_pixels, benchmark_height_, - benchmark_height_, benchmark_width_, - kFilterNone); + ScalePlane(orig_pixels, benchmark_width_, benchmark_width_, + benchmark_height_, dest_opt_pixels, benchmark_height_, + benchmark_height_, benchmark_width_, kFilterNone); } for (int i = 0; i < kSize; ++i) { @@ -1155,22 +1480,16 @@ TEST_F(LibYUVScaleTest, PlaneTestRotate_Bilinear) { align_buffer_page_end(dest_opt_pixels, kSize); align_buffer_page_end(dest_c_pixels, kSize); - MaskCpuFlags(disable_cpu_flags_); // Disable all CPU optimization. - ScalePlane(orig_pixels, benchmark_width_, - benchmark_width_, benchmark_height_, - dest_c_pixels, benchmark_height_, - benchmark_height_, benchmark_width_, - kFilterBilinear); + ScalePlane(orig_pixels, benchmark_width_, benchmark_width_, benchmark_height_, + dest_c_pixels, benchmark_height_, benchmark_height_, + benchmark_width_, kFilterBilinear); MaskCpuFlags(benchmark_cpu_info_); // Enable all CPU optimization. - for (int i = 0; i < benchmark_iterations_; ++i) { - ScalePlane(orig_pixels, benchmark_width_, - benchmark_width_, benchmark_height_, - dest_opt_pixels, benchmark_height_, - benchmark_height_, benchmark_width_, - kFilterBilinear); + ScalePlane(orig_pixels, benchmark_width_, benchmark_width_, + benchmark_height_, dest_opt_pixels, benchmark_height_, + benchmark_height_, benchmark_width_, kFilterBilinear); } for (int i = 0; i < kSize; ++i) { @@ -1192,22 +1511,16 @@ TEST_F(LibYUVScaleTest, PlaneTestRotate_Box) { align_buffer_page_end(dest_opt_pixels, kSize); align_buffer_page_end(dest_c_pixels, kSize); - MaskCpuFlags(disable_cpu_flags_); // Disable all CPU optimization. - ScalePlane(orig_pixels, benchmark_width_, - benchmark_width_, benchmark_height_, - dest_c_pixels, benchmark_height_, - benchmark_height_, benchmark_width_, - kFilterBox); + ScalePlane(orig_pixels, benchmark_width_, benchmark_width_, benchmark_height_, + dest_c_pixels, benchmark_height_, benchmark_height_, + benchmark_width_, kFilterBox); MaskCpuFlags(benchmark_cpu_info_); // Enable all CPU optimization. - for (int i = 0; i < benchmark_iterations_; ++i) { - ScalePlane(orig_pixels, benchmark_width_, - benchmark_width_, benchmark_height_, - dest_opt_pixels, benchmark_height_, - benchmark_height_, benchmark_width_, - kFilterBox); + ScalePlane(orig_pixels, benchmark_width_, benchmark_width_, + benchmark_height_, dest_opt_pixels, benchmark_height_, + benchmark_height_, benchmark_width_, kFilterBox); } for (int i = 0; i < kSize; ++i) { diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_uv_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/scale_uv_test.cc similarity index 91% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_uv_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/scale_uv_test.cc index b62bf3ad77..6e4649f84d 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/scale_uv_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/scale_uv_test.cc @@ -166,6 +166,7 @@ TEST_FACTOR(3, 1, 3) TEST_SCALETO1(name, width, height, Bilinear, 3) TEST_SCALETO(UVScale, 1, 1) +TEST_SCALETO(UVScale, 256, 144) /* 128x72 * 2 */ TEST_SCALETO(UVScale, 320, 240) TEST_SCALETO(UVScale, 569, 480) TEST_SCALETO(UVScale, 640, 360) @@ -176,6 +177,21 @@ TEST_SCALETO(UVScale, 1920, 1080) #undef TEST_SCALETO1 #undef TEST_SCALETO +#define TEST_SCALESWAPXY1(name, filter, max_diff) \ + TEST_F(LibYUVScaleTest, name##SwapXY_##filter) { \ + int diff = \ + UVTestFilter(benchmark_width_, benchmark_height_, benchmark_height_, \ + benchmark_width_, kFilter##filter, benchmark_iterations_, \ + disable_cpu_flags_, benchmark_cpu_info_); \ + EXPECT_LE(diff, max_diff); \ + } + +// Test scale with swapped width and height with all 3 filters. +TEST_SCALESWAPXY1(UVScale, None, 0) +TEST_SCALESWAPXY1(UVScale, Linear, 0) +TEST_SCALESWAPXY1(UVScale, Bilinear, 0) +#undef TEST_SCALESWAPXY1 + TEST_F(LibYUVScaleTest, UVTest3x) { const int kSrcStride = 48 * 2; const int kDstStride = 16 * 2; diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/arm_v7.txt b/third-party/libyuv/third_party/libyuv/unit_test/testdata/arm_v7.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/arm_v7.txt rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/arm_v7.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/juno.txt b/third-party/libyuv/third_party/libyuv/unit_test/testdata/juno.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/juno.txt rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/juno.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips.txt b/third-party/libyuv/third_party/libyuv/unit_test/testdata/mips.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips.txt rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/mips.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips_loongson2k.txt b/third-party/libyuv/third_party/libyuv/unit_test/testdata/mips_loongson2k.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips_loongson2k.txt rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/mips_loongson2k.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips_loongson3.txt b/third-party/libyuv/third_party/libyuv/unit_test/testdata/mips_loongson3.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips_loongson3.txt rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/mips_loongson3.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips_loongson_mmi.txt b/third-party/libyuv/third_party/libyuv/unit_test/testdata/mips_loongson_mmi.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips_loongson_mmi.txt rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/mips_loongson_mmi.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips_msa.txt b/third-party/libyuv/third_party/libyuv/unit_test/testdata/mips_msa.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/mips_msa.txt rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/mips_msa.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/tegra3.txt b/third-party/libyuv/third_party/libyuv/unit_test/testdata/tegra3.txt similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/tegra3.txt rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/tegra3.txt diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test0.jpg b/third-party/libyuv/third_party/libyuv/unit_test/testdata/test0.jpg similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test0.jpg rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/test0.jpg diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test1.jpg b/third-party/libyuv/third_party/libyuv/unit_test/testdata/test1.jpg similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test1.jpg rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/test1.jpg diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test2.jpg b/third-party/libyuv/third_party/libyuv/unit_test/testdata/test2.jpg similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test2.jpg rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/test2.jpg diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test3.jpg b/third-party/libyuv/third_party/libyuv/unit_test/testdata/test3.jpg similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test3.jpg rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/test3.jpg diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test4.jpg b/third-party/libyuv/third_party/libyuv/unit_test/testdata/test4.jpg similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/testdata/test4.jpg rename to third-party/libyuv/third_party/libyuv/unit_test/testdata/test4.jpg diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/unit_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/unit_test.cc similarity index 74% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/unit_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/unit_test.cc index 2aa9cdaad6..e6dbc3eed6 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/unit_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/unit_test.cc @@ -14,26 +14,28 @@ #include -#ifdef LIBYUV_USE_GFLAGS -#include "gflags/gflags.h" -#endif -#ifdef LIBYUV_USE_BASE_FLAGS -#include "base/commandlineflags.h" +#ifdef LIBYUV_USE_ABSL_FLAGS +#include "absl/flags/flag.h" +#include "absl/flags/parse.h" #endif #include "libyuv/cpu_id.h" unsigned int fastrand_seed = 0xfb; -#ifdef LIBYUV_USE_GFLAGS -DEFINE_int32(libyuv_width, 0, "width of test image."); -DEFINE_int32(libyuv_height, 0, "height of test image."); -DEFINE_int32(libyuv_repeat, 0, "number of times to repeat test."); -DEFINE_int32(libyuv_flags, 0, "cpu flags for reference code. 1 = C, -1 = SIMD"); -DEFINE_int32(libyuv_cpu_info, - 0, - "cpu flags for benchmark code. 1 = C, -1 = SIMD"); +#ifdef LIBYUV_USE_ABSL_FLAGS +ABSL_FLAG(int32_t, libyuv_width, 0, "width of test image."); +ABSL_FLAG(int32_t, libyuv_height, 0, "height of test image."); +ABSL_FLAG(int32_t, libyuv_repeat, 0, "number of times to repeat test."); +ABSL_FLAG(int32_t, + libyuv_flags, + 0, + "cpu flags for reference code. 1 = C, -1 = SIMD"); +ABSL_FLAG(int32_t, + libyuv_cpu_info, + 0, + "cpu flags for benchmark code. 1 = C, -1 = SIMD"); #else -// Disable command line parameters if gflags disabled. +// Disable command line parameters if absl/flags disabled. static const int32_t FLAGS_libyuv_width = 0; static const int32_t FLAGS_libyuv_height = 0; static const int32_t FLAGS_libyuv_repeat = 0; @@ -41,6 +43,12 @@ static const int32_t FLAGS_libyuv_flags = 0; static const int32_t FLAGS_libyuv_cpu_info = 0; #endif +#ifdef LIBYUV_USE_ABSL_FLAGS +#define LIBYUV_GET_FLAG(f) absl::GetFlag(f) +#else +#define LIBYUV_GET_FLAG(f) f +#endif + // Test environment variable for disabling CPU features. Any non-zero value // to disable. Zero ignored to make it easy to set the variable on/off. #if !defined(__native_client__) && !defined(_M_ARM) @@ -148,8 +156,8 @@ LibYUVConvertTest::LibYUVConvertTest() if (repeat) { benchmark_iterations_ = atoi(repeat); // NOLINT } - if (FLAGS_libyuv_repeat) { - benchmark_iterations_ = FLAGS_libyuv_repeat; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) { + benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat); } if (benchmark_iterations_ > 1) { benchmark_width_ = 1280; @@ -159,29 +167,29 @@ LibYUVConvertTest::LibYUVConvertTest() if (width) { benchmark_width_ = atoi(width); // NOLINT } - if (FLAGS_libyuv_width) { - benchmark_width_ = FLAGS_libyuv_width; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) { + benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width); } const char* height = getenv("LIBYUV_HEIGHT"); if (height) { benchmark_height_ = atoi(height); // NOLINT } - if (FLAGS_libyuv_height) { - benchmark_height_ = FLAGS_libyuv_height; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) { + benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height); } const char* cpu_flags = getenv("LIBYUV_FLAGS"); if (cpu_flags) { disable_cpu_flags_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_flags) { - disable_cpu_flags_ = FLAGS_libyuv_flags; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) { + disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags); } const char* cpu_info = getenv("LIBYUV_CPU_INFO"); if (cpu_info) { benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_cpu_info) { - benchmark_cpu_info_ = FLAGS_libyuv_cpu_info; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) { + benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info); } disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_); benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_); @@ -204,8 +212,8 @@ LibYUVColorTest::LibYUVColorTest() if (repeat) { benchmark_iterations_ = atoi(repeat); // NOLINT } - if (FLAGS_libyuv_repeat) { - benchmark_iterations_ = FLAGS_libyuv_repeat; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) { + benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat); } if (benchmark_iterations_ > 1) { benchmark_width_ = 1280; @@ -215,29 +223,29 @@ LibYUVColorTest::LibYUVColorTest() if (width) { benchmark_width_ = atoi(width); // NOLINT } - if (FLAGS_libyuv_width) { - benchmark_width_ = FLAGS_libyuv_width; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) { + benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width); } const char* height = getenv("LIBYUV_HEIGHT"); if (height) { benchmark_height_ = atoi(height); // NOLINT } - if (FLAGS_libyuv_height) { - benchmark_height_ = FLAGS_libyuv_height; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) { + benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height); } const char* cpu_flags = getenv("LIBYUV_FLAGS"); if (cpu_flags) { disable_cpu_flags_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_flags) { - disable_cpu_flags_ = FLAGS_libyuv_flags; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) { + disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags); } const char* cpu_info = getenv("LIBYUV_CPU_INFO"); if (cpu_info) { benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_cpu_info) { - benchmark_cpu_info_ = FLAGS_libyuv_cpu_info; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) { + benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info); } disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_); benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_); @@ -260,8 +268,8 @@ LibYUVScaleTest::LibYUVScaleTest() if (repeat) { benchmark_iterations_ = atoi(repeat); // NOLINT } - if (FLAGS_libyuv_repeat) { - benchmark_iterations_ = FLAGS_libyuv_repeat; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) { + benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat); } if (benchmark_iterations_ > 1) { benchmark_width_ = 1280; @@ -271,29 +279,29 @@ LibYUVScaleTest::LibYUVScaleTest() if (width) { benchmark_width_ = atoi(width); // NOLINT } - if (FLAGS_libyuv_width) { - benchmark_width_ = FLAGS_libyuv_width; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) { + benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width); } const char* height = getenv("LIBYUV_HEIGHT"); if (height) { benchmark_height_ = atoi(height); // NOLINT } - if (FLAGS_libyuv_height) { - benchmark_height_ = FLAGS_libyuv_height; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) { + benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height); } const char* cpu_flags = getenv("LIBYUV_FLAGS"); if (cpu_flags) { disable_cpu_flags_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_flags) { - disable_cpu_flags_ = FLAGS_libyuv_flags; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) { + disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags); } const char* cpu_info = getenv("LIBYUV_CPU_INFO"); if (cpu_info) { benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_cpu_info) { - benchmark_cpu_info_ = FLAGS_libyuv_cpu_info; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) { + benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info); } disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_); benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_); @@ -316,8 +324,8 @@ LibYUVRotateTest::LibYUVRotateTest() if (repeat) { benchmark_iterations_ = atoi(repeat); // NOLINT } - if (FLAGS_libyuv_repeat) { - benchmark_iterations_ = FLAGS_libyuv_repeat; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) { + benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat); } if (benchmark_iterations_ > 1) { benchmark_width_ = 1280; @@ -327,29 +335,29 @@ LibYUVRotateTest::LibYUVRotateTest() if (width) { benchmark_width_ = atoi(width); // NOLINT } - if (FLAGS_libyuv_width) { - benchmark_width_ = FLAGS_libyuv_width; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) { + benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width); } const char* height = getenv("LIBYUV_HEIGHT"); if (height) { benchmark_height_ = atoi(height); // NOLINT } - if (FLAGS_libyuv_height) { - benchmark_height_ = FLAGS_libyuv_height; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) { + benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height); } const char* cpu_flags = getenv("LIBYUV_FLAGS"); if (cpu_flags) { disable_cpu_flags_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_flags) { - disable_cpu_flags_ = FLAGS_libyuv_flags; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) { + disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags); } const char* cpu_info = getenv("LIBYUV_CPU_INFO"); if (cpu_info) { benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_cpu_info) { - benchmark_cpu_info_ = FLAGS_libyuv_cpu_info; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) { + benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info); } disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_); benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_); @@ -372,8 +380,8 @@ LibYUVPlanarTest::LibYUVPlanarTest() if (repeat) { benchmark_iterations_ = atoi(repeat); // NOLINT } - if (FLAGS_libyuv_repeat) { - benchmark_iterations_ = FLAGS_libyuv_repeat; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) { + benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat); } if (benchmark_iterations_ > 1) { benchmark_width_ = 1280; @@ -383,29 +391,29 @@ LibYUVPlanarTest::LibYUVPlanarTest() if (width) { benchmark_width_ = atoi(width); // NOLINT } - if (FLAGS_libyuv_width) { - benchmark_width_ = FLAGS_libyuv_width; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) { + benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width); } const char* height = getenv("LIBYUV_HEIGHT"); if (height) { benchmark_height_ = atoi(height); // NOLINT } - if (FLAGS_libyuv_height) { - benchmark_height_ = FLAGS_libyuv_height; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) { + benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height); } const char* cpu_flags = getenv("LIBYUV_FLAGS"); if (cpu_flags) { disable_cpu_flags_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_flags) { - disable_cpu_flags_ = FLAGS_libyuv_flags; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) { + disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags); } const char* cpu_info = getenv("LIBYUV_CPU_INFO"); if (cpu_info) { benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_cpu_info) { - benchmark_cpu_info_ = FLAGS_libyuv_cpu_info; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) { + benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info); } disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_); benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_); @@ -428,8 +436,8 @@ LibYUVBaseTest::LibYUVBaseTest() if (repeat) { benchmark_iterations_ = atoi(repeat); // NOLINT } - if (FLAGS_libyuv_repeat) { - benchmark_iterations_ = FLAGS_libyuv_repeat; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) { + benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat); } if (benchmark_iterations_ > 1) { benchmark_width_ = 1280; @@ -439,29 +447,29 @@ LibYUVBaseTest::LibYUVBaseTest() if (width) { benchmark_width_ = atoi(width); // NOLINT } - if (FLAGS_libyuv_width) { - benchmark_width_ = FLAGS_libyuv_width; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) { + benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width); } const char* height = getenv("LIBYUV_HEIGHT"); if (height) { benchmark_height_ = atoi(height); // NOLINT } - if (FLAGS_libyuv_height) { - benchmark_height_ = FLAGS_libyuv_height; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) { + benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height); } const char* cpu_flags = getenv("LIBYUV_FLAGS"); if (cpu_flags) { disable_cpu_flags_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_flags) { - disable_cpu_flags_ = FLAGS_libyuv_flags; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) { + disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags); } const char* cpu_info = getenv("LIBYUV_CPU_INFO"); if (cpu_info) { benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_cpu_info) { - benchmark_cpu_info_ = FLAGS_libyuv_cpu_info; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) { + benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info); } disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_); benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_); @@ -484,8 +492,8 @@ LibYUVCompareTest::LibYUVCompareTest() if (repeat) { benchmark_iterations_ = atoi(repeat); // NOLINT } - if (FLAGS_libyuv_repeat) { - benchmark_iterations_ = FLAGS_libyuv_repeat; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_repeat)) { + benchmark_iterations_ = LIBYUV_GET_FLAG(FLAGS_libyuv_repeat); } if (benchmark_iterations_ > 1) { benchmark_width_ = 1280; @@ -495,29 +503,29 @@ LibYUVCompareTest::LibYUVCompareTest() if (width) { benchmark_width_ = atoi(width); // NOLINT } - if (FLAGS_libyuv_width) { - benchmark_width_ = FLAGS_libyuv_width; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_width)) { + benchmark_width_ = LIBYUV_GET_FLAG(FLAGS_libyuv_width); } const char* height = getenv("LIBYUV_HEIGHT"); if (height) { benchmark_height_ = atoi(height); // NOLINT } - if (FLAGS_libyuv_height) { - benchmark_height_ = FLAGS_libyuv_height; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_height)) { + benchmark_height_ = LIBYUV_GET_FLAG(FLAGS_libyuv_height); } const char* cpu_flags = getenv("LIBYUV_FLAGS"); if (cpu_flags) { disable_cpu_flags_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_flags) { - disable_cpu_flags_ = FLAGS_libyuv_flags; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_flags)) { + disable_cpu_flags_ = LIBYUV_GET_FLAG(FLAGS_libyuv_flags); } const char* cpu_info = getenv("LIBYUV_CPU_INFO"); if (cpu_info) { benchmark_cpu_info_ = atoi(cpu_flags); // NOLINT } - if (FLAGS_libyuv_cpu_info) { - benchmark_cpu_info_ = FLAGS_libyuv_cpu_info; + if (LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info)) { + benchmark_cpu_info_ = LIBYUV_GET_FLAG(FLAGS_libyuv_cpu_info); } disable_cpu_flags_ = TestCpuEnv(disable_cpu_flags_); benchmark_cpu_info_ = TestCpuEnv(benchmark_cpu_info_); @@ -532,11 +540,8 @@ LibYUVCompareTest::LibYUVCompareTest() int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); -#ifdef LIBYUV_USE_GFLAGS - // AllowCommandLineParsing allows us to ignore flags passed on to us by - // Chromium build bots without having to explicitly disable them. - google::AllowCommandLineReparsing(); - google::ParseCommandLineFlags(&argc, &argv, true); +#ifdef LIBYUV_USE_ABSL_FLAGS + absl::ParseCommandLine(argc, argv); #endif return RUN_ALL_TESTS(); } diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/unit_test.h b/third-party/libyuv/third_party/libyuv/unit_test/unit_test.h similarity index 99% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/unit_test.h rename to third-party/libyuv/third_party/libyuv/unit_test/unit_test.h index 87907fa160..580832addc 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/unit_test.h +++ b/third-party/libyuv/third_party/libyuv/unit_test/unit_test.h @@ -11,7 +11,7 @@ #ifndef UNIT_TEST_UNIT_TEST_H_ // NOLINT #define UNIT_TEST_UNIT_TEST_H_ -#ifdef WIN32 +#ifdef _WIN32 #include #else #include diff --git a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/video_common_test.cc b/third-party/libyuv/third_party/libyuv/unit_test/video_common_test.cc similarity index 91% rename from third-party/webrtc/dependencies/third_party/libyuv/unit_test/video_common_test.cc rename to third-party/libyuv/third_party/libyuv/unit_test/video_common_test.cc index eb183aaa79..36728ea900 100644 --- a/third-party/webrtc/dependencies/third_party/libyuv/unit_test/video_common_test.cc +++ b/third-party/libyuv/third_party/libyuv/unit_test/video_common_test.cc @@ -29,7 +29,7 @@ static bool TestValidFourCC(uint32_t fourcc, int bpp) { !TestValidChar((fourcc >> 24) & 0xff)) { return false; } - if (bpp < 0 || bpp > 32) { + if (bpp < 0 || bpp > 64) { return false; } return true; @@ -72,6 +72,8 @@ TEST_F(LibYUVBaseTest, TestFourCC) { EXPECT_TRUE(TestValidFourCC(FOURCC_ABGR, FOURCC_BPP_ABGR)); EXPECT_TRUE(TestValidFourCC(FOURCC_AR30, FOURCC_BPP_AR30)); EXPECT_TRUE(TestValidFourCC(FOURCC_AB30, FOURCC_BPP_AB30)); + EXPECT_TRUE(TestValidFourCC(FOURCC_AR64, FOURCC_BPP_AR64)); + EXPECT_TRUE(TestValidFourCC(FOURCC_AB64, FOURCC_BPP_AB64)); EXPECT_TRUE(TestValidFourCC(FOURCC_24BG, FOURCC_BPP_24BG)); EXPECT_TRUE(TestValidFourCC(FOURCC_RAW, FOURCC_BPP_RAW)); EXPECT_TRUE(TestValidFourCC(FOURCC_RGBA, FOURCC_BPP_RGBA)); @@ -81,6 +83,11 @@ TEST_F(LibYUVBaseTest, TestFourCC) { EXPECT_TRUE(TestValidFourCC(FOURCC_H420, FOURCC_BPP_H420)); EXPECT_TRUE(TestValidFourCC(FOURCC_H422, FOURCC_BPP_H422)); EXPECT_TRUE(TestValidFourCC(FOURCC_H010, FOURCC_BPP_H010)); + EXPECT_TRUE(TestValidFourCC(FOURCC_H210, FOURCC_BPP_H210)); + EXPECT_TRUE(TestValidFourCC(FOURCC_I010, FOURCC_BPP_I010)); + EXPECT_TRUE(TestValidFourCC(FOURCC_I210, FOURCC_BPP_I210)); + EXPECT_TRUE(TestValidFourCC(FOURCC_P010, FOURCC_BPP_P010)); + EXPECT_TRUE(TestValidFourCC(FOURCC_P210, FOURCC_BPP_P210)); EXPECT_TRUE(TestValidFourCC(FOURCC_MJPG, FOURCC_BPP_MJPG)); EXPECT_TRUE(TestValidFourCC(FOURCC_YV12, FOURCC_BPP_YV12)); EXPECT_TRUE(TestValidFourCC(FOURCC_YV16, FOURCC_BPP_YV16)); diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/Makefile b/third-party/libyuv/third_party/libyuv/util/Makefile similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/Makefile rename to third-party/libyuv/third_party/libyuv/util/Makefile diff --git a/third-party/libyuv/third_party/libyuv/util/color.cc b/third-party/libyuv/third_party/libyuv/util/color.cc new file mode 100644 index 0000000000..8c3bbefd27 --- /dev/null +++ b/third-party/libyuv/third_party/libyuv/util/color.cc @@ -0,0 +1,120 @@ +/* + * Copyright 2021 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include +#include +#include + +// This utility computes values needed to generate yuvconstants based on +// white point values. +// The yuv formulas are tuned for 8 bit YUV channels. + +// For those MCs that can be represented as kr and kb: +// Full range +// float M[3][3] +// {{1,0,2*(1-kr)},{1,-((2*kb)/((2-kb)*(1-kb-kr))),-((2*kr)/((2-kr)*(1-kb-kr)))},{1,2*(1-kb),0}}; +// float B[3] +// {1+(256*(1-kr))/255,1-(256*kb)/(255*(2-kb)*(1-kb-kr))-(256*kr)/(255*(2-kr)*(1-kb-kr)),1+(256*(1-kb))/255}; +// Limited range +// float M[3][3] +// {{85/73,0,255/112-(255*kr)/112},{85/73,-((255*kb)/(112*(2-kb)*(1-kb-kr))),-((255*kr)/(112*(2-kr)*(1-kb-kr)))},{85/73,255/112-(255*kb)/112,0}}; +// float B[3] +// {77662/43435-(1537*kr)/1785,203/219-(1537*kb)/(1785*(2-kb)*(1-kb-kr))-(1537*kr)/(1785*(2-kr)*(1-kb-kr)),77662/43435-(1537*kb)/1785}; + +// mc bt +// 1 bt.709 KR = 0.2126; KB = 0.0722 +// 4 fcc KR = 0.30; KB = 0.11 +// 6 bt.601 KR = 0.299; KB = 0.114 +// 7 SMPTE 240M KR = 0.212; KB = 0.087 +// 10 bt2020 KR = 0.2627; KB = 0.0593 + +// BT.709 full range YUV to RGB reference +// R = Y + V * 1.5748 +// G = Y - U * 0.18732 - V * 0.46812 +// B = Y + U * 1.8556 +// KR = 0.2126 +// KB = 0.0722 + +// https://mymusing.co/bt601-yuv-to-rgb-conversion-color/ + +// // Y contribution to R,G,B. Scale and bias. +// #define YG 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ +// #define YB 32 /* 64 / 2 */ +// +// // U and V contributions to R,G,B. +// #define UB 113 /* round(1.77200 * 64) */ +// #define UG 22 /* round(0.34414 * 64) */ +// #define VG 46 /* round(0.71414 * 64) */ +// #define VR 90 /* round(1.40200 * 64) */ +// +// // Bias values to round, and subtract 128 from U and V. +// #define BB (-UB * 128 + YB) +// #define BG (UG * 128 + VG * 128 + YB) +// #define BR (-VR * 128 + YB) + +int round(float v) { + return (int)(v + 0.5); +} + +int main(int argc, const char* argv[]) { + if (argc < 2) { + printf("color kr kb\n"); + return -1; + } + float kr = atof(argv[1]); + float kb = atof(argv[2]); + float kg = 1 - kr - kb; + + float vr = 2 * (1 - kr); + float ug = 2 * ((1 - kb) * kb / kg); + float vg = 2 * ((1 - kr) * kr / kg); + float ub = 2 * (1 - kb); + + printf("Full range\n"); + printf("R = Y + V * %5f\n", vr); + printf("G = Y - U * %6f - V * %6f\n", ug, vg); + printf("B = Y + U * %5f\n", ub); + + printf("KR = %4f; ", kr); + printf("KB = %4f\n", kb); + // printf("KG = %4f\n", kg); + // #define YG 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ + // #define YB 32 /* 64 / 2 */ + // + // // U and V contributions to R,G,B. + + printf("UB %-3d /* round(%f * 64) */\n", round(ub * 64), ub); + printf("UG %-3d /* round(%f * 64) */\n", round(ug * 64), ug); + printf("VG %-3d /* round(%f * 64) */\n", round(vg * 64), vg); + printf("VR %-3d /* round(%f * 64) */\n", round(vr * 64), vr); + + vr = 255.f / 224.f * 2 * (1 - kr); + ug = 255.f / 224.f * 2 * ((1 - kb) * kb / kg); + vg = 255.f / 224.f * 2 * ((1 - kr) * kr / kg); + ub = 255.f / 224.f * 2 * (1 - kb); + + printf("Limited range\n"); + printf("R = (Y - 16) * 1.164 + V * %5f\n", vr); + printf("G = (Y - 16) * 1.164 - U * %6f - V * %6f\n", ug, vg); + printf("B = (Y - 16) * 1.164 + U * %5f\n", ub); + + // printf("KG = %4f\n", kg); + // #define YG 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ + // #define YB 32 /* 64 / 2 */ + // + // // U and V contributions to R,G,B. + + printf("UB %-3d /* round(%f * 64) */\n", round(ub * 64), ub); + printf("UG %-3d /* round(%f * 64) */\n", round(ug * 64), ug); + printf("VG %-3d /* round(%f * 64) */\n", round(vg * 64), vg); + printf("VR %-3d /* round(%f * 64) */\n", round(vr * 64), vr); + + return 0; +} diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/compare.cc b/third-party/libyuv/third_party/libyuv/util/compare.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/compare.cc rename to third-party/libyuv/third_party/libyuv/util/compare.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/cpuid.c b/third-party/libyuv/third_party/libyuv/util/cpuid.c similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/cpuid.c rename to third-party/libyuv/third_party/libyuv/util/cpuid.c diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/i444tonv12_eg.cc b/third-party/libyuv/third_party/libyuv/util/i444tonv12_eg.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/i444tonv12_eg.cc rename to third-party/libyuv/third_party/libyuv/util/i444tonv12_eg.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/psnr.cc b/third-party/libyuv/third_party/libyuv/util/psnr.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/psnr.cc rename to third-party/libyuv/third_party/libyuv/util/psnr.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/psnr.h b/third-party/libyuv/third_party/libyuv/util/psnr.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/psnr.h rename to third-party/libyuv/third_party/libyuv/util/psnr.h diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/psnr_main.cc b/third-party/libyuv/third_party/libyuv/util/psnr_main.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/psnr_main.cc rename to third-party/libyuv/third_party/libyuv/util/psnr_main.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/ssim.cc b/third-party/libyuv/third_party/libyuv/util/ssim.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/ssim.cc rename to third-party/libyuv/third_party/libyuv/util/ssim.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/ssim.h b/third-party/libyuv/third_party/libyuv/util/ssim.h similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/ssim.h rename to third-party/libyuv/third_party/libyuv/util/ssim.h diff --git a/third-party/libyuv/third_party/libyuv/util/yuvconstants.c b/third-party/libyuv/third_party/libyuv/util/yuvconstants.c new file mode 100644 index 0000000000..037e0824f0 --- /dev/null +++ b/third-party/libyuv/third_party/libyuv/util/yuvconstants.c @@ -0,0 +1,105 @@ +/* + * Copyright 2021 The LibYuv Project Authors. All rights reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include +#include +#include +#include + +// This utility computes values needed to generate yuvconstants based on +// white point values. +// The yuv formulas are tuned for 8 bit YUV channels. + +// See Also +// https://mymusing.co/bt601-yuv-to-rgb-conversion-color/ + +// BT.709 full range YUV to RGB reference +// R = Y + V * 1.5748 +// G = Y - U * 0.18732 - V * 0.46812 +// B = Y + U * 1.8556 +// KR = 0.2126 +// KB = 0.0722 + +// // Y contribution to R,G,B. Scale and bias. +// #define YG 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ +// #define YB 32 /* 64 / 2 */ +// +// // U and V contributions to R,G,B. +// #define UB 113 /* round(1.77200 * 64) */ +// #define UG 22 /* round(0.34414 * 64) */ +// #define VG 46 /* round(0.71414 * 64) */ +// #define VR 90 /* round(1.40200 * 64) */ +// +// // Bias values to round, and subtract 128 from U and V. +// #define BB (-UB * 128 + YB) +// #define BG (UG * 128 + VG * 128 + YB) +// #define BR (-VR * 128 + YB) + +int main(int argc, const char* argv[]) { + if (argc < 2) { + printf("yuvconstants Kr Kb\n"); + printf(" MC BT KR = 0.2126; KB = 0.0722\n"); + printf(" 1 BT.709 KR = 0.2126; KB = 0.0722\n"); + printf(" 4 FCC KR = 0.30; KB = 0.11\n"); + printf(" 6 BT.601 KR = 0.299; KB = 0.114\n"); + printf(" 7 SMPTE 240M KR = 0.212; KB = 0.087\n"); + printf(" 9 BT.2020 KR = 0.2627; KB = 0.0593\n"); + return -1; + } + float kr = atof(argv[1]); + float kb = atof(argv[2]); + float kg = 1 - kr - kb; + + float vr = 2 * (1 - kr); + float ug = 2 * ((1 - kb) * kb / kg); + float vg = 2 * ((1 - kr) * kr / kg); + float ub = 2 * (1 - kb); + + printf("Full range\n"); + printf("R = Y + V * %5f\n", vr); + printf("G = Y - U * %6f - V * %6f\n", ug, vg); + printf("B = Y + U * %5f\n", ub); + + printf("KR = %4f; ", kr); + printf("KB = %4f\n", kb); + // printf("KG = %4f\n", kg); + // #define YG 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ + // #define YB 32 /* 64 / 2 */ + // + // // U and V contributions to R,G,B. + + printf("UB %-3.0f /* round(%f * 64 = %8.4f) */\n", round(ub * 64), ub, ub * 64); + printf("UG %-3.0f /* round(%f * 64 = %8.4f) */\n", round(ug * 64), ug, ug * 64); + printf("VG %-3.0f /* round(%f * 64 = %8.4f) */\n", round(vg * 64), vg, vg * 64); + printf("VR %-3.0f /* round(%f * 64 = %8.4f) */\n", round(vr * 64), vr, vr * 64); + + vr = 255.f / 224.f * 2 * (1 - kr); + ug = 255.f / 224.f * 2 * ((1 - kb) * kb / kg); + vg = 255.f / 224.f * 2 * ((1 - kr) * kr / kg); + ub = 255.f / 224.f * 2 * (1 - kb); + + printf("\nLimited range\n"); + printf("R = (Y - 16) * 1.164 + V * %5f\n", vr); + printf("G = (Y - 16) * 1.164 - U * %6f - V * %6f\n", ug, vg); + printf("B = (Y - 16) * 1.164 + U * %5f\n", ub); + + // printf("KG = %4f\n", kg); + // #define YG 16320 /* round(1.000 * 64 * 256 * 256 / 257) */ + // #define YB 32 /* 64 / 2 */ + // + // // U and V contributions to R,G,B. + + printf("UB %-3.0f /* round(%f * 64 = %8.4f) */\n", round(ub * 64), ub, ub * 64); + printf("UG %-3.0f /* round(%f * 64 = %8.4f) */\n", round(ug * 64), ug, ug * 64); + printf("VG %-3.0f /* round(%f * 64 = %8.4f) */\n", round(vg * 64), vg, vg * 64); + printf("VR %-3.0f /* round(%f * 64 = %8.4f) */\n", round(vr * 64), vr, vr * 64); + + return 0; +} diff --git a/third-party/webrtc/dependencies/third_party/libyuv/util/yuvconvert.cc b/third-party/libyuv/third_party/libyuv/util/yuvconvert.cc similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/util/yuvconvert.cc rename to third-party/libyuv/third_party/libyuv/util/yuvconvert.cc diff --git a/third-party/webrtc/dependencies/third_party/libyuv/winarm.mk b/third-party/libyuv/third_party/libyuv/winarm.mk similarity index 100% rename from third-party/webrtc/dependencies/third_party/libyuv/winarm.mk rename to third-party/libyuv/third_party/libyuv/winarm.mk diff --git a/third-party/webrtc/BUILD b/third-party/webrtc/BUILD index 8da4664043..f7319e2cb1 100644 --- a/third-party/webrtc/BUILD +++ b/third-party/webrtc/BUILD @@ -3245,7 +3245,6 @@ arm_specific_flags = [ arm64_specific_flags = [ "-DWEBRTC_ARCH_ARM64", "-DWEBRTC_HAS_NEON", - "-mfpu=neon", "-DLIBYUV_NEON", ] @@ -3441,84 +3440,6 @@ cc_library( visibility = ["//visibility:public"], ) -cc_library( - name = "libyuv", - srcs = [ "dependencies/third_party/libyuv/" + path for path in [ - # Headers - "include/libyuv.h", - "include/libyuv/basic_types.h", - "include/libyuv/compare.h", - "include/libyuv/compare_row.h", - "include/libyuv/convert.h", - "include/libyuv/convert_argb.h", - "include/libyuv/convert_from.h", - "include/libyuv/convert_from_argb.h", - "include/libyuv/cpu_id.h", - "include/libyuv/mjpeg_decoder.h", - "include/libyuv/planar_functions.h", - "include/libyuv/rotate.h", - "include/libyuv/rotate_argb.h", - "include/libyuv/rotate_row.h", - "include/libyuv/row.h", - "include/libyuv/scale.h", - "include/libyuv/scale_argb.h", - "include/libyuv/scale_row.h", - "include/libyuv/scale_uv.h", - "include/libyuv/version.h", - "include/libyuv/video_common.h", - - # Source Files - "source/compare.cc", - "source/compare_common.cc", - "source/compare_gcc.cc", - "source/compare_win.cc", - "source/convert.cc", - "source/convert_argb.cc", - "source/convert_from.cc", - "source/convert_from_argb.cc", - "source/convert_jpeg.cc", - "source/convert_to_argb.cc", - "source/convert_to_i420.cc", - "source/cpu_id.cc", - "source/mjpeg_decoder.cc", - "source/mjpeg_validate.cc", - "source/planar_functions.cc", - "source/rotate.cc", - "source/rotate_any.cc", - "source/rotate_argb.cc", - "source/rotate_common.cc", - "source/rotate_gcc.cc", - "source/rotate_win.cc", - "source/row_any.cc", - "source/row_common.cc", - "source/row_gcc.cc", - "source/row_win.cc", - "source/scale.cc", - "source/scale_any.cc", - "source/scale_argb.cc", - "source/scale_common.cc", - "source/scale_gcc.cc", - "source/scale_uv.cc", - "source/scale_win.cc", - "source/video_common.cc", - - # ARM Source Files - "source/compare_neon.cc", - "source/compare_neon64.cc", - "source/rotate_neon.cc", - "source/rotate_neon64.cc", - "source/row_neon.cc", - "source/row_neon64.cc", - "source/scale_neon.cc", - "source/scale_neon64.cc", - ]], - copts = [ - "-ffp-contract=fast", - "-Ithird-party/webrtc/dependencies/third_party/libyuv/include", - ] + arch_specific_cflags + optimization_flags, - visibility = ["//visibility:public"], -) - fft4g_sources = [ "fft4g/fft4g.h", "fft4g/fft4g.cc", @@ -3540,7 +3461,8 @@ objc_library( "-Ithird-party/webrtc/dependencies/third_party/usrsctp/usrsctplib/usrsctplib", "-Ithird-party/webrtc/dependencies/third_party/libsrtp/include", "-Ithird-party/webrtc/dependencies/third_party/libsrtp/crypto/include", - "-Ithird-party/webrtc/dependencies/third_party/libyuv/include", + "-Ithird-party/libyuv", + "-Ithird-party/libyuv/third_party/libyuv/include", "-Ithird-party/webrtc/" + webrtc_source_dir + "/" + "testing/gtest/include", "-Ithird-party/webrtc/" + webrtc_source_dir + "/" + "sdk/objc", "-Ithird-party/webrtc/" + webrtc_source_dir + "/" + "sdk/objc/base", @@ -3569,7 +3491,7 @@ objc_library( "//third-party/opus:opus", ":usrsctp", ":libsrtp", - ":libyuv", + "//third-party/libyuv:libyuv", "//third-party/libvpx:vpx", "//submodules/ffmpeg:ffmpeg", "//third-party/openh264:openh264", diff --git a/third-party/webrtc/dependencies/third_party/libyuv/.clang-format b/third-party/webrtc/dependencies/third_party/libyuv/.clang-format deleted file mode 100644 index 59d487051f..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/.clang-format +++ /dev/null @@ -1,6 +0,0 @@ -# Defines the Chromium style for automatic reformatting. -# http://clang.llvm.org/docs/ClangFormatStyleOptions.html -BasedOnStyle: Chromium ---- -Language: Java -BasedOnStyle: Google diff --git a/third-party/webrtc/dependencies/third_party/libyuv/.gitignore b/third-party/webrtc/dependencies/third_party/libyuv/.gitignore deleted file mode 100644 index 7095d41708..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -*.pyc -.landmines -pin-log.txt -/base -/build -/buildtools -/google_apis -/links -/links.db -/ios -/mojo -/native_client -/net -/out -/source/out -/sde-avx-sse-transition-out.txt -/testing -/third_party -/tools - -# Files generated by CMake build -cmake_install.cmake -CMakeCache.txt -CMakeFiles/ -yuvconvert -libgtest.a -libyuv.a -libyuv_unittest - -# Files generated by winarm.mk build -libyuv_arm.lib -source/*.o - -# Files generated by perf -perf.data -perf.data.old diff --git a/third-party/webrtc/dependencies/third_party/libyuv/.gn b/third-party/webrtc/dependencies/third_party/libyuv/.gn deleted file mode 100644 index be8c3b513d..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/.gn +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2015 The LibYuv Project Authors. All rights reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -import("//build/dotfile_settings.gni") - -# The location of the build configuration file. -buildconfig = "//build/config/BUILDCONFIG.gn" - -# The secondary source root is a parallel directory tree where -# GN build files are placed when they can not be placed directly -# in the source tree, e.g. for third party source trees. -secondary_source = "//build/secondary/" - -# These are the targets to check headers for by default. The files in targets -# matching these patterns (see "gn help label_pattern" for format) will have -# their includes checked for proper dependencies when you run either -# "gn check" or "gn gen --check". -check_targets = [ "//libyuv/*" ] - -# These are the list of GN files that run exec_script. This whitelist exists -# to force additional review for new uses of exec_script, which is strongly -# discouraged except for gypi_to_gn calls. -exec_script_whitelist = build_dotfile_settings.exec_script_whitelist + - [ "//build_overrides/build.gni" ] - -default_args = { - mac_sdk_min = "10.12" - - # https://bugs.chromium.org/p/libyuv/issues/detail?id=826 - ios_deployment_target = "10.0" -} diff --git a/third-party/webrtc/dependencies/third_party/libyuv/.vpython b/third-party/webrtc/dependencies/third_party/libyuv/.vpython deleted file mode 100644 index e0aaf894c1..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/.vpython +++ /dev/null @@ -1,59 +0,0 @@ -# This is a vpython "spec" file. -# -# It describes patterns for python wheel dependencies of the python scripts in -# the chromium repo, particularly for dependencies that have compiled components -# (since pure-python dependencies can be easily vendored into third_party). -# -# When vpython is invoked, it finds this file and builds a python VirtualEnv, -# containing all of the dependencies described in this file, fetching them from -# CIPD (the "Chrome Infrastructure Package Deployer" service). Unlike `pip`, -# this never requires the end-user machine to have a working python extension -# compilation environment. All of these packages are built using: -# https://chromium.googlesource.com/infra/infra/+/master/infra/tools/dockerbuild/ -# -# All python scripts in the repo share this same spec, to avoid dependency -# fragmentation. -# -# If you have depot_tools installed in your $PATH, you can invoke python scripts -# in this repo by running them as you normally would run them, except -# substituting `vpython` instead of `python` on the command line, e.g.: -# vpython path/to/script.py some --arguments -# -# Read more about `vpython` and how to modify this file here: -# https://chromium.googlesource.com/infra/infra/+/master/doc/users/vpython.md - -python_version: "2.7" - -# Used by: -# third_party/catapult -wheel: < - name: "infra/python/wheels/psutil/${platform}_${py_python}_${py_abi}" - version: "version:5.2.2" -> - -# Used by: -# third_party/catapult -wheel: < - name: "infra/python/wheels/pypiwin32/${vpython_platform}" - version: "version:219" - match_tag: < - platform: "win32" - > - match_tag: < - platform: "win_amd64" - > -> - -# Used by: -# tools/swarming_client -wheel: < - name: "infra/python/wheels/six-py2_py3" - version: "version:1.15.0" -> - -# Used by: -# build/android -wheel: < - name: "infra/python/wheels/requests-py2_py3" - version: "version:2.13.0" -> diff --git a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_gcc.cc b/third-party/webrtc/dependencies/third_party/libyuv/source/scale_gcc.cc deleted file mode 100644 index e575ee18bc..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/source/scale_gcc.cc +++ /dev/null @@ -1,1464 +0,0 @@ -/* - * Copyright 2013 The LibYuv Project Authors. All rights reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include "libyuv/row.h" -#include "libyuv/scale_row.h" - -#ifdef __cplusplus -namespace libyuv { -extern "C" { -#endif - -// This module is for GCC x86 and x64. -#if !defined(LIBYUV_DISABLE_X86) && \ - (defined(__x86_64__) || (defined(__i386__) && !defined(_MSC_VER))) - -// Offsets for source bytes 0 to 9 -static const uvec8 kShuf0 = {0, 1, 3, 4, 5, 7, 8, 9, - 128, 128, 128, 128, 128, 128, 128, 128}; - -// Offsets for source bytes 11 to 20 with 8 subtracted = 3 to 12. -static const uvec8 kShuf1 = {3, 4, 5, 7, 8, 9, 11, 12, - 128, 128, 128, 128, 128, 128, 128, 128}; - -// Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31. -static const uvec8 kShuf2 = {5, 7, 8, 9, 11, 12, 13, 15, - 128, 128, 128, 128, 128, 128, 128, 128}; - -// Offsets for source bytes 0 to 10 -static const uvec8 kShuf01 = {0, 1, 1, 2, 2, 3, 4, 5, 5, 6, 6, 7, 8, 9, 9, 10}; - -// Offsets for source bytes 10 to 21 with 8 subtracted = 3 to 13. -static const uvec8 kShuf11 = {2, 3, 4, 5, 5, 6, 6, 7, - 8, 9, 9, 10, 10, 11, 12, 13}; - -// Offsets for source bytes 21 to 31 with 16 subtracted = 5 to 31. -static const uvec8 kShuf21 = {5, 6, 6, 7, 8, 9, 9, 10, - 10, 11, 12, 13, 13, 14, 14, 15}; - -// Coefficients for source bytes 0 to 10 -static const uvec8 kMadd01 = {3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2}; - -// Coefficients for source bytes 10 to 21 -static const uvec8 kMadd11 = {1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1}; - -// Coefficients for source bytes 21 to 31 -static const uvec8 kMadd21 = {2, 2, 1, 3, 3, 1, 2, 2, 1, 3, 3, 1, 2, 2, 1, 3}; - -// Coefficients for source bytes 21 to 31 -static const vec16 kRound34 = {2, 2, 2, 2, 2, 2, 2, 2}; - -static const uvec8 kShuf38a = {0, 3, 6, 8, 11, 14, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128}; - -static const uvec8 kShuf38b = {128, 128, 128, 128, 128, 128, 0, 3, - 6, 8, 11, 14, 128, 128, 128, 128}; - -// Arrange words 0,3,6 into 0,1,2 -static const uvec8 kShufAc = {0, 1, 6, 7, 12, 13, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128}; - -// Arrange words 0,3,6 into 3,4,5 -static const uvec8 kShufAc3 = {128, 128, 128, 128, 128, 128, 0, 1, - 6, 7, 12, 13, 128, 128, 128, 128}; - -// Scaling values for boxes of 3x3 and 2x3 -static const uvec16 kScaleAc33 = {65536 / 9, 65536 / 9, 65536 / 6, 65536 / 9, - 65536 / 9, 65536 / 6, 0, 0}; - -// Arrange first value for pixels 0,1,2,3,4,5 -static const uvec8 kShufAb0 = {0, 128, 3, 128, 6, 128, 8, 128, - 11, 128, 14, 128, 128, 128, 128, 128}; - -// Arrange second value for pixels 0,1,2,3,4,5 -static const uvec8 kShufAb1 = {1, 128, 4, 128, 7, 128, 9, 128, - 12, 128, 15, 128, 128, 128, 128, 128}; - -// Arrange third value for pixels 0,1,2,3,4,5 -static const uvec8 kShufAb2 = {2, 128, 5, 128, 128, 128, 10, 128, - 13, 128, 128, 128, 128, 128, 128, 128}; - -// Scaling values for boxes of 3x2 and 2x2 -static const uvec16 kScaleAb2 = {65536 / 3, 65536 / 3, 65536 / 2, 65536 / 3, - 65536 / 3, 65536 / 2, 0, 0}; - -// GCC versions of row functions are verbatim conversions from Visual C. -// Generated using gcc disassembly on Visual C object file: -// objdump -D yuvscaler.obj >yuvscaler.txt - -void ScaleRowDown2_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - (void)src_stride; - asm volatile( - // 16 pixel loop. - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "lea 0x20(%0),%0 \n" - "psrlw $0x8,%%xmm0 \n" - "psrlw $0x8,%%xmm1 \n" - "packuswb %%xmm1,%%xmm0 \n" - "movdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" - "sub $0x10,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1"); -} - -void ScaleRowDown2Linear_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - (void)src_stride; - asm volatile( - "pcmpeqb %%xmm4,%%xmm4 \n" - "psrlw $0xf,%%xmm4 \n" - "packuswb %%xmm4,%%xmm4 \n" - "pxor %%xmm5,%%xmm5 \n" - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "lea 0x20(%0),%0 \n" - "pmaddubsw %%xmm4,%%xmm0 \n" - "pmaddubsw %%xmm4,%%xmm1 \n" - "pavgw %%xmm5,%%xmm0 \n" - "pavgw %%xmm5,%%xmm1 \n" - "packuswb %%xmm1,%%xmm0 \n" - "movdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" - "sub $0x10,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1", "xmm4", "xmm5"); -} - -void ScaleRowDown2Box_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "pcmpeqb %%xmm4,%%xmm4 \n" - "psrlw $0xf,%%xmm4 \n" - "packuswb %%xmm4,%%xmm4 \n" - "pxor %%xmm5,%%xmm5 \n" - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "movdqu 0x00(%0,%3,1),%%xmm2 \n" - "movdqu 0x10(%0,%3,1),%%xmm3 \n" - "lea 0x20(%0),%0 \n" - "pmaddubsw %%xmm4,%%xmm0 \n" - "pmaddubsw %%xmm4,%%xmm1 \n" - "pmaddubsw %%xmm4,%%xmm2 \n" - "pmaddubsw %%xmm4,%%xmm3 \n" - "paddw %%xmm2,%%xmm0 \n" - "paddw %%xmm3,%%xmm1 \n" - "psrlw $0x1,%%xmm0 \n" - "psrlw $0x1,%%xmm1 \n" - "pavgw %%xmm5,%%xmm0 \n" - "pavgw %%xmm5,%%xmm1 \n" - "packuswb %%xmm1,%%xmm0 \n" - "movdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" - "sub $0x10,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)) // %3 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); -} - -#ifdef HAS_SCALEROWDOWN2_AVX2 -void ScaleRowDown2_AVX2(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - (void)src_stride; - asm volatile( - - LABELALIGN - "1: \n" - "vmovdqu (%0),%%ymm0 \n" - "vmovdqu 0x20(%0),%%ymm1 \n" - "lea 0x40(%0),%0 \n" - "vpsrlw $0x8,%%ymm0,%%ymm0 \n" - "vpsrlw $0x8,%%ymm1,%%ymm1 \n" - "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" - "vpermq $0xd8,%%ymm0,%%ymm0 \n" - "vmovdqu %%ymm0,(%1) \n" - "lea 0x20(%1),%1 \n" - "sub $0x20,%2 \n" - "jg 1b \n" - "vzeroupper \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1"); -} - -void ScaleRowDown2Linear_AVX2(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - (void)src_stride; - asm volatile( - "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" - "vpsrlw $0xf,%%ymm4,%%ymm4 \n" - "vpackuswb %%ymm4,%%ymm4,%%ymm4 \n" - "vpxor %%ymm5,%%ymm5,%%ymm5 \n" - - LABELALIGN - "1: \n" - "vmovdqu (%0),%%ymm0 \n" - "vmovdqu 0x20(%0),%%ymm1 \n" - "lea 0x40(%0),%0 \n" - "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" - "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n" - "vpavgw %%ymm5,%%ymm0,%%ymm0 \n" - "vpavgw %%ymm5,%%ymm1,%%ymm1 \n" - "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" - "vpermq $0xd8,%%ymm0,%%ymm0 \n" - "vmovdqu %%ymm0,(%1) \n" - "lea 0x20(%1),%1 \n" - "sub $0x20,%2 \n" - "jg 1b \n" - "vzeroupper \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1", "xmm4", "xmm5"); -} - -void ScaleRowDown2Box_AVX2(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" - "vpsrlw $0xf,%%ymm4,%%ymm4 \n" - "vpackuswb %%ymm4,%%ymm4,%%ymm4 \n" - "vpxor %%ymm5,%%ymm5,%%ymm5 \n" - - LABELALIGN - "1: \n" - "vmovdqu (%0),%%ymm0 \n" - "vmovdqu 0x20(%0),%%ymm1 \n" - "vmovdqu 0x00(%0,%3,1),%%ymm2 \n" - "vmovdqu 0x20(%0,%3,1),%%ymm3 \n" - "lea 0x40(%0),%0 \n" - "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" - "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n" - "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" - "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n" - "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" - "vpaddw %%ymm3,%%ymm1,%%ymm1 \n" - "vpsrlw $0x1,%%ymm0,%%ymm0 \n" - "vpsrlw $0x1,%%ymm1,%%ymm1 \n" - "vpavgw %%ymm5,%%ymm0,%%ymm0 \n" - "vpavgw %%ymm5,%%ymm1,%%ymm1 \n" - "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" - "vpermq $0xd8,%%ymm0,%%ymm0 \n" - "vmovdqu %%ymm0,(%1) \n" - "lea 0x20(%1),%1 \n" - "sub $0x20,%2 \n" - "jg 1b \n" - "vzeroupper \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)) // %3 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); -} -#endif // HAS_SCALEROWDOWN2_AVX2 - -void ScaleRowDown4_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - (void)src_stride; - asm volatile( - "pcmpeqb %%xmm5,%%xmm5 \n" - "psrld $0x18,%%xmm5 \n" - "pslld $0x10,%%xmm5 \n" - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "lea 0x20(%0),%0 \n" - "pand %%xmm5,%%xmm0 \n" - "pand %%xmm5,%%xmm1 \n" - "packuswb %%xmm1,%%xmm0 \n" - "psrlw $0x8,%%xmm0 \n" - "packuswb %%xmm0,%%xmm0 \n" - "movq %%xmm0,(%1) \n" - "lea 0x8(%1),%1 \n" - "sub $0x8,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1", "xmm5"); -} - -void ScaleRowDown4Box_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - intptr_t stridex3; - asm volatile( - "pcmpeqb %%xmm4,%%xmm4 \n" - "psrlw $0xf,%%xmm4 \n" - "movdqa %%xmm4,%%xmm5 \n" - "packuswb %%xmm4,%%xmm4 \n" - "psllw $0x3,%%xmm5 \n" - "lea 0x00(%4,%4,2),%3 \n" - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "movdqu 0x00(%0,%4,1),%%xmm2 \n" - "movdqu 0x10(%0,%4,1),%%xmm3 \n" - "pmaddubsw %%xmm4,%%xmm0 \n" - "pmaddubsw %%xmm4,%%xmm1 \n" - "pmaddubsw %%xmm4,%%xmm2 \n" - "pmaddubsw %%xmm4,%%xmm3 \n" - "paddw %%xmm2,%%xmm0 \n" - "paddw %%xmm3,%%xmm1 \n" - "movdqu 0x00(%0,%4,2),%%xmm2 \n" - "movdqu 0x10(%0,%4,2),%%xmm3 \n" - "pmaddubsw %%xmm4,%%xmm2 \n" - "pmaddubsw %%xmm4,%%xmm3 \n" - "paddw %%xmm2,%%xmm0 \n" - "paddw %%xmm3,%%xmm1 \n" - "movdqu 0x00(%0,%3,1),%%xmm2 \n" - "movdqu 0x10(%0,%3,1),%%xmm3 \n" - "lea 0x20(%0),%0 \n" - "pmaddubsw %%xmm4,%%xmm2 \n" - "pmaddubsw %%xmm4,%%xmm3 \n" - "paddw %%xmm2,%%xmm0 \n" - "paddw %%xmm3,%%xmm1 \n" - "phaddw %%xmm1,%%xmm0 \n" - "paddw %%xmm5,%%xmm0 \n" - "psrlw $0x4,%%xmm0 \n" - "packuswb %%xmm0,%%xmm0 \n" - "movq %%xmm0,(%1) \n" - "lea 0x8(%1),%1 \n" - "sub $0x8,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width), // %2 - "=&r"(stridex3) // %3 - : "r"((intptr_t)(src_stride)) // %4 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); -} - -#ifdef HAS_SCALEROWDOWN4_AVX2 -void ScaleRowDown4_AVX2(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - (void)src_stride; - asm volatile( - "vpcmpeqb %%ymm5,%%ymm5,%%ymm5 \n" - "vpsrld $0x18,%%ymm5,%%ymm5 \n" - "vpslld $0x10,%%ymm5,%%ymm5 \n" - - LABELALIGN - "1: \n" - "vmovdqu (%0),%%ymm0 \n" - "vmovdqu 0x20(%0),%%ymm1 \n" - "lea 0x40(%0),%0 \n" - "vpand %%ymm5,%%ymm0,%%ymm0 \n" - "vpand %%ymm5,%%ymm1,%%ymm1 \n" - "vpackuswb %%ymm1,%%ymm0,%%ymm0 \n" - "vpermq $0xd8,%%ymm0,%%ymm0 \n" - "vpsrlw $0x8,%%ymm0,%%ymm0 \n" - "vpackuswb %%ymm0,%%ymm0,%%ymm0 \n" - "vpermq $0xd8,%%ymm0,%%ymm0 \n" - "vmovdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" - "sub $0x10,%2 \n" - "jg 1b \n" - "vzeroupper \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1", "xmm5"); -} - -void ScaleRowDown4Box_AVX2(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" - "vpsrlw $0xf,%%ymm4,%%ymm4 \n" - "vpsllw $0x3,%%ymm4,%%ymm5 \n" - "vpackuswb %%ymm4,%%ymm4,%%ymm4 \n" - - LABELALIGN - "1: \n" - "vmovdqu (%0),%%ymm0 \n" - "vmovdqu 0x20(%0),%%ymm1 \n" - "vmovdqu 0x00(%0,%3,1),%%ymm2 \n" - "vmovdqu 0x20(%0,%3,1),%%ymm3 \n" - "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" - "vpmaddubsw %%ymm4,%%ymm1,%%ymm1 \n" - "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" - "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n" - "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" - "vpaddw %%ymm3,%%ymm1,%%ymm1 \n" - "vmovdqu 0x00(%0,%3,2),%%ymm2 \n" - "vmovdqu 0x20(%0,%3,2),%%ymm3 \n" - "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" - "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n" - "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" - "vpaddw %%ymm3,%%ymm1,%%ymm1 \n" - "vmovdqu 0x00(%0,%4,1),%%ymm2 \n" - "vmovdqu 0x20(%0,%4,1),%%ymm3 \n" - "lea 0x40(%0),%0 \n" - "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" - "vpmaddubsw %%ymm4,%%ymm3,%%ymm3 \n" - "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" - "vpaddw %%ymm3,%%ymm1,%%ymm1 \n" - "vphaddw %%ymm1,%%ymm0,%%ymm0 \n" - "vpermq $0xd8,%%ymm0,%%ymm0 \n" - "vpaddw %%ymm5,%%ymm0,%%ymm0 \n" - "vpsrlw $0x4,%%ymm0,%%ymm0 \n" - "vpackuswb %%ymm0,%%ymm0,%%ymm0 \n" - "vpermq $0xd8,%%ymm0,%%ymm0 \n" - "vmovdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" - "sub $0x10,%2 \n" - "jg 1b \n" - "vzeroupper \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)), // %3 - "r"((intptr_t)(src_stride * 3)) // %4 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); -} -#endif // HAS_SCALEROWDOWN4_AVX2 - -void ScaleRowDown34_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - (void)src_stride; - asm volatile( - "movdqa %0,%%xmm3 \n" - "movdqa %1,%%xmm4 \n" - "movdqa %2,%%xmm5 \n" - : - : "m"(kShuf0), // %0 - "m"(kShuf1), // %1 - "m"(kShuf2) // %2 - ); - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm2 \n" - "lea 0x20(%0),%0 \n" - "movdqa %%xmm2,%%xmm1 \n" - "palignr $0x8,%%xmm0,%%xmm1 \n" - "pshufb %%xmm3,%%xmm0 \n" - "pshufb %%xmm4,%%xmm1 \n" - "pshufb %%xmm5,%%xmm2 \n" - "movq %%xmm0,(%1) \n" - "movq %%xmm1,0x8(%1) \n" - "movq %%xmm2,0x10(%1) \n" - "lea 0x18(%1),%1 \n" - "sub $0x18,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); -} - -void ScaleRowDown34_1_Box_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "movdqa %0,%%xmm2 \n" // kShuf01 - "movdqa %1,%%xmm3 \n" // kShuf11 - "movdqa %2,%%xmm4 \n" // kShuf21 - : - : "m"(kShuf01), // %0 - "m"(kShuf11), // %1 - "m"(kShuf21) // %2 - ); - asm volatile( - "movdqa %0,%%xmm5 \n" // kMadd01 - "movdqa %1,%%xmm0 \n" // kMadd11 - "movdqa %2,%%xmm1 \n" // kRound34 - : - : "m"(kMadd01), // %0 - "m"(kMadd11), // %1 - "m"(kRound34) // %2 - ); - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm6 \n" - "movdqu 0x00(%0,%3,1),%%xmm7 \n" - "pavgb %%xmm7,%%xmm6 \n" - "pshufb %%xmm2,%%xmm6 \n" - "pmaddubsw %%xmm5,%%xmm6 \n" - "paddsw %%xmm1,%%xmm6 \n" - "psrlw $0x2,%%xmm6 \n" - "packuswb %%xmm6,%%xmm6 \n" - "movq %%xmm6,(%1) \n" - "movdqu 0x8(%0),%%xmm6 \n" - "movdqu 0x8(%0,%3,1),%%xmm7 \n" - "pavgb %%xmm7,%%xmm6 \n" - "pshufb %%xmm3,%%xmm6 \n" - "pmaddubsw %%xmm0,%%xmm6 \n" - "paddsw %%xmm1,%%xmm6 \n" - "psrlw $0x2,%%xmm6 \n" - "packuswb %%xmm6,%%xmm6 \n" - "movq %%xmm6,0x8(%1) \n" - "movdqu 0x10(%0),%%xmm6 \n" - "movdqu 0x10(%0,%3,1),%%xmm7 \n" - "lea 0x20(%0),%0 \n" - "pavgb %%xmm7,%%xmm6 \n" - "pshufb %%xmm4,%%xmm6 \n" - "pmaddubsw %4,%%xmm6 \n" - "paddsw %%xmm1,%%xmm6 \n" - "psrlw $0x2,%%xmm6 \n" - "packuswb %%xmm6,%%xmm6 \n" - "movq %%xmm6,0x10(%1) \n" - "lea 0x18(%1),%1 \n" - "sub $0x18,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)), // %3 - "m"(kMadd21) // %4 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", - "xmm7"); -} - -void ScaleRowDown34_0_Box_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "movdqa %0,%%xmm2 \n" // kShuf01 - "movdqa %1,%%xmm3 \n" // kShuf11 - "movdqa %2,%%xmm4 \n" // kShuf21 - : - : "m"(kShuf01), // %0 - "m"(kShuf11), // %1 - "m"(kShuf21) // %2 - ); - asm volatile( - "movdqa %0,%%xmm5 \n" // kMadd01 - "movdqa %1,%%xmm0 \n" // kMadd11 - "movdqa %2,%%xmm1 \n" // kRound34 - : - : "m"(kMadd01), // %0 - "m"(kMadd11), // %1 - "m"(kRound34) // %2 - ); - - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm6 \n" - "movdqu 0x00(%0,%3,1),%%xmm7 \n" - "pavgb %%xmm6,%%xmm7 \n" - "pavgb %%xmm7,%%xmm6 \n" - "pshufb %%xmm2,%%xmm6 \n" - "pmaddubsw %%xmm5,%%xmm6 \n" - "paddsw %%xmm1,%%xmm6 \n" - "psrlw $0x2,%%xmm6 \n" - "packuswb %%xmm6,%%xmm6 \n" - "movq %%xmm6,(%1) \n" - "movdqu 0x8(%0),%%xmm6 \n" - "movdqu 0x8(%0,%3,1),%%xmm7 \n" - "pavgb %%xmm6,%%xmm7 \n" - "pavgb %%xmm7,%%xmm6 \n" - "pshufb %%xmm3,%%xmm6 \n" - "pmaddubsw %%xmm0,%%xmm6 \n" - "paddsw %%xmm1,%%xmm6 \n" - "psrlw $0x2,%%xmm6 \n" - "packuswb %%xmm6,%%xmm6 \n" - "movq %%xmm6,0x8(%1) \n" - "movdqu 0x10(%0),%%xmm6 \n" - "movdqu 0x10(%0,%3,1),%%xmm7 \n" - "lea 0x20(%0),%0 \n" - "pavgb %%xmm6,%%xmm7 \n" - "pavgb %%xmm7,%%xmm6 \n" - "pshufb %%xmm4,%%xmm6 \n" - "pmaddubsw %4,%%xmm6 \n" - "paddsw %%xmm1,%%xmm6 \n" - "psrlw $0x2,%%xmm6 \n" - "packuswb %%xmm6,%%xmm6 \n" - "movq %%xmm6,0x10(%1) \n" - "lea 0x18(%1),%1 \n" - "sub $0x18,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)), // %3 - "m"(kMadd21) // %4 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", - "xmm7"); -} - -void ScaleRowDown38_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - (void)src_stride; - asm volatile( - "movdqa %3,%%xmm4 \n" - "movdqa %4,%%xmm5 \n" - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "lea 0x20(%0),%0 \n" - "pshufb %%xmm4,%%xmm0 \n" - "pshufb %%xmm5,%%xmm1 \n" - "paddusb %%xmm1,%%xmm0 \n" - "movq %%xmm0,(%1) \n" - "movhlps %%xmm0,%%xmm1 \n" - "movd %%xmm1,0x8(%1) \n" - "lea 0xc(%1),%1 \n" - "sub $0xc,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "m"(kShuf38a), // %3 - "m"(kShuf38b) // %4 - : "memory", "cc", "xmm0", "xmm1", "xmm4", "xmm5"); -} - -void ScaleRowDown38_2_Box_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "movdqa %0,%%xmm2 \n" - "movdqa %1,%%xmm3 \n" - "movdqa %2,%%xmm4 \n" - "movdqa %3,%%xmm5 \n" - : - : "m"(kShufAb0), // %0 - "m"(kShufAb1), // %1 - "m"(kShufAb2), // %2 - "m"(kScaleAb2) // %3 - ); - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x00(%0,%3,1),%%xmm1 \n" - "lea 0x10(%0),%0 \n" - "pavgb %%xmm1,%%xmm0 \n" - "movdqa %%xmm0,%%xmm1 \n" - "pshufb %%xmm2,%%xmm1 \n" - "movdqa %%xmm0,%%xmm6 \n" - "pshufb %%xmm3,%%xmm6 \n" - "paddusw %%xmm6,%%xmm1 \n" - "pshufb %%xmm4,%%xmm0 \n" - "paddusw %%xmm0,%%xmm1 \n" - "pmulhuw %%xmm5,%%xmm1 \n" - "packuswb %%xmm1,%%xmm1 \n" - "movd %%xmm1,(%1) \n" - "psrlq $0x10,%%xmm1 \n" - "movd %%xmm1,0x2(%1) \n" - "lea 0x6(%1),%1 \n" - "sub $0x6,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)) // %3 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); -} - -void ScaleRowDown38_3_Box_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "movdqa %0,%%xmm2 \n" - "movdqa %1,%%xmm3 \n" - "movdqa %2,%%xmm4 \n" - "pxor %%xmm5,%%xmm5 \n" - : - : "m"(kShufAc), // %0 - "m"(kShufAc3), // %1 - "m"(kScaleAc33) // %2 - ); - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x00(%0,%3,1),%%xmm6 \n" - "movhlps %%xmm0,%%xmm1 \n" - "movhlps %%xmm6,%%xmm7 \n" - "punpcklbw %%xmm5,%%xmm0 \n" - "punpcklbw %%xmm5,%%xmm1 \n" - "punpcklbw %%xmm5,%%xmm6 \n" - "punpcklbw %%xmm5,%%xmm7 \n" - "paddusw %%xmm6,%%xmm0 \n" - "paddusw %%xmm7,%%xmm1 \n" - "movdqu 0x00(%0,%3,2),%%xmm6 \n" - "lea 0x10(%0),%0 \n" - "movhlps %%xmm6,%%xmm7 \n" - "punpcklbw %%xmm5,%%xmm6 \n" - "punpcklbw %%xmm5,%%xmm7 \n" - "paddusw %%xmm6,%%xmm0 \n" - "paddusw %%xmm7,%%xmm1 \n" - "movdqa %%xmm0,%%xmm6 \n" - "psrldq $0x2,%%xmm0 \n" - "paddusw %%xmm0,%%xmm6 \n" - "psrldq $0x2,%%xmm0 \n" - "paddusw %%xmm0,%%xmm6 \n" - "pshufb %%xmm2,%%xmm6 \n" - "movdqa %%xmm1,%%xmm7 \n" - "psrldq $0x2,%%xmm1 \n" - "paddusw %%xmm1,%%xmm7 \n" - "psrldq $0x2,%%xmm1 \n" - "paddusw %%xmm1,%%xmm7 \n" - "pshufb %%xmm3,%%xmm7 \n" - "paddusw %%xmm7,%%xmm6 \n" - "pmulhuw %%xmm4,%%xmm6 \n" - "packuswb %%xmm6,%%xmm6 \n" - "movd %%xmm6,(%1) \n" - "psrlq $0x10,%%xmm6 \n" - "movd %%xmm6,0x2(%1) \n" - "lea 0x6(%1),%1 \n" - "sub $0x6,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)) // %3 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", - "xmm7"); -} - -// Reads 16xN bytes and produces 16 shorts at a time. -void ScaleAddRow_SSE2(const uint8_t* src_ptr, - uint16_t* dst_ptr, - int src_width) { - asm volatile( - - "pxor %%xmm5,%%xmm5 \n" - - // 16 pixel loop. - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm3 \n" - "lea 0x10(%0),%0 \n" // src_ptr += 16 - "movdqu (%1),%%xmm0 \n" - "movdqu 0x10(%1),%%xmm1 \n" - "movdqa %%xmm3,%%xmm2 \n" - "punpcklbw %%xmm5,%%xmm2 \n" - "punpckhbw %%xmm5,%%xmm3 \n" - "paddusw %%xmm2,%%xmm0 \n" - "paddusw %%xmm3,%%xmm1 \n" - "movdqu %%xmm0,(%1) \n" - "movdqu %%xmm1,0x10(%1) \n" - "lea 0x20(%1),%1 \n" - "sub $0x10,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(src_width) // %2 - : - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); -} - -#ifdef HAS_SCALEADDROW_AVX2 -// Reads 32 bytes and accumulates to 32 shorts at a time. -void ScaleAddRow_AVX2(const uint8_t* src_ptr, - uint16_t* dst_ptr, - int src_width) { - asm volatile( - - "vpxor %%ymm5,%%ymm5,%%ymm5 \n" - - LABELALIGN - "1: \n" - "vmovdqu (%0),%%ymm3 \n" - "lea 0x20(%0),%0 \n" // src_ptr += 32 - "vpermq $0xd8,%%ymm3,%%ymm3 \n" - "vpunpcklbw %%ymm5,%%ymm3,%%ymm2 \n" - "vpunpckhbw %%ymm5,%%ymm3,%%ymm3 \n" - "vpaddusw (%1),%%ymm2,%%ymm0 \n" - "vpaddusw 0x20(%1),%%ymm3,%%ymm1 \n" - "vmovdqu %%ymm0,(%1) \n" - "vmovdqu %%ymm1,0x20(%1) \n" - "lea 0x40(%1),%1 \n" - "sub $0x20,%2 \n" - "jg 1b \n" - "vzeroupper \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(src_width) // %2 - : - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm5"); -} -#endif // HAS_SCALEADDROW_AVX2 - -// Constant for making pixels signed to avoid pmaddubsw -// saturation. -static const uvec8 kFsub80 = {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80}; - -// Constant for making pixels unsigned and adding .5 for rounding. -static const uvec16 kFadd40 = {0x4040, 0x4040, 0x4040, 0x4040, - 0x4040, 0x4040, 0x4040, 0x4040}; - -// Bilinear column filtering. SSSE3 version. -void ScaleFilterCols_SSSE3(uint8_t* dst_ptr, - const uint8_t* src_ptr, - int dst_width, - int x, - int dx) { - intptr_t x0, x1, temp_pixel; - asm volatile( - "movd %6,%%xmm2 \n" - "movd %7,%%xmm3 \n" - "movl $0x04040000,%k2 \n" - "movd %k2,%%xmm5 \n" - "pcmpeqb %%xmm6,%%xmm6 \n" - "psrlw $0x9,%%xmm6 \n" // 0x007f007f - "pcmpeqb %%xmm7,%%xmm7 \n" - "psrlw $15,%%xmm7 \n" // 0x00010001 - - "pextrw $0x1,%%xmm2,%k3 \n" - "subl $0x2,%5 \n" - "jl 29f \n" - "movdqa %%xmm2,%%xmm0 \n" - "paddd %%xmm3,%%xmm0 \n" - "punpckldq %%xmm0,%%xmm2 \n" - "punpckldq %%xmm3,%%xmm3 \n" - "paddd %%xmm3,%%xmm3 \n" - "pextrw $0x3,%%xmm2,%k4 \n" - - LABELALIGN - "2: \n" - "movdqa %%xmm2,%%xmm1 \n" - "paddd %%xmm3,%%xmm2 \n" - "movzwl 0x00(%1,%3,1),%k2 \n" - "movd %k2,%%xmm0 \n" - "psrlw $0x9,%%xmm1 \n" - "movzwl 0x00(%1,%4,1),%k2 \n" - "movd %k2,%%xmm4 \n" - "pshufb %%xmm5,%%xmm1 \n" - "punpcklwd %%xmm4,%%xmm0 \n" - "psubb %8,%%xmm0 \n" // make pixels signed. - "pxor %%xmm6,%%xmm1 \n" // 128 - f = (f ^ 127 ) + - // 1 - "paddusb %%xmm7,%%xmm1 \n" - "pmaddubsw %%xmm0,%%xmm1 \n" - "pextrw $0x1,%%xmm2,%k3 \n" - "pextrw $0x3,%%xmm2,%k4 \n" - "paddw %9,%%xmm1 \n" // make pixels unsigned. - "psrlw $0x7,%%xmm1 \n" - "packuswb %%xmm1,%%xmm1 \n" - "movd %%xmm1,%k2 \n" - "mov %w2,(%0) \n" - "lea 0x2(%0),%0 \n" - "subl $0x2,%5 \n" - "jge 2b \n" - - LABELALIGN - "29: \n" - "addl $0x1,%5 \n" - "jl 99f \n" - "movzwl 0x00(%1,%3,1),%k2 \n" - "movd %k2,%%xmm0 \n" - "psrlw $0x9,%%xmm2 \n" - "pshufb %%xmm5,%%xmm2 \n" - "psubb %8,%%xmm0 \n" // make pixels signed. - "pxor %%xmm6,%%xmm2 \n" - "paddusb %%xmm7,%%xmm2 \n" - "pmaddubsw %%xmm0,%%xmm2 \n" - "paddw %9,%%xmm2 \n" // make pixels unsigned. - "psrlw $0x7,%%xmm2 \n" - "packuswb %%xmm2,%%xmm2 \n" - "movd %%xmm2,%k2 \n" - "mov %b2,(%0) \n" - "99: \n" - : "+r"(dst_ptr), // %0 - "+r"(src_ptr), // %1 - "=&a"(temp_pixel), // %2 - "=&r"(x0), // %3 - "=&r"(x1), // %4 -#if defined(__x86_64__) - "+rm"(dst_width) // %5 -#else - "+m"(dst_width) // %5 -#endif - : "rm"(x), // %6 - "rm"(dx), // %7 -#if defined(__x86_64__) - "x"(kFsub80), // %8 - "x"(kFadd40) // %9 -#else - "m"(kFsub80), // %8 - "m"(kFadd40) // %9 -#endif - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", - "xmm7"); -} - -// Reads 4 pixels, duplicates them and writes 8 pixels. -// Alignment requirement: src_argb 16 byte aligned, dst_argb 16 byte aligned. -void ScaleColsUp2_SSE2(uint8_t* dst_ptr, - const uint8_t* src_ptr, - int dst_width, - int x, - int dx) { - (void)x; - (void)dx; - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%1),%%xmm0 \n" - "lea 0x10(%1),%1 \n" - "movdqa %%xmm0,%%xmm1 \n" - "punpcklbw %%xmm0,%%xmm0 \n" - "punpckhbw %%xmm1,%%xmm1 \n" - "movdqu %%xmm0,(%0) \n" - "movdqu %%xmm1,0x10(%0) \n" - "lea 0x20(%0),%0 \n" - "sub $0x20,%2 \n" - "jg 1b \n" - - : "+r"(dst_ptr), // %0 - "+r"(src_ptr), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1"); -} - -void ScaleARGBRowDown2_SSE2(const uint8_t* src_argb, - ptrdiff_t src_stride, - uint8_t* dst_argb, - int dst_width) { - (void)src_stride; - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "lea 0x20(%0),%0 \n" - "shufps $0xdd,%%xmm1,%%xmm0 \n" - "movdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" - "sub $0x4,%2 \n" - "jg 1b \n" - : "+r"(src_argb), // %0 - "+r"(dst_argb), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1"); -} - -void ScaleARGBRowDown2Linear_SSE2(const uint8_t* src_argb, - ptrdiff_t src_stride, - uint8_t* dst_argb, - int dst_width) { - (void)src_stride; - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "lea 0x20(%0),%0 \n" - "movdqa %%xmm0,%%xmm2 \n" - "shufps $0x88,%%xmm1,%%xmm0 \n" - "shufps $0xdd,%%xmm1,%%xmm2 \n" - "pavgb %%xmm2,%%xmm0 \n" - "movdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" - "sub $0x4,%2 \n" - "jg 1b \n" - : "+r"(src_argb), // %0 - "+r"(dst_argb), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1"); -} - -void ScaleARGBRowDown2Box_SSE2(const uint8_t* src_argb, - ptrdiff_t src_stride, - uint8_t* dst_argb, - int dst_width) { - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" - "movdqu 0x10(%0),%%xmm1 \n" - "movdqu 0x00(%0,%3,1),%%xmm2 \n" - "movdqu 0x10(%0,%3,1),%%xmm3 \n" - "lea 0x20(%0),%0 \n" - "pavgb %%xmm2,%%xmm0 \n" - "pavgb %%xmm3,%%xmm1 \n" - "movdqa %%xmm0,%%xmm2 \n" - "shufps $0x88,%%xmm1,%%xmm0 \n" - "shufps $0xdd,%%xmm1,%%xmm2 \n" - "pavgb %%xmm2,%%xmm0 \n" - "movdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" - "sub $0x4,%2 \n" - "jg 1b \n" - : "+r"(src_argb), // %0 - "+r"(dst_argb), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)) // %3 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3"); -} - -// Reads 4 pixels at a time. -// Alignment requirement: dst_argb 16 byte aligned. -void ScaleARGBRowDownEven_SSE2(const uint8_t* src_argb, - ptrdiff_t src_stride, - int src_stepx, - uint8_t* dst_argb, - int dst_width) { - intptr_t src_stepx_x4 = (intptr_t)(src_stepx); - intptr_t src_stepx_x12; - (void)src_stride; - asm volatile( - "lea 0x00(,%1,4),%1 \n" - "lea 0x00(%1,%1,2),%4 \n" - - LABELALIGN - "1: \n" - "movd (%0),%%xmm0 \n" - "movd 0x00(%0,%1,1),%%xmm1 \n" - "punpckldq %%xmm1,%%xmm0 \n" - "movd 0x00(%0,%1,2),%%xmm2 \n" - "movd 0x00(%0,%4,1),%%xmm3 \n" - "lea 0x00(%0,%1,4),%0 \n" - "punpckldq %%xmm3,%%xmm2 \n" - "punpcklqdq %%xmm2,%%xmm0 \n" - "movdqu %%xmm0,(%2) \n" - "lea 0x10(%2),%2 \n" - "sub $0x4,%3 \n" - "jg 1b \n" - : "+r"(src_argb), // %0 - "+r"(src_stepx_x4), // %1 - "+r"(dst_argb), // %2 - "+r"(dst_width), // %3 - "=&r"(src_stepx_x12) // %4 - ::"memory", - "cc", "xmm0", "xmm1", "xmm2", "xmm3"); -} - -// Blends four 2x2 to 4x1. -// Alignment requirement: dst_argb 16 byte aligned. -void ScaleARGBRowDownEvenBox_SSE2(const uint8_t* src_argb, - ptrdiff_t src_stride, - int src_stepx, - uint8_t* dst_argb, - int dst_width) { - intptr_t src_stepx_x4 = (intptr_t)(src_stepx); - intptr_t src_stepx_x12; - intptr_t row1 = (intptr_t)(src_stride); - asm volatile( - "lea 0x00(,%1,4),%1 \n" - "lea 0x00(%1,%1,2),%4 \n" - "lea 0x00(%0,%5,1),%5 \n" - - LABELALIGN - "1: \n" - "movq (%0),%%xmm0 \n" - "movhps 0x00(%0,%1,1),%%xmm0 \n" - "movq 0x00(%0,%1,2),%%xmm1 \n" - "movhps 0x00(%0,%4,1),%%xmm1 \n" - "lea 0x00(%0,%1,4),%0 \n" - "movq (%5),%%xmm2 \n" - "movhps 0x00(%5,%1,1),%%xmm2 \n" - "movq 0x00(%5,%1,2),%%xmm3 \n" - "movhps 0x00(%5,%4,1),%%xmm3 \n" - "lea 0x00(%5,%1,4),%5 \n" - "pavgb %%xmm2,%%xmm0 \n" - "pavgb %%xmm3,%%xmm1 \n" - "movdqa %%xmm0,%%xmm2 \n" - "shufps $0x88,%%xmm1,%%xmm0 \n" - "shufps $0xdd,%%xmm1,%%xmm2 \n" - "pavgb %%xmm2,%%xmm0 \n" - "movdqu %%xmm0,(%2) \n" - "lea 0x10(%2),%2 \n" - "sub $0x4,%3 \n" - "jg 1b \n" - : "+r"(src_argb), // %0 - "+r"(src_stepx_x4), // %1 - "+r"(dst_argb), // %2 - "+rm"(dst_width), // %3 - "=&r"(src_stepx_x12), // %4 - "+r"(row1) // %5 - ::"memory", - "cc", "xmm0", "xmm1", "xmm2", "xmm3"); -} - -void ScaleARGBCols_SSE2(uint8_t* dst_argb, - const uint8_t* src_argb, - int dst_width, - int x, - int dx) { - intptr_t x0, x1; - asm volatile( - "movd %5,%%xmm2 \n" - "movd %6,%%xmm3 \n" - "pshufd $0x0,%%xmm2,%%xmm2 \n" - "pshufd $0x11,%%xmm3,%%xmm0 \n" - "paddd %%xmm0,%%xmm2 \n" - "paddd %%xmm3,%%xmm3 \n" - "pshufd $0x5,%%xmm3,%%xmm0 \n" - "paddd %%xmm0,%%xmm2 \n" - "paddd %%xmm3,%%xmm3 \n" - "pshufd $0x0,%%xmm3,%%xmm3 \n" - "pextrw $0x1,%%xmm2,%k0 \n" - "pextrw $0x3,%%xmm2,%k1 \n" - "cmp $0x0,%4 \n" - "jl 99f \n" - "sub $0x4,%4 \n" - "jl 49f \n" - - LABELALIGN - "40: \n" - "movd 0x00(%3,%0,4),%%xmm0 \n" - "movd 0x00(%3,%1,4),%%xmm1 \n" - "pextrw $0x5,%%xmm2,%k0 \n" - "pextrw $0x7,%%xmm2,%k1 \n" - "paddd %%xmm3,%%xmm2 \n" - "punpckldq %%xmm1,%%xmm0 \n" - "movd 0x00(%3,%0,4),%%xmm1 \n" - "movd 0x00(%3,%1,4),%%xmm4 \n" - "pextrw $0x1,%%xmm2,%k0 \n" - "pextrw $0x3,%%xmm2,%k1 \n" - "punpckldq %%xmm4,%%xmm1 \n" - "punpcklqdq %%xmm1,%%xmm0 \n" - "movdqu %%xmm0,(%2) \n" - "lea 0x10(%2),%2 \n" - "sub $0x4,%4 \n" - "jge 40b \n" - - "49: \n" - "test $0x2,%4 \n" - "je 29f \n" - "movd 0x00(%3,%0,4),%%xmm0 \n" - "movd 0x00(%3,%1,4),%%xmm1 \n" - "pextrw $0x5,%%xmm2,%k0 \n" - "punpckldq %%xmm1,%%xmm0 \n" - "movq %%xmm0,(%2) \n" - "lea 0x8(%2),%2 \n" - "29: \n" - "test $0x1,%4 \n" - "je 99f \n" - "movd 0x00(%3,%0,4),%%xmm0 \n" - "movd %%xmm0,(%2) \n" - "99: \n" - : "=&a"(x0), // %0 - "=&d"(x1), // %1 - "+r"(dst_argb), // %2 - "+r"(src_argb), // %3 - "+r"(dst_width) // %4 - : "rm"(x), // %5 - "rm"(dx) // %6 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4"); -} - -// Reads 4 pixels, duplicates them and writes 8 pixels. -// Alignment requirement: src_argb 16 byte aligned, dst_argb 16 byte aligned. -void ScaleARGBColsUp2_SSE2(uint8_t* dst_argb, - const uint8_t* src_argb, - int dst_width, - int x, - int dx) { - (void)x; - (void)dx; - asm volatile( - - LABELALIGN - "1: \n" - "movdqu (%1),%%xmm0 \n" - "lea 0x10(%1),%1 \n" - "movdqa %%xmm0,%%xmm1 \n" - "punpckldq %%xmm0,%%xmm0 \n" - "punpckhdq %%xmm1,%%xmm1 \n" - "movdqu %%xmm0,(%0) \n" - "movdqu %%xmm1,0x10(%0) \n" - "lea 0x20(%0),%0 \n" - "sub $0x8,%2 \n" - "jg 1b \n" - - : "+r"(dst_argb), // %0 - "+r"(src_argb), // %1 - "+r"(dst_width) // %2 - ::"memory", - "cc", "xmm0", "xmm1"); -} - -// Shuffle table for arranging 2 pixels into pairs for pmaddubsw -static const uvec8 kShuffleColARGB = { - 0u, 4u, 1u, 5u, 2u, 6u, 3u, 7u, // bbggrraa 1st pixel - 8u, 12u, 9u, 13u, 10u, 14u, 11u, 15u // bbggrraa 2nd pixel -}; - -// Shuffle table for duplicating 2 fractions into 8 bytes each -static const uvec8 kShuffleFractions = { - 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, -}; - -// Bilinear row filtering combines 4x2 -> 4x1. SSSE3 version -void ScaleARGBFilterCols_SSSE3(uint8_t* dst_argb, - const uint8_t* src_argb, - int dst_width, - int x, - int dx) { - intptr_t x0, x1; - asm volatile( - "movdqa %0,%%xmm4 \n" - "movdqa %1,%%xmm5 \n" - : - : "m"(kShuffleColARGB), // %0 - "m"(kShuffleFractions) // %1 - ); - - asm volatile( - "movd %5,%%xmm2 \n" - "movd %6,%%xmm3 \n" - "pcmpeqb %%xmm6,%%xmm6 \n" - "psrlw $0x9,%%xmm6 \n" - "pextrw $0x1,%%xmm2,%k3 \n" - "sub $0x2,%2 \n" - "jl 29f \n" - "movdqa %%xmm2,%%xmm0 \n" - "paddd %%xmm3,%%xmm0 \n" - "punpckldq %%xmm0,%%xmm2 \n" - "punpckldq %%xmm3,%%xmm3 \n" - "paddd %%xmm3,%%xmm3 \n" - "pextrw $0x3,%%xmm2,%k4 \n" - - LABELALIGN - "2: \n" - "movdqa %%xmm2,%%xmm1 \n" - "paddd %%xmm3,%%xmm2 \n" - "movq 0x00(%1,%3,4),%%xmm0 \n" - "psrlw $0x9,%%xmm1 \n" - "movhps 0x00(%1,%4,4),%%xmm0 \n" - "pshufb %%xmm5,%%xmm1 \n" - "pshufb %%xmm4,%%xmm0 \n" - "pxor %%xmm6,%%xmm1 \n" - "pmaddubsw %%xmm1,%%xmm0 \n" - "psrlw $0x7,%%xmm0 \n" - "pextrw $0x1,%%xmm2,%k3 \n" - "pextrw $0x3,%%xmm2,%k4 \n" - "packuswb %%xmm0,%%xmm0 \n" - "movq %%xmm0,(%0) \n" - "lea 0x8(%0),%0 \n" - "sub $0x2,%2 \n" - "jge 2b \n" - - LABELALIGN - "29: \n" - "add $0x1,%2 \n" - "jl 99f \n" - "psrlw $0x9,%%xmm2 \n" - "movq 0x00(%1,%3,4),%%xmm0 \n" - "pshufb %%xmm5,%%xmm2 \n" - "pshufb %%xmm4,%%xmm0 \n" - "pxor %%xmm6,%%xmm2 \n" - "pmaddubsw %%xmm2,%%xmm0 \n" - "psrlw $0x7,%%xmm0 \n" - "packuswb %%xmm0,%%xmm0 \n" - "movd %%xmm0,(%0) \n" - - LABELALIGN - "99: \n" // clang-format error. - - : "+r"(dst_argb), // %0 - "+r"(src_argb), // %1 - "+rm"(dst_width), // %2 - "=&r"(x0), // %3 - "=&r"(x1) // %4 - : "rm"(x), // %5 - "rm"(dx) // %6 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6"); -} - -// Divide num by div and return as 16.16 fixed point result. -int FixedDiv_X86(int num, int div) { - asm volatile( - "cdq \n" - "shld $0x10,%%eax,%%edx \n" - "shl $0x10,%%eax \n" - "idiv %1 \n" - "mov %0, %%eax \n" - : "+a"(num) // %0 - : "c"(div) // %1 - : "memory", "cc", "edx"); - return num; -} - -// Divide num - 1 by div - 1 and return as 16.16 fixed point result. -int FixedDiv1_X86(int num, int div) { - asm volatile( - "cdq \n" - "shld $0x10,%%eax,%%edx \n" - "shl $0x10,%%eax \n" - "sub $0x10001,%%eax \n" - "sbb $0x0,%%edx \n" - "sub $0x1,%1 \n" - "idiv %1 \n" - "mov %0, %%eax \n" - : "+a"(num) // %0 - : "c"(div) // %1 - : "memory", "cc", "edx"); - return num; -} - -#ifdef HAS_SCALEUVROWDOWN2BOX_SSSE3 -// Shuffle table for splitting UV into upper and lower part of register. -static const uvec8 kShuffleSplitUV = {0u, 2u, 4u, 6u, 8u, 10u, 12u, 14u, - 1u, 3u, 5u, 7u, 9u, 11u, 13u, 15u}; -static const uvec8 kShuffleMergeUV = {0u, 8u, 2u, 10u, 4u, 12u, - 6u, 14u, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80}; - -void ScaleUVRowDown2Box_SSSE3(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "pcmpeqb %%xmm4,%%xmm4 \n" // 01010101 - "psrlw $0xf,%%xmm4 \n" - "packuswb %%xmm4,%%xmm4 \n" - "pxor %%xmm5, %%xmm5 \n" // zero - "movdqa %4,%%xmm1 \n" // split shuffler - "movdqa %5,%%xmm3 \n" // merge shuffler - - LABELALIGN - "1: \n" - "movdqu (%0),%%xmm0 \n" // 8 UV row 0 - "movdqu 0x00(%0,%3,1),%%xmm2 \n" // 8 UV row 1 - "lea 0x10(%0),%0 \n" - "pshufb %%xmm1,%%xmm0 \n" // uuuuvvvv - "pshufb %%xmm1,%%xmm2 \n" - "pmaddubsw %%xmm4,%%xmm0 \n" // horizontal add - "pmaddubsw %%xmm4,%%xmm2 \n" - "paddw %%xmm2,%%xmm0 \n" // vertical add - "psrlw $0x1,%%xmm0 \n" // round - "pavgw %%xmm5,%%xmm0 \n" - "pshufb %%xmm3,%%xmm0 \n" // merge uv - "movq %%xmm0,(%1) \n" - "lea 0x8(%1),%1 \n" // 4 UV - "sub $0x4,%2 \n" - "jg 1b \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)), // %3 - "m"(kShuffleSplitUV), // %4 - "m"(kShuffleMergeUV) // %5 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); -} -#endif // HAS_SCALEUVROWDOWN2BOX_SSSE3 - -#ifdef HAS_SCALEUVROWDOWN2BOX_AVX2 -void ScaleUVRowDown2Box_AVX2(const uint8_t* src_ptr, - ptrdiff_t src_stride, - uint8_t* dst_ptr, - int dst_width) { - asm volatile( - "vpcmpeqb %%ymm4,%%ymm4,%%ymm4 \n" // 01010101 - "vpsrlw $0xf,%%ymm4,%%ymm4 \n" - "vpackuswb %%ymm4,%%ymm4,%%ymm4 \n" - "vpxor %%ymm5,%%ymm5,%%ymm5 \n" // zero - "vbroadcastf128 %4,%%ymm1 \n" // split shuffler - "vbroadcastf128 %5,%%ymm3 \n" // merge shuffler - - LABELALIGN - "1: \n" - "vmovdqu (%0),%%ymm0 \n" // 16 UV row 0 - "vmovdqu 0x00(%0,%3,1),%%ymm2 \n" // 16 UV row 1 - "lea 0x20(%0),%0 \n" - "vpshufb %%ymm1,%%ymm0,%%ymm0 \n" // uuuuvvvv - "vpshufb %%ymm1,%%ymm2,%%ymm2 \n" - "vpmaddubsw %%ymm4,%%ymm0,%%ymm0 \n" // horizontal add - "vpmaddubsw %%ymm4,%%ymm2,%%ymm2 \n" - "vpaddw %%ymm2,%%ymm0,%%ymm0 \n" // vertical add - "vpsrlw $0x1,%%ymm0,%%ymm0 \n" // round - "vpavgw %%ymm5,%%ymm0,%%ymm0 \n" - "vpshufb %%ymm3,%%ymm0,%%ymm0 \n" // merge uv - "vpermq $0xd8,%%ymm0,%%ymm0 \n" // combine qwords - "vmovdqu %%xmm0,(%1) \n" - "lea 0x10(%1),%1 \n" // 8 UV - "sub $0x8,%2 \n" - "jg 1b \n" - "vzeroupper \n" - : "+r"(src_ptr), // %0 - "+r"(dst_ptr), // %1 - "+r"(dst_width) // %2 - : "r"((intptr_t)(src_stride)), // %3 - "m"(kShuffleSplitUV), // %4 - "m"(kShuffleMergeUV) // %5 - : "memory", "cc", "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5"); -} -#endif // HAS_SCALEUVROWDOWN2BOX_AVX2 - -#endif // defined(__x86_64__) || defined(__i386__) - -#ifdef __cplusplus -} // extern "C" -} // namespace libyuv -#endif diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.bat b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.bat deleted file mode 100755 index 9d4c8ca8d3..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.bat +++ /dev/null @@ -1,53 +0,0 @@ -@echo off -:: Copyright (c) 2011 The Chromium Authors. All rights reserved. -:: Use of this source code is governed by a BSD-style license that can be -:: found in the LICENSE file. - -setlocal - -set THISDIR=%~dp0 -set TOOL_NAME="unknown" - -:: Get the tool name and put it into TOOL_NAME {{{1 -:: NB: SHIFT command doesn't modify %* -:PARSE_ARGS_LOOP - if %1 == () GOTO:TOOLNAME_NOT_FOUND - if %1 == --tool GOTO:TOOLNAME_FOUND - SHIFT - goto :PARSE_ARGS_LOOP - -:TOOLNAME_NOT_FOUND -echo "Please specify a tool (e.g. drmemory) by using --tool flag" -exit /B 1 - -:TOOLNAME_FOUND -SHIFT -set TOOL_NAME=%1 -:: }}} -if "%TOOL_NAME%" == "drmemory" GOTO :SETUP_DRMEMORY -if "%TOOL_NAME%" == "drmemory_light" GOTO :SETUP_DRMEMORY -if "%TOOL_NAME%" == "drmemory_full" GOTO :SETUP_DRMEMORY -if "%TOOL_NAME%" == "drmemory_pattern" GOTO :SETUP_DRMEMORY -echo "Unknown tool: `%TOOL_NAME%`! Only drmemory is supported right now" -exit /B 1 - -:SETUP_DRMEMORY -:: Set up DRMEMORY_COMMAND to invoke Dr. Memory {{{1 -set DRMEMORY_PATH=%THISDIR%..\..\third_party\drmemory -set DRMEMORY_SFX=%DRMEMORY_PATH%\drmemory-windows-sfx.exe -if EXIST %DRMEMORY_SFX% GOTO DRMEMORY_BINARY_OK -echo "Can't find Dr. Memory executables." -echo "See http://www.chromium.org/developers/how-tos/using-valgrind/dr-memory" -echo "for the instructions on how to get them." -exit /B 1 - -:DRMEMORY_BINARY_OK -%DRMEMORY_SFX% -o%DRMEMORY_PATH%\unpacked -y -set DRMEMORY_COMMAND=%DRMEMORY_PATH%\unpacked\bin\drmemory.exe -:: }}} -goto :RUN_TESTS - -:RUN_TESTS -set PYTHONPATH=%THISDIR%../python/google -set RUNNING_ON_VALGRIND=yes -python %THISDIR%/chrome_tests.py %* diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.py b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.py deleted file mode 100755 index fe899bce14..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.py +++ /dev/null @@ -1,869 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -''' Runs various chrome tests through valgrind_test.py.''' - -import glob -import logging -import multiprocessing -import optparse -import os -import stat -import subprocess -import sys - -import logging_utils -import path_utils - -import common -import valgrind_test - -class TestNotFound(Exception): pass - -class MultipleGTestFiltersSpecified(Exception): pass - -class BuildDirNotFound(Exception): pass - -class BuildDirAmbiguous(Exception): pass - -class ExecutableNotFound(Exception): pass - -class BadBinary(Exception): pass - -class ChromeTests: - SLOW_TOOLS = ["memcheck", "drmemory"] - LAYOUT_TESTS_DEFAULT_CHUNK_SIZE = 300 - - def __init__(self, options, args, test): - if ':' in test: - (self._test, self._gtest_filter) = test.split(':', 1) - else: - self._test = test - self._gtest_filter = options.gtest_filter - - if self._test not in self._test_list: - raise TestNotFound("Unknown test: %s" % test) - - if options.gtest_filter and options.gtest_filter != self._gtest_filter: - raise MultipleGTestFiltersSpecified("Can not specify both --gtest_filter " - "and --test %s" % test) - - self._options = options - self._args = args - - script_dir = path_utils.ScriptDir() - # Compute the top of the tree (the "source dir") from the script dir (where - # this script lives). We assume that the script dir is in tools/valgrind/ - # relative to the top of the tree. - self._source_dir = os.path.dirname(os.path.dirname(script_dir)) - # since this path is used for string matching, make sure it's always - # an absolute Unix-style path - self._source_dir = os.path.abspath(self._source_dir).replace('\\', '/') - valgrind_test_script = os.path.join(script_dir, "valgrind_test.py") - self._command_preamble = ["--source-dir=%s" % (self._source_dir)] - - if not self._options.build_dir: - dirs = [ - os.path.join(self._source_dir, "xcodebuild", "Debug"), - os.path.join(self._source_dir, "out", "Debug"), - os.path.join(self._source_dir, "build", "Debug"), - ] - build_dir = [d for d in dirs if os.path.isdir(d)] - if len(build_dir) > 1: - raise BuildDirAmbiguous("Found more than one suitable build dir:\n" - "%s\nPlease specify just one " - "using --build-dir" % ", ".join(build_dir)) - elif build_dir: - self._options.build_dir = build_dir[0] - else: - self._options.build_dir = None - - if self._options.build_dir: - build_dir = os.path.abspath(self._options.build_dir) - self._command_preamble += ["--build-dir=%s" % (self._options.build_dir)] - - def _EnsureBuildDirFound(self): - if not self._options.build_dir: - raise BuildDirNotFound("Oops, couldn't find a build dir, please " - "specify it manually using --build-dir") - - def _DefaultCommand(self, tool, exe=None, valgrind_test_args=None): - '''Generates the default command array that most tests will use.''' - if exe and common.IsWindows(): - exe += '.exe' - - cmd = list(self._command_preamble) - - # Find all suppressions matching the following pattern: - # tools/valgrind/TOOL/suppressions[_PLATFORM].txt - # and list them with --suppressions= prefix. - script_dir = path_utils.ScriptDir() - tool_name = tool.ToolName(); - suppression_file = os.path.join(script_dir, tool_name, "suppressions.txt") - if os.path.exists(suppression_file): - cmd.append("--suppressions=%s" % suppression_file) - # Platform-specific suppression - for platform in common.PlatformNames(): - platform_suppression_file = \ - os.path.join(script_dir, tool_name, 'suppressions_%s.txt' % platform) - if os.path.exists(platform_suppression_file): - cmd.append("--suppressions=%s" % platform_suppression_file) - - if tool_name == "drmemory": - if self._options.drmemory_ops: - # prepending " " to avoid Dr. Memory's option confusing optparse - cmd += ["--drmemory_ops", " " + self._options.drmemory_ops] - - if self._options.valgrind_tool_flags: - cmd += self._options.valgrind_tool_flags.split(" ") - if self._options.keep_logs: - cmd += ["--keep_logs"] - if valgrind_test_args != None: - for arg in valgrind_test_args: - cmd.append(arg) - if exe: - self._EnsureBuildDirFound() - exe_path = os.path.join(self._options.build_dir, exe) - if not os.path.exists(exe_path): - raise ExecutableNotFound("Couldn't find '%s'" % exe_path) - - # Make sure we don't try to test ASan-built binaries - # with other dynamic instrumentation-based tools. - # TODO(timurrrr): also check TSan and MSan? - # `nm` might not be available, so use try-except. - try: - # Do not perform this check on OS X, as 'nm' on 10.6 can't handle - # binaries built with Clang 3.5+. - if not common.IsMac(): - nm_output = subprocess.check_output(["nm", exe_path]) - if nm_output.find("__asan_init") != -1: - raise BadBinary("You're trying to run an executable instrumented " - "with AddressSanitizer under %s. Please provide " - "an uninstrumented executable." % tool_name) - except OSError: - pass - - cmd.append(exe_path) - # Valgrind runs tests slowly, so slow tests hurt more; show elapased time - # so we can find the slowpokes. - cmd.append("--gtest_print_time") - # Built-in test launcher for gtest-based executables runs tests using - # multiple process by default. Force the single-process mode back. - cmd.append("--single-process-tests") - if self._options.gtest_repeat: - cmd.append("--gtest_repeat=%s" % self._options.gtest_repeat) - if self._options.gtest_shuffle: - cmd.append("--gtest_shuffle") - if self._options.gtest_break_on_failure: - cmd.append("--gtest_break_on_failure") - if self._options.test_launcher_bot_mode: - cmd.append("--test-launcher-bot-mode") - if self._options.test_launcher_total_shards is not None: - cmd.append("--test-launcher-total-shards=%d" - % self._options.test_launcher_total_shards) - if self._options.test_launcher_shard_index is not None: - cmd.append("--test-launcher-shard-index=%d" - % self._options.test_launcher_shard_index) - return cmd - - def Run(self): - ''' Runs the test specified by command-line argument --test ''' - logging.info("running test %s" % (self._test)) - return self._test_list[self._test](self) - - def _AppendGtestFilter(self, tool, name, cmd): - '''Append an appropriate --gtest_filter flag to the googletest binary - invocation. - If the user passed their own filter mentioning only one test, just use - it. Otherwise, filter out tests listed in the appropriate gtest_exclude - files. - ''' - if (self._gtest_filter and - ":" not in self._gtest_filter and - "?" not in self._gtest_filter and - "*" not in self._gtest_filter): - cmd.append("--gtest_filter=%s" % self._gtest_filter) - return - - filters = [] - gtest_files_dir = os.path.join(path_utils.ScriptDir(), "gtest_exclude") - - gtest_filter_files = [ - os.path.join(gtest_files_dir, name + ".gtest-%s.txt" % tool.ToolName())] - # Use ".gtest.txt" files only for slow tools, as they now contain - # Valgrind- and Dr.Memory-specific filters. - # TODO(glider): rename the files to ".gtest_slow.txt" - if tool.ToolName() in ChromeTests.SLOW_TOOLS: - gtest_filter_files += [os.path.join(gtest_files_dir, name + ".gtest.txt")] - for platform_suffix in common.PlatformNames(): - gtest_filter_files += [ - os.path.join(gtest_files_dir, name + ".gtest_%s.txt" % platform_suffix), - os.path.join(gtest_files_dir, name + ".gtest-%s_%s.txt" % \ - (tool.ToolName(), platform_suffix))] - logging.info("Reading gtest exclude filter files:") - for filename in gtest_filter_files: - # strip the leading absolute path (may be very long on the bot) - # and the following / or \. - readable_filename = filename.replace("\\", "/") # '\' on Windows - readable_filename = readable_filename.replace(self._source_dir, "")[1:] - if not os.path.exists(filename): - logging.info(" \"%s\" - not found" % readable_filename) - continue - logging.info(" \"%s\" - OK" % readable_filename) - f = open(filename, 'r') - for line in f.readlines(): - if line.startswith("#") or line.startswith("//") or line.isspace(): - continue - line = line.rstrip() - test_prefixes = ["FLAKY", "FAILS"] - for p in test_prefixes: - # Strip prefixes from the test names. - line = line.replace(".%s_" % p, ".") - # Exclude the original test name. - filters.append(line) - if line[-2:] != ".*": - # List all possible prefixes if line doesn't end with ".*". - for p in test_prefixes: - filters.append(line.replace(".", ".%s_" % p)) - # Get rid of duplicates. - filters = set(filters) - gtest_filter = self._gtest_filter - if len(filters): - if gtest_filter: - gtest_filter += ":" - if gtest_filter.find("-") < 0: - gtest_filter += "-" - else: - gtest_filter = "-" - gtest_filter += ":".join(filters) - if gtest_filter: - cmd.append("--gtest_filter=%s" % gtest_filter) - - @staticmethod - def ShowTests(): - test_to_names = {} - for name, test_function in ChromeTests._test_list.iteritems(): - test_to_names.setdefault(test_function, []).append(name) - - name_to_aliases = {} - for names in test_to_names.itervalues(): - names.sort(key=lambda name: len(name)) - name_to_aliases[names[0]] = names[1:] - - print - print "Available tests:" - print "----------------" - for name, aliases in sorted(name_to_aliases.iteritems()): - if aliases: - print " {} (aka {})".format(name, ', '.join(aliases)) - else: - print " {}".format(name) - - def SetupLdPath(self, requires_build_dir): - if requires_build_dir: - self._EnsureBuildDirFound() - elif not self._options.build_dir: - return - - # Append build_dir to LD_LIBRARY_PATH so external libraries can be loaded. - if (os.getenv("LD_LIBRARY_PATH")): - os.putenv("LD_LIBRARY_PATH", "%s:%s" % (os.getenv("LD_LIBRARY_PATH"), - self._options.build_dir)) - else: - os.putenv("LD_LIBRARY_PATH", self._options.build_dir) - - def SimpleTest(self, module, name, valgrind_test_args=None, cmd_args=None): - tool = valgrind_test.CreateTool(self._options.valgrind_tool) - cmd = self._DefaultCommand(tool, name, valgrind_test_args) - self._AppendGtestFilter(tool, name, cmd) - cmd.extend(['--test-tiny-timeout=1000']) - if cmd_args: - cmd.extend(cmd_args) - - self.SetupLdPath(True) - return tool.Run(cmd, module) - - def RunCmdLine(self): - tool = valgrind_test.CreateTool(self._options.valgrind_tool) - cmd = self._DefaultCommand(tool, None, self._args) - self.SetupLdPath(False) - return tool.Run(cmd, None) - - def TestAccessibility(self): - return self.SimpleTest("accessibility", "accessibility_unittests") - - def TestAddressInput(self): - return self.SimpleTest("addressinput", "libaddressinput_unittests") - - def TestAngle(self): - return self.SimpleTest("angle", "angle_unittests") - - def TestAppList(self): - return self.SimpleTest("app_list", "app_list_unittests") - - def TestAsh(self): - return self.SimpleTest("ash", "ash_unittests") - - def TestAura(self): - return self.SimpleTest("aura", "aura_unittests") - - def TestBase(self): - return self.SimpleTest("base", "base_unittests") - - def TestBlinkHeap(self): - return self.SimpleTest("blink_heap", "blink_heap_unittests") - - def TestBlinkPlatform(self): - return self.SimpleTest("blink_platform", "blink_platform_unittests") - - def TestCacheInvalidation(self): - return self.SimpleTest("cacheinvalidation", "cacheinvalidation_unittests") - - def TestCast(self): - return self.SimpleTest("chrome", "cast_unittests") - - def TestCC(self): - return self.SimpleTest("cc", "cc_unittests", - cmd_args=[ - "--cc-layer-tree-test-long-timeout"]) - - def TestChromeApp(self): - return self.SimpleTest("chrome_app", "chrome_app_unittests") - - def TestChromeElf(self): - return self.SimpleTest("chrome_elf", "chrome_elf_unittests") - - def TestChromeDriver(self): - return self.SimpleTest("chromedriver", "chromedriver_unittests") - - def TestChromeOS(self): - return self.SimpleTest("chromeos", "chromeos_unittests") - - def TestComponents(self): - return self.SimpleTest("components", "components_unittests") - - def TestCompositor(self): - return self.SimpleTest("compositor", "compositor_unittests") - - def TestContent(self): - return self.SimpleTest("content", "content_unittests") - - def TestCourgette(self): - return self.SimpleTest("courgette", "courgette_unittests") - - def TestCrypto(self): - return self.SimpleTest("crypto", "crypto_unittests") - - def TestDevice(self): - return self.SimpleTest("device", "device_unittests") - - def TestDisplay(self): - return self.SimpleTest("display", "display_unittests") - - def TestEvents(self): - return self.SimpleTest("events", "events_unittests") - - def TestExtensions(self): - return self.SimpleTest("extensions", "extensions_unittests") - - def TestFFmpegRegressions(self): - return self.SimpleTest("chrome", "ffmpeg_regression_tests") - - def TestGCM(self): - return self.SimpleTest("gcm", "gcm_unit_tests") - - def TestGfx(self): - return self.SimpleTest("gfx", "gfx_unittests") - - def TestGin(self): - return self.SimpleTest("gin", "gin_unittests") - - def TestGoogleApis(self): - return self.SimpleTest("google_apis", "google_apis_unittests") - - def TestGPU(self): - return self.SimpleTest("gpu", "gpu_unittests") - - def TestIpc(self): - return self.SimpleTest("ipc", "ipc_tests", - valgrind_test_args=["--trace_children"]) - - def TestInstallerUtil(self): - return self.SimpleTest("installer_util", "installer_util_unittests") - - def TestInstallStatic(self): - return self.SimpleTest("install_static", "install_static_unittests") - - def TestJingle(self): - return self.SimpleTest("chrome", "jingle_unittests") - - def TestKeyboard(self): - return self.SimpleTest("keyboard", "keyboard_unittests") - - def TestLatency(self): - return self.SimpleTest("latency", "latency_unittests") - - def TestMedia(self): - return self.SimpleTest("chrome", "media_unittests") - - def TestMessageCenter(self): - return self.SimpleTest("message_center", "message_center_unittests") - - def TestMidi(self): - return self.SimpleTest("chrome", "midi_unittests") - - def TestMojoCommon(self): - return self.SimpleTest("mojo_common", "mojo_common_unittests") - - def TestMojoPublicBindings(self): - return self.SimpleTest("mojo_public_bindings", - "mojo_public_bindings_unittests") - - def TestMojoPublicSystem(self): - return self.SimpleTest("mojo_public_system", - "mojo_public_system_unittests") - - def TestMojoPublicSysPerf(self): - return self.SimpleTest("mojo_public_sysperf", - "mojo_public_system_perftests") - - def TestMojoSystem(self): - return self.SimpleTest("mojo_system", "mojo_system_unittests") - - def TestNet(self): - return self.SimpleTest("net", "net_unittests") - - def TestNetPerf(self): - return self.SimpleTest("net", "net_perftests") - - def TestPhoneNumber(self): - return self.SimpleTest("phonenumber", "libphonenumber_unittests") - - def TestPPAPI(self): - return self.SimpleTest("chrome", "ppapi_unittests") - - def TestPrinting(self): - return self.SimpleTest("chrome", "printing_unittests") - - def TestRemoting(self): - return self.SimpleTest("chrome", "remoting_unittests", - cmd_args=[ - "--ui-test-action-timeout=60000", - "--ui-test-action-max-timeout=150000"]) - - def TestSkia(self): - return self.SimpleTest("skia", "skia_unittests") - - def TestSql(self): - return self.SimpleTest("chrome", "sql_unittests") - - def TestStorage(self): - return self.SimpleTest("storage", "storage_unittests") - - def TestLinuxSandbox(self): - return self.SimpleTest("sandbox", "sandbox_linux_unittests") - - def TestUnit(self): - # http://crbug.com/51716 - # Disabling all unit tests - # Problems reappeared after r119922 - if common.IsMac() and (self._options.valgrind_tool == "memcheck"): - logging.warning("unit_tests are disabled for memcheck on MacOS.") - return 0; - return self.SimpleTest("chrome", "unit_tests") - - def TestUIBaseUnit(self): - return self.SimpleTest("chrome", "ui_base_unittests") - - def TestUIChromeOS(self): - return self.SimpleTest("chrome", "ui_chromeos_unittests") - - def TestURL(self): - return self.SimpleTest("chrome", "url_unittests") - - def TestViews(self): - return self.SimpleTest("views", "views_unittests") - - - # Valgrind timeouts are in seconds. - UI_VALGRIND_ARGS = ["--timeout=14400", "--trace_children", "--indirect"] - # UI test timeouts are in milliseconds. - UI_TEST_ARGS = ["--ui-test-action-timeout=60000", - "--ui-test-action-max-timeout=150000", - "--no-sandbox"] - - # TODO(thestig) fine-tune these values. - # Valgrind timeouts are in seconds. - BROWSER_VALGRIND_ARGS = ["--timeout=50000", "--trace_children", "--indirect"] - # Browser test timeouts are in milliseconds. - BROWSER_TEST_ARGS = ["--ui-test-action-timeout=400000", - "--ui-test-action-max-timeout=800000", - "--no-sandbox"] - - def TestBrowser(self): - return self.SimpleTest("chrome", "browser_tests", - valgrind_test_args=self.BROWSER_VALGRIND_ARGS, - cmd_args=self.BROWSER_TEST_ARGS) - - def TestContentBrowser(self): - return self.SimpleTest("content", "content_browsertests", - valgrind_test_args=self.BROWSER_VALGRIND_ARGS, - cmd_args=self.BROWSER_TEST_ARGS) - - def TestInteractiveUI(self): - return self.SimpleTest("chrome", "interactive_ui_tests", - valgrind_test_args=self.UI_VALGRIND_ARGS, - cmd_args=self.UI_TEST_ARGS) - - def TestSyncIntegration(self): - return self.SimpleTest("chrome", "sync_integration_tests", - valgrind_test_args=self.UI_VALGRIND_ARGS, - cmd_args=(["--ui-test-action-max-timeout=450000"])) - - def TestLayoutChunk(self, chunk_num, chunk_size): - # Run tests [chunk_num*chunk_size .. (chunk_num+1)*chunk_size) from the - # list of tests. Wrap around to beginning of list at end. - # If chunk_size is zero, run all tests in the list once. - # If a text file is given as argument, it is used as the list of tests. - assert((chunk_size == 0) != (len(self._args) == 0)) - # Build the ginormous commandline in 'cmd'. - # It's going to be roughly - # python valgrind_test.py ... - # but we'll use the --indirect flag to valgrind_test.py - # to avoid valgrinding python. - # Start by building the valgrind_test.py commandline. - tool = valgrind_test.CreateTool(self._options.valgrind_tool) - cmd = self._DefaultCommand(tool) - cmd.append("--trace_children") - cmd.append("--indirect_webkit_layout") - cmd.append("--ignore_exit_code") - # Now build script_cmd, the run-webkits-tests commandline. - # Store each chunk in its own directory so that we can find the data later - chunk_dir = os.path.join("layout", "chunk_%05d" % chunk_num) - out_dir = os.path.join(path_utils.ScriptDir(), "latest") - out_dir = os.path.join(out_dir, chunk_dir) - if os.path.exists(out_dir): - old_files = glob.glob(os.path.join(out_dir, "*.txt")) - for f in old_files: - os.remove(f) - else: - os.makedirs(out_dir) - script = os.path.join(self._source_dir, "third_party", "WebKit", "Tools", - "Scripts", "run-webkit-tests") - # http://crbug.com/260627: After the switch to content_shell from DRT, each - # test now brings up 3 processes. Under Valgrind, they become memory bound - # and can eventually OOM if we don't reduce the total count. - # It'd be nice if content_shell automatically throttled the startup of new - # tests if we're low on memory. - jobs = max(1, int(multiprocessing.cpu_count() * 0.3)) - script_cmd = ["python", script, "-v", - # run a separate DumpRenderTree for each test - "--batch-size=1", - "--fully-parallel", - "--child-processes=%d" % jobs, - "--time-out-ms=800000", - "--no-retry-failures", # retrying takes too much time - # http://crbug.com/176908: Don't launch a browser when done. - "--no-show-results", - "--nocheck-sys-deps", - "--additional-driver-flag=--no-sandbox"] - # Pass build mode to run-webkit-tests. We aren't passed it directly, - # so parse it out of build_dir. run-webkit-tests can only handle - # the two values "Release" and "Debug". - # TODO(Hercules): unify how all our scripts pass around build mode - # (--mode / --target / --build-dir / --debug) - if self._options.build_dir: - build_root, mode = os.path.split(self._options.build_dir) - script_cmd.extend(["--build-directory", build_root, "--target", mode]) - if (chunk_size > 0): - script_cmd.append("--run-chunk=%d:%d" % (chunk_num, chunk_size)) - if len(self._args): - # if the arg is a txt file, then treat it as a list of tests - if os.path.isfile(self._args[0]) and self._args[0][-4:] == ".txt": - script_cmd.append("--test-list=%s" % self._args[0]) - else: - script_cmd.extend(self._args) - self._AppendGtestFilter(tool, "layout", script_cmd) - # Now run script_cmd with the wrapper in cmd - cmd.extend(["--"]) - cmd.extend(script_cmd) - - # Layout tests often times fail quickly, but the buildbot remains green. - # Detect this situation when running with the default chunk size. - if chunk_size == self.LAYOUT_TESTS_DEFAULT_CHUNK_SIZE: - min_runtime_in_seconds=120 - else: - min_runtime_in_seconds=0 - ret = tool.Run(cmd, "layout", min_runtime_in_seconds=min_runtime_in_seconds) - return ret - - - def TestLayout(self): - # A "chunk file" is maintained in the local directory so that each test - # runs a slice of the layout tests of size chunk_size that increments with - # each run. Since tests can be added and removed from the layout tests at - # any time, this is not going to give exact coverage, but it will allow us - # to continuously run small slices of the layout tests under valgrind rather - # than having to run all of them in one shot. - chunk_size = self._options.num_tests - if chunk_size == 0 or len(self._args): - return self.TestLayoutChunk(0, 0) - chunk_num = 0 - chunk_file = os.path.join("valgrind_layout_chunk.txt") - logging.info("Reading state from " + chunk_file) - try: - f = open(chunk_file) - if f: - chunk_str = f.read() - if len(chunk_str): - chunk_num = int(chunk_str) - # This should be enough so that we have a couple of complete runs - # of test data stored in the archive (although note that when we loop - # that we almost guaranteed won't be at the end of the test list) - if chunk_num > 10000: - chunk_num = 0 - f.close() - except IOError, (errno, strerror): - logging.error("error reading from file %s (%d, %s)" % (chunk_file, - errno, strerror)) - # Save the new chunk size before running the tests. Otherwise if a - # particular chunk hangs the bot, the chunk number will never get - # incremented and the bot will be wedged. - logging.info("Saving state to " + chunk_file) - try: - f = open(chunk_file, "w") - chunk_num += 1 - f.write("%d" % chunk_num) - f.close() - except IOError, (errno, strerror): - logging.error("error writing to file %s (%d, %s)" % (chunk_file, errno, - strerror)) - # Since we're running small chunks of the layout tests, it's important to - # mark the ones that have errors in them. These won't be visible in the - # summary list for long, but will be useful for someone reviewing this bot. - return self.TestLayoutChunk(chunk_num, chunk_size) - - # The known list of tests. - # Recognise the original abbreviations as well as full executable names. - _test_list = { - "cmdline" : RunCmdLine, - "addressinput": TestAddressInput, - "libaddressinput_unittests": TestAddressInput, - "accessibility": TestAccessibility, - "angle": TestAngle, "angle_unittests": TestAngle, - "app_list": TestAppList, "app_list_unittests": TestAppList, - "ash": TestAsh, "ash_unittests": TestAsh, - "aura": TestAura, "aura_unittests": TestAura, - "base": TestBase, "base_unittests": TestBase, - "blink_heap": TestBlinkHeap, - "blink_platform": TestBlinkPlatform, - "browser": TestBrowser, "browser_tests": TestBrowser, - "cacheinvalidation": TestCacheInvalidation, - "cacheinvalidation_unittests": TestCacheInvalidation, - "cast": TestCast, "cast_unittests": TestCast, - "cc": TestCC, "cc_unittests": TestCC, - "chrome_app": TestChromeApp, - "chrome_elf": TestChromeElf, - "chromedriver": TestChromeDriver, - "chromeos": TestChromeOS, "chromeos_unittests": TestChromeOS, - "components": TestComponents,"components_unittests": TestComponents, - "compositor": TestCompositor,"compositor_unittests": TestCompositor, - "content": TestContent, "content_unittests": TestContent, - "content_browsertests": TestContentBrowser, - "courgette": TestCourgette, "courgette_unittests": TestCourgette, - "crypto": TestCrypto, "crypto_unittests": TestCrypto, - "device": TestDevice, "device_unittests": TestDevice, - "display": TestDisplay, "display_unittests": TestDisplay, - "events": TestEvents, "events_unittests": TestEvents, - "extensions": TestExtensions, "extensions_unittests": TestExtensions, - "ffmpeg_regression_tests": TestFFmpegRegressions, - "gcm": TestGCM, "gcm_unit_tests": TestGCM, - "gin": TestGin, "gin_unittests": TestGin, - "gfx": TestGfx, "gfx_unittests": TestGfx, - "google_apis": TestGoogleApis, - "gpu": TestGPU, "gpu_unittests": TestGPU, - "ipc": TestIpc, "ipc_tests": TestIpc, - "installer_util": TestInstallerUtil, - "installer_util_unittests": TestInstallerUtil, - "install_static_unittests": TestInstallStatic, - "interactive_ui": TestInteractiveUI, - "jingle": TestJingle, "jingle_unittests": TestJingle, - "keyboard": TestKeyboard, "keyboard_unittests": TestKeyboard, - "latency": TestLatency, "latency_unittests": TestLatency, - "layout": TestLayout, "layout_tests": TestLayout, - "media": TestMedia, "media_unittests": TestMedia, - "message_center": TestMessageCenter, - "message_center_unittests" : TestMessageCenter, - "midi": TestMidi, "midi_unittests": TestMidi, - "mojo_common": TestMojoCommon, - "mojo_common_unittests": TestMojoCommon, - "mojo_system": TestMojoSystem, - "mojo_system_unittests": TestMojoSystem, - "mojo_public_system": TestMojoPublicSystem, - "mojo_public_system_unittests": TestMojoPublicSystem, - "mojo_public_bindings": TestMojoPublicBindings, - "mojo_public_bindings_unittests": TestMojoPublicBindings, - "mojo_public_sysperf": TestMojoPublicSysPerf, - "net": TestNet, "net_unittests": TestNet, - "net_perf": TestNetPerf, "net_perftests": TestNetPerf, - "phonenumber": TestPhoneNumber, - "libphonenumber_unittests": TestPhoneNumber, - "ppapi": TestPPAPI, "ppapi_unittests": TestPPAPI, - "printing": TestPrinting, "printing_unittests": TestPrinting, - "remoting": TestRemoting, "remoting_unittests": TestRemoting, - "sandbox": TestLinuxSandbox, "sandbox_linux_unittests": TestLinuxSandbox, - "skia": TestSkia, "skia_unittests": TestSkia, - "sql": TestSql, "sql_unittests": TestSql, - "storage": TestStorage, "storage_unittests": TestStorage, - "sync_integration_tests": TestSyncIntegration, - "sync_integration": TestSyncIntegration, - "ui_base_unit": TestUIBaseUnit, "ui_base_unittests": TestUIBaseUnit, - "ui_chromeos": TestUIChromeOS, "ui_chromeos_unittests": TestUIChromeOS, - "unit": TestUnit, "unit_tests": TestUnit, - "url": TestURL, "url_unittests": TestURL, - "views": TestViews, "views_unittests": TestViews, - "webkit": TestLayout, - } - - -def _main(): - parser = optparse.OptionParser("usage: %prog -b -t " - "[-t ...]") - - parser.add_option("--help-tests", dest="help_tests", action="store_true", - default=False, help="List all available tests") - parser.add_option("-b", "--build-dir", - help="the location of the compiler output") - parser.add_option("--target", help="Debug or Release") - parser.add_option("-t", "--test", action="append", default=[], - help="which test to run, supports test:gtest_filter format " - "as well.") - parser.add_option("--baseline", action="store_true", default=False, - help="generate baseline data instead of validating") - parser.add_option("-f", "--force", action="store_true", default=False, - help="run a broken test anyway") - parser.add_option("--gtest_filter", - help="additional arguments to --gtest_filter") - parser.add_option("--gtest_repeat", help="argument for --gtest_repeat") - parser.add_option("--gtest_shuffle", action="store_true", default=False, - help="Randomize tests' orders on every iteration.") - parser.add_option("--gtest_break_on_failure", action="store_true", - default=False, - help="Drop in to debugger on assertion failure. Also " - "useful for forcing tests to exit with a stack dump " - "on the first assertion failure when running with " - "--gtest_repeat=-1") - parser.add_option("-v", "--verbose", action="store_true", default=False, - help="verbose output - enable debug log messages") - parser.add_option("--tool", dest="valgrind_tool", default="memcheck", - help="specify a valgrind tool to run the tests under") - parser.add_option("--tool_flags", dest="valgrind_tool_flags", default="", - help="specify custom flags for the selected valgrind tool") - parser.add_option("--keep_logs", action="store_true", default=False, - help="store memory tool logs in the .logs directory " - "instead of /tmp.\nThis can be useful for tool " - "developers/maintainers.\nPlease note that the " - ".logs directory will be clobbered on tool startup.") - parser.add_option("-n", "--num_tests", type="int", - default=ChromeTests.LAYOUT_TESTS_DEFAULT_CHUNK_SIZE, - help="for layout tests: # of subtests per run. 0 for all.") - parser.add_option("--test-launcher-bot-mode", action="store_true", - help="run the tests with --test-launcher-bot-mode") - parser.add_option("--test-launcher-total-shards", type=int, - help="run the tests with --test-launcher-total-shards") - parser.add_option("--test-launcher-shard-index", type=int, - help="run the tests with --test-launcher-shard-index") - parser.add_option("--drmemory_ops", - help="extra options passed to Dr. Memory") - - options, args = parser.parse_args() - - # Bake target into build_dir. - if options.target and options.build_dir: - assert (options.target != - os.path.basename(os.path.dirname(options.build_dir))) - options.build_dir = os.path.join(os.path.abspath(options.build_dir), - options.target) - - if options.verbose: - logging_utils.config_root(logging.DEBUG) - else: - logging_utils.config_root() - - if options.help_tests: - ChromeTests.ShowTests() - return 0 - - if not options.test: - parser.error("--test not specified") - - if len(options.test) != 1 and options.gtest_filter: - parser.error("--gtest_filter and multiple tests don't make sense together") - - BROKEN_TESTS = { - 'drmemory_light': [ - 'addressinput', - 'aura', - 'base_unittests', - 'cc', - 'components', # x64 only? - 'content', - 'gfx', - 'mojo_public_bindings', - ], - 'drmemory_full': [ - 'addressinput', - 'aura', - 'base_unittests', - 'blink_heap', - 'blink_platform', - 'browser_tests', - 'cast', - 'cc', - 'chromedriver', - 'compositor', - 'content', - 'content_browsertests', - 'device', - 'events', - 'extensions', - 'gfx', - 'google_apis', - 'gpu', - 'ipc_tests', - 'jingle', - 'keyboard', - 'media', - 'midi', - 'mojo_common', - 'mojo_public_bindings', - 'mojo_public_sysperf', - 'mojo_public_system', - 'mojo_system', - 'net', - 'remoting', - 'unit', - 'url', - ], - } - - for t in options.test: - if t in BROKEN_TESTS[options.valgrind_tool] and not options.force: - logging.info("Skipping broken %s test %s -- see crbug.com/633693" % - (options.valgrind_tool, t)) - return 0 - - tests = ChromeTests(options, args, t) - ret = tests.Run() - if ret: return ret - return 0 - - -if __name__ == "__main__": - sys.exit(_main()) diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.sh b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.sh deleted file mode 100755 index dc17684fec..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/chrome_tests.sh +++ /dev/null @@ -1,94 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -# Set up some paths and re-direct the arguments to chrome_tests.py - -export THISDIR=`dirname $0` -ARGV_COPY="$@" - -# We need to set CHROME_VALGRIND iff using Memcheck: -# tools/valgrind/chrome_tests.sh --tool memcheck -# or -# tools/valgrind/chrome_tests.sh --tool=memcheck -tool="memcheck" # Default to memcheck. -while (( "$#" )) -do - if [[ "$1" == "--tool" ]] - then - tool="$2" - shift - elif [[ "$1" =~ --tool=(.*) ]] - then - tool="${BASH_REMATCH[1]}" - fi - shift -done - -NEEDS_VALGRIND=0 -NEEDS_DRMEMORY=0 - -case "$tool" in - "memcheck") - NEEDS_VALGRIND=1 - ;; - "drmemory" | "drmemory_light" | "drmemory_full" | "drmemory_pattern") - NEEDS_DRMEMORY=1 - ;; -esac - -if [ "$NEEDS_VALGRIND" == "1" ] -then - export CHROME_VALGRIND=`sh $THISDIR/locate_valgrind.sh` - if [ "$CHROME_VALGRIND" = "" ] - then - # locate_valgrind.sh failed - exit 1 - fi - echo "Using valgrind binaries from ${CHROME_VALGRIND}" - - PATH="${CHROME_VALGRIND}/bin:$PATH" - # We need to set these variables to override default lib paths hard-coded into - # Valgrind binary. - export VALGRIND_LIB="$CHROME_VALGRIND/lib/valgrind" - export VALGRIND_LIB_INNER="$CHROME_VALGRIND/lib/valgrind" - - # Clean up some /tmp directories that might be stale due to interrupted - # chrome_tests.py execution. - # FYI: - # -mtime +1 <- only print files modified more than 24h ago, - # -print0/-0 are needed to handle possible newlines in the filenames. - echo "Cleanup /tmp from Valgrind stuff" - find /tmp -maxdepth 1 \(\ - -name "vgdb-pipe-*" -or -name "vg_logs_*" -or -name "valgrind.*" \ - \) -mtime +1 -print0 | xargs -0 rm -rf -fi - -if [ "$NEEDS_DRMEMORY" == "1" ] -then - if [ -z "$DRMEMORY_COMMAND" ] - then - DRMEMORY_PATH="$THISDIR/../../third_party/drmemory" - DRMEMORY_SFX="$DRMEMORY_PATH/drmemory-windows-sfx.exe" - if [ ! -f "$DRMEMORY_SFX" ] - then - echo "Can't find Dr. Memory executables." - echo "See http://www.chromium.org/developers/how-tos/using-valgrind/dr-memory" - echo "for the instructions on how to get them." - exit 1 - fi - - chmod +x "$DRMEMORY_SFX" # Cygwin won't run it without +x. - "$DRMEMORY_SFX" -o"$DRMEMORY_PATH/unpacked" -y - export DRMEMORY_COMMAND="$DRMEMORY_PATH/unpacked/bin/drmemory.exe" - fi -fi - -PYTHONPATH=$THISDIR/../python/google python \ - "$THISDIR/chrome_tests.py" $ARGV_COPY diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/common.py b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/common.py deleted file mode 100644 index e9ee51e48e..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/common.py +++ /dev/null @@ -1,256 +0,0 @@ -# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -import logging -import platform -import os -import signal -import subprocess -import sys -import time - - -class NotImplementedError(Exception): - pass - - -class TimeoutError(Exception): - pass - - -def RunSubprocessInBackground(proc): - """Runs a subprocess in the background. Returns a handle to the process.""" - logging.info("running %s in the background" % " ".join(proc)) - return subprocess.Popen(proc) - - -def RunSubprocess(proc, timeout=0): - """ Runs a subprocess, until it finishes or |timeout| is exceeded and the - process is killed with taskkill. A |timeout| <= 0 means no timeout. - - Args: - proc: list of process components (exe + args) - timeout: how long to wait before killing, <= 0 means wait forever - """ - - logging.info("running %s, timeout %d sec" % (" ".join(proc), timeout)) - sys.stdout.flush() - sys.stderr.flush() - - # Manually read and print out stdout and stderr. - # By default, the subprocess is supposed to inherit these from its parent, - # however when run under buildbot, it seems unable to read data from a - # grandchild process, so we have to read the child and print the data as if - # it came from us for buildbot to read it. We're not sure why this is - # necessary. - # TODO(erikkay): should we buffer stderr and stdout separately? - p = subprocess.Popen(proc, universal_newlines=True, - bufsize=0, # unbuffered - stdout=subprocess.PIPE, stderr=subprocess.STDOUT) - - logging.info("started subprocess") - - did_timeout = False - if timeout > 0: - wait_until = time.time() + timeout - while p.poll() is None and not did_timeout: - # Have to use readline rather than readlines() or "for line in p.stdout:", - # otherwise we get buffered even with bufsize=0. - line = p.stdout.readline() - while line and not did_timeout: - sys.stdout.write(line) - sys.stdout.flush() - line = p.stdout.readline() - if timeout > 0: - did_timeout = time.time() > wait_until - - if did_timeout: - logging.info("process timed out") - else: - logging.info("process ended, did not time out") - - if did_timeout: - if IsWindows(): - subprocess.call(["taskkill", "/T", "/F", "/PID", str(p.pid)]) - else: - # Does this kill all children, too? - os.kill(p.pid, signal.SIGINT) - logging.error("KILLED %d" % p.pid) - # Give the process a chance to actually die before continuing - # so that cleanup can happen safely. - time.sleep(1.0) - logging.error("TIMEOUT waiting for %s" % proc[0]) - raise TimeoutError(proc[0]) - else: - for line in p.stdout: - sys.stdout.write(line) - if not IsMac(): # stdout flush fails on Mac - logging.info("flushing stdout") - sys.stdout.flush() - - logging.info("collecting result code") - result = p.poll() - if result: - logging.error("%s exited with non-zero result code %d" % (proc[0], result)) - return result - - -def IsLinux(): - return sys.platform.startswith('linux') - - -def IsMac(): - return sys.platform.startswith('darwin') - - -def IsWindows(): - return sys.platform == 'cygwin' or sys.platform.startswith('win') - - -def WindowsVersionName(): - """Returns the name of the Windows version if it is known, or None. - - Possible return values are: xp, vista, 7, 8, or None - """ - if sys.platform == 'cygwin': - # Windows version number is hiding in system name. Looks like: - # CYGWIN_NT-6.1-WOW64 - try: - version_str = platform.uname()[0].split('-')[1] - except: - return None - elif sys.platform.startswith('win'): - # Normal Windows version string. Mine: 6.1.7601 - version_str = platform.version() - else: - return None - - parts = version_str.split('.') - try: - major = int(parts[0]) - minor = int(parts[1]) - except: - return None # Can't parse, unknown version. - - if major == 5: - return 'xp' - elif major == 6 and minor == 0: - return 'vista' - elif major == 6 and minor == 1: - return '7' - elif major == 6 and minor == 2: - return '8' # Future proof. ;) - return None - - -def PlatformNames(): - """Return an array of string to be used in paths for the platform - (e.g. suppressions, gtest filters, ignore files etc.) - The first element of the array describes the 'main' platform - """ - if IsLinux(): - return ['linux'] - if IsMac(): - return ['mac'] - if IsWindows(): - names = ['win32'] - version_name = WindowsVersionName() - if version_name is not None: - names.append('win-%s' % version_name) - return names - raise NotImplementedError('Unknown platform "%s".' % sys.platform) - - -def PutEnvAndLog(env_name, env_value): - os.putenv(env_name, env_value) - logging.info('export %s=%s', env_name, env_value) - -def BoringCallers(mangled, use_re_wildcards): - """Return a list of 'boring' function names (optinally mangled) - with */? wildcards (optionally .*/.). - Boring = we drop off the bottom of stack traces below such functions. - """ - - need_mangling = [ - # Don't show our testing framework: - ("testing::Test::Run", "_ZN7testing4Test3RunEv"), - ("testing::TestInfo::Run", "_ZN7testing8TestInfo3RunEv"), - ("testing::internal::Handle*ExceptionsInMethodIfSupported*", - "_ZN7testing8internal3?Handle*ExceptionsInMethodIfSupported*"), - - # Depend on scheduling: - ("MessageLoop::Run", "_ZN11MessageLoop3RunEv"), - ("MessageLoop::RunTask", "_ZN11MessageLoop7RunTask*"), - ("RunnableMethod*", "_ZN14RunnableMethod*"), - ("DispatchToMethod*", "_Z*16DispatchToMethod*"), - ("base::internal::Invoker*::DoInvoke*", - "_ZN4base8internal8Invoker*DoInvoke*"), # Invoker{1,2,3} - ("base::internal::RunnableAdapter*::Run*", - "_ZN4base8internal15RunnableAdapter*Run*"), - ] - - ret = [] - for pair in need_mangling: - ret.append(pair[1 if mangled else 0]) - - ret += [ - # Also don't show the internals of libc/pthread. - "start_thread", - "main", - "BaseThreadInitThunk", - ] - - if use_re_wildcards: - for i in range(0, len(ret)): - ret[i] = ret[i].replace('*', '.*').replace('?', '.') - - return ret - -def NormalizeWindowsPath(path): - """If we're using Cygwin Python, turn the path into a Windows path. - - Don't turn forward slashes into backslashes for easier copy-pasting and - escaping. - - TODO(rnk): If we ever want to cut out the subprocess invocation, we can use - _winreg to get the root Cygwin directory from the registry key: - HKEY_LOCAL_MACHINE\SOFTWARE\Cygwin\setup\rootdir. - """ - if sys.platform.startswith("cygwin"): - p = subprocess.Popen(["cygpath", "-m", path], - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - (out, err) = p.communicate() - if err: - logging.warning("WARNING: cygpath error: %s", err) - return out.strip() - else: - return path - -############################ -# Common output format code - -def PrintUsedSuppressionsList(suppcounts): - """ Prints out the list of used suppressions in a format common to all the - memory tools. If the list is empty, prints nothing and returns False, - otherwise True. - - suppcounts: a dictionary of used suppression counts, - Key -> name, Value -> count. - """ - if not suppcounts: - return False - - print "-----------------------------------------------------" - print "Suppressions used:" - print " count name" - for (name, count) in sorted(suppcounts.items(), key=lambda (k,v): (v,k)): - print "%7d %s" % (count, name) - print "-----------------------------------------------------" - sys.stdout.flush() - return True diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/gdb_helper.py b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/gdb_helper.py deleted file mode 100644 index d127f76008..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/gdb_helper.py +++ /dev/null @@ -1,91 +0,0 @@ -# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -''' A bunch of helper functions for querying gdb.''' - -import logging -import os -import re -import tempfile - -GDB_LINE_RE = re.compile(r'Line ([0-9]*) of "([^"]*)".*') - -def _GdbOutputToFileLine(output_line): - ''' Parse the gdb output line, return a pair (file, line num) ''' - match = GDB_LINE_RE.match(output_line) - if match: - return match.groups()[1], match.groups()[0] - else: - return None - -def ResolveAddressesWithinABinary(binary_name, load_address, address_list): - ''' For each address, return a pair (file, line num) ''' - commands = tempfile.NamedTemporaryFile() - commands.write('add-symbol-file "%s" %s\n' % (binary_name, load_address)) - for addr in address_list: - commands.write('info line *%s\n' % addr) - commands.write('quit\n') - commands.flush() - gdb_commandline = 'gdb -batch -x %s 2>/dev/null' % commands.name - gdb_pipe = os.popen(gdb_commandline) - result = gdb_pipe.readlines() - - address_count = 0 - ret = {} - for line in result: - if line.startswith('Line'): - ret[address_list[address_count]] = _GdbOutputToFileLine(line) - address_count += 1 - if line.startswith('No line'): - ret[address_list[address_count]] = (None, None) - address_count += 1 - gdb_pipe.close() - commands.close() - return ret - -class AddressTable(object): - ''' Object to do batched line number lookup. ''' - def __init__(self): - self._load_addresses = {} - self._binaries = {} - self._all_resolved = False - - def AddBinaryAt(self, binary, load_address): - ''' Register a new shared library or executable. ''' - self._load_addresses[binary] = load_address - - def Add(self, binary, address): - ''' Register a lookup request. ''' - if binary == '': - logging.warn('adding address %s in empty binary?' % address) - if binary in self._binaries: - self._binaries[binary].append(address) - else: - self._binaries[binary] = [address] - self._all_resolved = False - - def ResolveAll(self): - ''' Carry out all lookup requests. ''' - self._translation = {} - for binary in self._binaries.keys(): - if binary != '' and binary in self._load_addresses: - load_address = self._load_addresses[binary] - addr = ResolveAddressesWithinABinary( - binary, load_address, self._binaries[binary]) - self._translation[binary] = addr - self._all_resolved = True - - def GetFileLine(self, binary, addr): - ''' Get the (filename, linenum) result of a previously-registered lookup - request. - ''' - if self._all_resolved: - if binary in self._translation: - if addr in self._translation[binary]: - return self._translation[binary][addr] - return (None, None) diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.bat b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.bat deleted file mode 100644 index 5fceca6762..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.bat +++ /dev/null @@ -1,79 +0,0 @@ -@echo off -:: Copyright (c) 2012 The LibYuv Project Authors. All rights reserved. -:: -:: Use of this source code is governed by a BSD-style license -:: that can be found in the LICENSE file in the root of the source -:: tree. An additional intellectual property rights grant can be found -:: in the file PATENTS. All contributing project authors may -:: be found in the AUTHORS file in the root of the source tree. - -:: This script is a copy of chrome_tests.bat with the following changes: -:: - Invokes libyuv_tests.py instead of chrome_tests.py -:: - Chromium's Valgrind scripts directory is added to the PYTHONPATH to make -:: it possible to execute the Python scripts properly. - -:: TODO(timurrrr): batch files 'export' all the variables to the parent shell -set THISDIR=%~dp0 -set TOOL_NAME="unknown" - -:: Get the tool name and put it into TOOL_NAME {{{1 -:: NB: SHIFT command doesn't modify %* -:PARSE_ARGS_LOOP - if %1 == () GOTO:TOOLNAME_NOT_FOUND - if %1 == --tool GOTO:TOOLNAME_FOUND - SHIFT - goto :PARSE_ARGS_LOOP - -:TOOLNAME_NOT_FOUND -echo "Please specify a tool (tsan or drmemory) by using --tool flag" -exit /B 1 - -:TOOLNAME_FOUND -SHIFT -set TOOL_NAME=%1 -:: }}} -if "%TOOL_NAME%" == "drmemory" GOTO :SETUP_DRMEMORY -if "%TOOL_NAME%" == "drmemory_light" GOTO :SETUP_DRMEMORY -if "%TOOL_NAME%" == "drmemory_full" GOTO :SETUP_DRMEMORY -if "%TOOL_NAME%" == "drmemory_pattern" GOTO :SETUP_DRMEMORY -if "%TOOL_NAME%" == "tsan" GOTO :SETUP_TSAN -echo "Unknown tool: `%TOOL_NAME%`! Only tsan and drmemory are supported." -exit /B 1 - -:SETUP_DRMEMORY -if NOT "%DRMEMORY_COMMAND%"=="" GOTO :RUN_TESTS -:: Set up DRMEMORY_COMMAND to invoke Dr. Memory {{{1 -set DRMEMORY_PATH=%THISDIR%..\..\third_party\drmemory -set DRMEMORY_SFX=%DRMEMORY_PATH%\drmemory-windows-sfx.exe -if EXIST %DRMEMORY_SFX% GOTO DRMEMORY_BINARY_OK -echo "Can't find Dr. Memory executables." -echo "See http://www.chromium.org/developers/how-tos/using-valgrind/dr-memory" -echo "for the instructions on how to get them." -exit /B 1 - -:DRMEMORY_BINARY_OK -%DRMEMORY_SFX% -o%DRMEMORY_PATH%\unpacked -y -set DRMEMORY_COMMAND=%DRMEMORY_PATH%\unpacked\bin\drmemory.exe -:: }}} -goto :RUN_TESTS - -:SETUP_TSAN -:: Set up PIN_COMMAND to invoke TSan {{{1 -set TSAN_PATH=%THISDIR%..\..\third_party\tsan -set TSAN_SFX=%TSAN_PATH%\tsan-x86-windows-sfx.exe -if EXIST %TSAN_SFX% GOTO TSAN_BINARY_OK -echo "Can't find ThreadSanitizer executables." -echo "See http://www.chromium.org/developers/how-tos/using-valgrind/threadsanitizer/threadsanitizer-on-windows" -echo "for the instructions on how to get them." -exit /B 1 - -:TSAN_BINARY_OK -%TSAN_SFX% -o%TSAN_PATH%\unpacked -y -set PIN_COMMAND=%TSAN_PATH%\unpacked\tsan-x86-windows\tsan.bat -:: }}} -goto :RUN_TESTS - -:RUN_TESTS -set PYTHONPATH=%THISDIR%..\python\google;%THISDIR%..\valgrind -set RUNNING_ON_VALGRIND=yes -python %THISDIR%libyuv_tests.py %* diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.py b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.py deleted file mode 100755 index e780bd95eb..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.py +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2012 The LibYuv Project Authors. All rights reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -"""Runs various libyuv tests through valgrind_test.py. - -This script inherits the chrome_tests.py in Chrome, but allows running any test -instead of only the hard-coded ones. It uses the -t cmdline flag to do this, and -only supports specifying a single test for each run. - -Suppression files: -The Chrome valgrind directory we use as a DEPS dependency contains the following -suppression files: - valgrind/memcheck/suppressions.txt - valgrind/memcheck/suppressions_mac.txt - valgrind/tsan/suppressions.txt - valgrind/tsan/suppressions_mac.txt - valgrind/tsan/suppressions_win32.txt -Since they're referenced from the chrome_tests.py script, we have similar files -below the directory of this script. When executing, this script will setup both -Chrome's suppression files and our own, so we can easily maintain libyuv -specific suppressions in our own files. -""" - -import logging -import optparse -import os -import sys - -import logging_utils -import path_utils - -import chrome_tests - - -class LibyuvTest(chrome_tests.ChromeTests): - """Class that handles setup of suppressions for libyuv. - - Everything else is inherited from chrome_tests.ChromeTests. - """ - - def _DefaultCommand(self, tool, exe=None, valgrind_test_args=None): - """Override command-building method so we can add more suppressions.""" - cmd = chrome_tests.ChromeTests._DefaultCommand(self, tool, exe, - valgrind_test_args) - # When ChromeTests._DefaultCommand has executed, it has setup suppression - # files based on what's found in the memcheck/ or tsan/ subdirectories of - # this script's location. If Mac or Windows is executing, additional - # platform specific files have also been added. - # Since only the ones located below this directory is added, we must also - # add the ones maintained by Chrome, located in ../../tools/valgrind. - - # The idea is to look for --suppression arguments in the cmd list and add a - # modified copy of each suppression file, for the corresponding file in - # ../../tools/valgrind. - script_dir = path_utils.ScriptDir() - old_base, _ = os.path.split(script_dir) - - checkout_src = os.path.abspath(os.path.join(script_dir, os.pardir, - os.pardir)) - new_dir = os.path.join(checkout_src, 'tools', 'valgrind') - add_suppressions = [] - for token in cmd: - if '--suppressions' in token: - add_suppressions.append(token.replace(script_dir, new_dir)) - return add_suppressions + cmd - - -def main(_): - parser = optparse.OptionParser('usage: %prog -b -t ') - parser.disable_interspersed_args() - parser.add_option('-b', '--build-dir', - help=('Location of the compiler output. Can only be used ' - 'when the test argument does not contain this path.')) - parser.add_option("--target", help="Debug or Release") - parser.add_option('-t', '--test', help='Test to run.') - parser.add_option('', '--baseline', action='store_true', default=False, - help='Generate baseline data instead of validating') - parser.add_option('', '--gtest_filter', - help='Additional arguments to --gtest_filter') - parser.add_option('', '--gtest_repeat', - help='Argument for --gtest_repeat') - parser.add_option("--gtest_shuffle", action="store_true", default=False, - help="Randomize tests' orders on every iteration.") - parser.add_option("--gtest_break_on_failure", action="store_true", - default=False, - help="Drop in to debugger on assertion failure. Also " - "useful for forcing tests to exit with a stack dump " - "on the first assertion failure when running with " - "--gtest_repeat=-1") - parser.add_option('-v', '--verbose', action='store_true', default=False, - help='Verbose output - enable debug log messages') - parser.add_option('', '--tool', dest='valgrind_tool', default='memcheck', - help='Specify a valgrind tool to run the tests under') - parser.add_option('', '--tool_flags', dest='valgrind_tool_flags', default='', - help='Specify custom flags for the selected valgrind tool') - parser.add_option('', '--keep_logs', action='store_true', default=False, - help=('Store memory tool logs in the .logs directory ' - 'instead of /tmp.\nThis can be useful for tool ' - 'developers/maintainers.\nPlease note that the ' - '.logs directory will be clobbered on tool startup.')) - parser.add_option("--test-launcher-bot-mode", action="store_true", - help="run the tests with --test-launcher-bot-mode") - parser.add_option("--test-launcher-total-shards", type=int, - help="run the tests with --test-launcher-total-shards") - parser.add_option("--test-launcher-shard-index", type=int, - help="run the tests with --test-launcher-shard-index") - options, args = parser.parse_args() - - if options.verbose: - logging_utils.config_root(logging.DEBUG) - else: - logging_utils.config_root() - - if not options.test: - parser.error('--test not specified') - - # Support build dir both with and without the target. - if (options.target and options.build_dir and - not options.build_dir.endswith(options.target)): - options.build_dir = os.path.join(options.build_dir, options.target) - - # If --build_dir is provided, prepend it to the test executable if needed. - test_executable = options.test - if options.build_dir and not test_executable.startswith(options.build_dir): - test_executable = os.path.join(options.build_dir, test_executable) - args = [test_executable] + args - - test = LibyuvTest(options, args, 'cmdline') - return test.Run() - -if __name__ == '__main__': - return_code = main(sys.argv) - sys.exit(return_code) diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.sh b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.sh deleted file mode 100755 index 249032ca96..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/libyuv_tests.sh +++ /dev/null @@ -1,101 +0,0 @@ -#!/bin/bash -# Copyright (c) 2012 The LibYuv Project Authors. All rights reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -# Set up some paths and re-direct the arguments to libyuv_tests.py - -# This script is a copy of the chrome_tests.sh wrapper script with the following -# changes: -# - The locate_valgrind.sh of Chromium's Valgrind scripts dir is used to locate -# the Valgrind framework install. If it fails a fallback path is used instead -# (../../chromium/src/third_party/valgrind/linux_x64) and a warning message -# is showed by |show_locate_valgrind_failed_warning|. -# - libyuv_tests.py is invoked instead of chrome_tests.py. -# - Chromium's Valgrind scripts directory is added to the PYTHONPATH to make it -# possible to execute the Python scripts properly. - -export THISDIR=`dirname $0` -ARGV_COPY="$@" - -# We need to set CHROME_VALGRIND iff using Memcheck: -# tools_libyuv/valgrind/libyuv_tests.sh --tool memcheck -# or -# tools_libyuv/valgrind/libyuv_tests.sh --tool=memcheck -tool="memcheck" # Default to memcheck. -while (( "$#" )) -do - if [[ "$1" == "--tool" ]] - then - tool="$2" - shift - elif [[ "$1" =~ --tool=(.*) ]] - then - tool="${BASH_REMATCH[1]}" - fi - shift -done - -NEEDS_VALGRIND=0 - -case "$tool" in - "memcheck") - NEEDS_VALGRIND=1 - ;; -esac - -# For libyuv, we'll use the locate_valgrind.sh script in Chromium's Valgrind -# scripts dir to locate the Valgrind framework install -CHROME_VALGRIND_SCRIPTS=$THISDIR/../../tools/valgrind - -if [ "$NEEDS_VALGRIND" == "1" ] -then - CHROME_VALGRIND=`sh $THISDIR/locate_valgrind.sh` - if [ "$CHROME_VALGRIND" = "" ] - then - CHROME_VALGRIND=../../src/third_party/valgrind/linux_x64 - echo - echo "-------------------- WARNING ------------------------" - echo "locate_valgrind.sh failed." - echo "Using $CHROME_VALGRIND as a fallback location." - echo "This might be because:" - echo "1) This is a swarming bot" - echo "2) You haven't set up the valgrind binaries correctly." - echo "In this case, please make sure you have followed the instructions at" - echo "http://www.chromium.org/developers/how-tos/using-valgrind/get-valgrind" - echo "Notice: In the .gclient file, you need to add this for the 'libyuv'" - echo "solution since our directory structure is different from Chromium's:" - echo "\"custom_deps\": {" - echo " \"libyuv/third_party/valgrind\":" - echo " \"https://chromium.googlesource.com/chromium/deps/valgrind/binaries\"," - echo "}," - echo "-----------------------------------------------------" - echo - fi - echo "Using valgrind binaries from ${CHROME_VALGRIND}" - - PATH="${CHROME_VALGRIND}/bin:$PATH" - # We need to set these variables to override default lib paths hard-coded into - # Valgrind binary. - export VALGRIND_LIB="$CHROME_VALGRIND/lib/valgrind" - export VALGRIND_LIB_INNER="$CHROME_VALGRIND/lib/valgrind" - - # Clean up some /tmp directories that might be stale due to interrupted - # chrome_tests.py execution. - # FYI: - # -mtime +1 <- only print files modified more than 24h ago, - # -print0/-0 are needed to handle possible newlines in the filenames. - echo "Cleanup /tmp from Valgrind stuff" - find /tmp -maxdepth 1 \(\ - -name "vgdb-pipe-*" -or -name "vg_logs_*" -or -name "valgrind.*" \ - \) -mtime +1 -print0 | xargs -0 rm -rf -fi - -# Add Chrome's Valgrind scripts dir to the PYTHON_PATH since it contains -# the scripts that are needed for this script to run -PYTHONPATH=$THISDIR/../../tools/python/google:$CHROME_VALGRIND_SCRIPTS python \ - "$THISDIR/libyuv_tests.py" $ARGV_COPY diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/locate_valgrind.sh b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/locate_valgrind.sh deleted file mode 100755 index d9594f4848..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/locate_valgrind.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -# Prints a path to Valgrind binaries to be used for Chromium. -# Select the valgrind from third_party/valgrind by default, -# but allow users to override this default without editing scripts and -# without specifying a commandline option - -export THISDIR=`dirname $0` - -# User may use their own valgrind by giving its path with CHROME_VALGRIND env. -if [ "$CHROME_VALGRIND" = "" ] -then - # Guess which binaries we should use by uname - case "$(uname -a)" in - *Linux*x86_64*) - PLATFORM="linux_x64" - ;; - *Linux*86*) - PLATFORM="linux_x86" - ;; - *Darwin*9.[678].[01]*i386*) - # Didn't test other kernels. - PLATFORM="mac" - ;; - *Darwin*10.[0-9].[0-9]*i386*) - PLATFORM="mac_10.6" - ;; - *Darwin*10.[0-9].[0-9]*x86_64*) - PLATFORM="mac_10.6" - ;; - *Darwin*11.[0-9].[0-9]*x86_64*) - PLATFORM="mac_10.7" - ;; - *) - (echo "Sorry, your platform is not supported:" && - uname -a - echo - echo "If you're on Mac OS X, please see http://crbug.com/441425") >&2 - exit 42 - esac - - # The binaries should be in third_party/valgrind - # (checked out from deps/third_party/valgrind/binaries). - CHROME_VALGRIND="$THISDIR/../../third_party/valgrind/$PLATFORM" - - # TODO(timurrrr): readlink -f is not present on Mac... - if [ "$PLATFORM" != "mac" ] && \ - [ "$PLATFORM" != "mac_10.6" ] && \ - [ "$PLATFORM" != "mac_10.7" ] - then - # Get rid of all "../" dirs - CHROME_VALGRIND=$(readlink -f $CHROME_VALGRIND) - fi -fi - -if ! test -x $CHROME_VALGRIND/bin/valgrind -then - echo "Oops, could not find Valgrind binaries in your checkout." >&2 - echo "Please see" >&2 - echo " http://dev.chromium.org/developers/how-tos/using-valgrind/get-valgrind" >&2 - echo "for the instructions on how to download pre-built binaries." >&2 - exit 1 -fi - -echo $CHROME_VALGRIND diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/OWNERS b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/OWNERS deleted file mode 100644 index 72e8ffc0db..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/OWNERS +++ /dev/null @@ -1 +0,0 @@ -* diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/PRESUBMIT.py b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/PRESUBMIT.py deleted file mode 100644 index 033292148d..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/PRESUBMIT.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2012 The LibYuv Project Authors. All rights reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -""" -Copied from Chrome's src/tools/valgrind/memcheck/PRESUBMIT.py - -See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts -for more details on the presubmit API built into gcl. -""" - -import os -import re -import sys - -def CheckChange(input_api, output_api): - """Checks the memcheck suppressions files for bad data.""" - - # Add the path to the Chrome valgrind dir to the import path: - tools_vg_path = os.path.join(input_api.PresubmitLocalPath(), '..', '..', '..', - 'tools', 'valgrind') - sys.path.append(tools_vg_path) - import suppressions - - sup_regex = re.compile('suppressions.*\.txt$') - suppressions = {} - errors = [] - check_for_memcheck = False - # skip_next_line has 3 possible values: - # - False: don't skip the next line. - # - 'skip_suppression_name': the next line is a suppression name, skip. - # - 'skip_param': the next line is a system call parameter error, skip. - skip_next_line = False - for f in filter(lambda x: sup_regex.search(x.LocalPath()), - input_api.AffectedFiles()): - for line, line_num in zip(f.NewContents(), - xrange(1, len(f.NewContents()) + 1)): - line = line.lstrip() - if line.startswith('#') or not line: - continue - - if skip_next_line: - if skip_next_line == 'skip_suppression_name': - if 'insert_a_suppression_name_here' in line: - errors.append('"insert_a_suppression_name_here" is not a valid ' - 'suppression name') - if suppressions.has_key(line): - if f.LocalPath() == suppressions[line][1]: - errors.append('suppression with name "%s" at %s line %s ' - 'has already been defined at line %s' % - (line, f.LocalPath(), line_num, - suppressions[line][1])) - else: - errors.append('suppression with name "%s" at %s line %s ' - 'has already been defined at %s line %s' % - (line, f.LocalPath(), line_num, - suppressions[line][0], suppressions[line][1])) - else: - suppressions[line] = (f, line_num) - check_for_memcheck = True; - skip_next_line = False - continue - if check_for_memcheck: - if not line.startswith('Memcheck:'): - errors.append('"%s" should be "Memcheck:..." in %s line %s' % - (line, f.LocalPath(), line_num)) - check_for_memcheck = False; - if line == '{': - skip_next_line = 'skip_suppression_name' - continue - if line == "Memcheck:Param": - skip_next_line = 'skip_param' - continue - - if (line.startswith('fun:') or line.startswith('obj:') or - line.startswith('Memcheck:') or line == '}' or - line == '...'): - continue - errors.append('"%s" is probably wrong: %s line %s' % (line, f.LocalPath(), - line_num)) - if errors: - return [output_api.PresubmitError('\n'.join(errors))] - return [] - -def CheckChangeOnUpload(input_api, output_api): - return CheckChange(input_api, output_api) - -def CheckChangeOnCommit(input_api, output_api): - return CheckChange(input_api, output_api) - -def GetPreferredTrySlaves(): - # We don't have any memcheck slaves yet, so there's no use for this method. - # When we have, the slave name(s) should be put into this list. - return [] diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions.txt b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions.txt deleted file mode 100644 index 3f0f6d44f1..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions.txt +++ /dev/null @@ -1,21 +0,0 @@ -# This file is used in addition to the one already maintained in Chrome. -# It acts as a place holder for future additions for this project. -# It must exist for the Python wrapper script to work properly. - -# There are two of suppressions in this file. -# 1. third_party libraries -# 2. libyuv stuff -# 3. libjingle stuff (talk folder) -#----------------------------------------------------------------------- - -# third_party libraries -{ - bug_729 - Memcheck:Free - fun:_ZdaPv - ... - fun:_ZN7testing8internal12UnitTestImplD1Ev - ... -} - -# libyuv (empty so far) diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions_mac.txt b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions_mac.txt deleted file mode 100644 index 3ad0c8ccc5..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions_mac.txt +++ /dev/null @@ -1,5 +0,0 @@ -# This file is used in addition to the one already maintained in Chrome. -# It acts as a place holder for future additions for this project. -# It must exist for the Python wrapper script to work properly. - - diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions_win32.txt b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions_win32.txt deleted file mode 100644 index 3ad0c8ccc5..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck/suppressions_win32.txt +++ /dev/null @@ -1,5 +0,0 @@ -# This file is used in addition to the one already maintained in Chrome. -# It acts as a place holder for future additions for this project. -# It must exist for the Python wrapper script to work properly. - - diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck_analyze.py b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck_analyze.py deleted file mode 100755 index 80e85eb4ab..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/memcheck_analyze.py +++ /dev/null @@ -1,644 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -# memcheck_analyze.py - -''' Given a valgrind XML file, parses errors and uniques them.''' - -import gdb_helper - -from collections import defaultdict -import hashlib -import logging -import optparse -import os -import re -import subprocess -import sys -import time -from xml.dom.minidom import parse -from xml.parsers.expat import ExpatError - -import common - -# Global symbol table (yuck) -TheAddressTable = None - -# These are regexps that define functions (using C++ mangled names) -# we don't want to see in stack traces while pretty printing -# or generating suppressions. -# Just stop printing the stack/suppression frames when the current one -# matches any of these. -_BORING_CALLERS = common.BoringCallers(mangled=True, use_re_wildcards=True) - -def getTextOf(top_node, name): - ''' Returns all text in all DOM nodes with a certain |name| that are children - of |top_node|. - ''' - - text = "" - for nodes_named in top_node.getElementsByTagName(name): - text += "".join([node.data for node in nodes_named.childNodes - if node.nodeType == node.TEXT_NODE]) - return text - -def getCDATAOf(top_node, name): - ''' Returns all CDATA in all DOM nodes with a certain |name| that are children - of |top_node|. - ''' - - text = "" - for nodes_named in top_node.getElementsByTagName(name): - text += "".join([node.data for node in nodes_named.childNodes - if node.nodeType == node.CDATA_SECTION_NODE]) - if (text == ""): - return None - return text - -def shortenFilePath(source_dir, directory): - '''Returns a string with the string prefix |source_dir| removed from - |directory|.''' - prefixes_to_cut = ["build/src/", "valgrind/coregrind/", "out/Release/../../"] - - if source_dir: - prefixes_to_cut.append(source_dir) - - for p in prefixes_to_cut: - index = directory.rfind(p) - if index != -1: - directory = directory[index + len(p):] - - return directory - -# Constants that give real names to the abbreviations in valgrind XML output. -INSTRUCTION_POINTER = "ip" -OBJECT_FILE = "obj" -FUNCTION_NAME = "fn" -SRC_FILE_DIR = "dir" -SRC_FILE_NAME = "file" -SRC_LINE = "line" - -def gatherFrames(node, source_dir): - frames = [] - for frame in node.getElementsByTagName("frame"): - frame_dict = { - INSTRUCTION_POINTER : getTextOf(frame, INSTRUCTION_POINTER), - OBJECT_FILE : getTextOf(frame, OBJECT_FILE), - FUNCTION_NAME : getTextOf(frame, FUNCTION_NAME), - SRC_FILE_DIR : shortenFilePath( - source_dir, getTextOf(frame, SRC_FILE_DIR)), - SRC_FILE_NAME : getTextOf(frame, SRC_FILE_NAME), - SRC_LINE : getTextOf(frame, SRC_LINE) - } - - # Ignore this frame and all the following if it's a "boring" function. - enough_frames = False - for regexp in _BORING_CALLERS: - if re.match("^%s$" % regexp, frame_dict[FUNCTION_NAME]): - enough_frames = True - break - if enough_frames: - break - - frames += [frame_dict] - - global TheAddressTable - if TheAddressTable != None and frame_dict[SRC_LINE] == "": - # Try using gdb - TheAddressTable.Add(frame_dict[OBJECT_FILE], - frame_dict[INSTRUCTION_POINTER]) - return frames - -class ValgrindError: - ''' Takes a node and reads all the data from it. A - ValgrindError is immutable and is hashed on its pretty printed output. - ''' - - def __init__(self, source_dir, error_node, commandline, testcase): - ''' Copies all the relevant information out of the DOM and into object - properties. - - Args: - error_node: The DOM node we're extracting from. - source_dir: Prefix that should be stripped from the node. - commandline: The command that was run under valgrind - testcase: The test case name, if known. - ''' - - # Valgrind errors contain one pair, plus an optional - # pair, plus an optional , - # plus (since 3.5.0) a pair. - # (Origin is nicely enclosed; too bad the other two aren't.) - # The most common way to see all three in one report is - # a syscall with a parameter that points to uninitialized memory, e.g. - # Format: - # - # 0x6d - # 1 - # SyscallParam - # Syscall param write(buf) points to uninitialised byte(s) - # - # - # ... - # - # - # Address 0x5c9af4f is 7 bytes inside a block of ... - # - # - # ... - # - # - # - # Uninitialised value was created by a heap allocation - # - # - # ... - # - # - # - # - # insert_a_suppression_name_here - # Memcheck:Param - # write(buf) - # __write_nocancel - # ... - # main - # - # - # Memcheck:Param - # write(buf) - # fun:__write_nocancel - # ... - # fun:main - # } - # ]]> - # - # - # - # - # Each frame looks like this: - # - # 0x83751BC - # /data/dkegel/chrome-build/src/out/Release/base_unittests - # _ZN7testing8internal12TestInfoImpl7RunTestEPNS_8TestInfoE - # /data/dkegel/chrome-build/src/testing/gtest/src - # gtest-internal-inl.h - # 655 - # - # although the dir, file, and line elements are missing if there is - # no debug info. - - self._kind = getTextOf(error_node, "kind") - self._backtraces = [] - self._suppression = None - self._commandline = commandline - self._testcase = testcase - self._additional = [] - - # Iterate through the nodes, parsing pairs. - description = None - for node in error_node.childNodes: - if node.localName == "what" or node.localName == "auxwhat": - description = "".join([n.data for n in node.childNodes - if n.nodeType == n.TEXT_NODE]) - elif node.localName == "xwhat": - description = getTextOf(node, "text") - elif node.localName == "stack": - assert description - self._backtraces.append([description, gatherFrames(node, source_dir)]) - description = None - elif node.localName == "origin": - description = getTextOf(node, "what") - stack = node.getElementsByTagName("stack")[0] - frames = gatherFrames(stack, source_dir) - self._backtraces.append([description, frames]) - description = None - stack = None - frames = None - elif description and node.localName != None: - # The lastest description has no stack, e.g. "Address 0x28 is unknown" - self._additional.append(description) - description = None - - if node.localName == "suppression": - self._suppression = getCDATAOf(node, "rawtext"); - - def __str__(self): - ''' Pretty print the type and backtrace(s) of this specific error, - including suppression (which is just a mangled backtrace).''' - output = "" - output += "\n" # Make sure the ### is at the beginning of line. - output += "### BEGIN MEMORY TOOL REPORT (error hash=#%016X#)\n" % \ - self.ErrorHash() - if (self._commandline): - output += self._commandline + "\n" - - output += self._kind + "\n" - for backtrace in self._backtraces: - output += backtrace[0] + "\n" - filter = subprocess.Popen("c++filt -n", stdin=subprocess.PIPE, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - shell=True, - close_fds=True) - buf = "" - for frame in backtrace[1]: - buf += (frame[FUNCTION_NAME] or frame[INSTRUCTION_POINTER]) + "\n" - (stdoutbuf, stderrbuf) = filter.communicate(buf.encode('latin-1')) - demangled_names = stdoutbuf.split("\n") - - i = 0 - for frame in backtrace[1]: - output += (" " + demangled_names[i]) - i = i + 1 - - global TheAddressTable - if TheAddressTable != None and frame[SRC_FILE_DIR] == "": - # Try using gdb - foo = TheAddressTable.GetFileLine(frame[OBJECT_FILE], - frame[INSTRUCTION_POINTER]) - if foo[0] != None: - output += (" (" + foo[0] + ":" + foo[1] + ")") - elif frame[SRC_FILE_DIR] != "": - output += (" (" + frame[SRC_FILE_DIR] + "/" + frame[SRC_FILE_NAME] + - ":" + frame[SRC_LINE] + ")") - else: - output += " (" + frame[OBJECT_FILE] + ")" - output += "\n" - - for additional in self._additional: - output += additional + "\n" - - assert self._suppression != None, "Your Valgrind doesn't generate " \ - "suppressions - is it too old?" - - if self._testcase: - output += "The report came from the `%s` test.\n" % self._testcase - output += "Suppression (error hash=#%016X#):\n" % self.ErrorHash() - output += (" For more info on using suppressions see " - "http://dev.chromium.org/developers/tree-sheriffs/sheriff-details-chromium/memory-sheriff#TOC-Suppressing-memory-reports") - - # Widen suppression slightly to make portable between mac and linux - # TODO(timurrrr): Oops, these transformations should happen - # BEFORE calculating the hash! - supp = self._suppression; - supp = supp.replace("fun:_Znwj", "fun:_Znw*") - supp = supp.replace("fun:_Znwm", "fun:_Znw*") - supp = supp.replace("fun:_Znaj", "fun:_Zna*") - supp = supp.replace("fun:_Znam", "fun:_Zna*") - - # Make suppressions even less platform-dependent. - for sz in [1, 2, 4, 8]: - supp = supp.replace("Memcheck:Addr%d" % sz, "Memcheck:Unaddressable") - supp = supp.replace("Memcheck:Value%d" % sz, "Memcheck:Uninitialized") - supp = supp.replace("Memcheck:Cond", "Memcheck:Uninitialized") - - # Split into lines so we can enforce length limits - supplines = supp.split("\n") - supp = None # to avoid re-use - - # Truncate at line 26 (VG_MAX_SUPP_CALLERS plus 2 for name and type) - # or at the first 'boring' caller. - # (https://bugs.kde.org/show_bug.cgi?id=199468 proposes raising - # VG_MAX_SUPP_CALLERS, but we're probably fine with it as is.) - newlen = min(26, len(supplines)); - - # Drop boring frames and all the following. - enough_frames = False - for frameno in range(newlen): - for boring_caller in _BORING_CALLERS: - if re.match("^ +fun:%s$" % boring_caller, supplines[frameno]): - newlen = frameno - enough_frames = True - break - if enough_frames: - break - if (len(supplines) > newlen): - supplines = supplines[0:newlen] - supplines.append("}") - - for frame in range(len(supplines)): - # Replace the always-changing anonymous namespace prefix with "*". - m = re.match("( +fun:)_ZN.*_GLOBAL__N_.*\.cc_" + - "[0-9a-fA-F]{8}_[0-9a-fA-F]{8}(.*)", - supplines[frame]) - if m: - supplines[frame] = "*".join(m.groups()) - - output += "\n".join(supplines) + "\n" - output += "### END MEMORY TOOL REPORT (error hash=#%016X#)\n" % \ - self.ErrorHash() - - return output - - def UniqueString(self): - ''' String to use for object identity. Don't print this, use str(obj) - instead.''' - rep = self._kind + " " - for backtrace in self._backtraces: - for frame in backtrace[1]: - rep += frame[FUNCTION_NAME] - - if frame[SRC_FILE_DIR] != "": - rep += frame[SRC_FILE_DIR] + "/" + frame[SRC_FILE_NAME] - else: - rep += frame[OBJECT_FILE] - - return rep - - # This is a device-independent hash identifying the suppression. - # By printing out this hash we can find duplicate reports between tests and - # different shards running on multiple buildbots - def ErrorHash(self): - return int(hashlib.md5(self.UniqueString()).hexdigest()[:16], 16) - - def __hash__(self): - return hash(self.UniqueString()) - def __eq__(self, rhs): - return self.UniqueString() == rhs - -def log_is_finished(f, force_finish): - f.seek(0) - prev_line = "" - while True: - line = f.readline() - if line == "": - if not force_finish: - return False - # Okay, the log is not finished but we can make it up to be parseable: - if prev_line.strip() in ["", "", ""]: - f.write("\n") - return True - return False - if '' in line: - # Valgrind often has garbage after upon crash. - f.truncate() - return True - prev_line = line - -class MemcheckAnalyzer: - ''' Given a set of Valgrind XML files, parse all the errors out of them, - unique them and output the results.''' - - SANITY_TEST_SUPPRESSIONS = { - "Memcheck sanity test 01 (memory leak).": 1, - "Memcheck sanity test 02 (malloc/read left).": 1, - "Memcheck sanity test 03 (malloc/read right).": 1, - "Memcheck sanity test 04 (malloc/write left).": 1, - "Memcheck sanity test 05 (malloc/write right).": 1, - "Memcheck sanity test 06 (new/read left).": 1, - "Memcheck sanity test 07 (new/read right).": 1, - "Memcheck sanity test 08 (new/write left).": 1, - "Memcheck sanity test 09 (new/write right).": 1, - "Memcheck sanity test 10 (write after free).": 1, - "Memcheck sanity test 11 (write after delete).": 1, - "Memcheck sanity test 12 (array deleted without []).": 1, - "Memcheck sanity test 13 (single element deleted with []).": 1, - "Memcheck sanity test 14 (malloc/read uninit).": 1, - "Memcheck sanity test 15 (new/read uninit).": 1, - } - - # Max time to wait for memcheck logs to complete. - LOG_COMPLETION_TIMEOUT = 180.0 - - def __init__(self, source_dir, show_all_leaks=False, use_gdb=False): - '''Create a parser for Memcheck logs. - - Args: - source_dir: Path to top of source tree for this build - show_all_leaks: Whether to show even less important leaks - use_gdb: Whether to use gdb to resolve source filenames and line numbers - in the report stacktraces - ''' - self._source_dir = source_dir - self._show_all_leaks = show_all_leaks - self._use_gdb = use_gdb - - # Contains the set of unique errors - self._errors = set() - - # Contains the time when the we started analyzing the first log file. - # This variable is used to skip incomplete logs after some timeout. - self._analyze_start_time = None - - - def Report(self, files, testcase, check_sanity=False): - '''Reads in a set of files and prints Memcheck report. - - Args: - files: A list of filenames. - check_sanity: if true, search for SANITY_TEST_SUPPRESSIONS - ''' - # Beyond the detailed errors parsed by ValgrindError above, - # the xml file contain records describing suppressions that were used: - # - # - # 28 - # pango_font_leak_todo - # - # - # 378 - # bug_13243 - # - # /usr/lib/libgcc_s.1.dylib0x27000 - # giving the filename and load address of each binary that was mapped - # into the process. - - global TheAddressTable - if self._use_gdb: - TheAddressTable = gdb_helper.AddressTable() - else: - TheAddressTable = None - cur_report_errors = set() - suppcounts = defaultdict(int) - badfiles = set() - - if self._analyze_start_time == None: - self._analyze_start_time = time.time() - start_time = self._analyze_start_time - - parse_failed = False - for file in files: - # Wait up to three minutes for valgrind to finish writing all files, - # but after that, just skip incomplete files and warn. - f = open(file, "r+") - pid = re.match(".*\.([0-9]+)$", file) - if pid: - pid = pid.groups()[0] - found = False - running = True - firstrun = True - skip = False - origsize = os.path.getsize(file) - while (running and not found and not skip and - (firstrun or - ((time.time() - start_time) < self.LOG_COMPLETION_TIMEOUT))): - firstrun = False - f.seek(0) - if pid: - # Make sure the process is still running so we don't wait for - # 3 minutes if it was killed. See http://crbug.com/17453 - ps_out = subprocess.Popen("ps p %s" % pid, shell=True, - stdout=subprocess.PIPE).stdout - if len(ps_out.readlines()) < 2: - running = False - else: - skip = True - running = False - found = log_is_finished(f, False) - if not running and not found: - logging.warn("Valgrind process PID = %s is not running but its " - "XML log has not been finished correctly.\n" - "Make it up by adding some closing tags manually." % pid) - found = log_is_finished(f, not running) - if running and not found: - time.sleep(1) - f.close() - if not found: - badfiles.add(file) - else: - newsize = os.path.getsize(file) - if origsize > newsize+1: - logging.warn(str(origsize - newsize) + - " bytes of junk were after in %s!" % - file) - try: - parsed_file = parse(file); - except ExpatError, e: - parse_failed = True - logging.warn("could not parse %s: %s" % (file, e)) - lineno = e.lineno - 1 - context_lines = 5 - context_start = max(0, lineno - context_lines) - context_end = lineno + context_lines + 1 - context_file = open(file, "r") - for i in range(0, context_start): - context_file.readline() - for i in range(context_start, context_end): - context_data = context_file.readline().rstrip() - if i != lineno: - logging.warn(" %s" % context_data) - else: - logging.warn("> %s" % context_data) - context_file.close() - continue - if TheAddressTable != None: - load_objs = parsed_file.getElementsByTagName("load_obj") - for load_obj in load_objs: - obj = getTextOf(load_obj, "obj") - ip = getTextOf(load_obj, "ip") - TheAddressTable.AddBinaryAt(obj, ip) - - commandline = None - preamble = parsed_file.getElementsByTagName("preamble")[0]; - for node in preamble.getElementsByTagName("line"): - if node.localName == "line": - for x in node.childNodes: - if x.nodeType == node.TEXT_NODE and "Command" in x.data: - commandline = x.data - break - - raw_errors = parsed_file.getElementsByTagName("error") - for raw_error in raw_errors: - # Ignore "possible" leaks for now by default. - if (self._show_all_leaks or - getTextOf(raw_error, "kind") != "Leak_PossiblyLost"): - error = ValgrindError(self._source_dir, - raw_error, commandline, testcase) - if error not in cur_report_errors: - # We haven't seen such errors doing this report yet... - if error in self._errors: - # ... but we saw it in earlier reports, e.g. previous UI test - cur_report_errors.add("This error was already printed in " - "some other test, see 'hash=#%016X#'" % \ - error.ErrorHash()) - else: - # ... and we haven't seen it in other tests as well - self._errors.add(error) - cur_report_errors.add(error) - - suppcountlist = parsed_file.getElementsByTagName("suppcounts") - if len(suppcountlist) > 0: - suppcountlist = suppcountlist[0] - for node in suppcountlist.getElementsByTagName("pair"): - count = getTextOf(node, "count"); - name = getTextOf(node, "name"); - suppcounts[name] += int(count) - - if len(badfiles) > 0: - logging.warn("valgrind didn't finish writing %d files?!" % len(badfiles)) - for file in badfiles: - logging.warn("Last 20 lines of %s :" % file) - os.system("tail -n 20 '%s' 1>&2" % file) - - if parse_failed: - logging.error("FAIL! Couldn't parse Valgrind output file") - return -2 - - common.PrintUsedSuppressionsList(suppcounts) - - retcode = 0 - if cur_report_errors: - logging.error("FAIL! There were %s errors: " % len(cur_report_errors)) - - if TheAddressTable != None: - TheAddressTable.ResolveAll() - - for error in cur_report_errors: - logging.error(error) - - retcode = -1 - - # Report tool's insanity even if there were errors. - if check_sanity: - remaining_sanity_supp = MemcheckAnalyzer.SANITY_TEST_SUPPRESSIONS - for (name, count) in suppcounts.iteritems(): - # Workaround for http://crbug.com/334074 - if (name in remaining_sanity_supp and - remaining_sanity_supp[name] <= count): - del remaining_sanity_supp[name] - if remaining_sanity_supp: - logging.error("FAIL! Sanity check failed!") - logging.info("The following test errors were not handled: ") - for (name, count) in remaining_sanity_supp.iteritems(): - logging.info(" * %dx %s" % (count, name)) - retcode = -3 - - if retcode != 0: - return retcode - - logging.info("PASS! No errors found!") - return 0 - - -def _main(): - '''For testing only. The MemcheckAnalyzer class should be imported instead.''' - parser = optparse.OptionParser("usage: %prog [options] ") - parser.add_option("", "--source-dir", - help="path to top of source tree for this build" - "(used to normalize source paths in baseline)") - - (options, args) = parser.parse_args() - if len(args) == 0: - parser.error("no filename specified") - filenames = args - - analyzer = MemcheckAnalyzer(options.source_dir, use_gdb=True) - return analyzer.Report(filenames, None) - - -if __name__ == "__main__": - sys.exit(_main()) diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/valgrind.sh b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/valgrind.sh deleted file mode 100755 index 7f3f792666..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/valgrind.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/bash - -# Copyright (c) 2017 The LibYuv Project Authors. All rights reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -# This is a small script for manually launching valgrind, along with passing -# it the suppression file, and some helpful arguments (automatically attaching -# the debugger on failures, etc). Run it from your repo root, something like: -# $ sh ./tools/valgrind/valgrind.sh ./out/Debug/chrome -# -# This is mostly intended for running the chrome browser interactively. -# To run unit tests, you probably want to run chrome_tests.sh instead. -# That's the script used by the valgrind buildbot. - -export THISDIR=`dirname $0` - -setup_memcheck() { - RUN_COMMAND="valgrind" - - # Prompt to attach gdb when there was an error detected. - DEFAULT_TOOL_FLAGS=("--db-command=gdb -nw %f %p" "--db-attach=yes" \ - # Keep the registers in gdb in sync with the code. - "--vex-iropt-register-updates=allregs-at-mem-access" \ - # Overwrite newly allocated or freed objects - # with 0x41 to catch inproper use. - "--malloc-fill=41" "--free-fill=41" \ - # Increase the size of stacks being tracked. - "--num-callers=30") -} - -setup_unknown() { - echo "Unknown tool \"$TOOL_NAME\" specified, the result is not guaranteed" - DEFAULT_TOOL_FLAGS=() -} - -set -e - -if [ $# -eq 0 ]; then - echo "usage: " - exit 1 -fi - -TOOL_NAME="memcheck" -declare -a DEFAULT_TOOL_FLAGS[0] - -# Select a tool different from memcheck with --tool=TOOL as a first argument -TMP_STR=`echo $1 | sed 's/^\-\-tool=//'` -if [ "$TMP_STR" != "$1" ]; then - TOOL_NAME="$TMP_STR" - shift -fi - -if echo "$@" | grep "\-\-tool" ; then - echo "--tool=TOOL must be the first argument" >&2 - exit 1 -fi - -case $TOOL_NAME in - memcheck*) setup_memcheck "$1";; - *) setup_unknown;; -esac - - -SUPPRESSIONS="$THISDIR/$TOOL_NAME/suppressions.txt" - -CHROME_VALGRIND=`sh $THISDIR/locate_valgrind.sh` -if [ "$CHROME_VALGRIND" = "" ] -then - # locate_valgrind.sh failed - exit 1 -fi -echo "Using valgrind binaries from ${CHROME_VALGRIND}" - -set -x -PATH="${CHROME_VALGRIND}/bin:$PATH" -# We need to set these variables to override default lib paths hard-coded into -# Valgrind binary. -export VALGRIND_LIB="$CHROME_VALGRIND/lib/valgrind" -export VALGRIND_LIB_INNER="$CHROME_VALGRIND/lib/valgrind" - -# G_SLICE=always-malloc: make glib use system malloc -# NSS_DISABLE_UNLOAD=1: make nss skip dlclosing dynamically loaded modules, -# which would result in "obj:*" in backtraces. -# NSS_DISABLE_ARENA_FREE_LIST=1: make nss use system malloc -# G_DEBUG=fatal_warnings: make GTK abort on any critical or warning assertions. -# If it crashes on you in the Options menu, you hit bug 19751, -# comment out the G_DEBUG=fatal_warnings line. -# -# GTEST_DEATH_TEST_USE_FORK=1: make gtest death tests valgrind-friendly -# -# When everyone has the latest valgrind, we might want to add -# --show-possibly-lost=no -# to ignore possible but not definite leaks. - -G_SLICE=always-malloc \ -NSS_DISABLE_UNLOAD=1 \ -NSS_DISABLE_ARENA_FREE_LIST=1 \ -G_DEBUG=fatal_warnings \ -GTEST_DEATH_TEST_USE_FORK=1 \ -$RUN_COMMAND \ - --trace-children=yes \ - --leak-check=yes \ - --suppressions="$SUPPRESSIONS" \ - "${DEFAULT_TOOL_FLAGS[@]}" \ - "$@" diff --git a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/valgrind_test.py b/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/valgrind_test.py deleted file mode 100755 index 0fd3d97f11..0000000000 --- a/third-party/webrtc/dependencies/third_party/libyuv/tools_libyuv/valgrind/valgrind_test.py +++ /dev/null @@ -1,517 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. -# -# Use of this source code is governed by a BSD-style license -# that can be found in the LICENSE file in the root of the source -# tree. An additional intellectual property rights grant can be found -# in the file PATENTS. All contributing project authors may -# be found in the AUTHORS file in the root of the source tree. - -"""Runs an exe through Valgrind and puts the intermediate files in a -directory. -""" - -import datetime -import glob -import logging -import optparse -import os -import re -import shutil -import stat -import subprocess -import sys -import tempfile - -import common - -import memcheck_analyze - -class BaseTool(object): - """Abstract class for running dynamic error detection tools. - - Always subclass this and implement ToolCommand with framework- and - tool-specific stuff. - """ - - def __init__(self): - temp_parent_dir = None - self.log_parent_dir = "" - if common.IsWindows(): - # gpu process on Windows Vista+ runs at Low Integrity and can only - # write to certain directories (http://crbug.com/119131) - # - # TODO(bruening): if scripts die in middle and don't clean up temp - # dir, we'll accumulate files in profile dir. should remove - # really old files automatically. - profile = os.getenv("USERPROFILE") - if profile: - self.log_parent_dir = profile + "\\AppData\\LocalLow\\" - if os.path.exists(self.log_parent_dir): - self.log_parent_dir = common.NormalizeWindowsPath(self.log_parent_dir) - temp_parent_dir = self.log_parent_dir - # Generated every time (even when overridden) - self.temp_dir = tempfile.mkdtemp(prefix="vg_logs_", dir=temp_parent_dir) - self.log_dir = self.temp_dir # overridable by --keep_logs - self.option_parser_hooks = [] - # TODO(glider): we may not need some of the env vars on some of the - # platforms. - self._env = { - "G_SLICE" : "always-malloc", - "NSS_DISABLE_UNLOAD" : "1", - "NSS_DISABLE_ARENA_FREE_LIST" : "1", - "GTEST_DEATH_TEST_USE_FORK": "1", - } - - def ToolName(self): - raise NotImplementedError, "This method should be implemented " \ - "in the tool-specific subclass" - - def Analyze(self, check_sanity=False): - raise NotImplementedError, "This method should be implemented " \ - "in the tool-specific subclass" - - def RegisterOptionParserHook(self, hook): - # Frameworks and tools can add their own flags to the parser. - self.option_parser_hooks.append(hook) - - def CreateOptionParser(self): - # Defines Chromium-specific flags. - self._parser = optparse.OptionParser("usage: %prog [options] ") - self._parser.disable_interspersed_args() - self._parser.add_option("-t", "--timeout", - dest="timeout", metavar="TIMEOUT", default=10000, - help="timeout in seconds for the run (default 10000)") - self._parser.add_option("", "--build-dir", - help="the location of the compiler output") - self._parser.add_option("", "--source-dir", - help="path to top of source tree for this build" - "(used to normalize source paths in baseline)") - self._parser.add_option("", "--gtest_filter", default="", - help="which test case to run") - self._parser.add_option("", "--gtest_repeat", - help="how many times to run each test") - self._parser.add_option("", "--gtest_print_time", action="store_true", - default=False, - help="show how long each test takes") - self._parser.add_option("", "--ignore_exit_code", action="store_true", - default=False, - help="ignore exit code of the test " - "(e.g. test failures)") - self._parser.add_option("", "--keep_logs", action="store_true", - default=False, - help="store memory tool logs in the .logs " - "directory instead of /tmp.\nThis can be " - "useful for tool developers/maintainers.\n" - "Please note that the .logs directory " - "will be clobbered on tool startup.") - - # To add framework- or tool-specific flags, please add a hook using - # RegisterOptionParserHook in the corresponding subclass. - # See ValgrindTool for an example. - for hook in self.option_parser_hooks: - hook(self, self._parser) - - def ParseArgv(self, args): - self.CreateOptionParser() - - # self._tool_flags will store those tool flags which we don't parse - # manually in this script. - self._tool_flags = [] - known_args = [] - - """ We assume that the first argument not starting with "-" is a program - name and all the following flags should be passed to the program. - TODO(timurrrr): customize optparse instead - """ - while len(args) > 0 and args[0][:1] == "-": - arg = args[0] - if (arg == "--"): - break - if self._parser.has_option(arg.split("=")[0]): - known_args += [arg] - else: - self._tool_flags += [arg] - args = args[1:] - - if len(args) > 0: - known_args += args - - self._options, self._args = self._parser.parse_args(known_args) - - self._timeout = int(self._options.timeout) - self._source_dir = self._options.source_dir - if self._options.keep_logs: - # log_parent_dir has trailing slash if non-empty - self.log_dir = self.log_parent_dir + "%s.logs" % self.ToolName() - if os.path.exists(self.log_dir): - shutil.rmtree(self.log_dir) - os.mkdir(self.log_dir) - logging.info("Logs are in " + self.log_dir) - - self._ignore_exit_code = self._options.ignore_exit_code - if self._options.gtest_filter != "": - self._args.append("--gtest_filter=%s" % self._options.gtest_filter) - if self._options.gtest_repeat: - self._args.append("--gtest_repeat=%s" % self._options.gtest_repeat) - if self._options.gtest_print_time: - self._args.append("--gtest_print_time") - - return True - - def Setup(self, args): - return self.ParseArgv(args) - - def ToolCommand(self): - raise NotImplementedError, "This method should be implemented " \ - "in the tool-specific subclass" - - def Cleanup(self): - # You may override it in the tool-specific subclass - pass - - def Execute(self): - """ Execute the app to be tested after successful instrumentation. - Full execution command-line provided by subclassers via proc.""" - logging.info("starting execution...") - proc = self.ToolCommand() - for var in self._env: - common.PutEnvAndLog(var, self._env[var]) - return common.RunSubprocess(proc, self._timeout) - - def RunTestsAndAnalyze(self, check_sanity): - exec_retcode = self.Execute() - analyze_retcode = self.Analyze(check_sanity) - - if analyze_retcode: - logging.error("Analyze failed.") - logging.info("Search the log for '[ERROR]' to see the error reports.") - return analyze_retcode - - if exec_retcode: - if self._ignore_exit_code: - logging.info("Test execution failed, but the exit code is ignored.") - else: - logging.error("Test execution failed.") - return exec_retcode - else: - logging.info("Test execution completed successfully.") - - if not analyze_retcode: - logging.info("Analysis completed successfully.") - - return 0 - - def Main(self, args, check_sanity, min_runtime_in_seconds): - """Call this to run through the whole process: Setup, Execute, Analyze""" - start_time = datetime.datetime.now() - retcode = -1 - if self.Setup(args): - retcode = self.RunTestsAndAnalyze(check_sanity) - shutil.rmtree(self.temp_dir, ignore_errors=True) - self.Cleanup() - else: - logging.error("Setup failed") - end_time = datetime.datetime.now() - runtime_in_seconds = (end_time - start_time).seconds - hours = runtime_in_seconds / 3600 - seconds = runtime_in_seconds % 3600 - minutes = seconds / 60 - seconds = seconds % 60 - logging.info("elapsed time: %02d:%02d:%02d" % (hours, minutes, seconds)) - if (min_runtime_in_seconds > 0 and - runtime_in_seconds < min_runtime_in_seconds): - logging.error("Layout tests finished too quickly. " - "It should have taken at least %d seconds. " - "Something went wrong?" % min_runtime_in_seconds) - retcode = -1 - return retcode - - def Run(self, args, module, min_runtime_in_seconds=0): - MODULES_TO_SANITY_CHECK = ["base"] - - check_sanity = module in MODULES_TO_SANITY_CHECK - return self.Main(args, check_sanity, min_runtime_in_seconds) - - -class ValgrindTool(BaseTool): - """Abstract class for running Valgrind tools. - - Always subclass this and implement ToolSpecificFlags() and - ExtendOptionParser() for tool-specific stuff. - """ - def __init__(self): - super(ValgrindTool, self).__init__() - self.RegisterOptionParserHook(ValgrindTool.ExtendOptionParser) - - def UseXML(self): - # Override if tool prefers nonxml output - return True - - def ExtendOptionParser(self, parser): - parser.add_option("", "--suppressions", default=[], - action="append", - help="path to a valgrind suppression file") - parser.add_option("", "--indirect", action="store_true", - default=False, - help="set BROWSER_WRAPPER rather than " - "running valgrind directly") - parser.add_option("", "--indirect_webkit_layout", action="store_true", - default=False, - help="set --wrapper rather than running Dr. Memory " - "directly.") - parser.add_option("", "--trace_children", action="store_true", - default=False, - help="also trace child processes") - parser.add_option("", "--num-callers", - dest="num_callers", default=30, - help="number of callers to show in stack traces") - parser.add_option("", "--generate_dsym", action="store_true", - default=False, - help="Generate .dSYM file on Mac if needed. Slow!") - - def Setup(self, args): - if not BaseTool.Setup(self, args): - return False - return True - - def ToolCommand(self): - """Get the valgrind command to run.""" - # Note that self._args begins with the exe to be run. - tool_name = self.ToolName() - - # Construct the valgrind command. - if 'CHROME_VALGRIND' in os.environ: - path = os.path.join(os.environ['CHROME_VALGRIND'], "bin", "valgrind") - else: - path = "valgrind" - proc = [path, "--tool=%s" % tool_name] - - proc += ["--num-callers=%i" % int(self._options.num_callers)] - - if self._options.trace_children: - proc += ["--trace-children=yes"] - proc += ["--trace-children-skip='*dbus-daemon*'"] - proc += ["--trace-children-skip='*dbus-launch*'"] - proc += ["--trace-children-skip='*perl*'"] - proc += ["--trace-children-skip='*python*'"] - # This is really Python, but for some reason Valgrind follows it. - proc += ["--trace-children-skip='*lsb_release*'"] - - proc += self.ToolSpecificFlags() - proc += self._tool_flags - - suppression_count = 0 - for suppression_file in self._options.suppressions: - if os.path.exists(suppression_file): - suppression_count += 1 - proc += ["--suppressions=%s" % suppression_file] - - if not suppression_count: - logging.warning("WARNING: NOT USING SUPPRESSIONS!") - - logfilename = self.log_dir + ("/%s." % tool_name) + "%p" - if self.UseXML(): - proc += ["--xml=yes", "--xml-file=" + logfilename] - else: - proc += ["--log-file=" + logfilename] - - # The Valgrind command is constructed. - - # Handle --indirect_webkit_layout separately. - if self._options.indirect_webkit_layout: - # Need to create the wrapper before modifying |proc|. - wrapper = self.CreateBrowserWrapper(proc, webkit=True) - proc = self._args - proc.append("--wrapper") - proc.append(wrapper) - return proc - - if self._options.indirect: - wrapper = self.CreateBrowserWrapper(proc) - os.environ["BROWSER_WRAPPER"] = wrapper - logging.info('export BROWSER_WRAPPER=' + wrapper) - proc = [] - proc += self._args - return proc - - def ToolSpecificFlags(self): - raise NotImplementedError, "This method should be implemented " \ - "in the tool-specific subclass" - - def CreateBrowserWrapper(self, proc, webkit=False): - """The program being run invokes Python or something else that can't stand - to be valgrinded, and also invokes the Chrome browser. In this case, use a - magic wrapper to only valgrind the Chrome browser. Build the wrapper here. - Returns the path to the wrapper. It's up to the caller to use the wrapper - appropriately. - """ - command = " ".join(proc) - # Add the PID of the browser wrapper to the logfile names so we can - # separate log files for different UI tests at the analyze stage. - command = command.replace("%p", "$$.%p") - - (fd, indirect_fname) = tempfile.mkstemp(dir=self.log_dir, - prefix="browser_wrapper.", - text=True) - f = os.fdopen(fd, "w") - f.write('#!/bin/bash\n' - 'echo "Started Valgrind wrapper for this test, PID=$$" >&2\n') - - f.write('DIR=`dirname $0`\n' - 'TESTNAME_FILE=$DIR/testcase.$$.name\n\n') - - if webkit: - # Webkit layout_tests pass the URL as the first line of stdin. - f.write('tee $TESTNAME_FILE | %s "$@"\n' % command) - else: - # Try to get the test case name by looking at the program arguments. - # i.e. Chromium ui_tests used --test-name arg. - # TODO(timurrrr): This doesn't handle "--test-name Test.Name" - # TODO(timurrrr): ui_tests are dead. Where do we use the non-webkit - # wrapper now? browser_tests? What do they do? - f.write('for arg in $@\ndo\n' - ' if [[ "$arg" =~ --test-name=(.*) ]]\n then\n' - ' echo ${BASH_REMATCH[1]} >$TESTNAME_FILE\n' - ' fi\n' - 'done\n\n' - '%s "$@"\n' % command) - - f.close() - os.chmod(indirect_fname, stat.S_IRUSR|stat.S_IXUSR) - return indirect_fname - - def CreateAnalyzer(self): - raise NotImplementedError, "This method should be implemented " \ - "in the tool-specific subclass" - - def GetAnalyzeResults(self, check_sanity=False): - # Glob all the files in the log directory - filenames = glob.glob(self.log_dir + "/" + self.ToolName() + ".*") - - # If we have browser wrapper, the logfiles are named as - # "toolname.wrapper_PID.valgrind_PID". - # Let's extract the list of wrapper_PIDs and name it ppids - ppids = set([int(f.split(".")[-2]) \ - for f in filenames if re.search("\.[0-9]+\.[0-9]+$", f)]) - - analyzer = self.CreateAnalyzer() - if len(ppids) == 0: - # Fast path - no browser wrapper was set. - return analyzer.Report(filenames, None, check_sanity) - - ret = 0 - for ppid in ppids: - testcase_name = None - try: - f = open(self.log_dir + ("/testcase.%d.name" % ppid)) - testcase_name = f.read().strip() - f.close() - wk_layout_prefix="third_party/WebKit/LayoutTests/" - wk_prefix_at = testcase_name.rfind(wk_layout_prefix) - if wk_prefix_at != -1: - testcase_name = testcase_name[wk_prefix_at + len(wk_layout_prefix):] - except IOError: - pass - print "=====================================================" - print " Below is the report for valgrind wrapper PID=%d." % ppid - if testcase_name: - print " It was used while running the `%s` test." % testcase_name - else: - print " You can find the corresponding test" - print " by searching the above log for 'PID=%d'" % ppid - sys.stdout.flush() - - ppid_filenames = [f for f in filenames \ - if re.search("\.%d\.[0-9]+$" % ppid, f)] - # check_sanity won't work with browser wrappers - assert check_sanity == False - ret |= analyzer.Report(ppid_filenames, testcase_name) - print "=====================================================" - sys.stdout.flush() - - if ret != 0: - print "" - print "The Valgrind reports are grouped by test names." - print "Each test has its PID printed in the log when the test was run" - print "and at the beginning of its Valgrind report." - print "Hint: you can search for the reports by Ctrl+F -> `=#`" - sys.stdout.flush() - - return ret - - -# TODO(timurrrr): Split into a separate file. -class Memcheck(ValgrindTool): - """Memcheck - Dynamic memory error detector for Linux & Mac - - http://valgrind.org/info/tools.html#memcheck - """ - - def __init__(self): - super(Memcheck, self).__init__() - self.RegisterOptionParserHook(Memcheck.ExtendOptionParser) - - def ToolName(self): - return "memcheck" - - def ExtendOptionParser(self, parser): - parser.add_option("--leak-check", "--leak_check", type="string", - default="yes", # --leak-check=yes is equivalent of =full - help="perform leak checking at the end of the run") - parser.add_option("", "--show_all_leaks", action="store_true", - default=False, - help="also show less blatant leaks") - parser.add_option("", "--track_origins", action="store_true", - default=False, - help="Show whence uninitialized bytes came. 30% slower.") - - def ToolSpecificFlags(self): - ret = ["--gen-suppressions=all", "--demangle=no"] - ret += ["--leak-check=%s" % self._options.leak_check] - - if self._options.show_all_leaks: - ret += ["--show-reachable=yes"] - else: - ret += ["--show-possibly-lost=no"] - - if self._options.track_origins: - ret += ["--track-origins=yes"] - - # TODO(glider): this is a temporary workaround for http://crbug.com/51716 - # Let's see whether it helps. - if common.IsMac(): - ret += ["--smc-check=all"] - - return ret - - def CreateAnalyzer(self): - use_gdb = common.IsMac() - return memcheck_analyze.MemcheckAnalyzer(self._source_dir, - self._options.show_all_leaks, - use_gdb=use_gdb) - - def Analyze(self, check_sanity=False): - ret = self.GetAnalyzeResults(check_sanity) - - if ret != 0: - logging.info("Please see http://dev.chromium.org/developers/how-tos/" - "using-valgrind for the info on Memcheck/Valgrind") - return ret - - -class ToolFactory: - def Create(self, tool_name): - if tool_name == "memcheck": - return Memcheck() - try: - platform_name = common.PlatformNames()[0] - except common.NotImplementedError: - platform_name = sys.platform + "(Unknown)" - raise RuntimeError, "Unknown tool (tool=%s, platform=%s)" % (tool_name, - platform_name) - -def CreateTool(tool): - return ToolFactory().Create(tool)