Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/webmediaplayer_ms.h" | 5 #include "content/renderer/media/webmediaplayer_ms.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 size_t number_of_planes = | 64 size_t number_of_planes = |
| 65 media::VideoFrame::NumPlanes(frame->format()); | 65 media::VideoFrame::NumPlanes(frame->format()); |
| 66 for (size_t i = 0; i < number_of_planes; ++i) { | 66 for (size_t i = 0; i < number_of_planes; ++i) { |
| 67 media::CopyPlane(i, frame->data(i), frame->stride(i), | 67 media::CopyPlane(i, frame->data(i), frame->stride(i), |
| 68 frame->rows(i), new_frame.get()); | 68 frame->rows(i), new_frame.get()); |
| 69 } | 69 } |
| 70 } | 70 } |
| 71 return new_frame; | 71 return new_frame; |
| 72 } | 72 } |
| 73 | 73 |
| 74 // Empty method used for keeping a reference to the original media::VideoFrame | |
| 75 // in OnFrameAvailable() if a color conversion between I420 and YV12 is needed. | |
| 76 static void ReleaseOriginalFrame( | |
| 77 const scoped_refptr<media::VideoFrame>& frame) { | |
| 78 } | |
| 79 | |
| 74 } // anonymous namespace | 80 } // anonymous namespace |
| 75 | 81 |
| 76 namespace content { | 82 namespace content { |
| 77 | 83 |
| 78 WebMediaPlayerMS::WebMediaPlayerMS( | 84 WebMediaPlayerMS::WebMediaPlayerMS( |
| 79 blink::WebFrame* frame, | 85 blink::WebFrame* frame, |
| 80 blink::WebMediaPlayerClient* client, | 86 blink::WebMediaPlayerClient* client, |
| 81 base::WeakPtr<WebMediaPlayerDelegate> delegate, | 87 base::WeakPtr<WebMediaPlayerDelegate> delegate, |
| 82 MediaStreamClient* media_stream_client, | 88 MediaStreamClient* media_stream_client, |
| 83 media::MediaLog* media_log) | 89 media::MediaLog* media_log) |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 395 DVLOG(3) << "WebMediaPlayerMS::PutCurrentFrame"; | 401 DVLOG(3) << "WebMediaPlayerMS::PutCurrentFrame"; |
| 396 DCHECK(pending_repaint_); | 402 DCHECK(pending_repaint_); |
| 397 pending_repaint_ = false; | 403 pending_repaint_ = false; |
| 398 } | 404 } |
| 399 | 405 |
| 400 void WebMediaPlayerMS::OnFrameAvailable( | 406 void WebMediaPlayerMS::OnFrameAvailable( |
| 401 const scoped_refptr<media::VideoFrame>& frame) { | 407 const scoped_refptr<media::VideoFrame>& frame) { |
| 402 DVLOG(3) << "WebMediaPlayerMS::OnFrameAvailable"; | 408 DVLOG(3) << "WebMediaPlayerMS::OnFrameAvailable"; |
| 403 DCHECK(thread_checker_.CalledOnValidThread()); | 409 DCHECK(thread_checker_.CalledOnValidThread()); |
| 404 ++total_frame_count_; | 410 ++total_frame_count_; |
| 411 | |
| 412 // Rendering do not support I420 but video capture use I420. | |
| 413 // The only difference between YV12 and I420 is the order of U and V plane. | |
| 414 // To solve that the I420 frame is simply wrapped in an YV12 video frame. | |
| 415 scoped_refptr<media::VideoFrame> yv12_frame = frame; | |
|
perkj_chrome
2014/03/27 09:25:39
The incoming frame can be a texture as well- not n
| |
| 416 if (frame->format() == media::VideoFrame::I420) { | |
| 417 yv12_frame = media::VideoFrame::WrapExternalYuvData( | |
| 418 media::VideoFrame::YV12, | |
| 419 frame->coded_size(), | |
| 420 frame->visible_rect(), | |
| 421 frame->natural_size(), | |
| 422 frame->stride(media::VideoFrame::kYPlane), | |
| 423 frame->stride(media::VideoFrame::kUPlane), | |
| 424 frame->stride(media::VideoFrame::kVPlane), | |
| 425 frame->data(media::VideoFrame::kYPlane), | |
| 426 frame->data(media::VideoFrame::kUPlane), | |
| 427 frame->data(media::VideoFrame::kVPlane), | |
| 428 frame->GetTimestamp(), | |
| 429 base::Bind(&ReleaseOriginalFrame, frame)); | |
| 430 } | |
| 431 | |
| 405 if (!received_first_frame_) { | 432 if (!received_first_frame_) { |
| 406 received_first_frame_ = true; | 433 received_first_frame_ = true; |
| 407 { | 434 { |
| 408 base::AutoLock auto_lock(current_frame_lock_); | 435 base::AutoLock auto_lock(current_frame_lock_); |
| 409 DCHECK(!current_frame_used_); | 436 DCHECK(!current_frame_used_); |
| 410 current_frame_ = frame; | 437 current_frame_ = yv12_frame; |
| 411 } | 438 } |
| 412 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); | 439 SetReadyState(WebMediaPlayer::ReadyStateHaveMetadata); |
| 413 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); | 440 SetReadyState(WebMediaPlayer::ReadyStateHaveEnoughData); |
| 414 GetClient()->sizeChanged(); | 441 GetClient()->sizeChanged(); |
| 415 | 442 |
| 416 if (video_frame_provider_.get() && GetClient()->needsWebLayerForVideo()) { | 443 if (video_frame_provider_.get() && GetClient()->needsWebLayerForVideo()) { |
| 417 video_weblayer_.reset( | 444 video_weblayer_.reset( |
| 418 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); | 445 new webkit::WebLayerImpl(cc::VideoLayer::Create(this))); |
| 419 GetClient()->setWebLayer(video_weblayer_.get()); | 446 GetClient()->setWebLayer(video_weblayer_.get()); |
| 420 } | 447 } |
| 421 } | 448 } |
| 422 | 449 |
| 423 // Do not update |current_frame_| when paused. | 450 // Do not update |current_frame_| when paused. |
| 424 if (paused_) | 451 if (paused_) |
| 425 return; | 452 return; |
| 426 | 453 |
| 427 if (!sequence_started_) { | 454 if (!sequence_started_) { |
| 428 sequence_started_ = true; | 455 sequence_started_ = true; |
| 429 start_time_ = frame->GetTimestamp(); | 456 start_time_ = yv12_frame->GetTimestamp(); |
| 430 } | 457 } |
| 431 bool size_changed = !current_frame_.get() || | 458 bool size_changed = !current_frame_.get() || |
| 432 current_frame_->natural_size() != frame->natural_size(); | 459 current_frame_->natural_size() != yv12_frame->natural_size(); |
| 433 | 460 |
| 434 { | 461 { |
| 435 base::AutoLock auto_lock(current_frame_lock_); | 462 base::AutoLock auto_lock(current_frame_lock_); |
| 436 if (!current_frame_used_ && current_frame_.get()) | 463 if (!current_frame_used_ && current_frame_.get()) |
| 437 ++dropped_frame_count_; | 464 ++dropped_frame_count_; |
| 438 current_frame_ = frame; | 465 current_frame_ = yv12_frame; |
| 439 current_time_ = frame->GetTimestamp() - start_time_; | 466 current_time_ = yv12_frame->GetTimestamp() - start_time_; |
| 440 current_frame_used_ = false; | 467 current_frame_used_ = false; |
| 441 } | 468 } |
| 442 | 469 |
| 443 if (size_changed) | 470 if (size_changed) |
| 444 GetClient()->sizeChanged(); | 471 GetClient()->sizeChanged(); |
| 445 | 472 |
| 446 GetClient()->repaint(); | 473 GetClient()->repaint(); |
| 447 } | 474 } |
| 448 | 475 |
| 449 void WebMediaPlayerMS::RepaintInternal() { | 476 void WebMediaPlayerMS::RepaintInternal() { |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 473 GetClient()->readyStateChanged(); | 500 GetClient()->readyStateChanged(); |
| 474 } | 501 } |
| 475 | 502 |
| 476 blink::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() { | 503 blink::WebMediaPlayerClient* WebMediaPlayerMS::GetClient() { |
| 477 DCHECK(thread_checker_.CalledOnValidThread()); | 504 DCHECK(thread_checker_.CalledOnValidThread()); |
| 478 DCHECK(client_); | 505 DCHECK(client_); |
| 479 return client_; | 506 return client_; |
| 480 } | 507 } |
| 481 | 508 |
| 482 } // namespace content | 509 } // namespace content |
| OLD | NEW |