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

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

Issue 1135823004: Implement all resolution change policies for desktop and tab capture. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@resolution_change_policy_constraints_ITEM1_CR1
Patch Set: Created 5 years, 7 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
« no previous file with comments | « media/base/video_util.h ('k') | media/base/video_util_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_util.h" 5 #include "media/base/video_util.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "media/base/video_frame.h" 10 #include "media/base/video_frame.h"
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 uint8* dest_ptr = dest; 263 uint8* dest_ptr = dest;
264 for (int col = 0; col < num_cols; ++col) { 264 for (int col = 0; col < num_cols; ++col) {
265 *dest_ptr = *src_ptr++; 265 *dest_ptr = *src_ptr++;
266 dest_ptr += dest_col_step; 266 dest_ptr += dest_col_step;
267 } 267 }
268 src += src_stride; 268 src += src_stride;
269 dest += dest_row_step; 269 dest += dest_row_step;
270 } 270 }
271 } 271 }
272 272
273 // Common logic for the letterboxing and scale-within/scale-encompassing
274 // functions. Scales |size| to either fit within or encompass |target|,
275 // depending on whether |fit_within_target| is true.
276 template<bool fit_within_target>
DaleCurtis 2015/05/09 01:50:21 Seems like this is just a static function with an
miu 2015/05/09 03:52:56 Done.
277 static gfx::Size ScaleSizeToTarget(const gfx::Size& size,
278 const gfx::Size& target) {
279 if (size.IsEmpty())
280 return gfx::Size(); // Corner case: Aspect ratio is undefined.
281
282 // Scale |size|, preserving aspect ratio.
283 const int64 x = static_cast<int64>(size.width()) * target.height();
284 const int64 y = static_cast<int64>(size.height()) * target.width();
285 const bool use_target_width = fit_within_target ? (y < x) : (x < y);
286 return use_target_width ?
287 gfx::Size(target.width(), static_cast<int>(y / size.width())) :
288 gfx::Size(static_cast<int>(x / size.height()), target.height());
289 }
290
273 gfx::Rect ComputeLetterboxRegion(const gfx::Rect& bounds, 291 gfx::Rect ComputeLetterboxRegion(const gfx::Rect& bounds,
274 const gfx::Size& content) { 292 const gfx::Size& content) {
275 // If |content| has an undefined aspect ratio, let's not try to divide by 293 // If |content| has an undefined aspect ratio, let's not try to divide by
276 // zero. 294 // zero.
277 if (content.IsEmpty()) 295 if (content.IsEmpty())
278 return gfx::Rect(); 296 return gfx::Rect();
279 297
280 int64 x = static_cast<int64>(content.width()) * bounds.height(); 298 gfx::Rect result = bounds;
281 int64 y = static_cast<int64>(content.height()) * bounds.width(); 299 result.ClampToCenteredSize(ScaleSizeToTarget<true>(content, bounds.size()));
300 return result;
301 }
282 302
283 gfx::Size letterbox(bounds.width(), bounds.height()); 303 gfx::Size ScaleSizeToFitWithinTarget(const gfx::Size& size,
284 if (y < x) 304 const gfx::Size& target) {
285 letterbox.set_height(static_cast<int>(y / content.width())); 305 return ScaleSizeToTarget<true>(size, target);
306 }
307
308 gfx::Size ScaleSizeToEncompassTarget(const gfx::Size& size,
309 const gfx::Size& target) {
310 return ScaleSizeToTarget<false>(size, target);
311 }
312
313 gfx::Size PadToMatchAspectRatio(const gfx::Size& size,
314 const gfx::Size& target) {
315 if (target.IsEmpty())
316 return gfx::Size(); // Aspect ratio is undefined.
317
318 const int64 x = static_cast<int64>(size.width()) * target.height();
319 const int64 y = static_cast<int64>(size.height()) * target.width();
320 if (x < y)
321 return gfx::Size(static_cast<int>(y / target.height()), size.height());
286 else 322 else
DaleCurtis 2015/05/09 01:50:21 Remove else?
miu 2015/05/09 03:52:56 Done.
287 letterbox.set_width(static_cast<int>(x / content.height())); 323 return gfx::Size(size.width(), static_cast<int>(x / target.width()));
288 gfx::Rect result = bounds;
289 result.ClampToCenteredSize(letterbox);
290 return result;
291 } 324 }
292 325
293 void CopyRGBToVideoFrame(const uint8* source, 326 void CopyRGBToVideoFrame(const uint8* source,
294 int stride, 327 int stride,
295 const gfx::Rect& region_in_frame, 328 const gfx::Rect& region_in_frame,
296 VideoFrame* frame) { 329 VideoFrame* frame) {
297 const int kY = VideoFrame::kYPlane; 330 const int kY = VideoFrame::kYPlane;
298 const int kU = VideoFrame::kUPlane; 331 const int kU = VideoFrame::kUPlane;
299 const int kV = VideoFrame::kVPlane; 332 const int kV = VideoFrame::kVPlane;
300 CHECK_EQ(frame->stride(kU), frame->stride(kV)); 333 CHECK_EQ(frame->stride(kU), frame->stride(kV));
(...skipping 13 matching lines...) Expand all
314 frame->data(kU) + uv_offset, 347 frame->data(kU) + uv_offset,
315 frame->data(kV) + uv_offset, 348 frame->data(kV) + uv_offset,
316 region_in_frame.width(), 349 region_in_frame.width(),
317 region_in_frame.height(), 350 region_in_frame.height(),
318 stride, 351 stride,
319 frame->stride(kY), 352 frame->stride(kY),
320 uv_stride); 353 uv_stride);
321 } 354 }
322 355
323 } // namespace media 356 } // namespace media
OLDNEW
« no previous file with comments | « media/base/video_util.h ('k') | media/base/video_util_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698