• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "webrtc/common_video/libyuv/include/scaler.h"
12 
13 // NOTE(ajm): Path provided by gyp.
14 #include "libyuv.h"  // NOLINT
15 
16 namespace webrtc {
17 
Scaler()18 Scaler::Scaler()
19     : method_(kScaleBox),
20       src_width_(0),
21       src_height_(0),
22       dst_width_(0),
23       dst_height_(0),
24       set_(false) {}
25 
~Scaler()26 Scaler::~Scaler() {}
27 
Set(int src_width,int src_height,int dst_width,int dst_height,VideoType src_video_type,VideoType dst_video_type,ScaleMethod method)28 int Scaler::Set(int src_width, int src_height,
29                 int dst_width, int dst_height,
30                 VideoType src_video_type, VideoType dst_video_type,
31                 ScaleMethod method) {
32   set_ = false;
33   if (src_width < 1 || src_height < 1 || dst_width < 1 || dst_height < 1)
34     return -1;
35 
36   if (!SupportedVideoType(src_video_type, dst_video_type))
37     return -1;
38 
39   src_width_ = src_width;
40   src_height_ = src_height;
41   dst_width_ = dst_width;
42   dst_height_ = dst_height;
43   method_ = method;
44   set_ = true;
45   return 0;
46 }
47 
Scale(const I420VideoFrame & src_frame,I420VideoFrame * dst_frame)48 int Scaler::Scale(const I420VideoFrame& src_frame,
49                   I420VideoFrame* dst_frame) {
50   assert(dst_frame);
51   if (src_frame.IsZeroSize())
52     return -1;
53   if (!set_)
54     return -2;
55 
56   // Making sure that destination frame is of sufficient size.
57   // Aligning stride values based on width.
58   dst_frame->CreateEmptyFrame(dst_width_, dst_height_,
59                               dst_width_, (dst_width_ + 1) / 2,
60                               (dst_width_ + 1) / 2);
61 
62   return libyuv::I420Scale(src_frame.buffer(kYPlane),
63                            src_frame.stride(kYPlane),
64                            src_frame.buffer(kUPlane),
65                            src_frame.stride(kUPlane),
66                            src_frame.buffer(kVPlane),
67                            src_frame.stride(kVPlane),
68                            src_width_, src_height_,
69                            dst_frame->buffer(kYPlane),
70                            dst_frame->stride(kYPlane),
71                            dst_frame->buffer(kUPlane),
72                            dst_frame->stride(kUPlane),
73                            dst_frame->buffer(kVPlane),
74                            dst_frame->stride(kVPlane),
75                            dst_width_, dst_height_,
76                            libyuv::FilterMode(method_));
77 }
78 
SupportedVideoType(VideoType src_video_type,VideoType dst_video_type)79 bool Scaler::SupportedVideoType(VideoType src_video_type,
80                                 VideoType dst_video_type) {
81   if (src_video_type != dst_video_type)
82     return false;
83 
84   if ((src_video_type == kI420) || (src_video_type == kIYUV) ||
85       (src_video_type == kYV12))
86     return true;
87 
88   return false;
89 }
90 
91 }  // namespace webrtc
92