| 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 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 natural_size.width() > limits::kMaxDimension || | 118 natural_size.width() > limits::kMaxDimension || |
| 119 natural_size.height() > limits::kMaxDimension) | 119 natural_size.height() > limits::kMaxDimension) |
| 120 return false; | 120 return false; |
| 121 | 121 |
| 122 // TODO(mcasas): Remove parameter |storage_type| when the opaque storage types | 122 // TODO(mcasas): Remove parameter |storage_type| when the opaque storage types |
| 123 // comply with the checks below. Right now we skip them. | 123 // comply with the checks below. Right now we skip them. |
| 124 if (!IsStorageTypeMappable(storage_type)) | 124 if (!IsStorageTypeMappable(storage_type)) |
| 125 return true; | 125 return true; |
| 126 | 126 |
| 127 // Make sure new formats are properly accounted for in the method. | 127 // Make sure new formats are properly accounted for in the method. |
| 128 static_assert(PIXEL_FORMAT_MAX == 21, | 128 static_assert(PIXEL_FORMAT_MAX == 23, |
| 129 "Added pixel format, please review IsValidConfig()"); | 129 "Added pixel format, please review IsValidConfig()"); |
| 130 | 130 |
| 131 if (format == PIXEL_FORMAT_UNKNOWN) { | 131 if (format == PIXEL_FORMAT_UNKNOWN) { |
| 132 return coded_size.IsEmpty() && visible_rect.IsEmpty() && | 132 return coded_size.IsEmpty() && visible_rect.IsEmpty() && |
| 133 natural_size.IsEmpty(); | 133 natural_size.IsEmpty(); |
| 134 } | 134 } |
| 135 | 135 |
| 136 // Check that software-allocated buffer formats are not empty. | 136 // Check that software-allocated buffer formats are not empty. |
| 137 return !coded_size.IsEmpty() && !visible_rect.IsEmpty() && | 137 return !coded_size.IsEmpty() && !visible_rect.IsEmpty() && |
| 138 !natural_size.IsEmpty(); | 138 !natural_size.IsEmpty(); |
| (...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 528 // static | 528 // static |
| 529 size_t VideoFrame::NumPlanes(VideoPixelFormat format) { | 529 size_t VideoFrame::NumPlanes(VideoPixelFormat format) { |
| 530 switch (format) { | 530 switch (format) { |
| 531 case PIXEL_FORMAT_UYVY: | 531 case PIXEL_FORMAT_UYVY: |
| 532 case PIXEL_FORMAT_YUY2: | 532 case PIXEL_FORMAT_YUY2: |
| 533 case PIXEL_FORMAT_ARGB: | 533 case PIXEL_FORMAT_ARGB: |
| 534 case PIXEL_FORMAT_XRGB: | 534 case PIXEL_FORMAT_XRGB: |
| 535 case PIXEL_FORMAT_RGB24: | 535 case PIXEL_FORMAT_RGB24: |
| 536 case PIXEL_FORMAT_RGB32: | 536 case PIXEL_FORMAT_RGB32: |
| 537 case PIXEL_FORMAT_MJPEG: | 537 case PIXEL_FORMAT_MJPEG: |
| 538 case PIXEL_FORMAT_Y8: |
| 539 case PIXEL_FORMAT_Y16: |
| 538 return 1; | 540 return 1; |
| 539 case PIXEL_FORMAT_NV12: | 541 case PIXEL_FORMAT_NV12: |
| 540 case PIXEL_FORMAT_NV21: | 542 case PIXEL_FORMAT_NV21: |
| 541 case PIXEL_FORMAT_MT21: | 543 case PIXEL_FORMAT_MT21: |
| 542 return 2; | 544 return 2; |
| 543 case PIXEL_FORMAT_I420: | 545 case PIXEL_FORMAT_I420: |
| 544 case PIXEL_FORMAT_YV12: | 546 case PIXEL_FORMAT_YV12: |
| 545 case PIXEL_FORMAT_YV16: | 547 case PIXEL_FORMAT_YV16: |
| 546 case PIXEL_FORMAT_YV24: | 548 case PIXEL_FORMAT_YV24: |
| 547 case PIXEL_FORMAT_YUV420P9: | 549 case PIXEL_FORMAT_YUV420P9: |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 808 const gfx::Size& natural_size, | 810 const gfx::Size& natural_size, |
| 809 uint8_t* data, | 811 uint8_t* data, |
| 810 size_t data_size, | 812 size_t data_size, |
| 811 base::TimeDelta timestamp, | 813 base::TimeDelta timestamp, |
| 812 base::SharedMemoryHandle handle, | 814 base::SharedMemoryHandle handle, |
| 813 size_t data_offset) { | 815 size_t data_offset) { |
| 814 DCHECK(IsStorageTypeMappable(storage_type)); | 816 DCHECK(IsStorageTypeMappable(storage_type)); |
| 815 | 817 |
| 816 // TODO(miu): This function should support any pixel format. | 818 // TODO(miu): This function should support any pixel format. |
| 817 // http://crbug.com/555909 | 819 // http://crbug.com/555909 |
| 818 if (format != PIXEL_FORMAT_I420) { | 820 if (format != PIXEL_FORMAT_I420 && format != PIXEL_FORMAT_Y8 && |
| 819 LOG(DFATAL) << "Only PIXEL_FORMAT_I420 format supported: " | 821 format != PIXEL_FORMAT_Y16) { |
| 822 LOG(DFATAL) << "Only PIXEL_FORMAT_I420, PIXEL_FORMAT_Y8 and " |
| 823 "PIXEL_FORMAT_Y16 formats are supported: " |
| 820 << VideoPixelFormatToString(format); | 824 << VideoPixelFormatToString(format); |
| 821 return nullptr; | 825 return nullptr; |
| 822 } | 826 } |
| 823 | 827 |
| 824 if (!IsValidConfig(format, storage_type, coded_size, visible_rect, | 828 if (!IsValidConfig(format, storage_type, coded_size, visible_rect, |
| 825 natural_size)) { | 829 natural_size)) { |
| 826 LOG(DFATAL) << __FUNCTION__ << " Invalid config." | 830 LOG(DFATAL) << __FUNCTION__ << " Invalid config." |
| 827 << ConfigToString(format, storage_type, coded_size, | 831 << ConfigToString(format, storage_type, coded_size, |
| 828 visible_rect, natural_size); | 832 visible_rect, natural_size); |
| 829 return nullptr; | 833 return nullptr; |
| 830 } | 834 } |
| 831 | 835 |
| 832 scoped_refptr<VideoFrame> frame; | 836 scoped_refptr<VideoFrame> frame; |
| 833 if (storage_type == STORAGE_SHMEM) { | 837 if (storage_type == STORAGE_SHMEM) { |
| 834 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, | 838 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, |
| 835 natural_size, timestamp, handle, data_offset); | 839 natural_size, timestamp, handle, data_offset); |
| 836 } else { | 840 } else { |
| 837 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, | 841 frame = new VideoFrame(format, storage_type, coded_size, visible_rect, |
| 838 natural_size, timestamp); | 842 natural_size, timestamp); |
| 839 } | 843 } |
| 844 if (format == PIXEL_FORMAT_Y8 || format == PIXEL_FORMAT_Y16) { |
| 845 // TODO(astojilj) Make this code generic for all and move format specifics |
| 846 // to static methods. |
| 847 DCHECK_EQ(NumPlanes(format), 1); |
| 848 const size_t i = 0; |
| 849 frame->strides_[i] = coded_size.width() * BytesPerElement(format, i); |
| 850 frame->data_[i] = data; |
| 851 return frame; |
| 852 } |
| 840 frame->strides_[kYPlane] = coded_size.width(); | 853 frame->strides_[kYPlane] = coded_size.width(); |
| 841 // TODO(miu): This always rounds widths down, whereas VideoFrame::RowBytes() | 854 // TODO(miu): This always rounds widths down, whereas VideoFrame::RowBytes() |
| 842 // always rounds up. This inconsistency must be resolved. Perhaps a | 855 // always rounds up. This inconsistency must be resolved. Perhaps a |
| 843 // CommonAlignment() check should be made in IsValidConfig()? | 856 // CommonAlignment() check should be made in IsValidConfig()? |
| 844 // http://crbug.com/555909 | 857 // http://crbug.com/555909 |
| 845 frame->strides_[kUPlane] = coded_size.width() / 2; | 858 frame->strides_[kUPlane] = coded_size.width() / 2; |
| 846 frame->strides_[kVPlane] = coded_size.width() / 2; | 859 frame->strides_[kVPlane] = coded_size.width() / 2; |
| 847 frame->data_[kYPlane] = data; | 860 frame->data_[kYPlane] = data; |
| 848 frame->data_[kUPlane] = data + coded_size.GetArea(); | 861 frame->data_[kUPlane] = data + coded_size.GetArea(); |
| 849 frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4); | 862 frame->data_[kVPlane] = data + (coded_size.GetArea() * 5 / 4); |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1009 case kYPlane: | 1022 case kYPlane: |
| 1010 case kAPlane: | 1023 case kAPlane: |
| 1011 return gfx::Size(1, 1); | 1024 return gfx::Size(1, 1); |
| 1012 | 1025 |
| 1013 case kUPlane: // and kUVPlane: | 1026 case kUPlane: // and kUVPlane: |
| 1014 case kVPlane: | 1027 case kVPlane: |
| 1015 switch (format) { | 1028 switch (format) { |
| 1016 case PIXEL_FORMAT_YV24: | 1029 case PIXEL_FORMAT_YV24: |
| 1017 case PIXEL_FORMAT_YUV444P9: | 1030 case PIXEL_FORMAT_YUV444P9: |
| 1018 case PIXEL_FORMAT_YUV444P10: | 1031 case PIXEL_FORMAT_YUV444P10: |
| 1032 case PIXEL_FORMAT_Y8: |
| 1019 return gfx::Size(1, 1); | 1033 return gfx::Size(1, 1); |
| 1020 | 1034 |
| 1021 case PIXEL_FORMAT_YV16: | 1035 case PIXEL_FORMAT_YV16: |
| 1022 case PIXEL_FORMAT_YUV422P9: | 1036 case PIXEL_FORMAT_YUV422P9: |
| 1023 case PIXEL_FORMAT_YUV422P10: | 1037 case PIXEL_FORMAT_YUV422P10: |
| 1024 return gfx::Size(2, 1); | 1038 return gfx::Size(2, 1); |
| 1025 | 1039 |
| 1026 case PIXEL_FORMAT_YV12: | 1040 case PIXEL_FORMAT_YV12: |
| 1027 case PIXEL_FORMAT_I420: | 1041 case PIXEL_FORMAT_I420: |
| 1028 case PIXEL_FORMAT_YV12A: | 1042 case PIXEL_FORMAT_YV12A: |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1059 case PIXEL_FORMAT_RGB24: | 1073 case PIXEL_FORMAT_RGB24: |
| 1060 return 3; | 1074 return 3; |
| 1061 case PIXEL_FORMAT_UYVY: | 1075 case PIXEL_FORMAT_UYVY: |
| 1062 case PIXEL_FORMAT_YUY2: | 1076 case PIXEL_FORMAT_YUY2: |
| 1063 case PIXEL_FORMAT_YUV420P9: | 1077 case PIXEL_FORMAT_YUV420P9: |
| 1064 case PIXEL_FORMAT_YUV422P9: | 1078 case PIXEL_FORMAT_YUV422P9: |
| 1065 case PIXEL_FORMAT_YUV444P9: | 1079 case PIXEL_FORMAT_YUV444P9: |
| 1066 case PIXEL_FORMAT_YUV420P10: | 1080 case PIXEL_FORMAT_YUV420P10: |
| 1067 case PIXEL_FORMAT_YUV422P10: | 1081 case PIXEL_FORMAT_YUV422P10: |
| 1068 case PIXEL_FORMAT_YUV444P10: | 1082 case PIXEL_FORMAT_YUV444P10: |
| 1083 case PIXEL_FORMAT_Y16: |
| 1069 return 2; | 1084 return 2; |
| 1070 case PIXEL_FORMAT_NV12: | 1085 case PIXEL_FORMAT_NV12: |
| 1071 case PIXEL_FORMAT_NV21: | 1086 case PIXEL_FORMAT_NV21: |
| 1072 case PIXEL_FORMAT_MT21: { | 1087 case PIXEL_FORMAT_MT21: { |
| 1073 static const int bytes_per_element[] = {1, 2}; | 1088 static const int bytes_per_element[] = {1, 2}; |
| 1074 DCHECK_LT(plane, arraysize(bytes_per_element)); | 1089 DCHECK_LT(plane, arraysize(bytes_per_element)); |
| 1075 return bytes_per_element[plane]; | 1090 return bytes_per_element[plane]; |
| 1076 } | 1091 } |
| 1077 case PIXEL_FORMAT_YV12: | 1092 case PIXEL_FORMAT_YV12: |
| 1078 case PIXEL_FORMAT_I420: | 1093 case PIXEL_FORMAT_I420: |
| 1079 case PIXEL_FORMAT_YV16: | 1094 case PIXEL_FORMAT_YV16: |
| 1080 case PIXEL_FORMAT_YV12A: | 1095 case PIXEL_FORMAT_YV12A: |
| 1081 case PIXEL_FORMAT_YV24: | 1096 case PIXEL_FORMAT_YV24: |
| 1097 case PIXEL_FORMAT_Y8: |
| 1082 return 1; | 1098 return 1; |
| 1083 case PIXEL_FORMAT_MJPEG: | 1099 case PIXEL_FORMAT_MJPEG: |
| 1084 return 0; | 1100 return 0; |
| 1085 case PIXEL_FORMAT_UNKNOWN: | 1101 case PIXEL_FORMAT_UNKNOWN: |
| 1086 break; | 1102 break; |
| 1087 } | 1103 } |
| 1088 NOTREACHED(); | 1104 NOTREACHED(); |
| 1089 return 0; | 1105 return 0; |
| 1090 } | 1106 } |
| 1091 | 1107 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1130 if (zero_initialize_memory) | 1146 if (zero_initialize_memory) |
| 1131 memset(data, 0, data_size); | 1147 memset(data, 0, data_size); |
| 1132 | 1148 |
| 1133 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) | 1149 for (size_t plane = 0; plane < NumPlanes(format_); ++plane) |
| 1134 data_[plane] = data + offset[plane]; | 1150 data_[plane] = data + offset[plane]; |
| 1135 | 1151 |
| 1136 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); | 1152 AddDestructionObserver(base::Bind(&base::AlignedFree, data)); |
| 1137 } | 1153 } |
| 1138 | 1154 |
| 1139 } // namespace media | 1155 } // namespace media |
| OLD | NEW |