diff --git a/webrtc/sdk/BUILD.gn b/webrtc/sdk/BUILD.gn index 5228cd684a..5d339da479 100644 --- a/webrtc/sdk/BUILD.gn +++ b/webrtc/sdk/BUILD.gn @@ -47,8 +47,8 @@ if (is_ios || is_mac) { "objc/Framework/Classes/Common/RTCDispatcher.m", "objc/Framework/Classes/Common/RTCFieldTrials.mm", "objc/Framework/Classes/Common/RTCLogging.mm", - "objc/Framework/Classes/Common/RTCUIApplication.h", - "objc/Framework/Classes/Common/RTCUIApplication.mm", + "objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h", + "objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m", "objc/Framework/Classes/Common/helpers.h", "objc/Framework/Classes/Common/helpers.mm", "objc/Framework/Headers/WebRTC/RTCDispatcher.h", @@ -546,8 +546,8 @@ if (is_ios || is_mac) { "objc/Framework/Classes/VideoToolbox/encoder.mm", "objc/Framework/Classes/VideoToolbox/nalu_rewriter.cc", "objc/Framework/Classes/VideoToolbox/nalu_rewriter.h", - "objc/Framework/Classes/VideoToolbox/videocodecfactory.cc", "objc/Framework/Classes/VideoToolbox/videocodecfactory.h", + "objc/Framework/Classes/VideoToolbox/videocodecfactory.mm", ] configs += [ "..:common_objc" ] diff --git a/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplication.h b/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplication.h deleted file mode 100644 index 3df6d530b8..0000000000 --- a/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplication.h +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2016 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. - */ - -#ifndef WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_UI_RTCUIAPPLICATION_H_ -#define WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_UI_RTCUIAPPLICATION_H_ - -#include "WebRTC/RTCMacros.h" - -#if defined(WEBRTC_IOS) -/** Convenience function to get UIApplicationState from C++. */ -RTC_EXTERN bool RTCIsUIApplicationActive(); -#endif // WEBRTC_IOS - -#endif // WEBRTC_SDK_OBJC_FRAMEWORK_CLASSES_UI_RTCUIAPPLICATION_H_ diff --git a/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplication.mm b/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h similarity index 64% rename from webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplication.mm rename to webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h index 7e8aea6295..ff38628383 100644 --- a/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplication.mm +++ b/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.h @@ -8,15 +8,16 @@ * be found in the AUTHORS file in the root of the source tree. */ -#include "RTCUIApplication.h" - #if defined(WEBRTC_IOS) -#import +#import -bool RTCIsUIApplicationActive() { - UIApplicationState state = [UIApplication sharedApplication].applicationState; - return state == UIApplicationStateActive; -} +@interface RTCUIApplicationStatusObserver : NSObject -#endif // WEBRTC_IOS ++ (instancetype)sharedInstance; + +- (BOOL)isApplicationActive; + +@end + +#endif // WEBRTC_IOS diff --git a/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m b/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m new file mode 100644 index 0000000000..718aeca58b --- /dev/null +++ b/webrtc/sdk/objc/Framework/Classes/Common/RTCUIApplicationStatusObserver.m @@ -0,0 +1,68 @@ +/* + * Copyright 2016 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. + */ + +#include "RTCUIApplicationStatusObserver.h" + +#if defined(WEBRTC_IOS) + +#import + +@implementation RTCUIApplicationStatusObserver { + UIApplicationState _state; +} + ++ (instancetype)sharedInstance { + static id sharedInstance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + sharedInstance = [[self alloc] init]; + }); + + return sharedInstance; +} + +- (id)init { + if (self = [super init]) { + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + [center addObserverForName:UIApplicationDidBecomeActiveNotification + object:nil + queue:[NSOperationQueue mainQueue] + usingBlock:^(NSNotification *note) { + _state = [UIApplication sharedApplication].applicationState; + }]; + + [center addObserverForName:UIApplicationDidEnterBackgroundNotification + object:nil + queue:[NSOperationQueue mainQueue] + usingBlock:^(NSNotification *note) { + _state = [UIApplication sharedApplication].applicationState; + }]; + + dispatch_block_t initializeBlock = ^{ + _state = [UIApplication sharedApplication].applicationState; + }; + + if ([NSThread isMainThread]) { + initializeBlock(); + } else { + dispatch_sync(dispatch_get_main_queue(), initializeBlock); + } + } + + return self; +} + +- (BOOL)isApplicationActive { + return _state == UIApplicationStateActive; +} + +@end + +#endif // WEBRTC_IOS diff --git a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.mm b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.mm index 9c2509f83c..1698477e82 100644 --- a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.mm +++ b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/decoder.mm @@ -13,9 +13,6 @@ #include -#if defined(WEBRTC_IOS) -#include "Common/RTCUIApplication.h" -#endif #include "libyuv/convert.h" #include "webrtc/api/video/video_frame.h" #include "webrtc/base/checks.h" @@ -24,6 +21,10 @@ #include "webrtc/sdk/objc/Framework/Classes/Video/corevideo_frame_buffer.h" #include "webrtc/sdk/objc/Framework/Classes/VideoToolbox/nalu_rewriter.h" +#if defined(WEBRTC_IOS) +#import "Common/RTCUIApplicationStatusObserver.h" +#endif + namespace webrtc { namespace { @@ -74,9 +75,7 @@ void VTDecompressionOutputCallback(void* decoder, } // namespace H264VideoToolboxDecoder::H264VideoToolboxDecoder() - : callback_(nullptr), - video_format_(nullptr), - decompression_session_(nullptr) {} + : callback_(nullptr), video_format_(nullptr), decompression_session_(nullptr) {} H264VideoToolboxDecoder::~H264VideoToolboxDecoder() { DestroyDecompressionSession(); @@ -97,7 +96,7 @@ int H264VideoToolboxDecoder::Decode( RTC_DCHECK(input_image._buffer); #if defined(WEBRTC_IOS) - if (!RTCIsUIApplicationActive()) { + if (![[RTCUIApplicationStatusObserver sharedInstance] isApplicationActive]) { // Ignore all decode requests when app isn't active. In this state, the // hardware decoder has been invalidated by the OS. // Reset video format so that we won't process frames until the next diff --git a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.mm b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.mm index 8ff27f8d3a..4928cd5596 100644 --- a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.mm +++ b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/encoder.mm @@ -16,8 +16,8 @@ #include #if defined(WEBRTC_IOS) +#import "Common/RTCUIApplicationStatusObserver.h" #import "WebRTC/UIDevice+RTCDevice.h" -#include "Common/RTCUIApplication.h" #endif #include "libyuv/convert_from.h" #include "webrtc/base/checks.h" @@ -386,7 +386,7 @@ int H264VideoToolboxEncoder::Encode( return WEBRTC_VIDEO_CODEC_UNINITIALIZED; } #if defined(WEBRTC_IOS) - if (!RTCIsUIApplicationActive()) { + if (![[RTCUIApplicationStatusObserver sharedInstance] isApplicationActive]) { // Ignore all encode requests when app isn't active. In this state, the // hardware encoder has been invalidated by the OS. return WEBRTC_VIDEO_CODEC_OK; diff --git a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/videocodecfactory.cc b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/videocodecfactory.mm similarity index 80% rename from webrtc/sdk/objc/Framework/Classes/VideoToolbox/videocodecfactory.cc rename to webrtc/sdk/objc/Framework/Classes/VideoToolbox/videocodecfactory.mm index 05806cd2c1..1aa5ba3d28 100644 --- a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/videocodecfactory.cc +++ b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/videocodecfactory.mm @@ -28,8 +28,7 @@ bool IsHighProfileEnabled() { // VideoToolboxVideoEncoderFactory -VideoToolboxVideoEncoderFactory::VideoToolboxVideoEncoderFactory() { -} +VideoToolboxVideoEncoderFactory::VideoToolboxVideoEncoderFactory() {} VideoToolboxVideoEncoderFactory::~VideoToolboxVideoEncoderFactory() {} @@ -43,14 +42,12 @@ VideoEncoder* VideoToolboxVideoEncoderFactory::CreateVideoEncoder( return nullptr; } -void VideoToolboxVideoEncoderFactory::DestroyVideoEncoder( - VideoEncoder* encoder) { +void VideoToolboxVideoEncoderFactory::DestroyVideoEncoder(VideoEncoder* encoder) { delete encoder; encoder = nullptr; } -const std::vector& -VideoToolboxVideoEncoderFactory::supported_codecs() const { +const std::vector& VideoToolboxVideoEncoderFactory::supported_codecs() const { supported_codecs_.clear(); // TODO(magjed): Enumerate actual level instead of using hardcoded level 3.1. @@ -59,22 +56,18 @@ VideoToolboxVideoEncoderFactory::supported_codecs() const { if (IsHighProfileEnabled()) { cricket::VideoCodec constrained_high(cricket::kH264CodecName); - const H264::ProfileLevelId constrained_high_profile( - H264::kProfileConstrainedHigh, level); - constrained_high.SetParam( - cricket::kH264FmtpProfileLevelId, - *H264::ProfileLevelIdToString(constrained_high_profile)); + const H264::ProfileLevelId constrained_high_profile(H264::kProfileConstrainedHigh, level); + constrained_high.SetParam(cricket::kH264FmtpProfileLevelId, + *H264::ProfileLevelIdToString(constrained_high_profile)); constrained_high.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1"); constrained_high.SetParam(cricket::kH264FmtpPacketizationMode, "1"); supported_codecs_.push_back(constrained_high); } cricket::VideoCodec constrained_baseline(cricket::kH264CodecName); - const H264::ProfileLevelId constrained_baseline_profile( - H264::kProfileConstrainedBaseline, level); - constrained_baseline.SetParam( - cricket::kH264FmtpProfileLevelId, - *H264::ProfileLevelIdToString(constrained_baseline_profile)); + const H264::ProfileLevelId constrained_baseline_profile(H264::kProfileConstrainedBaseline, level); + constrained_baseline.SetParam(cricket::kH264FmtpProfileLevelId, + *H264::ProfileLevelIdToString(constrained_baseline_profile)); constrained_baseline.SetParam(cricket::kH264FmtpLevelAsymmetryAllowed, "1"); constrained_baseline.SetParam(cricket::kH264FmtpPacketizationMode, "1"); supported_codecs_.push_back(constrained_baseline); @@ -90,8 +83,7 @@ VideoToolboxVideoDecoderFactory::VideoToolboxVideoDecoderFactory() { VideoToolboxVideoDecoderFactory::~VideoToolboxVideoDecoderFactory() {} -VideoDecoder* VideoToolboxVideoDecoderFactory::CreateVideoDecoder( - VideoCodecType type) { +VideoDecoder* VideoToolboxVideoDecoderFactory::CreateVideoDecoder(VideoCodecType type) { const rtc::Optional codec_name = CodecTypeToPayloadName(type); if (!codec_name) { LOG(LS_ERROR) << "Invalid codec type: " << type; @@ -106,8 +98,7 @@ VideoDecoder* VideoToolboxVideoDecoderFactory::CreateVideoDecoder( return nullptr; } -void VideoToolboxVideoDecoderFactory::DestroyVideoDecoder( - VideoDecoder* decoder) { +void VideoToolboxVideoDecoderFactory::DestroyVideoDecoder(VideoDecoder* decoder) { delete decoder; decoder = nullptr; }