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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
159 scoped_refptr<VideoFrame> VideoFrame::WrapNativeTextures( | 159 scoped_refptr<VideoFrame> VideoFrame::WrapNativeTextures( |
160 VideoPixelFormat format, | 160 VideoPixelFormat format, |
161 const gpu::MailboxHolder (&mailbox_holders)[kMaxPlanes], | 161 const gpu::MailboxHolder (&mailbox_holders)[kMaxPlanes], |
162 const ReleaseMailboxCB& mailbox_holder_release_cb, | 162 const ReleaseMailboxCB& mailbox_holder_release_cb, |
163 const gfx::Size& coded_size, | 163 const gfx::Size& coded_size, |
164 const gfx::Rect& visible_rect, | 164 const gfx::Rect& visible_rect, |
165 const gfx::Size& natural_size, | 165 const gfx::Size& natural_size, |
166 base::TimeDelta timestamp) { | 166 base::TimeDelta timestamp) { |
167 if (format != PIXEL_FORMAT_ARGB && format != PIXEL_FORMAT_XRGB && | 167 if (format != PIXEL_FORMAT_ARGB && format != PIXEL_FORMAT_XRGB && |
168 format != PIXEL_FORMAT_UYVY && format != PIXEL_FORMAT_NV12 && | 168 format != PIXEL_FORMAT_UYVY && format != PIXEL_FORMAT_NV12 && |
169 format != PIXEL_FORMAT_I420) { | 169 format != PIXEL_FORMAT_I420 && format != PIXEL_FORMAT_Y16) { |
170 LOG(DFATAL) << "Unsupported pixel format supported, got " | 170 LOG(DFATAL) << "Unsupported pixel format supported, got " |
171 << VideoPixelFormatToString(format); | 171 << VideoPixelFormatToString(format); |
172 return nullptr; | 172 return nullptr; |
173 } | 173 } |
174 const StorageType storage = STORAGE_OPAQUE; | 174 const StorageType storage = STORAGE_OPAQUE; |
175 if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) { | 175 if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) { |
176 LOG(DFATAL) << __func__ << " Invalid config." | 176 LOG(DFATAL) << __func__ << " Invalid config." |
177 << ConfigToString(format, storage, coded_size, visible_rect, | 177 << ConfigToString(format, storage, coded_size, visible_rect, |
178 natural_size); | 178 natural_size); |
179 return nullptr; | 179 return nullptr; |
(...skipping 27 matching lines...) Expand all Loading... |
207 size_t data_size, | 207 size_t data_size, |
208 base::SharedMemoryHandle handle, | 208 base::SharedMemoryHandle handle, |
209 size_t data_offset, | 209 size_t data_offset, |
210 base::TimeDelta timestamp) { | 210 base::TimeDelta timestamp) { |
211 return WrapExternalStorage(format, STORAGE_SHMEM, coded_size, visible_rect, | 211 return WrapExternalStorage(format, STORAGE_SHMEM, coded_size, visible_rect, |
212 natural_size, data, data_size, timestamp, handle, | 212 natural_size, data, data_size, timestamp, handle, |
213 data_offset); | 213 data_offset); |
214 } | 214 } |
215 | 215 |
216 // static | 216 // static |
| 217 scoped_refptr<VideoFrame> VideoFrame::WrapExternalGpuMemoryBuffer( |
| 218 VideoPixelFormat format, |
| 219 const gfx::Size& coded_size, |
| 220 const gfx::Rect& visible_rect, |
| 221 const gfx::Size& natural_size, |
| 222 uint8_t* data, |
| 223 const gfx::GpuMemoryBufferHandle& handle, |
| 224 base::TimeDelta timestamp) { |
| 225 const StorageType storage = STORAGE_GPU_MEMORY_BUFFERS; |
| 226 if (!IsValidConfig(format, storage, coded_size, visible_rect, natural_size)) { |
| 227 LOG(DFATAL) << __func__ << " Invalid config." |
| 228 << ConfigToString(format, storage, coded_size, visible_rect, |
| 229 natural_size); |
| 230 return nullptr; |
| 231 } |
| 232 |
| 233 scoped_refptr<VideoFrame> frame(new VideoFrame( |
| 234 format, storage, coded_size, visible_rect, natural_size, timestamp)); |
| 235 frame->strides_[0] = coded_size.width() * BytesPerElement(format, 0); |
| 236 frame->data_[0] = data; |
| 237 frame->gpu_memory_buffer_handles_.push_back(handle); |
| 238 return frame; |
| 239 } |
| 240 |
| 241 // static |
217 scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvData( | 242 scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvData( |
218 VideoPixelFormat format, | 243 VideoPixelFormat format, |
219 const gfx::Size& coded_size, | 244 const gfx::Size& coded_size, |
220 const gfx::Rect& visible_rect, | 245 const gfx::Rect& visible_rect, |
221 const gfx::Size& natural_size, | 246 const gfx::Size& natural_size, |
222 int32_t y_stride, | 247 int32_t y_stride, |
223 int32_t u_stride, | 248 int32_t u_stride, |
224 int32_t v_stride, | 249 int32_t v_stride, |
225 uint8_t* y_data, | 250 uint8_t* y_data, |
226 uint8_t* u_data, | 251 uint8_t* u_data, |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
616 for (int row = 0; row < frame->rows(plane); ++row) { | 641 for (int row = 0; row < frame->rows(plane); ++row) { |
617 base::MD5Update( | 642 base::MD5Update( |
618 context, | 643 context, |
619 base::StringPiece(reinterpret_cast<char*>(frame->data(plane) + | 644 base::StringPiece(reinterpret_cast<char*>(frame->data(plane) + |
620 frame->stride(plane) * row), | 645 frame->stride(plane) * row), |
621 frame->row_bytes(plane))); | 646 frame->row_bytes(plane))); |
622 } | 647 } |
623 } | 648 } |
624 } | 649 } |
625 | 650 |
| 651 // static |
| 652 gfx::BufferFormat VideoFrame::BufferFormat(VideoPixelFormat format) { |
| 653 switch (format) { |
| 654 case PIXEL_FORMAT_I420: |
| 655 case PIXEL_FORMAT_Y8: |
| 656 return gfx::BufferFormat::R_8; |
| 657 case PIXEL_FORMAT_NV12: |
| 658 return gfx::BufferFormat::YUV_420_BIPLANAR; |
| 659 case PIXEL_FORMAT_UYVY: |
| 660 return gfx::BufferFormat::UYVY_422; |
| 661 case PIXEL_FORMAT_Y16: |
| 662 return gfx::BufferFormat::RG_88; |
| 663 default: |
| 664 NOTREACHED(); |
| 665 return gfx::BufferFormat::BGRA_8888; |
| 666 } |
| 667 } |
| 668 |
626 bool VideoFrame::IsMappable() const { | 669 bool VideoFrame::IsMappable() const { |
627 return IsStorageTypeMappable(storage_type_); | 670 return IsStorageTypeMappable(storage_type_); |
628 } | 671 } |
629 | 672 |
630 bool VideoFrame::HasTextures() const { | 673 bool VideoFrame::HasTextures() const { |
631 return !mailbox_holders_[0].mailbox.IsZero(); | 674 return !mailbox_holders_[0].mailbox.IsZero(); |
632 } | 675 } |
633 | 676 |
634 gfx::ColorSpace VideoFrame::ColorSpace() const { | 677 gfx::ColorSpace VideoFrame::ColorSpace() const { |
635 if (color_space_ == gfx::ColorSpace()) { | 678 if (color_space_ == gfx::ColorSpace()) { |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 const gfx::Size& natural_size, | 854 const gfx::Size& natural_size, |
812 uint8_t* data, | 855 uint8_t* data, |
813 size_t data_size, | 856 size_t data_size, |
814 base::TimeDelta timestamp, | 857 base::TimeDelta timestamp, |
815 base::SharedMemoryHandle handle, | 858 base::SharedMemoryHandle handle, |
816 size_t data_offset) { | 859 size_t data_offset) { |
817 DCHECK(IsStorageTypeMappable(storage_type)); | 860 DCHECK(IsStorageTypeMappable(storage_type)); |
818 | 861 |
819 // TODO(miu): This function should support any pixel format. | 862 // TODO(miu): This function should support any pixel format. |
820 // http://crbug.com/555909 | 863 // http://crbug.com/555909 |
821 if (format != PIXEL_FORMAT_I420) { | 864 if (format != PIXEL_FORMAT_I420 && format != PIXEL_FORMAT_Y16) { |
822 LOG(DFATAL) << "Only PIXEL_FORMAT_I420 format supported: " | 865 LOG(DFATAL) << "Only PIXEL_FORMAT_I420 and PIXEL_FORMAT_Y16 formats are" |
| 866 "supported: " |
823 << VideoPixelFormatToString(format); | 867 << VideoPixelFormatToString(format); |
824 return nullptr; | 868 return nullptr; |
825 } | 869 } |
826 | 870 |
827 if (!IsValidConfig(format, storage_type, coded_size, visible_rect, | 871 if (!IsValidConfig(format, storage_type, coded_size, visible_rect, |
828 natural_size)) { | 872 natural_size)) { |
829 LOG(DFATAL) << __func__ << " Invalid config." | 873 LOG(DFATAL) << __func__ << " Invalid config." |
830 << ConfigToString(format, storage_type, coded_size, | 874 << ConfigToString(format, storage_type, coded_size, |
831 visible_rect, natural_size); | 875 visible_rect, natural_size); |
832 return nullptr; | 876 return nullptr; |
833 } | 877 } |
834 | 878 |
835 scoped_refptr<VideoFrame> frame; | 879 scoped_refptr<VideoFrame> frame; |
836 if (storage_type == STORAGE_SHMEM) { | 880 if (storage_type == STORAGE_SHMEM) { |
837 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, | 881 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, |
838 natural_size, timestamp, handle, data_offset); | 882 natural_size, timestamp, handle, data_offset); |
839 } else { | 883 } else { |
840 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, | 884 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, |
841 natural_size, timestamp); | 885 natural_size, timestamp); |
842 } | 886 } |
| 887 if (format == PIXEL_FORMAT_Y16) { |
| 888 DCHECK_EQ(NumPlanes(format), 1U); |
| 889 const size_t i = 0; |
| 890 frame->strides_[i] = coded_size.width() * BytesPerElement(format, i); |
| 891 frame->data_[i] = data; |
| 892 return frame; |
| 893 } |
843 frame->strides_[kYPlane] = coded_size.width(); | 894 frame->strides_[kYPlane] = coded_size.width(); |
844 // TODO(miu): This always rounds widths down, whereas VideoFrame::RowBytes() | 895 // TODO(miu): This always rounds widths down, whereas VideoFrame::RowBytes() |
845 // always rounds up. This inconsistency must be resolved. Perhaps a | 896 // always rounds up. This inconsistency must be resolved. Perhaps a |
846 // CommonAlignment() check should be made in IsValidConfig()? | 897 // CommonAlignment() check should be made in IsValidConfig()? |
847 // http://crbug.com/555909 | 898 // http://crbug.com/555909 |
848 frame->strides_[kUPlane] = coded_size.width() / 2; | 899 frame->strides_[kUPlane] = coded_size.width() / 2; |
849 frame->strides_[kVPlane] = coded_size.width() / 2; | 900 frame->strides_[kVPlane] = coded_size.width() / 2; |
850 frame->data_[kYPlane] = data; | 901 frame->data_[kYPlane] = data; |
851 frame->data_[kUPlane] = data + coded_size.GetArea(); | 902 frame->data_[kUPlane] = data + coded_size.GetArea(); |
852 frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4); | 903 frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1013 case kAPlane: | 1064 case kAPlane: |
1014 return gfx::Size(1, 1); | 1065 return gfx::Size(1, 1); |
1015 | 1066 |
1016 case kUPlane: // and kUVPlane: | 1067 case kUPlane: // and kUVPlane: |
1017 case kVPlane: | 1068 case kVPlane: |
1018 switch (format) { | 1069 switch (format) { |
1019 case PIXEL_FORMAT_YV24: | 1070 case PIXEL_FORMAT_YV24: |
1020 case PIXEL_FORMAT_YUV444P9: | 1071 case PIXEL_FORMAT_YUV444P9: |
1021 case PIXEL_FORMAT_YUV444P10: | 1072 case PIXEL_FORMAT_YUV444P10: |
1022 case PIXEL_FORMAT_YUV444P12: | 1073 case PIXEL_FORMAT_YUV444P12: |
| 1074 case PIXEL_FORMAT_Y8: |
| 1075 case PIXEL_FORMAT_Y16: |
1023 return gfx::Size(1, 1); | 1076 return gfx::Size(1, 1); |
1024 | 1077 |
1025 case PIXEL_FORMAT_YV16: | 1078 case PIXEL_FORMAT_YV16: |
1026 case PIXEL_FORMAT_YUV422P9: | 1079 case PIXEL_FORMAT_YUV422P9: |
1027 case PIXEL_FORMAT_YUV422P10: | 1080 case PIXEL_FORMAT_YUV422P10: |
1028 case PIXEL_FORMAT_YUV422P12: | 1081 case PIXEL_FORMAT_YUV422P12: |
1029 return gfx::Size(2, 1); | 1082 return gfx::Size(2, 1); |
1030 | 1083 |
1031 case PIXEL_FORMAT_YV12: | 1084 case PIXEL_FORMAT_YV12: |
1032 case PIXEL_FORMAT_I420: | 1085 case PIXEL_FORMAT_I420: |
1033 case PIXEL_FORMAT_YV12A: | 1086 case PIXEL_FORMAT_YV12A: |
1034 case PIXEL_FORMAT_NV12: | 1087 case PIXEL_FORMAT_NV12: |
1035 case PIXEL_FORMAT_NV21: | 1088 case PIXEL_FORMAT_NV21: |
1036 case PIXEL_FORMAT_MT21: | 1089 case PIXEL_FORMAT_MT21: |
1037 case PIXEL_FORMAT_YUV420P9: | 1090 case PIXEL_FORMAT_YUV420P9: |
1038 case PIXEL_FORMAT_YUV420P10: | 1091 case PIXEL_FORMAT_YUV420P10: |
1039 case PIXEL_FORMAT_YUV420P12: | 1092 case PIXEL_FORMAT_YUV420P12: |
1040 return gfx::Size(2, 2); | 1093 return gfx::Size(2, 2); |
1041 | 1094 |
1042 case PIXEL_FORMAT_UNKNOWN: | 1095 case PIXEL_FORMAT_UNKNOWN: |
1043 case PIXEL_FORMAT_UYVY: | 1096 case PIXEL_FORMAT_UYVY: |
1044 case PIXEL_FORMAT_YUY2: | 1097 case PIXEL_FORMAT_YUY2: |
1045 case PIXEL_FORMAT_ARGB: | 1098 case PIXEL_FORMAT_ARGB: |
1046 case PIXEL_FORMAT_XRGB: | 1099 case PIXEL_FORMAT_XRGB: |
1047 case PIXEL_FORMAT_RGB24: | 1100 case PIXEL_FORMAT_RGB24: |
1048 case PIXEL_FORMAT_RGB32: | 1101 case PIXEL_FORMAT_RGB32: |
1049 case PIXEL_FORMAT_MJPEG: | 1102 case PIXEL_FORMAT_MJPEG: |
1050 case PIXEL_FORMAT_Y8: | |
1051 case PIXEL_FORMAT_Y16: | |
1052 break; | 1103 break; |
1053 } | 1104 } |
1054 } | 1105 } |
1055 NOTREACHED(); | 1106 NOTREACHED(); |
1056 return gfx::Size(); | 1107 return gfx::Size(); |
1057 } | 1108 } |
1058 | 1109 |
1059 // static | 1110 // static |
1060 int VideoFrame::BytesPerElement(VideoPixelFormat format, size_t plane) { | 1111 int VideoFrame::BytesPerElement(VideoPixelFormat format, size_t plane) { |
1061 DCHECK(IsValidPlane(plane, format)); | 1112 DCHECK(IsValidPlane(plane, format)); |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1143 if (zero_initialize_memory) | 1194 if (zero_initialize_memory) |
1144 memset(data, 0, data_size); | 1195 memset(data, 0, data_size); |
1145 | 1196 |
1146 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) | 1197 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) |
1147 data_[plane] = data + offset[plane]; | 1198 data_[plane] = data + offset[plane]; |
1148 | 1199 |
1149 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); | 1200 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); |
1150 } | 1201 } |
1151 | 1202 |
1152 } // namespace media | 1203 } // namespace media |
OLD | NEW |