Home | History | Annotate | Download | only in libyuv
      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 
     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 
     26 Scaler::~Scaler() {}
     27 
     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 
     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 
     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