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 |