| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/cast/sender/performance_metrics_overlay.h" | 5 #include "media/cast/sender/performance_metrics_overlay.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 const int kCharacterHeight = 5; // Logical pixel height of one character. | 22 const int kCharacterHeight = 5; // Logical pixel height of one character. |
| 23 const int kCharacterSpacing = 1; // Logical pixels between each character. | 23 const int kCharacterSpacing = 1; // Logical pixels between each character. |
| 24 const int kLineSpacing = 2; // Logical pixels between each line of characters. | 24 const int kLineSpacing = 2; // Logical pixels between each line of characters. |
| 25 const int kPlane = 0; // Y-plane in YUV formats. | 25 const int kPlane = 0; // Y-plane in YUV formats. |
| 26 | 26 |
| 27 // For each pixel in the |rect| (logical coordinates), either decrease the | 27 // For each pixel in the |rect| (logical coordinates), either decrease the |
| 28 // intensity or increase it so that the resulting pixel has a perceivably | 28 // intensity or increase it so that the resulting pixel has a perceivably |
| 29 // different value than it did before. |p_ul| is a pointer to the pixel at | 29 // different value than it did before. |p_ul| is a pointer to the pixel at |
| 30 // coordinate (0,0) in a single-channel 8bpp bitmap. |stride| is the number of | 30 // coordinate (0,0) in a single-channel 8bpp bitmap. |stride| is the number of |
| 31 // bytes per row in the output bitmap. | 31 // bytes per row in the output bitmap. |
| 32 void DivergePixels(const gfx::Rect& rect, uint8* p_ul, int stride) { | 32 void DivergePixels(const gfx::Rect& rect, uint8_t* p_ul, int stride) { |
| 33 DCHECK(p_ul); | 33 DCHECK(p_ul); |
| 34 DCHECK_GT(stride, 0); | 34 DCHECK_GT(stride, 0); |
| 35 | 35 |
| 36 // These constants and heuristics were chosen based on experimenting with a | 36 // These constants and heuristics were chosen based on experimenting with a |
| 37 // wide variety of content, and converging on a readable result. The amount | 37 // wide variety of content, and converging on a readable result. The amount |
| 38 // by which the darker pixels are changed is less because each unit of change | 38 // by which the darker pixels are changed is less because each unit of change |
| 39 // has a larger visual impact on the darker end of the spectrum. Each pixel's | 39 // has a larger visual impact on the darker end of the spectrum. Each pixel's |
| 40 // intensity value is changed as follows: | 40 // intensity value is changed as follows: |
| 41 // | 41 // |
| 42 // [16,31] --> [32,63] (always a difference of +16) | 42 // [16,31] --> [32,63] (always a difference of +16) |
| 43 // [32,64] --> 16 (a difference between -16 and -48) | 43 // [32,64] --> 16 (a difference between -16 and -48) |
| 44 // [65,235] --> [17,187] (always a difference of -48) | 44 // [65,235] --> [17,187] (always a difference of -48) |
| 45 const int kDivergeDownThreshold = 32; | 45 const int kDivergeDownThreshold = 32; |
| 46 const int kDivergeDownAmount = 48; | 46 const int kDivergeDownAmount = 48; |
| 47 const int kDivergeUpAmount = 32; | 47 const int kDivergeUpAmount = 32; |
| 48 const int kMinIntensity = 16; | 48 const int kMinIntensity = 16; |
| 49 | 49 |
| 50 const int top = rect.y() * kScale; | 50 const int top = rect.y() * kScale; |
| 51 const int bottom = rect.bottom() * kScale; | 51 const int bottom = rect.bottom() * kScale; |
| 52 const int left = rect.x() * kScale; | 52 const int left = rect.x() * kScale; |
| 53 const int right = rect.right() * kScale; | 53 const int right = rect.right() * kScale; |
| 54 for (int y = top; y < bottom; ++y) { | 54 for (int y = top; y < bottom; ++y) { |
| 55 uint8* const p_l = p_ul + y * stride; | 55 uint8_t* const p_l = p_ul + y * stride; |
| 56 for (int x = left; x < right; ++x) { | 56 for (int x = left; x < right; ++x) { |
| 57 int intensity = p_l[x]; | 57 int intensity = p_l[x]; |
| 58 if (intensity >= kDivergeDownThreshold) | 58 if (intensity >= kDivergeDownThreshold) |
| 59 intensity = std::max(kMinIntensity, intensity - kDivergeDownAmount); | 59 intensity = std::max(kMinIntensity, intensity - kDivergeDownAmount); |
| 60 else | 60 else |
| 61 intensity += kDivergeUpAmount; | 61 intensity += kDivergeUpAmount; |
| 62 p_l[x] = static_cast<uint8>(intensity); | 62 p_l[x] = static_cast<uint8_t>(intensity); |
| 63 } | 63 } |
| 64 } | 64 } |
| 65 } | 65 } |
| 66 | 66 |
| 67 // Render |line| into |frame| at physical pixel row |top| and aligned to the | 67 // Render |line| into |frame| at physical pixel row |top| and aligned to the |
| 68 // right edge. Only number digits and a smattering of punctuation characters | 68 // right edge. Only number digits and a smattering of punctuation characters |
| 69 // will be rendered. | 69 // will be rendered. |
| 70 void RenderLineOfText(const std::string& line, int top, VideoFrame* frame) { | 70 void RenderLineOfText(const std::string& line, int top, VideoFrame* frame) { |
| 71 // Compute number of physical pixels wide the rendered |line| would be, | 71 // Compute number of physical pixels wide the rendered |line| would be, |
| 72 // including padding. | 72 // including padding. |
| 73 const int line_width = | 73 const int line_width = |
| 74 (((kCharacterWidth + kCharacterSpacing) * static_cast<int>(line.size())) + | 74 (((kCharacterWidth + kCharacterSpacing) * static_cast<int>(line.size())) + |
| 75 kCharacterSpacing) * kScale; | 75 kCharacterSpacing) * kScale; |
| 76 | 76 |
| 77 // Determine if any characters would render past the left edge of the frame, | 77 // Determine if any characters would render past the left edge of the frame, |
| 78 // and compute the index of the first character to be rendered. | 78 // and compute the index of the first character to be rendered. |
| 79 const int pixels_per_char = (kCharacterWidth + kCharacterSpacing) * kScale; | 79 const int pixels_per_char = (kCharacterWidth + kCharacterSpacing) * kScale; |
| 80 const size_t first_idx = (line_width < frame->visible_rect().width()) ? 0u : | 80 const size_t first_idx = (line_width < frame->visible_rect().width()) ? 0u : |
| 81 static_cast<size_t>( | 81 static_cast<size_t>( |
| 82 ((line_width - frame->visible_rect().width()) / pixels_per_char) + 1); | 82 ((line_width - frame->visible_rect().width()) / pixels_per_char) + 1); |
| 83 | 83 |
| 84 // Compute the pointer to the pixel at the upper-left corner of the first | 84 // Compute the pointer to the pixel at the upper-left corner of the first |
| 85 // character to be rendered. | 85 // character to be rendered. |
| 86 const int stride = frame->stride(kPlane); | 86 const int stride = frame->stride(kPlane); |
| 87 uint8* p_ul = | 87 uint8_t* p_ul = |
| 88 // Start at the first pixel in the first row... | 88 // Start at the first pixel in the first row... |
| 89 frame->visible_data(kPlane) + (stride * top) | 89 frame->visible_data(kPlane) + (stride * top) |
| 90 // ...now move to the right edge of the visible part of the frame... | 90 // ...now move to the right edge of the visible part of the frame... |
| 91 + frame->visible_rect().width() | 91 + frame->visible_rect().width() |
| 92 // ...now move left to where line[0] would be rendered... | 92 // ...now move left to where line[0] would be rendered... |
| 93 - line_width | 93 - line_width |
| 94 // ...now move right to where line[first_idx] would be rendered. | 94 // ...now move right to where line[first_idx] would be rendered. |
| 95 + first_idx * pixels_per_char; | 95 + first_idx * pixels_per_char; |
| 96 | 96 |
| 97 // Render each character. | 97 // Render each character. |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 303 RenderLineOfText(base::StringPrintf("%d %3.1d%% %3.1d%%", | 303 RenderLineOfText(base::StringPrintf("%d %3.1d%% %3.1d%%", |
| 304 frames_ago, | 304 frames_ago, |
| 305 deadline_pct, | 305 deadline_pct, |
| 306 lossy_pct), | 306 lossy_pct), |
| 307 top, | 307 top, |
| 308 frame); | 308 frame); |
| 309 } | 309 } |
| 310 | 310 |
| 311 } // namespace cast | 311 } // namespace cast |
| 312 } // namespace media | 312 } // namespace media |
| OLD | NEW |