3838static const NSUInteger XCWRealtimeHardwareHealthyFrameWindow = 6 ;
3939
4040typedef NS_ENUM (NSUInteger , XCWVideoEncoderMode) {
41+ XCWVideoEncoderModeAuto,
4142 XCWVideoEncoderModeH264Hardware,
4243 XCWVideoEncoderModeH264Software,
4344};
4445
4546static XCWVideoEncoderMode XCWVideoEncoderModeFromEnvironment (void ) {
4647 const char *rawValue = getenv (" SIMDECK_VIDEO_CODEC" );
4748 NSString *value = rawValue != NULL ? [[[NSString alloc ] initWithUTF8String: rawValue] lowercaseString ] : @" " ;
48- if ([value isEqualToString: @" h264" ] || [value isEqualToString: @" h264-hardware" ] || [value isEqualToString: @" avc" ]) {
49+ if (value.length == 0 || [value isEqualToString: @" auto" ]) {
50+ return XCWVideoEncoderModeAuto;
51+ }
52+ if ([value isEqualToString: @" hardware" ]) {
4953 return XCWVideoEncoderModeH264Hardware;
5054 }
51- if ([value isEqualToString: @" h264- software" ] || [value isEqualToString: @" software-h264 " ]) {
55+ if ([value isEqualToString: @" software" ]) {
5256 return XCWVideoEncoderModeH264Software;
5357 }
54- return XCWVideoEncoderModeH264Software ;
58+ return XCWVideoEncoderModeAuto ;
5559}
5660
5761static BOOL XCWLowLatencyModeFromEnvironment (void ) {
@@ -149,6 +153,7 @@ static int32_t XCWRealtimeMinimumAverageBitRate(void) {
149153
150154static CMVideoCodecType XCWVideoCodecTypeForMode (XCWVideoEncoderMode mode) {
151155 switch (mode) {
156+ case XCWVideoEncoderModeAuto:
152157 case XCWVideoEncoderModeH264Hardware:
153158 case XCWVideoEncoderModeH264Software:
154159 default :
@@ -158,16 +163,19 @@ static CMVideoCodecType XCWVideoCodecTypeForMode(XCWVideoEncoderMode mode) {
158163
159164static NSString *XCWVideoEncoderModeName (XCWVideoEncoderMode mode) {
160165 switch (mode) {
166+ case XCWVideoEncoderModeAuto:
167+ return @" auto" ;
161168 case XCWVideoEncoderModeH264Hardware:
162- return @" h264 " ;
169+ return @" hardware " ;
163170 case XCWVideoEncoderModeH264Software:
164171 default :
165- return @" h264- software" ;
172+ return @" software" ;
166173 }
167174}
168175
169176static NSString *XCWVideoEncoderIDForMode (XCWVideoEncoderMode mode) {
170177 switch (mode) {
178+ case XCWVideoEncoderModeAuto:
171179 case XCWVideoEncoderModeH264Hardware:
172180 return nil ;
173181 case XCWVideoEncoderModeH264Software:
@@ -648,7 +656,7 @@ - (int32_t)expectedFrameRateLocked {
648656}
649657
650658- (BOOL )shouldPaceRealtimeHardwareFrameAtTimeUs : (uint64_t )nowUs {
651- if (_encoderMode != XCWVideoEncoderModeH264Hardware || !_realtimeStreamMode || _needsKeyFrame) {
659+ if (( _encoderMode != XCWVideoEncoderModeAuto && _encoderMode != XCWVideoEncoderModeH264Hardware) || !_realtimeStreamMode || _needsKeyFrame) {
652660 return NO ;
653661 }
654662 if (_realtimeHardwareFrameIntervalUs == 0 ) {
@@ -723,7 +731,7 @@ - (void)adaptSoftwarePacingForLatencyUs:(uint64_t)latencyUs {
723731}
724732
725733- (void )adaptRealtimeHardwarePacingForLatencyUs : (uint64_t )latencyUs {
726- if (_encoderMode != XCWVideoEncoderModeH264Hardware || !_realtimeStreamMode || latencyUs == 0 ) {
734+ if (( _encoderMode != XCWVideoEncoderModeAuto && _encoderMode != XCWVideoEncoderModeH264Hardware) || !_realtimeStreamMode || latencyUs == 0 ) {
727735 return ;
728736 }
729737 if (_realtimeHardwareFrameIntervalUs == 0 ) {
@@ -843,7 +851,7 @@ - (BOOL)encodePixelBufferLocked:(CVPixelBufferRef)pixelBuffer {
843851 _submittedFrameCount += 1 ;
844852 if (_encoderMode == XCWVideoEncoderModeH264Software) {
845853 _lastSoftwareSubmissionUs = nowUs;
846- } else if (_encoderMode == XCWVideoEncoderModeH264Hardware && _realtimeStreamMode) {
854+ } else if (( _encoderMode == XCWVideoEncoderModeAuto || _encoderMode == XCWVideoEncoderModeH264Hardware) && _realtimeStreamMode) {
847855 _lastRealtimeHardwareSubmissionUs = nowUs;
848856 }
849857 _maxInFlightFrameCount = MAX (_maxInFlightFrameCount, _inFlightFrameCount);
@@ -872,7 +880,7 @@ - (BOOL)ensureCompressionSessionWithWidth:(int32_t)width height:(int32_t)height
872880 }
873881 if (_encoderMode == XCWVideoEncoderModeH264Software) {
874882 encoderSpecification[(__bridge NSString *)kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder ] = @NO ;
875- } else {
883+ } else if (_encoderMode == XCWVideoEncoderModeH264Hardware) {
876884 encoderSpecification[(__bridge NSString *)kVTVideoEncoderSpecification_RequireHardwareAcceleratedVideoEncoder ] = @YES ;
877885 }
878886
0 commit comments