Index: webrtc/modules/video_coding/codecs/h264/h264.cc |
diff --git a/webrtc/modules/video_coding/codecs/h264/h264.cc b/webrtc/modules/video_coding/codecs/h264/h264.cc |
index d4123a2e777d7ecad519d9fe8b406eebe0777e63..6060caf1dbeddab9da71461a556582e403ca624a 100644 |
--- a/webrtc/modules/video_coding/codecs/h264/h264.cc |
+++ b/webrtc/modules/video_coding/codecs/h264/h264.cc |
@@ -11,6 +11,10 @@ |
#include "webrtc/modules/video_coding/codecs/h264/include/h264.h" |
+#if defined(WEBRTC_OPENH264) |
+#include "webrtc/modules/video_coding/codecs/h264/h264_encoder_impl.h" |
+#include "webrtc/modules/video_coding/codecs/h264/h264_decoder_impl.h" |
+#endif |
#if defined(WEBRTC_IOS) |
#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_decoder.h" |
#include "webrtc/modules/video_coding/codecs/h264/h264_video_toolbox_encoder.h" |
@@ -27,9 +31,33 @@ namespace webrtc { |
extern bool IsH264CodecSupportedObjC(); |
#endif |
+// If any H.264 codec is supported (iOS HW or OpenH264). |
bool IsH264CodecSupported() { |
#if defined(WEBRTC_IOS) |
- return IsH264CodecSupportedObjC(); |
+ if (IsH264CodecSupportedObjC()) { |
+ return true; |
+ } |
+#endif |
+#if defined(WEBRTC_OPENH264) |
+ return true; |
+#else |
+ return false; |
+#endif |
+} |
+ |
+// If H.264 codec is supported and OpenH264 is the implementation used, meaning |
+// H264EncoderImpl and H264DecoderImpl. |
+bool IsOpenH264CodecSupported() { |
+#if defined(WEBRTC_OPENH264) |
+ #if defined(WEBRTC_IOS) |
+ // If on iOS and we have HW H.264 support we will prefer that over OpenH264 |
+ // and say that OpenH264 is not supported (even though some H264 is). |
+ // TODO(hbos): If we could support both HW and SW implementations then we |
+ // should do so and have the ability to choose. |
+ return !IsH264CodecSupportedObjC(); |
+ #else |
+ return true; |
+ #endif |
#else |
return false; |
#endif |
@@ -38,29 +66,49 @@ bool IsH264CodecSupported() { |
H264Encoder* H264Encoder::Create() { |
DCHECK(H264Encoder::IsSupported()); |
#if defined(WEBRTC_IOS) && defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) |
- return new H264VideoToolboxEncoder(); |
-#else |
+ if (IsH264CodecSupportedObjC()) { |
+ return new H264VideoToolboxEncoder(); |
+ } |
+#endif |
+#if defined(WEBRTC_OPENH264) |
+ if (IsOpenH264CodecSupported()) { |
+ return new H264EncoderImpl(); |
+ } |
+#endif |
RTC_NOTREACHED(); |
return nullptr; |
-#endif |
} |
bool H264Encoder::IsSupported() { |
return IsH264CodecSupported(); |
} |
+bool H264Encoder::IsSupportedOpenH264() { |
+ return IsOpenH264CodecSupported(); |
+} |
+ |
H264Decoder* H264Decoder::Create() { |
DCHECK(H264Decoder::IsSupported()); |
#if defined(WEBRTC_IOS) && defined(WEBRTC_VIDEO_TOOLBOX_SUPPORTED) |
- return new H264VideoToolboxDecoder(); |
-#else |
+ if (IsH264CodecSupportedObjC()) { |
+ return new H264VideoToolboxDecoder(); |
+ } |
+#endif |
+#if defined(WEBRTC_OPENH264) |
+ if (IsOpenH264CodecSupported()) { |
+ return new H264DecoderImpl(); |
+ } |
+#endif |
RTC_NOTREACHED(); |
return nullptr; |
-#endif |
} |
bool H264Decoder::IsSupported() { |
return IsH264CodecSupported(); |
} |
+bool H264Decoder::IsSupportedOpenH264() { |
+ return IsOpenH264CodecSupported(); |
+} |
+ |
} // namespace webrtc |