| 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 #include <climits> | 8 #include <climits> |
| 9 | 9 |
| 10 #include "base/atomic_sequence_num.h" | 10 #include "base/atomic_sequence_num.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 return "UNKNOWN"; | 47 return "UNKNOWN"; |
| 48 case VideoFrame::STORAGE_OPAQUE: | 48 case VideoFrame::STORAGE_OPAQUE: |
| 49 return "OPAQUE"; | 49 return "OPAQUE"; |
| 50 case VideoFrame::STORAGE_UNOWNED_MEMORY: | 50 case VideoFrame::STORAGE_UNOWNED_MEMORY: |
| 51 return "UNOWNED_MEMORY"; | 51 return "UNOWNED_MEMORY"; |
| 52 case VideoFrame::STORAGE_OWNED_MEMORY: | 52 case VideoFrame::STORAGE_OWNED_MEMORY: |
| 53 return "OWNED_MEMORY"; | 53 return "OWNED_MEMORY"; |
| 54 case VideoFrame::STORAGE_SHMEM: | 54 case VideoFrame::STORAGE_SHMEM: |
| 55 return "SHMEM"; | 55 return "SHMEM"; |
| 56 #if defined(OS_LINUX) | 56 #if defined(OS_LINUX) |
| 57 case VideoFrame::STORAGE_DMABUFS: | 57 case VideoFrame::STORAGE_NATIVE: |
| 58 return "DMABUFS"; | 58 return "DMABUFS"; |
| 59 #endif | 59 #endif |
| 60 case VideoFrame::STORAGE_MOJO_SHARED_BUFFER: | 60 case VideoFrame::STORAGE_MOJO_SHARED_BUFFER: |
| 61 return "MOJO_SHARED_BUFFER"; | 61 return "MOJO_SHARED_BUFFER"; |
| 62 } | 62 } |
| 63 | 63 |
| 64 NOTREACHED() << "Invalid StorageType provided: " << storage_type; | 64 NOTREACHED() << "Invalid StorageType provided: " << storage_type; |
| 65 return "INVALID"; | 65 return "INVALID"; |
| 66 } | 66 } |
| 67 | 67 |
| 68 // Returns true if |frame| is accesible mapped in the VideoFrame memory space. | 68 // Returns true if |frame| is accesible mapped in the VideoFrame memory space. |
| 69 // static | 69 // static |
| 70 static bool IsStorageTypeMappable(VideoFrame::StorageType storage_type) { | 70 static bool IsStorageTypeMappable(VideoFrame::StorageType storage_type) { |
| 71 return | 71 return |
| 72 #if defined(OS_LINUX) | 72 #if defined(OS_LINUX) |
| 73 // This is not strictly needed but makes explicit that, at VideoFrame | 73 // This is not strictly needed but makes explicit that, at VideoFrame |
| 74 // level, DmaBufs are not mappable from userspace. | 74 // level, DmaBufs are not mappable from userspace. |
| 75 storage_type != VideoFrame::STORAGE_DMABUFS && | 75 storage_type != VideoFrame::STORAGE_NATIVE && |
| 76 #endif | 76 #endif |
| 77 (storage_type == VideoFrame::STORAGE_UNOWNED_MEMORY || | 77 (storage_type == VideoFrame::STORAGE_UNOWNED_MEMORY || |
| 78 storage_type == VideoFrame::STORAGE_OWNED_MEMORY || | 78 storage_type == VideoFrame::STORAGE_OWNED_MEMORY || |
| 79 storage_type == VideoFrame::STORAGE_SHMEM || | 79 storage_type == VideoFrame::STORAGE_SHMEM || |
| 80 storage_type == VideoFrame::STORAGE_MOJO_SHARED_BUFFER); | 80 storage_type == VideoFrame::STORAGE_MOJO_SHARED_BUFFER); |
| 81 } | 81 } |
| 82 | 82 |
| 83 // Checks if |source_format| can be wrapped into a |target_format| frame. | 83 // Checks if |source_format| can be wrapped into a |target_format| frame. |
| 84 static bool AreValidPixelFormatsForWrap(VideoPixelFormat source_format, | 84 static bool AreValidPixelFormatsForWrap(VideoPixelFormat source_format, |
| 85 VideoPixelFormat target_format) { | 85 VideoPixelFormat target_format) { |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 | 326 |
| 327 #if defined(OS_LINUX) | 327 #if defined(OS_LINUX) |
| 328 // static | 328 // static |
| 329 scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs( | 329 scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs( |
| 330 VideoPixelFormat format, | 330 VideoPixelFormat format, |
| 331 const gfx::Size& coded_size, | 331 const gfx::Size& coded_size, |
| 332 const gfx::Rect& visible_rect, | 332 const gfx::Rect& visible_rect, |
| 333 const gfx::Size& natural_size, | 333 const gfx::Size& natural_size, |
| 334 const std::vector<int>& dmabuf_fds, | 334 const std::vector<int>& dmabuf_fds, |
| 335 base::TimeDelta timestamp) { | 335 base::TimeDelta timestamp) { |
| 336 const StorageType storage = STORAGE_DMABUFS; | 336 const StorageType storage = STORAGE_NATIVE; |
| 337 if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) { | 337 if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) { |
| 338 LOG(DFATAL) << __func__ << " Invalid config." | 338 LOG(DFATAL) << __func__ << " Invalid config." |
| 339 << ConfigToString(format, storage, coded_size, visible_rect, | 339 << ConfigToString(format, storage, coded_size, visible_rect, |
| 340 natural_size); | 340 natural_size); |
| 341 return nullptr; | 341 return nullptr; |
| 342 } | 342 } |
| 343 | 343 |
| 344 gpu::MailboxHolder mailbox_holders[kMaxPlanes]; | 344 gpu::MailboxHolder mailbox_holders[kMaxPlanes]; |
| 345 scoped_refptr<VideoFrame> frame = | 345 scoped_refptr<VideoFrame> frame = |
| 346 new VideoFrame(format, storage, coded_size, visible_rect, natural_size, | 346 new VideoFrame(format, storage, coded_size, visible_rect, natural_size, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 // Copy all metadata to the wrapped frame. | 431 // Copy all metadata to the wrapped frame. |
| 432 wrapping_frame->metadata()->MergeMetadataFrom(frame->metadata()); | 432 wrapping_frame->metadata()->MergeMetadataFrom(frame->metadata()); |
| 433 | 433 |
| 434 for (size_t i = 0; i < NumPlanes(format); ++i) { | 434 for (size_t i = 0; i < NumPlanes(format); ++i) { |
| 435 wrapping_frame->strides_[i] = frame->stride(i); | 435 wrapping_frame->strides_[i] = frame->stride(i); |
| 436 wrapping_frame->data_[i] = frame->data(i); | 436 wrapping_frame->data_[i] = frame->data(i); |
| 437 } | 437 } |
| 438 | 438 |
| 439 #if defined(OS_LINUX) | 439 #if defined(OS_LINUX) |
| 440 // If there are any |dmabuf_fds_| plugged in, we should duplicate them. | 440 // If there are any |dmabuf_fds_| plugged in, we should duplicate them. |
| 441 if (frame->storage_type() == STORAGE_DMABUFS) { | 441 if (frame->storage_type() == STORAGE_NATIVE) { |
| 442 std::vector<int> original_fds; | 442 std::vector<int> original_fds; |
| 443 for (size_t i = 0; i < kMaxPlanes; ++i) | 443 for (size_t i = 0; i < kMaxPlanes; ++i) |
| 444 original_fds.push_back(frame->dmabuf_fd(i)); | 444 original_fds.push_back(frame->DmabufFd(i)); |
| 445 if (!wrapping_frame->DuplicateFileDescriptors(original_fds)) { | 445 if (!wrapping_frame->DuplicateFileDescriptors(original_fds)) { |
| 446 LOG(DFATAL) << __func__ << " Couldn't duplicate fds."; | 446 LOG(DFATAL) << __func__ << " Couldn't duplicate fds."; |
| 447 return nullptr; | 447 return nullptr; |
| 448 } | 448 } |
| 449 } | 449 } |
| 450 #endif | 450 #endif |
| 451 | 451 |
| 452 if (frame->storage_type() == STORAGE_SHMEM) | 452 if (frame->storage_type() == STORAGE_SHMEM) |
| 453 wrapping_frame->AddSharedMemoryHandle(frame->shared_memory_handle_); | 453 wrapping_frame->AddSharedMemoryHandle(frame->shared_memory_handle_); |
| 454 | 454 |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 716 return shared_memory_handle_; | 716 return shared_memory_handle_; |
| 717 } | 717 } |
| 718 | 718 |
| 719 size_t VideoFrame::shared_memory_offset() const { | 719 size_t VideoFrame::shared_memory_offset() const { |
| 720 DCHECK_EQ(storage_type_, STORAGE_SHMEM); | 720 DCHECK_EQ(storage_type_, STORAGE_SHMEM); |
| 721 DCHECK(shared_memory_handle_ != base::SharedMemory::NULLHandle()); | 721 DCHECK(shared_memory_handle_ != base::SharedMemory::NULLHandle()); |
| 722 return shared_memory_offset_; | 722 return shared_memory_offset_; |
| 723 } | 723 } |
| 724 | 724 |
| 725 #if defined(OS_LINUX) | 725 #if defined(OS_LINUX) |
| 726 int VideoFrame::dmabuf_fd(size_t plane) const { | 726 int VideoFrame::DmabufFd(size_t plane) const { |
| 727 DCHECK_EQ(storage_type_, STORAGE_DMABUFS); | 727 DCHECK_EQ(storage_type_, STORAGE_NATIVE); |
| 728 DCHECK(IsValidPlane(plane, format_)); | 728 DCHECK(IsValidPlane(plane, format_)); |
| 729 return dmabuf_fds_[plane].get(); | 729 return dmabuf_fds_[plane].get(); |
| 730 } | 730 } |
| 731 | 731 |
| 732 bool VideoFrame::DuplicateFileDescriptors(const std::vector<int>& in_fds) { | 732 bool VideoFrame::DuplicateFileDescriptors(const std::vector<int>& in_fds) { |
| 733 // TODO(mcasas): Support offsets for e.g. multiplanar inside a single |in_fd|. | 733 // TODO(mcasas): Support offsets for e.g. multiplanar inside a single |in_fd|. |
| 734 | 734 |
| 735 storage_type_ = STORAGE_DMABUFS; | 735 storage_type_ = STORAGE_NATIVE; |
| 736 // TODO(posciak): This is not exactly correct, it's possible for one | 736 // TODO(posciak): This is not exactly correct, it's possible for one |
| 737 // buffer to contain more than one plane. | 737 // buffer to contain more than one plane. |
| 738 if (in_fds.size() != NumPlanes(format_)) { | 738 if (in_fds.size() != NumPlanes(format_)) { |
| 739 LOG(FATAL) << "Not enough dmabuf fds provided, got: " << in_fds.size() | 739 LOG(FATAL) << "Not enough dmabuf fds provided, got: " << in_fds.size() |
| 740 << ", expected: " << NumPlanes(format_); | 740 << ", expected: " << NumPlanes(format_); |
| 741 return false; | 741 return false; |
| 742 } | 742 } |
| 743 | 743 |
| 744 // Make sure that all fds are closed if any dup() fails, | 744 // Make sure that all fds are closed if any dup() fails, |
| 745 base::ScopedFD temp_dmabuf_fds[kMaxPlanes]; | 745 base::ScopedFD temp_dmabuf_fds[kMaxPlanes]; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 756 return true; | 756 return true; |
| 757 } | 757 } |
| 758 #endif | 758 #endif |
| 759 | 759 |
| 760 void VideoFrame::AddSharedMemoryHandle(base::SharedMemoryHandle handle) { | 760 void VideoFrame::AddSharedMemoryHandle(base::SharedMemoryHandle handle) { |
| 761 storage_type_ = STORAGE_SHMEM; | 761 storage_type_ = STORAGE_SHMEM; |
| 762 shared_memory_handle_ = handle; | 762 shared_memory_handle_ = handle; |
| 763 } | 763 } |
| 764 | 764 |
| 765 #if defined(OS_MACOSX) | 765 #if defined(OS_MACOSX) |
| 766 CVPixelBufferRef VideoFrame::cv_pixel_buffer() const { | 766 CVPixelBufferRef VideoFrame::CvPixelBuffer() const { |
| 767 return cv_pixel_buffer_.get(); | 767 return cv_pixel_buffer_.get(); |
| 768 } | 768 } |
| 769 #endif | 769 #endif |
| 770 | 770 |
| 771 void VideoFrame::SetReleaseMailboxCB( | 771 void VideoFrame::SetReleaseMailboxCB( |
| 772 const ReleaseMailboxCB& release_mailbox_cb) { | 772 const ReleaseMailboxCB& release_mailbox_cb) { |
| 773 DCHECK(!release_mailbox_cb.is_null()); | 773 DCHECK(!release_mailbox_cb.is_null()); |
| 774 DCHECK(mailbox_holders_release_cb_.is_null()); | 774 DCHECK(mailbox_holders_release_cb_.is_null()); |
| 775 mailbox_holders_release_cb_ = release_mailbox_cb; | 775 mailbox_holders_release_cb_ = release_mailbox_cb; |
| 776 } | 776 } |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1206 if (zero_initialize_memory) | 1206 if (zero_initialize_memory) |
| 1207 memset(data, 0, data_size); | 1207 memset(data, 0, data_size); |
| 1208 | 1208 |
| 1209 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) | 1209 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) |
| 1210 data_[plane] = data + offset[plane]; | 1210 data_[plane] = data + offset[plane]; |
| 1211 | 1211 |
| 1212 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); | 1212 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); |
| 1213 } | 1213 } |
| 1214 | 1214 |
| 1215 } // namespace media | 1215 } // namespace media |
| OLD | NEW |