Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(107)

Side by Side Diff: content/renderer/media/webmediaplayer_ms.cc

Issue 213423006: Move conversion from YUV420 to YV12 in WebMediaPlayerMs (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698