blob: 7771b13a2f9f8979c89e08f21472f8a557211363 [file] [log] [blame]
Zeke Chin71f6f442015-06-29 14:34:58 -07001/*
2 * Copyright (c) 2015 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 */
11
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020012#include "modules/video_coding/codecs/h264/include/h264.h"
Zeke Chin71f6f442015-06-29 14:34:58 -070013
Magnus Jedvert849b3ae2017-09-29 17:54:09 +020014#include "api/video_codecs/sdp_video_format.h"
Magnus Jedvert8deb8182017-10-05 13:13:32 +020015#include "media/base/h264_profile_level_id.h"
Magnus Jedvert849b3ae2017-09-29 17:54:09 +020016
hbos9dc59282016-02-03 05:09:37 -080017#if defined(WEBRTC_USE_H264)
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "modules/video_coding/codecs/h264/h264_decoder_impl.h"
19#include "modules/video_coding/codecs/h264/h264_encoder_impl.h"
hbosbab934b2016-01-27 01:36:03 -080020#endif
Zeke Chin71f6f442015-06-29 14:34:58 -070021
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "rtc_base/checks.h"
23#include "rtc_base/logging.h"
Magnus Jedvert46a27652017-11-13 14:10:02 +010024#include "rtc_base/ptr_util.h"
Zeke Chin71f6f442015-06-29 14:34:58 -070025
26namespace webrtc {
27
hbos9dc59282016-02-03 05:09:37 -080028namespace {
29
30#if defined(WEBRTC_USE_H264)
31bool g_rtc_use_h264 = true;
32#endif
33
Magnus Jedvert8deb8182017-10-05 13:13:32 +020034// If H.264 OpenH264/FFmpeg codec is supported.
Magnus Jedvert849b3ae2017-09-29 17:54:09 +020035bool IsH264CodecSupported() {
36#if defined(WEBRTC_USE_H264)
37 return g_rtc_use_h264;
38#else
39 return false;
40#endif
41}
42
Magnus Jedvert8deb8182017-10-05 13:13:32 +020043SdpVideoFormat CreateH264Format(H264::Profile profile, H264::Level level) {
44 const rtc::Optional<std::string> profile_string =
45 H264::ProfileLevelIdToString(H264::ProfileLevelId(profile, level));
46 RTC_CHECK(profile_string);
47 return SdpVideoFormat(cricket::kH264CodecName,
48 {{cricket::kH264FmtpProfileLevelId, *profile_string},
49 {cricket::kH264FmtpLevelAsymmetryAllowed, "1"},
50 {cricket::kH264FmtpPacketizationMode, "1"}});
51}
52
hbos9dc59282016-02-03 05:09:37 -080053} // namespace
54
55void DisableRtcUseH264() {
56#if defined(WEBRTC_USE_H264)
57 g_rtc_use_h264 = false;
58#endif
59}
60
Magnus Jedvert849b3ae2017-09-29 17:54:09 +020061std::vector<SdpVideoFormat> SupportedH264Codecs() {
62 if (!IsH264CodecSupported())
63 return std::vector<SdpVideoFormat>();
Magnus Jedvert8deb8182017-10-05 13:13:32 +020064 // We only support encoding Constrained Baseline Profile (CBP), but the
65 // decoder supports more profiles. We can list all profiles here that are
66 // supported by the decoder and that are also supersets of CBP, i.e. the
67 // decoder for that profile is required to be able to decode CBP. This means
68 // we can encode and send CBP even though we negotiated a potentially
69 // higher profile. See the H264 spec for more information.
Magnus Jedverta7503332017-11-01 08:52:03 +010070 return {CreateH264Format(H264::kProfileBaseline, H264::kLevel3_1),
71 CreateH264Format(H264::kProfileConstrainedBaseline, H264::kLevel3_1)};
Zeke Chin71f6f442015-06-29 14:34:58 -070072}
73
Magnus Jedvert46a27652017-11-13 14:10:02 +010074std::unique_ptr<H264Encoder> H264Encoder::Create(
75 const cricket::VideoCodec& codec) {
henrikg91d6ede2015-09-17 00:24:34 -070076 RTC_DCHECK(H264Encoder::IsSupported());
hbos9dc59282016-02-03 05:09:37 -080077#if defined(WEBRTC_USE_H264)
78 RTC_CHECK(g_rtc_use_h264);
Mirko Bonadei675513b2017-11-09 11:09:25 +010079 RTC_LOG(LS_INFO) << "Creating H264EncoderImpl.";
Magnus Jedvert46a27652017-11-13 14:10:02 +010080 return rtc::MakeUnique<H264EncoderImpl>(codec);
Zeke Chin71f6f442015-06-29 14:34:58 -070081#else
82 RTC_NOTREACHED();
83 return nullptr;
84#endif
85}
86
87bool H264Encoder::IsSupported() {
88 return IsH264CodecSupported();
89}
90
Magnus Jedvert46a27652017-11-13 14:10:02 +010091std::unique_ptr<H264Decoder> H264Decoder::Create() {
henrikg91d6ede2015-09-17 00:24:34 -070092 RTC_DCHECK(H264Decoder::IsSupported());
hbos9dc59282016-02-03 05:09:37 -080093#if defined(WEBRTC_USE_H264)
94 RTC_CHECK(g_rtc_use_h264);
Mirko Bonadei675513b2017-11-09 11:09:25 +010095 RTC_LOG(LS_INFO) << "Creating H264DecoderImpl.";
Magnus Jedvert46a27652017-11-13 14:10:02 +010096 return rtc::MakeUnique<H264DecoderImpl>();
Zeke Chin71f6f442015-06-29 14:34:58 -070097#else
98 RTC_NOTREACHED();
99 return nullptr;
100#endif
101}
102
103bool H264Decoder::IsSupported() {
104 return IsH264CodecSupported();
105}
106
107} // namespace webrtc