| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "media/base/video_frame.h" | 5 #include "media/base/video_frame.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 frame->strides_[kYPlane] = y_stride; | 337 frame->strides_[kYPlane] = y_stride; |
| 338 frame->strides_[kUPlane] = u_stride; | 338 frame->strides_[kUPlane] = u_stride; |
| 339 frame->strides_[kVPlane] = v_stride; | 339 frame->strides_[kVPlane] = v_stride; |
| 340 frame->data_[kYPlane] = y_data; | 340 frame->data_[kYPlane] = y_data; |
| 341 frame->data_[kUPlane] = u_data; | 341 frame->data_[kUPlane] = u_data; |
| 342 frame->data_[kVPlane] = v_data; | 342 frame->data_[kVPlane] = v_data; |
| 343 frame->no_longer_needed_cb_ = no_longer_needed_cb; | 343 frame->no_longer_needed_cb_ = no_longer_needed_cb; |
| 344 return frame; | 344 return frame; |
| 345 } | 345 } |
| 346 | 346 |
| 347 // static |
| 348 scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvConstData( |
| 349 Format format, |
| 350 const gfx::Size& coded_size, |
| 351 const gfx::Rect& visible_rect, |
| 352 const gfx::Size& natural_size, |
| 353 int32 y_stride, |
| 354 int32 u_stride, |
| 355 int32 v_stride, |
| 356 const uint8* y_data, |
| 357 const uint8* u_data, |
| 358 const uint8* v_data, |
| 359 base::TimeDelta timestamp, |
| 360 const base::Closure& no_longer_needed_cb) { |
| 361 // Const cast is ok because the pointers will be protected by |is_read_only_|. |
| 362 scoped_refptr<VideoFrame> frame = WrapExternalYuvData( |
| 363 format, coded_size, visible_rect, natural_size, y_stride, u_stride, |
| 364 v_stride, const_cast<uint8*>(y_data), const_cast<uint8*>(u_data), |
| 365 const_cast<uint8*>(v_data), timestamp, no_longer_needed_cb); |
| 366 frame->is_read_only_ = true; |
| 367 return frame; |
| 368 } |
| 369 |
| 347 #if defined(OS_POSIX) | 370 #if defined(OS_POSIX) |
| 348 // static | 371 // static |
| 349 scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs( | 372 scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs( |
| 350 Format format, | 373 Format format, |
| 351 const gfx::Size& coded_size, | 374 const gfx::Size& coded_size, |
| 352 const gfx::Rect& visible_rect, | 375 const gfx::Rect& visible_rect, |
| 353 const gfx::Size& natural_size, | 376 const gfx::Size& natural_size, |
| 354 const std::vector<int> dmabuf_fds, | 377 const std::vector<int> dmabuf_fds, |
| 355 base::TimeDelta timestamp, | 378 base::TimeDelta timestamp, |
| 356 const base::Closure& no_longer_needed_cb) { | 379 const base::Closure& no_longer_needed_cb) { |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 664 const gfx::Size& coded_size, | 687 const gfx::Size& coded_size, |
| 665 const gfx::Rect& visible_rect, | 688 const gfx::Rect& visible_rect, |
| 666 const gfx::Size& natural_size, | 689 const gfx::Size& natural_size, |
| 667 scoped_ptr<gpu::MailboxHolder> mailbox_holder, | 690 scoped_ptr<gpu::MailboxHolder> mailbox_holder, |
| 668 base::TimeDelta timestamp, | 691 base::TimeDelta timestamp, |
| 669 bool end_of_stream) | 692 bool end_of_stream) |
| 670 : format_(format), | 693 : format_(format), |
| 671 coded_size_(coded_size), | 694 coded_size_(coded_size), |
| 672 visible_rect_(visible_rect), | 695 visible_rect_(visible_rect), |
| 673 natural_size_(natural_size), | 696 natural_size_(natural_size), |
| 697 is_read_only_(false), |
| 674 mailbox_holder_(mailbox_holder.Pass()), | 698 mailbox_holder_(mailbox_holder.Pass()), |
| 675 shared_memory_handle_(base::SharedMemory::NULLHandle()), | 699 shared_memory_handle_(base::SharedMemory::NULLHandle()), |
| 676 shared_memory_offset_(0), | 700 shared_memory_offset_(0), |
| 677 timestamp_(timestamp), | 701 timestamp_(timestamp), |
| 678 release_sync_point_(0), | 702 release_sync_point_(0), |
| 679 end_of_stream_(end_of_stream), | 703 end_of_stream_(end_of_stream), |
| 680 allow_overlay_(false) { | 704 allow_overlay_(false) { |
| 681 DCHECK(IsValidConfig(format_, coded_size_, visible_rect_, natural_size_)); | 705 DCHECK(IsValidConfig(format_, coded_size_, visible_rect_, natural_size_)); |
| 682 | 706 |
| 683 memset(&strides_, 0, sizeof(strides_)); | 707 memset(&strides_, 0, sizeof(strides_)); |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 return Rows(plane, format_, coded_size_.height()); | 763 return Rows(plane, format_, coded_size_.height()); |
| 740 } | 764 } |
| 741 | 765 |
| 742 const uint8* VideoFrame::data(size_t plane) const { | 766 const uint8* VideoFrame::data(size_t plane) const { |
| 743 DCHECK(IsValidPlane(plane, format_)); | 767 DCHECK(IsValidPlane(plane, format_)); |
| 744 return data_[plane]; | 768 return data_[plane]; |
| 745 } | 769 } |
| 746 | 770 |
| 747 uint8* VideoFrame::data(size_t plane) { | 771 uint8* VideoFrame::data(size_t plane) { |
| 748 DCHECK(IsValidPlane(plane, format_)); | 772 DCHECK(IsValidPlane(plane, format_)); |
| 773 DCHECK(!is_read_only_); |
| 749 return data_[plane]; | 774 return data_[plane]; |
| 750 } | 775 } |
| 751 | 776 |
| 752 const uint8* VideoFrame::visible_data(size_t plane) const { | 777 const uint8* VideoFrame::visible_data(size_t plane) const { |
| 753 DCHECK(IsValidPlane(plane, format_)); | 778 DCHECK(IsValidPlane(plane, format_)); |
| 754 | 779 |
| 755 // Calculate an offset that is properly aligned for all planes. | 780 // Calculate an offset that is properly aligned for all planes. |
| 756 const gfx::Size alignment = CommonAlignment(format_); | 781 const gfx::Size alignment = CommonAlignment(format_); |
| 757 const gfx::Point offset(RoundDown(visible_rect_.x(), alignment.width()), | 782 const gfx::Point offset(RoundDown(visible_rect_.x(), alignment.width()), |
| 758 RoundDown(visible_rect_.y(), alignment.height())); | 783 RoundDown(visible_rect_.y(), alignment.height())); |
| 759 | 784 |
| 760 const gfx::Size subsample = SampleSize(format_, plane); | 785 const gfx::Size subsample = SampleSize(format_, plane); |
| 761 DCHECK(offset.x() % subsample.width() == 0); | 786 DCHECK(offset.x() % subsample.width() == 0); |
| 762 DCHECK(offset.y() % subsample.height() == 0); | 787 DCHECK(offset.y() % subsample.height() == 0); |
| 763 return data(plane) + | 788 return data(plane) + |
| 764 stride(plane) * (offset.y() / subsample.height()) + // Row offset. | 789 stride(plane) * (offset.y() / subsample.height()) + // Row offset. |
| 765 BytesPerElement(format_, plane) * // Column offset. | 790 BytesPerElement(format_, plane) * // Column offset. |
| 766 (offset.x() / subsample.width()); | 791 (offset.x() / subsample.width()); |
| 767 } | 792 } |
| 768 | 793 |
| 769 uint8* VideoFrame::visible_data(size_t plane) { | 794 uint8* VideoFrame::visible_data(size_t plane) { |
| 795 DCHECK(!is_read_only_); |
| 770 return const_cast<uint8*>( | 796 return const_cast<uint8*>( |
| 771 static_cast<const VideoFrame*>(this)->visible_data(plane)); | 797 static_cast<const VideoFrame*>(this)->visible_data(plane)); |
| 772 } | 798 } |
| 773 | 799 |
| 774 const gpu::MailboxHolder* VideoFrame::mailbox_holder() const { | 800 const gpu::MailboxHolder* VideoFrame::mailbox_holder() const { |
| 775 DCHECK_EQ(format_, NATIVE_TEXTURE); | 801 DCHECK_EQ(format_, NATIVE_TEXTURE); |
| 776 return mailbox_holder_.get(); | 802 return mailbox_holder_.get(); |
| 777 } | 803 } |
| 778 | 804 |
| 779 base::SharedMemoryHandle VideoFrame::shared_memory_handle() const { | 805 base::SharedMemoryHandle VideoFrame::shared_memory_handle() const { |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 811 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) { | 837 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) { |
| 812 for (int row = 0; row < rows(plane); ++row) { | 838 for (int row = 0; row < rows(plane); ++row) { |
| 813 base::MD5Update(context, base::StringPiece( | 839 base::MD5Update(context, base::StringPiece( |
| 814 reinterpret_cast<char*>(data(plane) + stride(plane) * row), | 840 reinterpret_cast<char*>(data(plane) + stride(plane) * row), |
| 815 row_bytes(plane))); | 841 row_bytes(plane))); |
| 816 } | 842 } |
| 817 } | 843 } |
| 818 } | 844 } |
| 819 | 845 |
| 820 } // namespace media | 846 } // namespace media |
| OLD | NEW |