blob: d771e6ac42d7919b756a668ae0e84df14144d554 [file] [log] [blame]
magjed712338e2017-05-11 05:11:57 -07001/*
2 * Copyright (c) 2017 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/api/video/video_frame_buffer.h"
12
magjedeaf4a1e2017-05-30 01:21:59 -070013#include "libyuv/convert.h"
magjed712338e2017-05-11 05:11:57 -070014#include "webrtc/api/video/i420_buffer.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020015#include "webrtc/rtc_base/checks.h"
magjed712338e2017-05-11 05:11:57 -070016
17namespace webrtc {
18
magjedeaf4a1e2017-05-30 01:21:59 -070019rtc::scoped_refptr<I420BufferInterface> VideoFrameBuffer::GetI420() {
magjed712338e2017-05-11 05:11:57 -070020 RTC_CHECK(type() == Type::kI420);
Magnus Jedvert224e6592017-06-30 12:14:42 +000021 return static_cast<I420BufferInterface*>(this);
magjed712338e2017-05-11 05:11:57 -070022}
23
magjed3f075492017-06-01 10:02:26 -070024rtc::scoped_refptr<const I420BufferInterface> VideoFrameBuffer::GetI420()
25 const {
26 RTC_CHECK(type() == Type::kI420);
Magnus Jedvert224e6592017-06-30 12:14:42 +000027 return static_cast<const I420BufferInterface*>(this);
magjed3f075492017-06-01 10:02:26 -070028}
29
30I444BufferInterface* VideoFrameBuffer::GetI444() {
magjed712338e2017-05-11 05:11:57 -070031 RTC_CHECK(type() == Type::kI444);
magjedeaf4a1e2017-05-30 01:21:59 -070032 return static_cast<I444BufferInterface*>(this);
magjed712338e2017-05-11 05:11:57 -070033}
34
magjed3f075492017-06-01 10:02:26 -070035const I444BufferInterface* VideoFrameBuffer::GetI444() const {
36 RTC_CHECK(type() == Type::kI444);
37 return static_cast<const I444BufferInterface*>(this);
38}
39
magjedeaf4a1e2017-05-30 01:21:59 -070040VideoFrameBuffer::Type I420BufferInterface::type() const {
41 return Type::kI420;
magjed712338e2017-05-11 05:11:57 -070042}
43
magjedeaf4a1e2017-05-30 01:21:59 -070044int I420BufferInterface::ChromaWidth() const {
45 return (width() + 1) / 2;
magjed712338e2017-05-11 05:11:57 -070046}
47
magjedeaf4a1e2017-05-30 01:21:59 -070048int I420BufferInterface::ChromaHeight() const {
49 return (height() + 1) / 2;
50}
51
52rtc::scoped_refptr<I420BufferInterface> I420BufferInterface::ToI420() {
53 return this;
54}
55
56VideoFrameBuffer::Type I444BufferInterface::type() const {
57 return Type::kI444;
58}
59
60int I444BufferInterface::ChromaWidth() const {
61 return width();
62}
63
64int I444BufferInterface::ChromaHeight() const {
65 return height();
66}
67
68rtc::scoped_refptr<I420BufferInterface> I444BufferInterface::ToI420() {
69 rtc::scoped_refptr<I420Buffer> i420_buffer =
70 I420Buffer::Create(width(), height());
71 libyuv::I444ToI420(DataY(), StrideY(), DataU(), StrideU(), DataV(), StrideV(),
72 i420_buffer->MutableDataY(), i420_buffer->StrideY(),
73 i420_buffer->MutableDataU(), i420_buffer->StrideU(),
74 i420_buffer->MutableDataV(), i420_buffer->StrideV(),
75 width(), height());
76 return i420_buffer;
magjed712338e2017-05-11 05:11:57 -070077}
78
79} // namespace webrtc