| OLD | NEW |
| 1 /* | 1 /* |
| 2 * libjingle | 2 * libjingle |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 | 75 |
| 76 const cricket::CapturedFrame* GetCapturedFrame() const { | 76 const cricket::CapturedFrame* GetCapturedFrame() const { |
| 77 return &captured_frame_; | 77 return &captured_frame_; |
| 78 } | 78 } |
| 79 | 79 |
| 80 cricket::VideoFrame* CreateAliasedFrame( | 80 cricket::VideoFrame* CreateAliasedFrame( |
| 81 const cricket::CapturedFrame* captured_frame, | 81 const cricket::CapturedFrame* captured_frame, |
| 82 int dst_width, | 82 int dst_width, |
| 83 int dst_height) const override { | 83 int dst_height) const override { |
| 84 // Check that captured_frame is actually our frame. | 84 // Check that captured_frame is actually our frame. |
| 85 CHECK(captured_frame == &captured_frame_); | 85 RTC_CHECK(captured_frame == &captured_frame_); |
| 86 rtc::scoped_ptr<cricket::VideoFrame> frame(new cricket::WebRtcVideoFrame( | 86 rtc::scoped_ptr<cricket::VideoFrame> frame(new cricket::WebRtcVideoFrame( |
| 87 ShallowCenterCrop(buffer_, dst_width, dst_height), | 87 ShallowCenterCrop(buffer_, dst_width, dst_height), |
| 88 captured_frame->elapsed_time, captured_frame->time_stamp, | 88 captured_frame->elapsed_time, captured_frame->time_stamp, |
| 89 captured_frame->GetRotation())); | 89 captured_frame->GetRotation())); |
| 90 // Caller takes ownership. | 90 // Caller takes ownership. |
| 91 // TODO(magjed): Change CreateAliasedFrame() to return a rtc::scoped_ptr. | 91 // TODO(magjed): Change CreateAliasedFrame() to return a rtc::scoped_ptr. |
| 92 return apply_rotation_ ? frame->GetCopyWithRotationApplied()->Copy() | 92 return apply_rotation_ ? frame->GetCopyWithRotationApplied()->Copy() |
| 93 : frame.release(); | 93 : frame.release(); |
| 94 } | 94 } |
| 95 | 95 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 112 | 112 |
| 113 Json::Value json_values; | 113 Json::Value json_values; |
| 114 Json::Reader reader(Json::Features::strictMode()); | 114 Json::Reader reader(Json::Features::strictMode()); |
| 115 if (!reader.parse(json_string, json_values)) { | 115 if (!reader.parse(json_string, json_values)) { |
| 116 LOG(LS_ERROR) << "Failed to parse formats."; | 116 LOG(LS_ERROR) << "Failed to parse formats."; |
| 117 } | 117 } |
| 118 | 118 |
| 119 std::vector<cricket::VideoFormat> formats; | 119 std::vector<cricket::VideoFormat> formats; |
| 120 for (Json::ArrayIndex i = 0; i < json_values.size(); ++i) { | 120 for (Json::ArrayIndex i = 0; i < json_values.size(); ++i) { |
| 121 const Json::Value& json_value = json_values[i]; | 121 const Json::Value& json_value = json_values[i]; |
| 122 CHECK(!json_value["width"].isNull() && !json_value["height"].isNull() && | 122 RTC_CHECK(!json_value["width"].isNull() && |
| 123 !json_value["framerate"].isNull()); | 123 !json_value["height"].isNull() && |
| 124 !json_value["framerate"].isNull()); |
| 124 cricket::VideoFormat format( | 125 cricket::VideoFormat format( |
| 125 json_value["width"].asInt(), | 126 json_value["width"].asInt(), |
| 126 json_value["height"].asInt(), | 127 json_value["height"].asInt(), |
| 127 cricket::VideoFormat::FpsToInterval(json_value["framerate"].asInt()), | 128 cricket::VideoFormat::FpsToInterval(json_value["framerate"].asInt()), |
| 128 cricket::FOURCC_YV12); | 129 cricket::FOURCC_YV12); |
| 129 formats.push_back(format); | 130 formats.push_back(format); |
| 130 } | 131 } |
| 131 SetSupportedFormats(formats); | 132 SetSupportedFormats(formats); |
| 132 // Do not apply frame rotation by default. | 133 // Do not apply frame rotation by default. |
| 133 SetApplyRotation(false); | 134 SetApplyRotation(false); |
| 134 } | 135 } |
| 135 | 136 |
| 136 AndroidVideoCapturer::~AndroidVideoCapturer() { | 137 AndroidVideoCapturer::~AndroidVideoCapturer() { |
| 137 CHECK(!running_); | 138 RTC_CHECK(!running_); |
| 138 } | 139 } |
| 139 | 140 |
| 140 cricket::CaptureState AndroidVideoCapturer::Start( | 141 cricket::CaptureState AndroidVideoCapturer::Start( |
| 141 const cricket::VideoFormat& capture_format) { | 142 const cricket::VideoFormat& capture_format) { |
| 142 CHECK(thread_checker_.CalledOnValidThread()); | 143 RTC_CHECK(thread_checker_.CalledOnValidThread()); |
| 143 CHECK(!running_); | 144 RTC_CHECK(!running_); |
| 144 const int fps = cricket::VideoFormat::IntervalToFps(capture_format.interval); | 145 const int fps = cricket::VideoFormat::IntervalToFps(capture_format.interval); |
| 145 LOG(LS_INFO) << " AndroidVideoCapturer::Start " << capture_format.width << "x" | 146 LOG(LS_INFO) << " AndroidVideoCapturer::Start " << capture_format.width << "x" |
| 146 << capture_format.height << "@" << fps; | 147 << capture_format.height << "@" << fps; |
| 147 | 148 |
| 148 frame_factory_ = new AndroidVideoCapturer::FrameFactory(delegate_.get()); | 149 frame_factory_ = new AndroidVideoCapturer::FrameFactory(delegate_.get()); |
| 149 set_frame_factory(frame_factory_); | 150 set_frame_factory(frame_factory_); |
| 150 | 151 |
| 151 running_ = true; | 152 running_ = true; |
| 152 delegate_->Start(capture_format.width, capture_format.height, fps, this); | 153 delegate_->Start(capture_format.width, capture_format.height, fps, this); |
| 153 SetCaptureFormat(&capture_format); | 154 SetCaptureFormat(&capture_format); |
| 154 current_state_ = cricket::CS_STARTING; | 155 current_state_ = cricket::CS_STARTING; |
| 155 return current_state_; | 156 return current_state_; |
| 156 } | 157 } |
| 157 | 158 |
| 158 void AndroidVideoCapturer::Stop() { | 159 void AndroidVideoCapturer::Stop() { |
| 159 LOG(LS_INFO) << " AndroidVideoCapturer::Stop "; | 160 LOG(LS_INFO) << " AndroidVideoCapturer::Stop "; |
| 160 CHECK(thread_checker_.CalledOnValidThread()); | 161 RTC_CHECK(thread_checker_.CalledOnValidThread()); |
| 161 CHECK(running_); | 162 RTC_CHECK(running_); |
| 162 running_ = false; | 163 running_ = false; |
| 163 SetCaptureFormat(NULL); | 164 SetCaptureFormat(NULL); |
| 164 | 165 |
| 165 delegate_->Stop(); | 166 delegate_->Stop(); |
| 166 current_state_ = cricket::CS_STOPPED; | 167 current_state_ = cricket::CS_STOPPED; |
| 167 SignalStateChange(this, current_state_); | 168 SignalStateChange(this, current_state_); |
| 168 } | 169 } |
| 169 | 170 |
| 170 bool AndroidVideoCapturer::IsRunning() { | 171 bool AndroidVideoCapturer::IsRunning() { |
| 171 CHECK(thread_checker_.CalledOnValidThread()); | 172 RTC_CHECK(thread_checker_.CalledOnValidThread()); |
| 172 return running_; | 173 return running_; |
| 173 } | 174 } |
| 174 | 175 |
| 175 bool AndroidVideoCapturer::GetPreferredFourccs(std::vector<uint32>* fourccs) { | 176 bool AndroidVideoCapturer::GetPreferredFourccs(std::vector<uint32>* fourccs) { |
| 176 CHECK(thread_checker_.CalledOnValidThread()); | 177 RTC_CHECK(thread_checker_.CalledOnValidThread()); |
| 177 fourccs->push_back(cricket::FOURCC_YV12); | 178 fourccs->push_back(cricket::FOURCC_YV12); |
| 178 return true; | 179 return true; |
| 179 } | 180 } |
| 180 | 181 |
| 181 void AndroidVideoCapturer::OnCapturerStarted(bool success) { | 182 void AndroidVideoCapturer::OnCapturerStarted(bool success) { |
| 182 CHECK(thread_checker_.CalledOnValidThread()); | 183 RTC_CHECK(thread_checker_.CalledOnValidThread()); |
| 183 cricket::CaptureState new_state = | 184 cricket::CaptureState new_state = |
| 184 success ? cricket::CS_RUNNING : cricket::CS_FAILED; | 185 success ? cricket::CS_RUNNING : cricket::CS_FAILED; |
| 185 if (new_state == current_state_) | 186 if (new_state == current_state_) |
| 186 return; | 187 return; |
| 187 current_state_ = new_state; | 188 current_state_ = new_state; |
| 188 | 189 |
| 189 // TODO(perkj): SetCaptureState can not be used since it posts to |thread_|. | 190 // TODO(perkj): SetCaptureState can not be used since it posts to |thread_|. |
| 190 // But |thread_ | is currently just the thread that happened to create the | 191 // But |thread_ | is currently just the thread that happened to create the |
| 191 // cricket::VideoCapturer. | 192 // cricket::VideoCapturer. |
| 192 SignalStateChange(this, new_state); | 193 SignalStateChange(this, new_state); |
| 193 } | 194 } |
| 194 | 195 |
| 195 void AndroidVideoCapturer::OnIncomingFrame( | 196 void AndroidVideoCapturer::OnIncomingFrame( |
| 196 rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer, | 197 rtc::scoped_refptr<webrtc::VideoFrameBuffer> buffer, |
| 197 int rotation, | 198 int rotation, |
| 198 int64 time_stamp) { | 199 int64 time_stamp) { |
| 199 CHECK(thread_checker_.CalledOnValidThread()); | 200 RTC_CHECK(thread_checker_.CalledOnValidThread()); |
| 200 frame_factory_->UpdateCapturedFrame(buffer, rotation, time_stamp); | 201 frame_factory_->UpdateCapturedFrame(buffer, rotation, time_stamp); |
| 201 SignalFrameCaptured(this, frame_factory_->GetCapturedFrame()); | 202 SignalFrameCaptured(this, frame_factory_->GetCapturedFrame()); |
| 202 frame_factory_->ClearCapturedFrame(); | 203 frame_factory_->ClearCapturedFrame(); |
| 203 } | 204 } |
| 204 | 205 |
| 205 void AndroidVideoCapturer::OnOutputFormatRequest( | 206 void AndroidVideoCapturer::OnOutputFormatRequest( |
| 206 int width, int height, int fps) { | 207 int width, int height, int fps) { |
| 207 CHECK(thread_checker_.CalledOnValidThread()); | 208 RTC_CHECK(thread_checker_.CalledOnValidThread()); |
| 208 const cricket::VideoFormat& current = video_adapter()->output_format(); | 209 const cricket::VideoFormat& current = video_adapter()->output_format(); |
| 209 cricket::VideoFormat format( | 210 cricket::VideoFormat format( |
| 210 width, height, cricket::VideoFormat::FpsToInterval(fps), current.fourcc); | 211 width, height, cricket::VideoFormat::FpsToInterval(fps), current.fourcc); |
| 211 video_adapter()->OnOutputFormatRequest(format); | 212 video_adapter()->OnOutputFormatRequest(format); |
| 212 } | 213 } |
| 213 | 214 |
| 214 bool AndroidVideoCapturer::GetBestCaptureFormat( | 215 bool AndroidVideoCapturer::GetBestCaptureFormat( |
| 215 const cricket::VideoFormat& desired, | 216 const cricket::VideoFormat& desired, |
| 216 cricket::VideoFormat* best_format) { | 217 cricket::VideoFormat* best_format) { |
| 217 // Delegate this choice to VideoCapturerAndroid.startCapture(). | 218 // Delegate this choice to VideoCapturerAndroid.startCapture(). |
| 218 *best_format = desired; | 219 *best_format = desired; |
| 219 return true; | 220 return true; |
| 220 } | 221 } |
| 221 | 222 |
| 222 } // namespace webrtc | 223 } // namespace webrtc |
| OLD | NEW |