blob: df74773c86db26ee374841247aa10bb400b197ac [file] [log] [blame]
magjeddd407022016-12-01 00:27:27 -08001/*
2 * Copyright (c) 2016 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "media/engine/internaldecoderfactory.h"
magjeddd407022016-12-01 00:27:27 -080012
Anders Carlssondd8c1652018-01-30 10:32:13 +010013#include "api/video_codecs/sdp_video_format.h"
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010014#include "media/base/mediaconstants.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/video_coding/codecs/h264/include/h264.h"
Anders Carlssonb3306882018-05-14 10:11:42 +020016#include "modules/video_coding/codecs/vp8/include/vp8.h"
17#include "modules/video_coding/codecs/vp9/include/vp9.h"
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010018#include "rtc_base/checks.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "rtc_base/logging.h"
magjeddd407022016-12-01 00:27:27 -080020
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010021namespace webrtc {
magjeddd407022016-12-01 00:27:27 -080022
Magnus Jedvertd528ad52018-08-06 10:10:51 +020023namespace {
24
25bool IsFormatSupported(
26 const std::vector<webrtc::SdpVideoFormat>& supported_formats,
27 const webrtc::SdpVideoFormat& format) {
28 for (const webrtc::SdpVideoFormat& supported_format : supported_formats) {
29 if (cricket::IsSameCodec(format.name, format.parameters,
30 supported_format.name,
31 supported_format.parameters)) {
32 return true;
33 }
34 }
35 return false;
36}
37
38} // namespace
39
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010040std::vector<SdpVideoFormat> InternalDecoderFactory::GetSupportedFormats()
41 const {
42 std::vector<SdpVideoFormat> formats;
43 formats.push_back(SdpVideoFormat(cricket::kVp8CodecName));
Emircan Uysaler98badbc2018-06-28 10:59:02 -070044 for (const SdpVideoFormat& format : SupportedVP9Codecs())
45 formats.push_back(format);
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010046 for (const SdpVideoFormat& h264_format : SupportedH264Codecs())
47 formats.push_back(h264_format);
48 return formats;
magjeddd407022016-12-01 00:27:27 -080049}
50
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010051std::unique_ptr<VideoDecoder> InternalDecoderFactory::CreateVideoDecoder(
52 const SdpVideoFormat& format) {
Magnus Jedvertd528ad52018-08-06 10:10:51 +020053 if (!IsFormatSupported(GetSupportedFormats(), format)) {
54 RTC_LOG(LS_ERROR) << "Trying to create decoder for unsupported format";
55 return nullptr;
56 }
57
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010058 if (cricket::CodecNamesEq(format.name, cricket::kVp8CodecName))
Magnus Jedvert46a27652017-11-13 14:10:02 +010059 return VP8Decoder::Create();
Emircan Uysaler98badbc2018-06-28 10:59:02 -070060 if (cricket::CodecNamesEq(format.name, cricket::kVp9CodecName))
Magnus Jedvert46a27652017-11-13 14:10:02 +010061 return VP9Decoder::Create();
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010062 if (cricket::CodecNamesEq(format.name, cricket::kH264CodecName))
Magnus Jedvert46a27652017-11-13 14:10:02 +010063 return H264Decoder::Create();
Magnus Jedvertd528ad52018-08-06 10:10:51 +020064
65 RTC_NOTREACHED();
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010066 return nullptr;
Christian Fremerey267d84b2017-11-08 23:26:44 +000067}
68
Magnus Jedvert7501b1c2017-11-09 13:43:42 +010069} // namespace webrtc