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

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

Issue 1822983002: Support external buffer import in VDA interface and add a V4L2SVDA impl. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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
« no previous file with comments | « content/renderer/media/rtc_video_decoder.h ('k') | media/filters/gpu_video_decoder.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/rtc_video_decoder.h" 5 #include "content/renderer/media/rtc_video_decoder.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
377 visible_rect = picture.visible_rect(); 377 visible_rect = picture.visible_rect();
378 378
379 const media::PictureBuffer& pb = it->second; 379 const media::PictureBuffer& pb = it->second;
380 if (visible_rect.IsEmpty() || !gfx::Rect(pb.size()).Contains(visible_rect)) { 380 if (visible_rect.IsEmpty() || !gfx::Rect(pb.size()).Contains(visible_rect)) {
381 LOG(ERROR) << "Invalid picture size: " << visible_rect.ToString() 381 LOG(ERROR) << "Invalid picture size: " << visible_rect.ToString()
382 << " should fit in " << pb.size().ToString(); 382 << " should fit in " << pb.size().ToString();
383 NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE); 383 NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE);
384 return; 384 return;
385 } 385 }
386 386
387 media::VideoPixelFormat pixel_format = vda_->GetOutputFormat();
388 if (pixel_format == media::PIXEL_FORMAT_UNKNOWN)
389 pixel_format = media::PIXEL_FORMAT_ARGB;
390
387 scoped_refptr<media::VideoFrame> frame = 391 scoped_refptr<media::VideoFrame> frame =
388 CreateVideoFrame(picture, pb, timestamp, visible_rect); 392 CreateVideoFrame(picture, pb, timestamp, visible_rect, pixel_format);
389 if (!frame) { 393 if (!frame) {
390 NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE); 394 NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE);
391 return; 395 return;
392 } 396 }
393 bool inserted = picture_buffers_at_display_ 397 bool inserted = picture_buffers_at_display_
394 .insert(std::make_pair(picture.picture_buffer_id(), 398 .insert(std::make_pair(picture.picture_buffer_id(),
395 pb.texture_ids()[0])) 399 pb.texture_ids()[0]))
396 .second; 400 .second;
397 DCHECK(inserted); 401 DCHECK(inserted);
398 402
(...skipping 10 matching lines...) Expand all
409 reset_bitstream_buffer_id_)) { 413 reset_bitstream_buffer_id_)) {
410 decode_complete_callback_->Decoded(decoded_image); 414 decode_complete_callback_->Decoded(decoded_image);
411 } 415 }
412 } 416 }
413 } 417 }
414 418
415 scoped_refptr<media::VideoFrame> RTCVideoDecoder::CreateVideoFrame( 419 scoped_refptr<media::VideoFrame> RTCVideoDecoder::CreateVideoFrame(
416 const media::Picture& picture, 420 const media::Picture& picture,
417 const media::PictureBuffer& pb, 421 const media::PictureBuffer& pb,
418 uint32_t timestamp, 422 uint32_t timestamp,
419 const gfx::Rect& visible_rect) { 423 const gfx::Rect& visible_rect,
424 media::VideoPixelFormat pixel_format) {
420 DCHECK(decoder_texture_target_); 425 DCHECK(decoder_texture_target_);
421 // Convert timestamp from 90KHz to ms. 426 // Convert timestamp from 90KHz to ms.
422 base::TimeDelta timestamp_ms = base::TimeDelta::FromInternalValue( 427 base::TimeDelta timestamp_ms = base::TimeDelta::FromInternalValue(
423 base::checked_cast<uint64_t>(timestamp) * 1000 / 90); 428 base::checked_cast<uint64_t>(timestamp) * 1000 / 90);
424 // TODO(mcasas): The incoming data is actually a YUV format, but is labelled 429 // TODO(mcasas): The incoming data may actually be in a YUV format, but may be
425 // as ARGB. This prevents the compositor from messing with it, since the 430 // labelled as ARGB. This may or may not be reported by VDA, depending on
426 // underlying platform can handle the former format natively. Make sure the 431 // whether it provides an implementation of VDA::GetOutputFormat().
432 // This prevents the compositor from messing with it, since the underlying
433 // platform can handle the former format natively. Make sure the
427 // correct format is used and everyone down the line understands it. 434 // correct format is used and everyone down the line understands it.
428 scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapNativeTexture( 435 scoped_refptr<media::VideoFrame> frame = media::VideoFrame::WrapNativeTexture(
429 media::PIXEL_FORMAT_ARGB, 436 pixel_format, gpu::MailboxHolder(pb.texture_mailbox(0), gpu::SyncToken(),
430 gpu::MailboxHolder(pb.texture_mailbox(0), gpu::SyncToken(), 437 decoder_texture_target_),
431 decoder_texture_target_),
432 media::BindToCurrentLoop(base::Bind( 438 media::BindToCurrentLoop(base::Bind(
433 &RTCVideoDecoder::ReleaseMailbox, weak_factory_.GetWeakPtr(), 439 &RTCVideoDecoder::ReleaseMailbox, weak_factory_.GetWeakPtr(),
434 factories_, picture.picture_buffer_id(), pb.texture_ids()[0])), 440 factories_, picture.picture_buffer_id(), pb.texture_ids()[0])),
435 pb.size(), visible_rect, visible_rect.size(), timestamp_ms); 441 pb.size(), visible_rect, visible_rect.size(), timestamp_ms);
436 if (frame && picture.allow_overlay()) { 442 if (frame && picture.allow_overlay()) {
437 frame->metadata()->SetBoolean(media::VideoFrameMetadata::ALLOW_OVERLAY, 443 frame->metadata()->SetBoolean(media::VideoFrameMetadata::ALLOW_OVERLAY,
438 true); 444 true);
439 } 445 }
440 return frame; 446 return frame;
441 } 447 }
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 858
853 void RTCVideoDecoder::TryResetVDAErrorCounter_Locked() { 859 void RTCVideoDecoder::TryResetVDAErrorCounter_Locked() {
854 lock_.AssertAcquired(); 860 lock_.AssertAcquired();
855 861
856 if (vda_error_counter_ == 0) 862 if (vda_error_counter_ == 0)
857 return; 863 return;
858 vda_error_counter_ = 0; 864 vda_error_counter_ = 0;
859 } 865 }
860 866
861 } // namespace content 867 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/rtc_video_decoder.h ('k') | media/filters/gpu_video_decoder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698