/*
 * Copyright 2015 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "media/base/shell_video_data_allocator.h"

#include "base/logging.h"

namespace media {

ShellVideoDataAllocator::YV12Param::YV12Param(int decoded_width,
                                              int decoded_height,
                                              const gfx::Rect& visible_rect,
                                              uint8* data)
    : decoded_width_(decoded_width),
      decoded_height_(decoded_height),
      visible_rect_(visible_rect),
      y_pitch_(decoded_width),
      uv_pitch_(decoded_width / 2),
      y_data_(data),
      u_data_(y_data_ + y_pitch_ * decoded_height_),
      v_data_(u_data_ + uv_pitch_ * decoded_height_ / 2) {}

ShellVideoDataAllocator::YV12Param::YV12Param(int width,
                                              int height,
                                              int y_pitch,
                                              int uv_pitch,
                                              uint8* y_data,
                                              uint8* u_data,
                                              uint8* v_data)
    : decoded_width_(width),
      decoded_height_(height),
      visible_rect_(0, 0, width, height),
      y_pitch_(y_pitch),
      uv_pitch_(uv_pitch),
      y_data_(y_data),
      u_data_(u_data),
      v_data_(v_data) {
  DCHECK_NE(y_pitch_, 0);
  DCHECK_NE(uv_pitch_, 0);
  DCHECK(y_data_);
  DCHECK(u_data);
  DCHECK(v_data);
}

ShellVideoDataAllocator::NV12Param::NV12Param(int width,
                                              int height,
                                              int y_pitch,
                                              const gfx::Rect& visible_rect)
    : decoded_width_(width),
      decoded_height_(height),
      y_pitch_(y_pitch),
      visible_rect_(visible_rect) {}

}  // namespace media
