/*
 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/common_video/interface/texture_video_frame.h"

#include <assert.h>

namespace webrtc {

TextureVideoFrame::TextureVideoFrame(NativeHandle* handle,
                                     int width,
                                     int height,
                                     uint32_t timestamp,
                                     int64_t render_time_ms)
    : handle_(handle) {
  width_ = width;
  height_ = height;
  set_timestamp(timestamp);
  set_render_time_ms(render_time_ms);
}

TextureVideoFrame::~TextureVideoFrame() {}

int TextureVideoFrame::CreateEmptyFrame(int width,
                                        int height,
                                        int stride_y,
                                        int stride_u,
                                        int stride_v) {
  assert(false);  // Should not be called.
  return -1;
}

int TextureVideoFrame::CreateFrame(int size_y,
                                   const uint8_t* buffer_y,
                                   int size_u,
                                   const uint8_t* buffer_u,
                                   int size_v,
                                   const uint8_t* buffer_v,
                                   int width,
                                   int height,
                                   int stride_y,
                                   int stride_u,
                                   int stride_v) {
  assert(false);  // Should not be called.
  return -1;
}

int TextureVideoFrame::CreateFrame(int size_y,
                                   const uint8_t* buffer_y,
                                   int size_u,
                                   const uint8_t* buffer_u,
                                   int size_v,
                                   const uint8_t* buffer_v,
                                   int width,
                                   int height,
                                   int stride_y,
                                   int stride_u,
                                   int stride_v,
                                   webrtc::VideoRotation rotation) {
  assert(false);  // Should not be called.
  return -1;
}

int TextureVideoFrame::CopyFrame(const I420VideoFrame& videoFrame) {
  assert(false);  // Should not be called.
  return -1;
}

I420VideoFrame* TextureVideoFrame::CloneFrame() const {
  return new TextureVideoFrame(
      handle_, width(), height(), timestamp(), render_time_ms());
}

void TextureVideoFrame::SwapFrame(I420VideoFrame* videoFrame) {
  assert(false);  // Should not be called.
}

uint8_t* TextureVideoFrame::buffer(PlaneType type) {
  assert(false);  // Should not be called.
  return NULL;
}

const uint8_t* TextureVideoFrame::buffer(PlaneType type) const {
  assert(false);  // Should not be called.
  return NULL;
}

int TextureVideoFrame::allocated_size(PlaneType type) const {
  assert(false);  // Should not be called.
  return -1;
}

int TextureVideoFrame::stride(PlaneType type) const {
  assert(false);  // Should not be called.
  return -1;
}

bool TextureVideoFrame::IsZeroSize() const {
  assert(false);  // Should not be called.
  return true;
}

void* TextureVideoFrame::native_handle() const { return handle_.get(); }

int TextureVideoFrame::CheckDimensions(
    int width, int height, int stride_y, int stride_u, int stride_v) {
  return 0;
}

}  // namespace webrtc
