Revert "Add scaling interface to VideoFrameBuffer"

This reverts commit c79f1d8cfb48c348692320b05fa31598ed7067ca.

Reason for revert: Breaks downstream project.

Original change's description:
> Add scaling interface to VideoFrameBuffer
>
> This can be overriden for kNative frame types to perform scaling efficiently.
>
> Default implementations for existing buffer types require actual
> buffer implementation, thus this CL also merges "video_frame"
> with "video_frame_I420" build targets.
>
> Bug: webrtc:11976, chromium:1132299
> Change-Id: I3bf5f6bf179db5e7ab165b1c2301980043a08765
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/186303
> Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
> Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
> Reviewed-by: Stefan Holmer <stefan@webrtc.org>
> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
> Reviewed-by: Niels Moller <nisse@webrtc.org>
> Reviewed-by: Evan Shrubsole <eshr@google.com>
> Cr-Commit-Position: refs/heads/master@{#32352}

TBR=mbonadei@webrtc.org,sakal@webrtc.org,ilnik@webrtc.org,nisse@webrtc.org,stefan@webrtc.org,eshr@google.com

Change-Id: I86ac697bf963ef7e2c4f2ed34c3a7bf04f4f1ce1
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: webrtc:11976
Bug: chromium:1132299
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/187344
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#32354}
This commit is contained in:
Ilya Nikolaevskiy
2020-10-08 14:16:13 +00:00
committed by Commit Bot
parent b556b08668
commit 441dbf9a56
26 changed files with 133 additions and 179 deletions

View File

@ -42,8 +42,6 @@ rtc_library("video_rtp_headers") {
rtc_library("video_frame") {
visibility = [ "*" ]
sources = [
"i420_buffer.cc",
"i420_buffer.h",
"video_codec_type.h",
"video_frame.cc",
"video_frame.h",
@ -61,9 +59,7 @@ rtc_library("video_frame") {
"..:scoped_refptr",
"../../rtc_base:checks",
"../../rtc_base:rtc_base_approved",
"../../rtc_base/memory:aligned_malloc",
"../../rtc_base/system:rtc_export",
"//third_party/libyuv",
]
absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
@ -74,47 +70,6 @@ if (is_android) {
}
}
# Deprecated empty target. Use "video_frame" instead.
rtc_source_set("video_frame_i420") {
visibility = [ "*" ]
sources = []
deps = [ ":video_frame" ]
}
rtc_library("video_frame_i010") {
visibility = [ "*" ]
sources = [
"i010_buffer.cc",
"i010_buffer.h",
]
deps = [
":video_frame",
":video_rtp_headers",
"..:scoped_refptr",
"../../rtc_base",
"../../rtc_base:checks",
"../../rtc_base/memory:aligned_malloc",
"//third_party/libyuv",
]
}
rtc_library("video_frame_nv12") {
visibility = [ "*" ]
sources = [
"nv12_buffer.cc",
"nv12_buffer.h",
]
deps = [
":video_frame",
"..:scoped_refptr",
"../../rtc_base",
"../../rtc_base:checks",
"../../rtc_base/memory:aligned_malloc",
"../../rtc_base/system:rtc_export",
"//third_party/libyuv",
]
}
rtc_source_set("recordable_encoded_frame") {
visibility = [ "*" ]
sources = [ "recordable_encoded_frame.h" ]
@ -135,6 +90,60 @@ rtc_source_set("video_frame_type") {
sources = [ "video_frame_type.h" ]
}
rtc_library("video_frame_i420") {
visibility = [ "*" ]
sources = [
"i420_buffer.cc",
"i420_buffer.h",
]
deps = [
":video_frame",
":video_rtp_headers",
"..:scoped_refptr",
"../../rtc_base",
"../../rtc_base:checks",
"../../rtc_base/memory:aligned_malloc",
"../../rtc_base/system:rtc_export",
"//third_party/libyuv",
]
}
rtc_library("video_frame_i010") {
visibility = [ "*" ]
sources = [
"i010_buffer.cc",
"i010_buffer.h",
]
deps = [
":video_frame",
":video_frame_i420",
":video_rtp_headers",
"..:scoped_refptr",
"../../rtc_base",
"../../rtc_base:checks",
"../../rtc_base/memory:aligned_malloc",
"//third_party/libyuv",
]
}
rtc_library("video_frame_nv12") {
visibility = [ "*" ]
sources = [
"nv12_buffer.cc",
"nv12_buffer.h",
]
deps = [
":video_frame",
":video_frame_i420",
"..:scoped_refptr",
"../../rtc_base",
"../../rtc_base:checks",
"../../rtc_base/memory:aligned_malloc",
"../../rtc_base/system:rtc_export",
"//third_party/libyuv",
]
}
rtc_library("encoded_image") {
visibility = [ "*" ]
sources = [

View File

@ -14,7 +14,6 @@
#include "rtc_base/checks.h"
#include "rtc_base/ref_counted_object.h"
#include "third_party/libyuv/include/libyuv/convert.h"
#include "third_party/libyuv/include/libyuv/scale.h"
namespace webrtc {
@ -123,35 +122,4 @@ void NV12Buffer::InitializeData() {
memset(data_.get(), 0, NV12DataSize(height_, stride_y_, stride_uv_));
}
void NV12Buffer::CropAndScaleFrom(const NV12BufferInterface& src,
int offset_x,
int offset_y,
int crop_width,
int crop_height) {
RTC_CHECK_LE(crop_width, src.width());
RTC_CHECK_LE(crop_height, src.height());
RTC_CHECK_LE(crop_width + offset_x, src.width());
RTC_CHECK_LE(crop_height + offset_y, src.height());
RTC_CHECK_GE(offset_x, 0);
RTC_CHECK_GE(offset_y, 0);
// Make sure offset is even so that u/v plane becomes aligned.
const int uv_offset_x = offset_x / 2;
const int uv_offset_y = offset_y / 2;
offset_x = uv_offset_x * 2;
offset_y = uv_offset_y * 2;
const uint8_t* y_plane = src.DataY() + src.StrideY() * offset_y + offset_x;
const uint8_t* uv_plane =
src.DataUV() + src.StrideUV() * uv_offset_y + uv_offset_x * 2;
// kFilterBox is unsupported in libyuv, so using kFilterBilinear instead.
int res = libyuv::NV12Scale(y_plane, src.StrideY(), uv_plane, src.StrideUV(),
crop_width, crop_height, MutableDataY(),
StrideY(), MutableDataUV(), StrideUV(), width(),
height(), libyuv::kFilterBilinear);
RTC_DCHECK_EQ(res, 0);
}
} // namespace webrtc

View File

@ -56,14 +56,6 @@ class RTC_EXPORT NV12Buffer : public NV12BufferInterface {
// are resolved in a better way. Or in the mean time, use SetBlack.
void InitializeData();
// Scale the cropped area of |src| to the size of |this| buffer, and
// write the result into |this|.
void CropAndScaleFrom(const NV12BufferInterface& src,
int offset_x,
int offset_y,
int crop_width,
int crop_height);
protected:
NV12Buffer(int width, int height);
NV12Buffer(int width, int height, int stride_y, int stride_uv);

View File

@ -20,6 +20,7 @@ rtc_library("rtc_api_video_unittests") {
"..:video_adaptation",
"..:video_bitrate_allocation",
"..:video_frame",
"..:video_frame_i420",
"..:video_frame_nv12",
"..:video_rtp_headers",
"../../../test:frame_utils",

View File

@ -10,25 +10,10 @@
#include "api/video/video_frame_buffer.h"
#include "api/video/i420_buffer.h"
#include "rtc_base/checks.h"
namespace webrtc {
rtc::scoped_refptr<VideoFrameBuffer> VideoFrameBuffer::CropAndScale(
int offset_x,
int offset_y,
int crop_width,
int crop_height,
int scaled_width,
int scaled_height) {
rtc::scoped_refptr<I420Buffer> result =
I420Buffer::Create(scaled_width, scaled_height);
result->CropAndScaleFrom(*this->ToI420(), offset_x, offset_y, crop_width,
crop_height);
return result;
}
const I420BufferInterface* VideoFrameBuffer::GetI420() const {
// Overridden by subclasses that can return an I420 buffer without any
// conversion, in particular, I420BufferInterface.
@ -139,4 +124,5 @@ int NV12BufferInterface::ChromaWidth() const {
int NV12BufferInterface::ChromaHeight() const {
return (height() + 1) / 2;
}
} // namespace webrtc

View File

@ -79,24 +79,6 @@ class RTC_EXPORT VideoFrameBuffer : public rtc::RefCountInterface {
// behave as the other GetXXX methods below.
virtual const I420BufferInterface* GetI420() const;
// A format specific scale function. Default implementation works by
// converting to I420. But more efficient implementations may override it,
// especially for kNative.
// First, the image is cropped to |crop_width| and |crop_height| and then
// scaled to |scaled_width| and |scaled_height|.
virtual rtc::scoped_refptr<VideoFrameBuffer> CropAndScale(int offset_x,
int offset_y,
int crop_width,
int crop_height,
int scaled_width,
int scaled_height);
// Alias for common use case.
rtc::scoped_refptr<VideoFrameBuffer> Scale(int scaled_width,
int scaled_height) {
return CropAndScale(0, 0, width(), height(), scaled_width, scaled_height);
}
// These functions should only be called if type() is of the correct type.
// Calling with a different type will result in a crash.
const I420ABufferInterface* GetI420A() const;

View File

@ -137,7 +137,7 @@ rtc_library("rtc_software_fallback_wrappers") {
deps = [
":video_codecs_api",
"..:fec_controller_api",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../media:rtc_h264_profile_id",
"../../media:rtc_media_base",
"../../modules/video_coding:video_codec_interface",

View File

@ -36,6 +36,7 @@ if (rtc_include_tests) {
"../../video:encoded_image",
"../../video:video_bitrate_allocation",
"../../video:video_frame",
"../../video:video_frame_i420",
"../../video:video_rtp_headers",
"//testing/gtest",
]

View File

@ -49,6 +49,7 @@ rtc_library("common_video") {
"../api/video:video_bitrate_allocation",
"../api/video:video_bitrate_allocator",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_frame_nv12",
"../api/video:video_rtp_headers",
"../api/video_codecs:bitstream_parser_api",
@ -104,7 +105,7 @@ if (rtc_include_tests) {
"../api/units:time_delta",
"../api/video:video_frame",
"../api/video:video_frame_i010",
"../api/video:video_frame_nv12",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../media:rtc_h264_profile_id",
"../rtc_base",

View File

@ -15,7 +15,6 @@
#include "api/video/i010_buffer.h"
#include "api/video/i420_buffer.h"
#include "api/video/nv12_buffer.h"
#include "rtc_base/bind.h"
#include "rtc_base/time_utils.h"
#include "test/fake_texture_frame.h"
@ -158,29 +157,6 @@ rtc::scoped_refptr<PlanarYuvBuffer> CreateGradient(VideoFrameBuffer::Type type,
return I010Buffer::Copy(*buffer);
}
rtc::scoped_refptr<NV12BufferInterface> CreateNV12Gradient(int width,
int height) {
rtc::scoped_refptr<NV12Buffer> buffer(NV12Buffer::Create(width, height));
// Initialize with gradient, Y = 128(x/w + y/h), U = 256 x/w, V = 256 y/h
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
buffer->MutableDataY()[x + y * width] =
128 * (x * height + y * width) / (width * height);
}
}
int chroma_width = buffer->ChromaWidth();
int chroma_height = buffer->ChromaHeight();
for (int x = 0; x < chroma_width; x++) {
for (int y = 0; y < chroma_height; y++) {
buffer->MutableDataUV()[x * 2 + y * buffer->StrideUV()] =
255 * x / (chroma_width - 1);
buffer->MutableDataUV()[x * 2 + 1 + y * buffer->StrideUV()] =
255 * y / (chroma_height - 1);
}
}
return buffer;
}
// The offsets and sizes describe the rectangle extracted from the
// original (gradient) frame, in relative coordinates where the
// original frame correspond to the unit square, 0.0 <= x, y < 1.0.
@ -519,35 +495,6 @@ INSTANTIATE_TEST_SUITE_P(All,
::testing::Values(VideoFrameBuffer::Type::kI420,
VideoFrameBuffer::Type::kI010));
TEST(TestNV12Buffer, CropAndScale) {
const int kSourceWidth = 640;
const int kSourceHeight = 480;
const int kScaledWidth = 320;
const int kScaledHeight = 240;
const int kCropLeft = 40;
const int kCropTop = 30;
const int kCropRight = 0;
const int kCropBottom = 30;
rtc::scoped_refptr<VideoFrameBuffer> buf =
CreateNV12Gradient(kSourceWidth, kSourceHeight);
rtc::scoped_refptr<VideoFrameBuffer> scaled_buffer = buf->CropAndScale(
kCropLeft, kCropTop, kSourceWidth - kCropLeft - kCropRight,
kSourceHeight - kCropTop - kCropBottom, kScaledWidth, kScaledHeight);
// Parameters to CheckCrop indicate what part of the source frame is in the
// scaled frame.
const float kOffsetX = (kCropLeft + 0.0) / kSourceWidth;
const float kOffsetY = (kCropTop + 0.0) / kSourceHeight;
const float kRelativeWidth =
(kSourceWidth - kCropLeft - kCropRight + 0.0) / kSourceWidth;
const float kRelativeHeight =
(kSourceHeight - kCropTop - kCropBottom + 0.0) / kSourceHeight;
CheckCrop(*scaled_buffer->ToI420(), kOffsetX, kOffsetY, kRelativeWidth,
kRelativeHeight);
}
class TestPlanarYuvBufferRotate
: public ::testing::TestWithParam<
std::tuple<webrtc::VideoRotation, VideoFrameBuffer::Type>> {};

View File

@ -667,7 +667,7 @@ if (is_linux || is_chromeos || is_win) {
"../api:scoped_refptr",
"../api/audio:audio_mixer_api",
"../api/audio_codecs:audio_codecs_api",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:video_codecs_api",
"../media:rtc_media_base",

View File

@ -99,6 +99,7 @@ rtc_library("rtc_media_base") {
"../api/video:video_bitrate_allocation",
"../api/video:video_bitrate_allocator_factory",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:video_codecs_api",
"../call:call_interfaces",
@ -184,6 +185,7 @@ rtc_library("rtc_simulcast_encoder_adapter") {
"../api:scoped_refptr",
"../api/video:video_codec_constants",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:rtc_software_fallback_wrappers",
"../api/video_codecs:video_codecs_api",
@ -297,6 +299,7 @@ rtc_library("rtc_audio_video") {
"../api/video:video_bitrate_allocator_factory",
"../api/video:video_codec_constants",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:rtc_software_fallback_wrappers",
"../api/video_codecs:video_codecs_api",
@ -463,6 +466,7 @@ if (rtc_include_tests) {
"../api/video:encoded_image",
"../api/video:video_bitrate_allocation",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:video_codecs_api",
"../call:call_interfaces",
@ -564,6 +568,7 @@ if (rtc_include_tests) {
"../api/video:builtin_video_bitrate_allocator_factory",
"../api/video:video_bitrate_allocation",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:builtin_video_decoder_factory",
"../api/video_codecs:builtin_video_encoder_factory",

View File

@ -30,6 +30,7 @@ rtc_library("video_capture_module") {
"..:module_api",
"../../api:scoped_refptr",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../common_video",
"../../media:rtc_media_base",
@ -131,6 +132,7 @@ if (!build_with_chromium) {
":video_capture_module",
"../../api:scoped_refptr",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../common_video",
"../../rtc_base:rtc_base_approved",

View File

@ -20,6 +20,7 @@ rtc_library("encoded_frame") {
":video_codec_interface",
"../../api/video:encoded_image",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../modules:module_api_public",
"../../modules/rtp_rtcp:rtp_video_header",
@ -185,6 +186,7 @@ rtc_library("video_coding") {
"../../api/video:video_adaptation",
"../../api/video:video_bitrate_allocator",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_frame_type",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:video_codecs_api",
@ -378,6 +380,7 @@ rtc_library("webrtc_h264") {
":video_coding_utility",
"../../api/video:video_frame",
"../../api/video:video_frame_i010",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:video_codecs_api",
"../../common_video",
@ -425,6 +428,7 @@ rtc_library("webrtc_multiplex") {
"../../api:scoped_refptr",
"../../api/video:encoded_image",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:video_codecs_api",
"../../common_video",
@ -459,6 +463,7 @@ rtc_library("webrtc_vp8") {
"../../api:scoped_refptr",
"../../api/video:encoded_image",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:video_codecs_api",
"../../api/video_codecs:vp8_temporal_layers_factory",
@ -655,6 +660,7 @@ if (rtc_include_tests) {
"../../api:simulcast_test_fixture_api",
"../../api/video:encoded_image",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:video_codecs_api",
"../../common_video",
@ -692,6 +698,7 @@ if (rtc_include_tests) {
"../../api/video:video_bitrate_allocator",
"../../api/video:video_bitrate_allocator_factory",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:video_codecs_api",
"../../common_video",
@ -843,6 +850,7 @@ if (rtc_include_tests) {
"../../api/test/video:function_video_factory",
"../../api/video:encoded_image",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:rtc_software_fallback_wrappers",
"../../api/video_codecs:video_codecs_api",
@ -974,6 +982,7 @@ if (rtc_include_tests) {
"../../api/video:video_bitrate_allocator",
"../../api/video:video_bitrate_allocator_factory",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_frame_type",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:video_codecs_api",

View File

@ -22,7 +22,7 @@ rtc_library("libaom_av1_decoder") {
"../..:video_codec_interface",
"../../../../api:scoped_refptr",
"../../../../api/video:encoded_image",
"../../../../api/video:video_frame",
"../../../../api/video:video_frame_i420",
"../../../../common_video",
"../../../../rtc_base:logging",
"//third_party/libaom",
@ -116,6 +116,7 @@ rtc_library("libaom_av1_encoder") {
"../../../../api:scoped_refptr",
"../../../../api/video:encoded_image",
"../../../../api/video:video_frame",
"../../../../api/video:video_frame_i420",
"../../../../common_video",
"../../../../rtc_base:checks",
"../../../../rtc_base:logging",
@ -160,7 +161,7 @@ if (rtc_include_tests) {
"../../../../api:mock_video_encoder",
"../../../../api/units:data_size",
"../../../../api/units:time_delta",
"../../../../api/video:video_frame",
"../../../../api/video:video_frame_i420",
"../../../../api/video_codecs:video_codecs_api",
"../../../../test:test_support",
]

View File

@ -29,6 +29,7 @@ rtc_library("video_processing") {
"..:module_api",
"../../api:scoped_refptr",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../common_audio",
"../../common_video",
@ -99,6 +100,7 @@ if (rtc_include_tests) {
":video_processing",
"../../api:scoped_refptr",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../common_video",
"../../test:fileutils",

View File

@ -56,6 +56,7 @@ rtc_library("video_file_reader") {
deps = [
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../rtc_base:checks",
"../rtc_base:rtc_base_approved",
@ -75,6 +76,7 @@ rtc_library("video_file_writer") {
":video_file_reader",
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../rtc_base:rtc_base_approved",
]
@ -103,6 +105,7 @@ rtc_library("video_quality_analysis") {
"../api:array_view",
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../common_video",
"../rtc_base:checks",
@ -484,6 +487,7 @@ if (rtc_include_tests) {
":video_quality_analysis",
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../common_video",
"../rtc_base",

View File

@ -383,6 +383,7 @@ if (is_ios || is_mac) {
"../api:libjingle_peerconnection_api",
"../api:media_stream_interface",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../common_video",
"../media:rtc_media_base",
@ -411,6 +412,7 @@ if (is_ios || is_mac) {
deps = [
":base_objc",
"//api/video:video_frame",
"//api/video:video_frame_i420",
"//api/video:video_rtp_headers",
"//common_video",
"//rtc_base:checks",
@ -1128,7 +1130,7 @@ if (is_ios || is_mac) {
":videotoolbox_objc",
"../api:scoped_refptr",
"../api/task_queue:default_task_queue_factory",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../common_video",
"../media:rtc_media_base",
"../media:rtc_media_tests_utils",
@ -1654,6 +1656,7 @@ if (is_ios || is_mac) {
":vpx_codec_constants",
":wrapped_native_codec_objc",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:video_codecs_api",
"../common_video",

View File

@ -54,6 +54,7 @@ public class VideoFrame implements RefCounted {
* Crops a region defined by |cropx|, |cropY|, |cropWidth| and |cropHeight|. Scales it to size
* |scaleWidth| x |scaleHeight|.
*/
@CalledByNative("Buffer")
Buffer cropAndScale(
int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight);
}

View File

@ -152,6 +152,19 @@ const ScopedJavaGlobalRef<jobject>& AndroidVideoBuffer::video_frame_buffer()
return j_video_frame_buffer_;
}
rtc::scoped_refptr<AndroidVideoBuffer> AndroidVideoBuffer::CropAndScale(
JNIEnv* jni,
int crop_x,
int crop_y,
int crop_width,
int crop_height,
int scale_width,
int scale_height) {
return Adopt(jni, Java_Buffer_cropAndScale(jni, j_video_frame_buffer_, crop_x,
crop_y, crop_width, crop_height,
scale_width, scale_height));
}
VideoFrameBuffer::Type AndroidVideoBuffer::type() const {
return Type::kNative;
}

View File

@ -40,6 +40,16 @@ class AndroidVideoBuffer : public VideoFrameBuffer {
const ScopedJavaGlobalRef<jobject>& video_frame_buffer() const;
// Crops a region defined by |crop_x|, |crop_y|, |crop_width| and
// |crop_height|. Scales it to size |scale_width| x |scale_height|.
rtc::scoped_refptr<AndroidVideoBuffer> CropAndScale(JNIEnv* jni,
int crop_x,
int crop_y,
int crop_width,
int crop_height,
int scale_width,
int scale_height);
protected:
// Should not be called directly. Adopts the Java VideoFrame.Buffer. Use
// Create() or Adopt() instead for clarity.

View File

@ -52,6 +52,7 @@ rtc_library("frame_generator_impl") {
"../api/video:encoded_image",
"../api/video:video_frame",
"../api/video:video_frame_i010",
"../api/video:video_frame_i420",
"../api/video:video_frame_nv12",
"../api/video:video_rtp_headers",
"../api/video_codecs:video_codecs_api",
@ -85,6 +86,7 @@ rtc_library("frame_utils") {
deps = [
"../api:scoped_refptr",
"../api/video:video_frame",
"../api/video:video_frame_i420",
]
}
@ -111,6 +113,8 @@ rtc_library("video_test_common") {
"../api:scoped_refptr",
"../api/task_queue",
"../api/video:video_frame",
"../api/video:video_frame_i010",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:video_codecs_api",
"../common_video",
@ -357,6 +361,7 @@ rtc_library("video_test_support") {
"../api:scoped_refptr",
"../api/video:encoded_image",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video_codecs:video_codecs_api",
"../common_video",
"../media:rtc_media_base",
@ -512,6 +517,7 @@ if (rtc_include_tests) {
"../api/test/video:function_video_factory",
"../api/video:encoded_image",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video_codecs:video_codecs_api",
"../call:video_stream_api",
"../common_video",
@ -757,6 +763,7 @@ rtc_library("fake_video_codecs") {
"../api/video:encoded_image",
"../api/video:video_bitrate_allocation",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video_codecs:video_codecs_api",
"../api/video_codecs:vp8_temporal_layers_factory",

View File

@ -124,7 +124,10 @@ if (!build_with_chromium) {
"analyzer/video/simulcast_dummy_buffer_helper.cc",
"analyzer/video/simulcast_dummy_buffer_helper.h",
]
deps = [ "../../../api/video:video_frame" ]
deps = [
"../../../api/video:video_frame",
"../../../api/video:video_frame_i420",
]
}
rtc_library("quality_analyzing_video_decoder") {
@ -141,6 +144,7 @@ if (!build_with_chromium) {
"../../../api:video_quality_analyzer_api",
"../../../api/video:encoded_image",
"../../../api/video:video_frame",
"../../../api/video:video_frame_i420",
"../../../api/video:video_rtp_headers",
"../../../api/video_codecs:video_codecs_api",
"../../../modules/video_coding:video_codec_interface",
@ -518,6 +522,7 @@ if (!build_with_chromium) {
"../../../api:rtp_packet_info",
"../../../api/video:encoded_image",
"../../../api/video:video_frame",
"../../../api/video:video_frame_i420",
"../../../common_video",
"../../../modules/rtp_rtcp:rtp_rtcp_format",
"../../../rtc_base:stringutils",
@ -640,6 +645,7 @@ if (!build_with_chromium) {
"../../../api/units:timestamp",
"../../../api/video:encoded_image",
"../../../api/video:video_frame",
"../../../api/video:video_frame_i420",
"../../../api/video:video_rtp_headers",
"../../../common_video",
"../../../rtc_base:criticalsection",

View File

@ -97,6 +97,7 @@ if (rtc_include_tests) {
"../../api/units:timestamp",
"../../api/video:builtin_video_bitrate_allocator_factory",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video:video_rtp_headers",
"../../api/video_codecs:video_codecs_api",
"../../audio",

View File

@ -86,6 +86,7 @@ rtc_library("video") {
"../api/video:video_bitrate_allocator",
"../api/video:video_codec_constants",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video:video_stream_encoder",
"../api/video:video_stream_encoder_create",
@ -226,6 +227,7 @@ rtc_library("video_stream_encoder_impl") {
"../api/video:video_bitrate_allocator_factory",
"../api/video:video_codec_constants",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_rtp_headers",
"../api/video:video_stream_encoder",
"../api/video_codecs:video_codecs_api",
@ -595,6 +597,7 @@ if (rtc_include_tests) {
"../api/video:video_adaptation",
"../api/video:video_bitrate_allocation",
"../api/video:video_frame",
"../api/video:video_frame_i420",
"../api/video:video_frame_nv12",
"../api/video:video_frame_type",
"../api/video:video_rtp_headers",

View File

@ -80,7 +80,7 @@ if (rtc_include_tests) {
"../../api/task_queue:task_queue",
"../../api/video:encoded_image",
"../../api/video:video_adaptation",
"../../api/video:video_frame",
"../../api/video:video_frame_i420",
"../../api/video_codecs:video_codecs_api",
"../../call/adaptation:resource_adaptation",
"../../call/adaptation:resource_adaptation_test_utilities",