blob: 06c4e8c22fcb1b5a3af04659a4153e117aa905b3 [file] [log] [blame]
Anders Carlsson7e042812017-10-05 16:55:38 +02001/*
2 * Copyright 2017 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020011#import "RTCDefaultVideoEncoderFactory.h"
Anders Carlsson7e042812017-10-05 16:55:38 +020012
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020013#import "RTCH264ProfileLevelId.h"
14#import "RTCVideoEncoderH264.h"
15#import "api/video_codec/RTCVideoCodecConstants.h"
Yura Yaroshevich8cfb2872021-03-03 12:29:42 +030016#import "api/video_codec/RTCVideoEncoderAV1.h"
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020017#import "api/video_codec/RTCVideoEncoderVP8.h"
Anders Carlsson7bca8ca2018-08-30 09:30:29 +020018#import "api/video_codec/RTCVideoEncoderVP9.h"
Yura Yaroshevich8cfb2872021-03-03 12:29:42 +030019#import "base/RTCVideoCodecInfo.h"
Anders Carlsson7e042812017-10-05 16:55:38 +020020
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020021@implementation RTC_OBJC_TYPE (RTCDefaultVideoEncoderFactory)
Anders Carlsson7e042812017-10-05 16:55:38 +020022
Anders Carlsson6bf43d22017-10-16 13:51:43 +020023@synthesize preferredCodec;
24
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020025+ (NSArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *)supportedCodecs {
Anders Carlsson1d4c1522017-10-30 13:07:07 +010026 NSDictionary<NSString *, NSString *> *constrainedHighParams = @{
Yura Yaroshevich0f77fea2018-04-26 15:41:01 +030027 @"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedHigh,
Anders Carlsson1d4c1522017-10-30 13:07:07 +010028 @"level-asymmetry-allowed" : @"1",
29 @"packetization-mode" : @"1",
30 };
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020031 RTC_OBJC_TYPE(RTCVideoCodecInfo) *constrainedHighInfo =
32 [[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecH264Name
33 parameters:constrainedHighParams];
Anders Carlsson1d4c1522017-10-30 13:07:07 +010034
35 NSDictionary<NSString *, NSString *> *constrainedBaselineParams = @{
Yura Yaroshevich0f77fea2018-04-26 15:41:01 +030036 @"profile-level-id" : kRTCMaxSupportedH264ProfileLevelConstrainedBaseline,
Anders Carlsson1d4c1522017-10-30 13:07:07 +010037 @"level-asymmetry-allowed" : @"1",
38 @"packetization-mode" : @"1",
39 };
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020040 RTC_OBJC_TYPE(RTCVideoCodecInfo) *constrainedBaselineInfo =
41 [[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecH264Name
42 parameters:constrainedBaselineParams];
Anders Carlsson1d4c1522017-10-30 13:07:07 +010043
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020044 RTC_OBJC_TYPE(RTCVideoCodecInfo) *vp8Info =
45 [[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecVp8Name];
Anders Carlsson1d4c1522017-10-30 13:07:07 +010046
Yura Yaroshevich8cfb2872021-03-03 12:29:42 +030047 NSMutableArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *result = [@[
Anders Carlssondd8c1652018-01-30 10:32:13 +010048 constrainedHighInfo,
49 constrainedBaselineInfo,
Anders Carlssondd8c1652018-01-30 10:32:13 +010050 vp8Info,
Yura Yaroshevich8cfb2872021-03-03 12:29:42 +030051 ] mutableCopy];
52
53 if ([RTC_OBJC_TYPE(RTCVideoEncoderVP9) isSupported]) {
54 [result
55 addObject:[[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecVp9Name]];
56 }
57
58 if ([RTC_OBJC_TYPE(RTCVideoEncoderAV1) isSupported]) {
59 [result
60 addObject:[[RTC_OBJC_TYPE(RTCVideoCodecInfo) alloc] initWithName:kRTCVideoCodecAv1Name]];
61 }
62
63 return result;
Anders Carlsson1d4c1522017-10-30 13:07:07 +010064}
65
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020066- (id<RTC_OBJC_TYPE(RTCVideoEncoder)>)createEncoder:(RTC_OBJC_TYPE(RTCVideoCodecInfo) *)info {
Kári Tristan Helgasonfc313dc2017-10-20 11:01:22 +020067 if ([info.name isEqualToString:kRTCVideoCodecH264Name]) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020068 return [[RTC_OBJC_TYPE(RTCVideoEncoderH264) alloc] initWithCodecInfo:info];
Kári Tristan Helgasonfc313dc2017-10-20 11:01:22 +020069 } else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020070 return [RTC_OBJC_TYPE(RTCVideoEncoderVP8) vp8Encoder];
Yura Yaroshevich8cfb2872021-03-03 12:29:42 +030071 } else if ([info.name isEqualToString:kRTCVideoCodecVp9Name] &&
72 [RTC_OBJC_TYPE(RTCVideoEncoderVP9) isSupported]) {
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020073 return [RTC_OBJC_TYPE(RTCVideoEncoderVP9) vp9Encoder];
Yura Yaroshevich8cfb2872021-03-03 12:29:42 +030074 } else if ([info.name isEqualToString:kRTCVideoCodecAv1Name] &&
75 [RTC_OBJC_TYPE(RTCVideoEncoderAV1) isSupported]) {
76 return [RTC_OBJC_TYPE(RTCVideoEncoderAV1) av1Encoder];
Anders Carlsson7e042812017-10-05 16:55:38 +020077 }
78
79 return nil;
80}
81
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020082- (NSArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *)supportedCodecs {
83 NSMutableArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *codecs =
84 [[[self class] supportedCodecs] mutableCopy];
Anders Carlsson7e042812017-10-05 16:55:38 +020085
Mirko Bonadeia81e9c82020-05-04 16:14:32 +020086 NSMutableArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *orderedCodecs = [NSMutableArray array];
Anders Carlsson6bf43d22017-10-16 13:51:43 +020087 NSUInteger index = [codecs indexOfObject:self.preferredCodec];
88 if (index != NSNotFound) {
89 [orderedCodecs addObject:[codecs objectAtIndex:index]];
90 [codecs removeObjectAtIndex:index];
91 }
92 [orderedCodecs addObjectsFromArray:codecs];
93
94 return [orderedCodecs copy];
Anders Carlsson7e042812017-10-05 16:55:38 +020095}
96
97@end