FUImageRenderViewModel.m 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. //
  2. // FUImageRenderViewModel.m
  3. // FULiveDemo
  4. //
  5. // Created by 项林平 on 2022/8/9.
  6. //
  7. #import "FUImageRenderViewModel.h"
  8. @interface FUImageRenderViewModel ()
  9. @property (nonatomic, strong) CADisplayLink *displayLink;
  10. @property (nonatomic, strong) NSOperationQueue *renderOperationQueue;
  11. @property (nonatomic, strong) UIImage *renderImage;
  12. @end
  13. @implementation FUImageRenderViewModel {
  14. FUImageBuffer currentImageBuffer;
  15. }
  16. #pragma mark - Initializer
  17. - (instancetype)initWithImage:(UIImage *)image {
  18. self = [super init];
  19. if (self) {
  20. self.rendering = YES;
  21. self.detectingParts = FUDetectingPartsFace;
  22. if (self.necessaryAIModelTypes & FUAIModelTypeFace) {
  23. [FURenderKitManager setFaceProcessorDetectMode:FUFaceProcessorDetectModeImage];
  24. }
  25. if (self.necessaryAIModelTypes & FUAIModelTypeHuman) {
  26. [FURenderKitManager setHumanProcessorDetectMode:FUHumanProcessorDetectModeVideo];
  27. }
  28. self.renderImage = [UIImage imageWithData:UIImageJPEGRepresentation(image, 1)];
  29. }
  30. return self;
  31. }
  32. - (void)dealloc {
  33. if (&currentImageBuffer != NULL) {
  34. [UIImage freeImageBuffer:&currentImageBuffer];
  35. }
  36. }
  37. #pragma mark - Instance methods
  38. - (void)start {
  39. [FURenderKitManager resetTrackedResult];
  40. if (!_displayLink) {
  41. self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(displayLinkAction)];
  42. [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  43. self.displayLink.frameInterval = 10;
  44. }
  45. self.displayLink.paused = NO;
  46. }
  47. - (void)stop {
  48. self.displayLink.paused = YES;
  49. [self.displayLink invalidate];
  50. self.displayLink = nil;
  51. [self.renderOperationQueue cancelAllOperations];
  52. }
  53. #pragma mark - Event response
  54. - (void)displayLinkAction {
  55. [self.renderOperationQueue addOperationWithBlock:^{
  56. [FURenderKitManager updateBeautyBlurEffect];
  57. @autoreleasepool {
  58. self->currentImageBuffer = [self.renderImage getImageBuffer];
  59. if (self.isRendering) {
  60. FURenderInput *input = [[FURenderInput alloc] init];
  61. switch (self.renderImage.imageOrientation) {
  62. case UIImageOrientationUp:
  63. case UIImageOrientationUpMirrored:
  64. input.renderConfig.imageOrientation = FUImageOrientationUP;
  65. break;
  66. case UIImageOrientationLeft:
  67. case UIImageOrientationLeftMirrored:
  68. input.renderConfig.imageOrientation = FUImageOrientationRight;
  69. break;
  70. case UIImageOrientationDown:
  71. case UIImageOrientationDownMirrored:
  72. input.renderConfig.imageOrientation = FUImageOrientationDown;
  73. break;
  74. case UIImageOrientationRight:
  75. case UIImageOrientationRightMirrored:
  76. input.renderConfig.imageOrientation = FUImageOrientationLeft;
  77. break;
  78. }
  79. input.imageBuffer = self->currentImageBuffer;
  80. FURenderOutput *output = [[FURenderKit shareRenderKit] renderWithInput:input];
  81. self->currentImageBuffer = output.imageBuffer;
  82. }
  83. if (self.captureImageHandler) {
  84. UIImage *captureImage = [UIImage imageWithRGBAImageBuffer:&self->currentImageBuffer autoFreeBuffer:NO];
  85. self.captureImageHandler(captureImage);
  86. self.captureImageHandler = nil;
  87. }
  88. if (self.delegate && [self.delegate respondsToSelector:@selector(imageRenderDidOutputImageBuffer:)]) {
  89. [self.delegate imageRenderDidOutputImageBuffer:self->currentImageBuffer];
  90. }
  91. // 释放内存
  92. [UIImage freeImageBuffer:&self->currentImageBuffer];
  93. }
  94. if (self.detectingParts != FUDetectingPartsNone) {
  95. // 需要检查人脸/人体/手势检测状态
  96. if (self.delegate && [self.delegate respondsToSelector:@selector(imageRenderShouldCheckDetectingStatus:)]) {
  97. [self.delegate imageRenderShouldCheckDetectingStatus:self.detectingParts];
  98. }
  99. }
  100. }];
  101. }
  102. #pragma mark - Getters
  103. - (NSOperationQueue *)renderOperationQueue {
  104. if (!_renderOperationQueue) {
  105. _renderOperationQueue = [[NSOperationQueue alloc] init];
  106. _renderOperationQueue.maxConcurrentOperationCount = 1;
  107. }
  108. return _renderOperationQueue;
  109. }
  110. #pragma mark - Overriding attributes
  111. - (FUAIModelType)necessaryAIModelTypes {
  112. return FUAIModelTypeFace;
  113. }
  114. - (CGFloat)downloadButtonBottomConstant {
  115. return FUHeightIncludeBottomSafeArea(10);
  116. }
  117. @end