Chromium Code Reviews| 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 752 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 763 const gfx::Size& natural_size, | 763 const gfx::Size& natural_size, |
| 764 uint8_t* data, | 764 uint8_t* data, |
| 765 size_t data_size, | 765 size_t data_size, |
| 766 base::TimeDelta timestamp, | 766 base::TimeDelta timestamp, |
| 767 base::SharedMemoryHandle handle, | 767 base::SharedMemoryHandle handle, |
| 768 size_t data_offset) { | 768 size_t data_offset) { |
| 769 DCHECK(IsStorageTypeMappable(storage_type)); | 769 DCHECK(IsStorageTypeMappable(storage_type)); |
| 770 | 770 |
| 771 // TODO(miu): This function should support any pixel format. | 771 // TODO(miu): This function should support any pixel format. |
| 772 // http://crbug.com/555909 | 772 // http://crbug.com/555909 |
| 773 if (format != PIXEL_FORMAT_I420) { | 773 if (format != PIXEL_FORMAT_I420 && format != PIXEL_FORMAT_Y16) { |
| 774 LOG(DFATAL) << "Only PIXEL_FORMAT_I420 format supported: " | 774 LOG(DFATAL) << "Only PIXEL_FORMAT_I420 and PIXEL_FORMAT_Y16 formats are" |
| 775 "supported: " | |
| 775 << VideoPixelFormatToString(format); | 776 << VideoPixelFormatToString(format); |
| 776 return nullptr; | 777 return nullptr; |
| 777 } | 778 } |
| 778 | 779 |
| 779 if (!IsValidConfig(format, storage_type, coded_size, visible_rect, | 780 if (!IsValidConfig(format, storage_type, coded_size, visible_rect, |
| 780 natural_size)) { | 781 natural_size)) { |
| 781 LOG(DFATAL) << __func__ << " Invalid config." | 782 LOG(DFATAL) << __func__ << " Invalid config." |
| 782 << ConfigToString(format, storage_type, coded_size, | 783 << ConfigToString(format, storage_type, coded_size, |
| 783 visible_rect, natural_size); | 784 visible_rect, natural_size); |
| 784 return nullptr; | 785 return nullptr; |
| 785 } | 786 } |
| 786 | 787 |
| 787 scoped_refptr<VideoFrame> frame; | 788 scoped_refptr<VideoFrame> frame; |
| 788 if (storage_type == STORAGE_SHMEM) { | 789 if (storage_type == STORAGE_SHMEM) { |
| 789 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, | 790 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, |
| 790 natural_size, timestamp, handle, data_offset); | 791 natural_size, timestamp, handle, data_offset); |
| 791 } else { | 792 } else { |
| 792 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, | 793 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, |
| 793 natural_size, timestamp); | 794 natural_size, timestamp); |
| 794 } | 795 } |
| 795 frame->strides_[kYPlane] = coded_size.width(); | 796 switch (NumPlanes(format)) { |
| 796 // TODO(miu): This always rounds widths down, whereas VideoFrame::RowBytes() | 797 case 3: |
| 797 // always rounds up. This inconsistency must be resolved. Perhaps a | 798 DCHECK_EQ(format, PIXEL_FORMAT_I420); |
| 798 // CommonAlignment() check should be made in IsValidConfig()? | 799 // TODO(miu): This always rounds widths down, whereas |
| 799 // http://crbug.com/555909 | 800 // VideoFrame::RowBytes() always rounds up. This inconsistency must be |
| 800 frame->strides_[kUPlane] = coded_size.width() / 2; | 801 // resolved. Perhaps a CommonAlignment() check should be made in |
| 801 frame->strides_[kVPlane] = coded_size.width() / 2; | 802 // IsValidConfig()? |
| 802 frame->data_[kYPlane] = data; | 803 // http://crbug.com/555909 |
| 803 frame->data_[kUPlane] = data + coded_size.GetArea(); | 804 frame->strides_[kVPlane] = coded_size.width() / 2; |
| 804 frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4); | 805 frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4); |
| 806 frame->strides_[kUPlane] = coded_size.width() / 2; | |
| 807 frame->data_[kUPlane] = data + coded_size.GetArea(); | |
| 808 // Fall through. | |
| 809 case 1: | |
| 810 frame->strides_[kYPlane] = RowBytes(kYPlane, format, coded_size.width()); | |
| 811 frame->data_[kYPlane] = data; | |
| 812 return frame; | |
|
xhwang
2016/10/27 20:28:09
nit: does it make sense to case 1 before case 3?
aleksandar.stojiljkovic
2016/10/27 20:59:41
It is fall through - YPlane handling is shared by
xhwang
2016/10/27 21:09:06
hmm, this is tricky. I'd rather duplicate these 3
aleksandar.stojiljkovic
2016/10/28 13:30:24
Done.
| |
| 813 default: | |
| 814 LOG(DFATAL) << "Invalid number of planes: " << NumPlanes(format) | |
| 815 << " in format: " << VideoPixelFormatToString(format); | |
| 816 return nullptr; | |
| 817 } | |
| 805 return frame; | 818 return frame; |
| 806 } | 819 } |
| 807 | 820 |
| 808 VideoFrame::VideoFrame(VideoPixelFormat format, | 821 VideoFrame::VideoFrame(VideoPixelFormat format, |
| 809 StorageType storage_type, | 822 StorageType storage_type, |
| 810 const gfx::Size& coded_size, | 823 const gfx::Size& coded_size, |
| 811 const gfx::Rect& visible_rect, | 824 const gfx::Rect& visible_rect, |
| 812 const gfx::Size& natural_size, | 825 const gfx::Size& natural_size, |
| 813 base::TimeDelta timestamp) | 826 base::TimeDelta timestamp) |
| 814 : format_(format), | 827 : format_(format), |
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 965 case kAPlane: | 978 case kAPlane: |
| 966 return gfx::Size(1, 1); | 979 return gfx::Size(1, 1); |
| 967 | 980 |
| 968 case kUPlane: // and kUVPlane: | 981 case kUPlane: // and kUVPlane: |
| 969 case kVPlane: | 982 case kVPlane: |
| 970 switch (format) { | 983 switch (format) { |
| 971 case PIXEL_FORMAT_YV24: | 984 case PIXEL_FORMAT_YV24: |
| 972 case PIXEL_FORMAT_YUV444P9: | 985 case PIXEL_FORMAT_YUV444P9: |
| 973 case PIXEL_FORMAT_YUV444P10: | 986 case PIXEL_FORMAT_YUV444P10: |
| 974 case PIXEL_FORMAT_YUV444P12: | 987 case PIXEL_FORMAT_YUV444P12: |
| 988 case PIXEL_FORMAT_Y16: | |
| 975 return gfx::Size(1, 1); | 989 return gfx::Size(1, 1); |
| 976 | 990 |
| 977 case PIXEL_FORMAT_YV16: | 991 case PIXEL_FORMAT_YV16: |
| 978 case PIXEL_FORMAT_YUV422P9: | 992 case PIXEL_FORMAT_YUV422P9: |
| 979 case PIXEL_FORMAT_YUV422P10: | 993 case PIXEL_FORMAT_YUV422P10: |
| 980 case PIXEL_FORMAT_YUV422P12: | 994 case PIXEL_FORMAT_YUV422P12: |
| 981 return gfx::Size(2, 1); | 995 return gfx::Size(2, 1); |
| 982 | 996 |
| 983 case PIXEL_FORMAT_YV12: | 997 case PIXEL_FORMAT_YV12: |
| 984 case PIXEL_FORMAT_I420: | 998 case PIXEL_FORMAT_I420: |
| 985 case PIXEL_FORMAT_YV12A: | 999 case PIXEL_FORMAT_YV12A: |
| 986 case PIXEL_FORMAT_NV12: | 1000 case PIXEL_FORMAT_NV12: |
| 987 case PIXEL_FORMAT_NV21: | 1001 case PIXEL_FORMAT_NV21: |
| 988 case PIXEL_FORMAT_MT21: | 1002 case PIXEL_FORMAT_MT21: |
| 989 case PIXEL_FORMAT_YUV420P9: | 1003 case PIXEL_FORMAT_YUV420P9: |
| 990 case PIXEL_FORMAT_YUV420P10: | 1004 case PIXEL_FORMAT_YUV420P10: |
| 991 case PIXEL_FORMAT_YUV420P12: | 1005 case PIXEL_FORMAT_YUV420P12: |
| 992 return gfx::Size(2, 2); | 1006 return gfx::Size(2, 2); |
| 993 | 1007 |
| 994 case PIXEL_FORMAT_UNKNOWN: | 1008 case PIXEL_FORMAT_UNKNOWN: |
| 995 case PIXEL_FORMAT_UYVY: | 1009 case PIXEL_FORMAT_UYVY: |
| 996 case PIXEL_FORMAT_YUY2: | 1010 case PIXEL_FORMAT_YUY2: |
| 997 case PIXEL_FORMAT_ARGB: | 1011 case PIXEL_FORMAT_ARGB: |
| 998 case PIXEL_FORMAT_XRGB: | 1012 case PIXEL_FORMAT_XRGB: |
| 999 case PIXEL_FORMAT_RGB24: | 1013 case PIXEL_FORMAT_RGB24: |
| 1000 case PIXEL_FORMAT_RGB32: | 1014 case PIXEL_FORMAT_RGB32: |
| 1001 case PIXEL_FORMAT_MJPEG: | 1015 case PIXEL_FORMAT_MJPEG: |
| 1002 case PIXEL_FORMAT_Y8: | 1016 case PIXEL_FORMAT_Y8: |
| 1003 case PIXEL_FORMAT_Y16: | |
| 1004 break; | 1017 break; |
| 1005 } | 1018 } |
| 1006 } | 1019 } |
| 1007 NOTREACHED(); | 1020 NOTREACHED(); |
| 1008 return gfx::Size(); | 1021 return gfx::Size(); |
| 1009 } | 1022 } |
| 1010 | 1023 |
| 1011 // static | 1024 // static |
| 1012 int VideoFrame::BytesPerElement(VideoPixelFormat format, size_t plane) { | 1025 int VideoFrame::BytesPerElement(VideoPixelFormat format, size_t plane) { |
| 1013 DCHECK(IsValidPlane(plane, format)); | 1026 DCHECK(IsValidPlane(plane, format)); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1095 if (zero_initialize_memory) | 1108 if (zero_initialize_memory) |
| 1096 memset(data, 0, data_size); | 1109 memset(data, 0, data_size); |
| 1097 | 1110 |
| 1098 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) | 1111 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) |
| 1099 data_[plane] = data + offset[plane]; | 1112 data_[plane] = data + offset[plane]; |
| 1100 | 1113 |
| 1101 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); | 1114 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); |
| 1102 } | 1115 } |
| 1103 | 1116 |
| 1104 } // namespace media | 1117 } // namespace media |
| OLD | NEW |