1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef TEST_MAPPABLE_NATIVE_BUFFER_H_ 12*d9f75844SAndroid Build Coastguard Worker #define TEST_MAPPABLE_NATIVE_BUFFER_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <utility> 15*d9f75844SAndroid Build Coastguard Worker #include <vector> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h" 18*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame.h" 19*d9f75844SAndroid Build Coastguard Worker #include "common_video/include/video_frame_buffer.h" 20*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_counted_object.h" 21*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/synchronization/mutex.h" 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 24*d9f75844SAndroid Build Coastguard Worker namespace test { 25*d9f75844SAndroid Build Coastguard Worker 26*d9f75844SAndroid Build Coastguard Worker class MappableNativeBuffer; 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Worker VideoFrame CreateMappableNativeFrame(int64_t ntp_time_ms, 29*d9f75844SAndroid Build Coastguard Worker VideoFrameBuffer::Type mappable_type, 30*d9f75844SAndroid Build Coastguard Worker int width, 31*d9f75844SAndroid Build Coastguard Worker int height); 32*d9f75844SAndroid Build Coastguard Worker 33*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<MappableNativeBuffer> GetMappableNativeBufferFromVideoFrame( 34*d9f75844SAndroid Build Coastguard Worker const VideoFrame& frame); 35*d9f75844SAndroid Build Coastguard Worker 36*d9f75844SAndroid Build Coastguard Worker // A for-testing native buffer that is scalable and mappable. The contents of 37*d9f75844SAndroid Build Coastguard Worker // the buffer is black and the pixels are created upon mapping. Mapped buffers 38*d9f75844SAndroid Build Coastguard Worker // are stored inside MappableNativeBuffer, allowing tests to verify which 39*d9f75844SAndroid Build Coastguard Worker // resolutions were mapped, e.g. when passing them in to an encoder or other 40*d9f75844SAndroid Build Coastguard Worker // modules. 41*d9f75844SAndroid Build Coastguard Worker class MappableNativeBuffer : public VideoFrameBuffer { 42*d9f75844SAndroid Build Coastguard Worker public: 43*d9f75844SAndroid Build Coastguard Worker // If `allow_i420_conversion` is false, calling ToI420() on a non-I420 buffer 44*d9f75844SAndroid Build Coastguard Worker // will DCHECK-crash. Used to ensure zero-copy in tests. 45*d9f75844SAndroid Build Coastguard Worker MappableNativeBuffer(VideoFrameBuffer::Type mappable_type, 46*d9f75844SAndroid Build Coastguard Worker int width, 47*d9f75844SAndroid Build Coastguard Worker int height); 48*d9f75844SAndroid Build Coastguard Worker ~MappableNativeBuffer() override; 49*d9f75844SAndroid Build Coastguard Worker mappable_type()50*d9f75844SAndroid Build Coastguard Worker VideoFrameBuffer::Type mappable_type() const { return mappable_type_; } 51*d9f75844SAndroid Build Coastguard Worker type()52*d9f75844SAndroid Build Coastguard Worker VideoFrameBuffer::Type type() const override { return Type::kNative; } width()53*d9f75844SAndroid Build Coastguard Worker int width() const override { return width_; } height()54*d9f75844SAndroid Build Coastguard Worker int height() const override { return height_; } 55*d9f75844SAndroid Build Coastguard Worker 56*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> CropAndScale(int offset_x, 57*d9f75844SAndroid Build Coastguard Worker int offset_y, 58*d9f75844SAndroid Build Coastguard Worker int crop_width, 59*d9f75844SAndroid Build Coastguard Worker int crop_height, 60*d9f75844SAndroid Build Coastguard Worker int scaled_width, 61*d9f75844SAndroid Build Coastguard Worker int scaled_height) override; 62*d9f75844SAndroid Build Coastguard Worker 63*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420BufferInterface> ToI420() override; 64*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> GetMappedFrameBuffer( 65*d9f75844SAndroid Build Coastguard Worker rtc::ArrayView<VideoFrameBuffer::Type> types) override; 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker // Gets all the buffers that have been mapped so far, including mappings of 68*d9f75844SAndroid Build Coastguard Worker // cropped and scaled buffers. 69*d9f75844SAndroid Build Coastguard Worker std::vector<rtc::scoped_refptr<VideoFrameBuffer>> GetMappedFramedBuffers() 70*d9f75844SAndroid Build Coastguard Worker const; 71*d9f75844SAndroid Build Coastguard Worker bool DidConvertToI420() const; 72*d9f75844SAndroid Build Coastguard Worker 73*d9f75844SAndroid Build Coastguard Worker private: 74*d9f75844SAndroid Build Coastguard Worker friend class rtc::RefCountedObject<MappableNativeBuffer>; 75*d9f75844SAndroid Build Coastguard Worker 76*d9f75844SAndroid Build Coastguard Worker class ScaledBuffer : public VideoFrameBuffer { 77*d9f75844SAndroid Build Coastguard Worker public: 78*d9f75844SAndroid Build Coastguard Worker ScaledBuffer(rtc::scoped_refptr<MappableNativeBuffer> parent, 79*d9f75844SAndroid Build Coastguard Worker int width, 80*d9f75844SAndroid Build Coastguard Worker int height); 81*d9f75844SAndroid Build Coastguard Worker ~ScaledBuffer() override; 82*d9f75844SAndroid Build Coastguard Worker type()83*d9f75844SAndroid Build Coastguard Worker VideoFrameBuffer::Type type() const override { return Type::kNative; } width()84*d9f75844SAndroid Build Coastguard Worker int width() const override { return width_; } height()85*d9f75844SAndroid Build Coastguard Worker int height() const override { return height_; } 86*d9f75844SAndroid Build Coastguard Worker 87*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> CropAndScale( 88*d9f75844SAndroid Build Coastguard Worker int offset_x, 89*d9f75844SAndroid Build Coastguard Worker int offset_y, 90*d9f75844SAndroid Build Coastguard Worker int crop_width, 91*d9f75844SAndroid Build Coastguard Worker int crop_height, 92*d9f75844SAndroid Build Coastguard Worker int scaled_width, 93*d9f75844SAndroid Build Coastguard Worker int scaled_height) override; 94*d9f75844SAndroid Build Coastguard Worker 95*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420BufferInterface> ToI420() override; 96*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> GetMappedFrameBuffer( 97*d9f75844SAndroid Build Coastguard Worker rtc::ArrayView<VideoFrameBuffer::Type> types) override; 98*d9f75844SAndroid Build Coastguard Worker 99*d9f75844SAndroid Build Coastguard Worker private: 100*d9f75844SAndroid Build Coastguard Worker friend class rtc::RefCountedObject<ScaledBuffer>; 101*d9f75844SAndroid Build Coastguard Worker 102*d9f75844SAndroid Build Coastguard Worker const rtc::scoped_refptr<MappableNativeBuffer> parent_; 103*d9f75844SAndroid Build Coastguard Worker const int width_; 104*d9f75844SAndroid Build Coastguard Worker const int height_; 105*d9f75844SAndroid Build Coastguard Worker }; 106*d9f75844SAndroid Build Coastguard Worker 107*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<ScaledBuffer> FullSizeBuffer(); 108*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> GetOrCreateMappedBuffer(int width, 109*d9f75844SAndroid Build Coastguard Worker int height); 110*d9f75844SAndroid Build Coastguard Worker 111*d9f75844SAndroid Build Coastguard Worker const VideoFrameBuffer::Type mappable_type_; 112*d9f75844SAndroid Build Coastguard Worker const int width_; 113*d9f75844SAndroid Build Coastguard Worker const int height_; 114*d9f75844SAndroid Build Coastguard Worker mutable Mutex lock_; 115*d9f75844SAndroid Build Coastguard Worker std::vector<rtc::scoped_refptr<VideoFrameBuffer>> mapped_buffers_ 116*d9f75844SAndroid Build Coastguard Worker RTC_GUARDED_BY(&lock_); 117*d9f75844SAndroid Build Coastguard Worker }; 118*d9f75844SAndroid Build Coastguard Worker 119*d9f75844SAndroid Build Coastguard Worker } // namespace test 120*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 121*d9f75844SAndroid Build Coastguard Worker 122*d9f75844SAndroid Build Coastguard Worker #endif // TEST_MAPPABLE_NATIVE_BUFFER_H_ 123