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

Side by Side Diff: content/browser/renderer_host/media/video_capture_manager.cc

Issue 2398463003: 16 bit capture and GPU&CPU memory buffer support.
Patch Set: fixes. Created 4 years, 2 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 "content/browser/renderer_host/media/video_capture_manager.h" 5 #include "content/browser/renderer_host/media/video_capture_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
53 // Compares two VideoCaptureFormat by checking smallest frame_size area, then 53 // Compares two VideoCaptureFormat by checking smallest frame_size area, then
54 // by _largest_ frame_rate. Used to order a VideoCaptureFormats vector so that 54 // by _largest_ frame_rate. Used to order a VideoCaptureFormats vector so that
55 // the first entry for a given resolution has the largest frame rate, as needed 55 // the first entry for a given resolution has the largest frame rate, as needed
56 // by the ConsolidateCaptureFormats() method. 56 // by the ConsolidateCaptureFormats() method.
57 bool IsCaptureFormatSmaller(const media::VideoCaptureFormat& format1, 57 bool IsCaptureFormatSmaller(const media::VideoCaptureFormat& format1,
58 const media::VideoCaptureFormat& format2) { 58 const media::VideoCaptureFormat& format2) {
59 DCHECK(format1.frame_size.GetCheckedArea().IsValid()); 59 DCHECK(format1.frame_size.GetCheckedArea().IsValid());
60 DCHECK(format2.frame_size.GetCheckedArea().IsValid()); 60 DCHECK(format2.frame_size.GetCheckedArea().IsValid());
61 if (format1.frame_size.GetCheckedArea().ValueOrDefault(0) == 61 if (format1.frame_size.GetCheckedArea().ValueOrDefault(0) ==
62 format2.frame_size.GetCheckedArea().ValueOrDefault(0)) { 62 format2.frame_size.GetCheckedArea().ValueOrDefault(0)) {
63 return format1.frame_rate > format2.frame_rate; 63 return format1.frame_rate > format2.frame_rate ||
64 // Prefer Y16 capture format for the same frame rate.
65 // This is workaround for e.g. Realsense R200 IR stream.
66 (format1.frame_rate == format2.frame_rate &&
67 (format2.pixel_format != media::PIXEL_FORMAT_Y16));
64 } 68 }
65 return format1.frame_size.GetCheckedArea().ValueOrDefault(0) < 69 return format1.frame_size.GetCheckedArea().ValueOrDefault(0) <
66 format2.frame_size.GetCheckedArea().ValueOrDefault(0); 70 format2.frame_size.GetCheckedArea().ValueOrDefault(0);
67 } 71 }
68 72
69 bool IsCaptureFormatSizeEqual(const media::VideoCaptureFormat& format1, 73 bool IsCaptureFormatSizeEqual(const media::VideoCaptureFormat& format1,
70 const media::VideoCaptureFormat& format2) { 74 const media::VideoCaptureFormat& format2) {
71 DCHECK(format1.frame_size.GetCheckedArea().IsValid()); 75 DCHECK(format1.frame_size.GetCheckedArea().IsValid());
72 DCHECK(format2.frame_size.GetCheckedArea().IsValid()); 76 DCHECK(format2.frame_size.GetCheckedArea().IsValid());
73 return format1.frame_size.GetCheckedArea().ValueOrDefault(0) == 77 return format1.frame_size.GetCheckedArea().ValueOrDefault(0) ==
74 format2.frame_size.GetCheckedArea().ValueOrDefault(0); 78 format2.frame_size.GetCheckedArea().ValueOrDefault(0);
75 } 79 }
76 80
77 // This function receives a list of capture formats, removes duplicated 81 // This function receives a list of capture formats, removes duplicated
78 // resolutions while keeping the highest frame rate for each, and forcing I420 82 // resolutions while keeping the highest frame rate for each, and forcing I420
79 // pixel format. 83 // pixel format.
80 void ConsolidateCaptureFormats(media::VideoCaptureFormats* formats) { 84 void ConsolidateCaptureFormats(media::VideoCaptureFormats* formats) {
81 if (formats->empty()) 85 if (formats->empty())
82 return; 86 return;
83 std::sort(formats->begin(), formats->end(), IsCaptureFormatSmaller); 87 std::sort(formats->begin(), formats->end(), IsCaptureFormatSmaller);
84 // Due to the ordering imposed, the largest frame_rate is kept while removing 88 // Due to the ordering imposed, the largest frame_rate is kept while removing
85 // duplicated resolutions. 89 // duplicated resolutions.
86 media::VideoCaptureFormats::iterator last = 90 media::VideoCaptureFormats::iterator last =
87 std::unique(formats->begin(), formats->end(), IsCaptureFormatSizeEqual); 91 std::unique(formats->begin(), formats->end(), IsCaptureFormatSizeEqual);
88 formats->erase(last, formats->end()); 92 formats->erase(last, formats->end());
89 // Mark all formats as I420, since this is what the renderer side will get 93 // Mark all formats as I420, since this is what the renderer side will get
90 // anyhow: the actual pixel format is decided at the device level. 94 // anyhow: the actual pixel format is decided at the device level.
95 // Don't do this for Y16 format as it is handled separatelly.
91 for (media::VideoCaptureFormats::iterator it = formats->begin(); 96 for (media::VideoCaptureFormats::iterator it = formats->begin();
92 it != formats->end(); ++it) { 97 it != formats->end(); ++it) {
93 it->pixel_format = media::PIXEL_FORMAT_I420; 98 if (it->pixel_format != media::PIXEL_FORMAT_Y16)
99 it->pixel_format = media::PIXEL_FORMAT_I420;
94 } 100 }
95 } 101 }
96 102
97 // The maximum number of buffers in the capture pipeline. See 103 // The maximum number of buffers in the capture pipeline. See
98 // VideoCaptureController ctor comments for more details. 104 // VideoCaptureController ctor comments for more details.
99 const int kMaxNumberOfBuffers = 3; 105 const int kMaxNumberOfBuffers = 3;
100 // TODO(miu): The value for tab capture should be determined programmatically. 106 // TODO(miu): The value for tab capture should be determined programmatically.
101 // http://crbug.com/460318 107 // http://crbug.com/460318
102 const int kMaxNumberOfBuffersForTabCapture = 10; 108 const int kMaxNumberOfBuffersForTabCapture = 10;
103 109
(...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after
1282 if (!device_in_queue) { 1288 if (!device_in_queue) {
1283 // Session ID is only valid for Screen capture. So we can fake it to 1289 // Session ID is only valid for Screen capture. So we can fake it to
1284 // resume video capture devices here. 1290 // resume video capture devices here.
1285 QueueStartDevice(kFakeSessionId, entry.get(), entry->parameters); 1291 QueueStartDevice(kFakeSessionId, entry.get(), entry->parameters);
1286 } 1292 }
1287 } 1293 }
1288 } 1294 }
1289 #endif // defined(OS_ANDROID) 1295 #endif // defined(OS_ANDROID)
1290 1296
1291 } // namespace content 1297 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698