Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / content / renderer / media / rtc_video_encoder_factory.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/media/rtc_video_encoder_factory.h"
6
7 #include "content/common/gpu/client/gpu_video_encode_accelerator_host.h"
8 #include "content/renderer/media/rtc_video_encoder.h"
9 #include "media/filters/gpu_video_accelerator_factories.h"
10 #include "media/video/video_encode_accelerator.h"
11
12 namespace content {
13
14 namespace {
15
16 // Translate from media::VideoEncodeAccelerator::SupportedProfile to
17 // cricket::WebRtcVideoEncoderFactory::VideoCodec
18 cricket::WebRtcVideoEncoderFactory::VideoCodec VEAToWebRTCCodec(
19     const media::VideoEncodeAccelerator::SupportedProfile& profile) {
20   webrtc::VideoCodecType type = webrtc::kVideoCodecUnknown;
21   std::string name;
22   int width = 0, height = 0, fps = 0;
23
24   if (profile.profile >= media::VP8PROFILE_MIN &&
25       profile.profile <= media::VP8PROFILE_MAX) {
26     type = webrtc::kVideoCodecVP8;
27     name = "VP8";
28   } else if (profile.profile >= media::H264PROFILE_MIN &&
29              profile.profile <= media::H264PROFILE_MAX) {
30     type = webrtc::kVideoCodecGeneric;
31     name = "CAST1";
32   }
33
34   if (type != webrtc::kVideoCodecUnknown) {
35     width = profile.max_resolution.width();
36     height = profile.max_resolution.height();
37     fps = profile.max_framerate.numerator;
38     DCHECK_EQ(profile.max_framerate.denominator, 1U);
39   }
40
41   return cricket::WebRtcVideoEncoderFactory::VideoCodec(
42       type, name, width, height, fps);
43 }
44
45 // Translate from cricket::WebRtcVideoEncoderFactory::VideoCodec to
46 // media::VideoCodecProfile.  Pick a default profile for each codec type.
47 media::VideoCodecProfile WebRTCCodecToVideoCodecProfile(
48     webrtc::VideoCodecType type) {
49   switch (type) {
50     case webrtc::kVideoCodecVP8:
51       return media::VP8PROFILE_MAIN;
52     case webrtc::kVideoCodecGeneric:
53       return media::H264PROFILE_MAIN;
54     default:
55       return media::VIDEO_CODEC_PROFILE_UNKNOWN;
56   }
57 }
58
59 }  // anonymous namespace
60
61 RTCVideoEncoderFactory::RTCVideoEncoderFactory(
62     const scoped_refptr<media::GpuVideoAcceleratorFactories>& gpu_factories)
63     : gpu_factories_(gpu_factories) {
64   // Query media::VideoEncodeAccelerator (statically) for our supported codecs.
65   std::vector<media::VideoEncodeAccelerator::SupportedProfile> profiles =
66       GpuVideoEncodeAcceleratorHost::GetSupportedProfiles();
67   for (size_t i = 0; i < profiles.size(); ++i) {
68     VideoCodec codec = VEAToWebRTCCodec(profiles[i]);
69     if (codec.type != webrtc::kVideoCodecUnknown)
70       codecs_.push_back(codec);
71   }
72 }
73
74 RTCVideoEncoderFactory::~RTCVideoEncoderFactory() {}
75
76 webrtc::VideoEncoder* RTCVideoEncoderFactory::CreateVideoEncoder(
77     webrtc::VideoCodecType type) {
78   bool found = false;
79   for (size_t i = 0; i < codecs_.size(); ++i) {
80     if (codecs_[i].type == type) {
81       found = true;
82       break;
83     }
84   }
85   if (!found)
86     return NULL;
87   return new RTCVideoEncoder(
88       type, WebRTCCodecToVideoCodecProfile(type), gpu_factories_);
89 }
90
91 void RTCVideoEncoderFactory::AddObserver(Observer* observer) {
92   // No-op: our codec list is populated on installation.
93 }
94
95 void RTCVideoEncoderFactory::RemoveObserver(Observer* observer) {}
96
97 const std::vector<cricket::WebRtcVideoEncoderFactory::VideoCodec>&
98 RTCVideoEncoderFactory::codecs() const {
99   return codecs_;
100 }
101
102 void RTCVideoEncoderFactory::DestroyVideoEncoder(
103     webrtc::VideoEncoder* encoder) {
104   delete encoder;
105 }
106
107 }  // namespace content