| 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 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 531 // static | 531 // static |
| 532 size_t VideoFrame::AllocationSize(VideoPixelFormat format, | 532 size_t VideoFrame::AllocationSize(VideoPixelFormat format, |
| 533 const gfx::Size& coded_size) { | 533 const gfx::Size& coded_size) { |
| 534 size_t total = 0; | 534 size_t total = 0; |
| 535 for (size_t i = 0; i < NumPlanes(format); ++i) | 535 for (size_t i = 0; i < NumPlanes(format); ++i) |
| 536 total += PlaneSize(format, i, coded_size).GetArea(); | 536 total += PlaneSize(format, i, coded_size).GetArea(); |
| 537 return total; | 537 return total; |
| 538 } | 538 } |
| 539 | 539 |
| 540 // static | 540 // static |
| 541 size_t VideoFrame::AlignedAllocationSize( |
| 542 const scoped_refptr<VideoFrame>& frame) { |
| 543 DCHECK(IsYuvPlanar(frame->format())); |
| 544 DCHECK_EQ(frame->storage_type(), STORAGE_OWNED_MEMORY); |
| 545 |
| 546 // This method is expected to called only after CreateFrame(). Therefore, the |
| 547 // buffer size needs to the same as the allocated size of AllocateYUV(). |
| 548 size_t data_size = 0; |
| 549 for (size_t plane = 0; plane < NumPlanes(frame->format()); ++plane) { |
| 550 const size_t height = RoundUp(frame->rows(plane), kFrameSizeAlignment * 2); |
| 551 data_size += height * frame->stride(plane); |
| 552 } |
| 553 data_size += frame->stride(kUPlane) + kFrameSizePadding; |
| 554 return data_size; |
| 555 } |
| 556 |
| 557 // static |
| 541 gfx::Size VideoFrame::PlaneSize(VideoPixelFormat format, | 558 gfx::Size VideoFrame::PlaneSize(VideoPixelFormat format, |
| 542 size_t plane, | 559 size_t plane, |
| 543 const gfx::Size& coded_size) { | 560 const gfx::Size& coded_size) { |
| 544 DCHECK(IsValidPlane(plane, format)); | 561 DCHECK(IsValidPlane(plane, format)); |
| 545 | 562 |
| 546 int width = coded_size.width(); | 563 int width = coded_size.width(); |
| 547 int height = coded_size.height(); | 564 int height = coded_size.height(); |
| 548 if (format != PIXEL_FORMAT_ARGB) { | 565 if (format != PIXEL_FORMAT_ARGB) { |
| 549 // Align to multiple-of-two size overall. This ensures that non-subsampled | 566 // Align to multiple-of-two size overall. This ensures that non-subsampled |
| 550 // planes can be addressed by pixel with the same scaling as the subsampled | 567 // planes can be addressed by pixel with the same scaling as the subsampled |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 | 905 |
| 889 // The extra line of UV being allocated is because h264 chroma MC | 906 // The extra line of UV being allocated is because h264 chroma MC |
| 890 // overreads by one line in some cases, see libavcodec/utils.c: | 907 // overreads by one line in some cases, see libavcodec/utils.c: |
| 891 // avcodec_align_dimensions2() and libavcodec/x86/h264_chromamc.asm: | 908 // avcodec_align_dimensions2() and libavcodec/x86/h264_chromamc.asm: |
| 892 // put_h264_chroma_mc4_ssse3(). | 909 // put_h264_chroma_mc4_ssse3(). |
| 893 DCHECK(IsValidPlane(kUPlane, format_)); | 910 DCHECK(IsValidPlane(kUPlane, format_)); |
| 894 data_size += strides_[kUPlane] + kFrameSizePadding; | 911 data_size += strides_[kUPlane] + kFrameSizePadding; |
| 895 | 912 |
| 896 uint8* data = reinterpret_cast<uint8*>( | 913 uint8* data = reinterpret_cast<uint8*>( |
| 897 base::AlignedAlloc(data_size, kFrameAddressAlignment)); | 914 base::AlignedAlloc(data_size, kFrameAddressAlignment)); |
| 898 | |
| 899 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) | 915 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) |
| 900 data_[plane] = data + offset[plane]; | 916 data_[plane] = data + offset[plane]; |
| 901 | 917 |
| 902 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); | 918 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); |
| 919 |
| 920 // Make sure that AlignedAllocationSize() returns the same size as allocated |
| 921 // here. |
| 922 DCHECK_EQ(data_size, VideoFrame::AlignedAllocationSize(this)); |
| 903 } | 923 } |
| 904 | 924 |
| 905 } // namespace media | 925 } // namespace media |
| OLD | NEW |