Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: media/base/video_frame.cc

Issue 2121043002: 16 bpp video stream capture, render and WebGL usage - Realsense R200 & SR300 support. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: WebGL video to texture support and readPixels from R16UI for CPU access Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698