OLD | NEW |
---|---|
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
55 VideoCapturer* video_capturer) { | 55 VideoCapturer* video_capturer) { |
56 if (!video_capturer) { | 56 if (!video_capturer) { |
57 return NULL; | 57 return NULL; |
58 } | 58 } |
59 CaptureRenderAdapter* return_value = new CaptureRenderAdapter(video_capturer); | 59 CaptureRenderAdapter* return_value = new CaptureRenderAdapter(video_capturer); |
60 return_value->Init(); // Can't fail. | 60 return_value->Init(); // Can't fail. |
61 return return_value; | 61 return return_value; |
62 } | 62 } |
63 | 63 |
64 bool CaptureRenderAdapter::AddRenderer(VideoRenderer* video_renderer) { | 64 bool CaptureRenderAdapter::AddRenderer(VideoRenderer* video_renderer) { |
65 if (!video_renderer) { | 65 if (!video_renderer) { |
tommi
2016/01/20 13:21:24
can you add an RTC_DCHECK for this? Seems like thi
nisse-webrtc
2016/01/21 08:08:50
Done. Callers (CaptureManager) checks for NULL.
| |
66 return false; | 66 return false; |
67 } | 67 } |
68 rtc::CritScope cs(&capture_crit_); | 68 rtc::CritScope cs(&capture_crit_); |
69 if (IsRendererRegistered(*video_renderer)) { | 69 if (IsRendererRegistered(*video_renderer)) { |
70 return false; | 70 return false; |
71 } | 71 } |
72 video_renderers_.push_back(VideoRendererInfo(video_renderer)); | 72 video_renderers_.push_back(video_renderer); |
73 return true; | 73 return true; |
74 } | 74 } |
75 | 75 |
76 bool CaptureRenderAdapter::RemoveRenderer(VideoRenderer* video_renderer) { | 76 bool CaptureRenderAdapter::RemoveRenderer(VideoRenderer* video_renderer) { |
77 if (!video_renderer) { | 77 if (!video_renderer) { |
78 return false; | 78 return false; |
79 } | 79 } |
80 rtc::CritScope cs(&capture_crit_); | 80 rtc::CritScope cs(&capture_crit_); |
81 // TODO(nisse): Switch to using std::set (like in | |
82 // VideoTrackRenderers), so we can use erase directly? | |
tommi
2016/01/20 13:21:24
what about:
video_renderers_.erase(
std::remo
nisse-webrtc
2016/01/20 13:45:45
Maybe, is that readable to a typical C++ programme
tommi
2016/01/20 15:38:15
Using erase+std::remove is readable to a C++ progr
nisse-webrtc
2016/01/21 08:08:50
I'm editing the TODO to suggest std::list, but I'm
| |
81 for (VideoRenderers::iterator iter = video_renderers_.begin(); | 83 for (VideoRenderers::iterator iter = video_renderers_.begin(); |
82 iter != video_renderers_.end(); ++iter) { | 84 iter != video_renderers_.end(); ++iter) { |
83 if (video_renderer == iter->renderer) { | 85 if (video_renderer == *iter) { |
84 video_renderers_.erase(iter); | 86 video_renderers_.erase(iter); |
85 return true; | 87 return true; |
86 } | 88 } |
87 } | 89 } |
88 return false; | 90 return false; |
89 } | 91 } |
90 | 92 |
91 void CaptureRenderAdapter::Init() { | 93 void CaptureRenderAdapter::Init() { |
92 video_capturer_->SignalVideoFrame.connect( | 94 video_capturer_->SignalVideoFrame.connect( |
93 this, | 95 this, |
94 &CaptureRenderAdapter::OnVideoFrame); | 96 &CaptureRenderAdapter::OnVideoFrame); |
95 } | 97 } |
96 | 98 |
97 void CaptureRenderAdapter::OnVideoFrame(VideoCapturer* capturer, | 99 void CaptureRenderAdapter::OnVideoFrame(VideoCapturer* capturer, |
98 const VideoFrame* video_frame) { | 100 const VideoFrame* video_frame) { |
99 rtc::CritScope cs(&capture_crit_); | 101 rtc::CritScope cs(&capture_crit_); |
100 if (video_renderers_.empty()) { | 102 if (video_renderers_.empty()) { |
101 return; | 103 return; |
102 } | 104 } |
103 MaybeSetRenderingSize(video_frame); | |
104 | 105 |
105 for (VideoRenderers::iterator iter = video_renderers_.begin(); | 106 for (VideoRenderers::iterator iter = video_renderers_.begin(); |
106 iter != video_renderers_.end(); ++iter) { | 107 iter != video_renderers_.end(); ++iter) { |
tommi
2016/01/20 13:21:24
change to range based loop?
for (auto* renderer :
nisse-webrtc
2016/01/20 13:45:45
Done. Looks nice and concise.
| |
107 VideoRenderer* video_renderer = iter->renderer; | 108 (*iter)->RenderFrame(video_frame); |
108 video_renderer->RenderFrame(video_frame); | |
109 } | 109 } |
110 } | 110 } |
111 | 111 |
112 // The renderer_crit_ lock needs to be taken when calling this function. | |
113 void CaptureRenderAdapter::MaybeSetRenderingSize(const VideoFrame* frame) { | |
114 for (VideoRenderers::iterator iter = video_renderers_.begin(); | |
115 iter != video_renderers_.end(); ++iter) { | |
116 const bool new_resolution = iter->render_width != frame->GetWidth() || | |
117 iter->render_height != frame->GetHeight(); | |
118 if (new_resolution) { | |
119 iter->render_width = frame->GetWidth(); | |
120 iter->render_height = frame->GetHeight(); | |
121 } | |
122 } | |
123 } | |
124 | |
125 // The renderer_crit_ lock needs to be taken when calling this function. | 112 // The renderer_crit_ lock needs to be taken when calling this function. |
126 bool CaptureRenderAdapter::IsRendererRegistered( | 113 bool CaptureRenderAdapter::IsRendererRegistered( |
127 const VideoRenderer& video_renderer) const { | 114 const VideoRenderer& video_renderer) const { |
128 for (VideoRenderers::const_iterator iter = video_renderers_.begin(); | 115 for (VideoRenderers::const_iterator iter = video_renderers_.begin(); |
129 iter != video_renderers_.end(); ++iter) { | 116 iter != video_renderers_.end(); ++iter) { |
130 if (&video_renderer == iter->renderer) { | 117 if (&video_renderer == *iter) { |
131 return true; | 118 return true; |
132 } | 119 } |
133 } | 120 } |
134 return false; | 121 return false; |
135 } | 122 } |
136 | 123 |
137 } // namespace cricket | 124 } // namespace cricket |
OLD | NEW |