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

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

Issue 2428263004: 16 bpp video stream capture, render and createImageBitmap(video) using (CPU) shared memory buffers (Closed)
Patch Set: video_frame.cc switch fix. Created 4 years, 1 month 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 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698