1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2015 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 API_VIDEO_VIDEO_FRAME_BUFFER_H_ 12*d9f75844SAndroid Build Coastguard Worker #define API_VIDEO_VIDEO_FRAME_BUFFER_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h" 17*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h" 18*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h" 19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/rtc_export.h" 20*d9f75844SAndroid Build Coastguard Worker 21*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 22*d9f75844SAndroid Build Coastguard Worker 23*d9f75844SAndroid Build Coastguard Worker class I420BufferInterface; 24*d9f75844SAndroid Build Coastguard Worker class I420ABufferInterface; 25*d9f75844SAndroid Build Coastguard Worker class I422BufferInterface; 26*d9f75844SAndroid Build Coastguard Worker class I444BufferInterface; 27*d9f75844SAndroid Build Coastguard Worker class I010BufferInterface; 28*d9f75844SAndroid Build Coastguard Worker class I210BufferInterface; 29*d9f75844SAndroid Build Coastguard Worker class NV12BufferInterface; 30*d9f75844SAndroid Build Coastguard Worker 31*d9f75844SAndroid Build Coastguard Worker // Base class for frame buffers of different types of pixel format and storage. 32*d9f75844SAndroid Build Coastguard Worker // The tag in type() indicates how the data is represented, and each type is 33*d9f75844SAndroid Build Coastguard Worker // implemented as a subclass. To access the pixel data, call the appropriate 34*d9f75844SAndroid Build Coastguard Worker // GetXXX() function, where XXX represents the type. There is also a function 35*d9f75844SAndroid Build Coastguard Worker // ToI420() that returns a frame buffer in I420 format, converting from the 36*d9f75844SAndroid Build Coastguard Worker // underlying representation if necessary. I420 is the most widely accepted 37*d9f75844SAndroid Build Coastguard Worker // format and serves as a fallback for video sinks that can only handle I420, 38*d9f75844SAndroid Build Coastguard Worker // e.g. the internal WebRTC software encoders. A special enum value 'kNative' is 39*d9f75844SAndroid Build Coastguard Worker // provided for external clients to implement their own frame buffer 40*d9f75844SAndroid Build Coastguard Worker // representations, e.g. as textures. The external client can produce such 41*d9f75844SAndroid Build Coastguard Worker // native frame buffers from custom video sources, and then cast it back to the 42*d9f75844SAndroid Build Coastguard Worker // correct subclass in custom video sinks. The purpose of this is to improve 43*d9f75844SAndroid Build Coastguard Worker // performance by providing an optimized path without intermediate conversions. 44*d9f75844SAndroid Build Coastguard Worker // Frame metadata such as rotation and timestamp are stored in 45*d9f75844SAndroid Build Coastguard Worker // webrtc::VideoFrame, and not here. 46*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT VideoFrameBuffer : public rtc::RefCountInterface { 47*d9f75844SAndroid Build Coastguard Worker public: 48*d9f75844SAndroid Build Coastguard Worker // New frame buffer types will be added conservatively when there is an 49*d9f75844SAndroid Build Coastguard Worker // opportunity to optimize the path between some pair of video source and 50*d9f75844SAndroid Build Coastguard Worker // video sink. 51*d9f75844SAndroid Build Coastguard Worker // GENERATED_JAVA_ENUM_PACKAGE: org.webrtc 52*d9f75844SAndroid Build Coastguard Worker // GENERATED_JAVA_CLASS_NAME_OVERRIDE: VideoFrameBufferType 53*d9f75844SAndroid Build Coastguard Worker enum class Type { 54*d9f75844SAndroid Build Coastguard Worker kNative, 55*d9f75844SAndroid Build Coastguard Worker kI420, 56*d9f75844SAndroid Build Coastguard Worker kI420A, 57*d9f75844SAndroid Build Coastguard Worker kI422, 58*d9f75844SAndroid Build Coastguard Worker kI444, 59*d9f75844SAndroid Build Coastguard Worker kI010, 60*d9f75844SAndroid Build Coastguard Worker kI210, 61*d9f75844SAndroid Build Coastguard Worker kNV12, 62*d9f75844SAndroid Build Coastguard Worker }; 63*d9f75844SAndroid Build Coastguard Worker 64*d9f75844SAndroid Build Coastguard Worker // This function specifies in what pixel format the data is stored in. 65*d9f75844SAndroid Build Coastguard Worker virtual Type type() const = 0; 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker // The resolution of the frame in pixels. For formats where some planes are 68*d9f75844SAndroid Build Coastguard Worker // subsampled, this is the highest-resolution plane. 69*d9f75844SAndroid Build Coastguard Worker virtual int width() const = 0; 70*d9f75844SAndroid Build Coastguard Worker virtual int height() const = 0; 71*d9f75844SAndroid Build Coastguard Worker 72*d9f75844SAndroid Build Coastguard Worker // Returns a memory-backed frame buffer in I420 format. If the pixel data is 73*d9f75844SAndroid Build Coastguard Worker // in another format, a conversion will take place. All implementations must 74*d9f75844SAndroid Build Coastguard Worker // provide a fallback to I420 for compatibility with e.g. the internal WebRTC 75*d9f75844SAndroid Build Coastguard Worker // software encoders. 76*d9f75844SAndroid Build Coastguard Worker // Conversion may fail, for example if reading the pixel data from a texture 77*d9f75844SAndroid Build Coastguard Worker // fails. If the conversion fails, nullptr is returned. 78*d9f75844SAndroid Build Coastguard Worker virtual rtc::scoped_refptr<I420BufferInterface> ToI420() = 0; 79*d9f75844SAndroid Build Coastguard Worker 80*d9f75844SAndroid Build Coastguard Worker // GetI420() methods should return I420 buffer if conversion is trivial, i.e 81*d9f75844SAndroid Build Coastguard Worker // no change for binary data is needed. Otherwise these methods should return 82*d9f75844SAndroid Build Coastguard Worker // nullptr. One example of buffer with that property is 83*d9f75844SAndroid Build Coastguard Worker // WebrtcVideoFrameAdapter in Chrome - it's I420 buffer backed by a shared 84*d9f75844SAndroid Build Coastguard Worker // memory buffer. Therefore it must have type kNative. Yet, ToI420() 85*d9f75844SAndroid Build Coastguard Worker // doesn't affect binary data at all. Another example is any I420A buffer. 86*d9f75844SAndroid Build Coastguard Worker // TODO(https://crbug.com/webrtc/12021): Make this method non-virtual and 87*d9f75844SAndroid Build Coastguard Worker // behave as the other GetXXX methods below. 88*d9f75844SAndroid Build Coastguard Worker virtual const I420BufferInterface* GetI420() const; 89*d9f75844SAndroid Build Coastguard Worker 90*d9f75844SAndroid Build Coastguard Worker // A format specific scale function. Default implementation works by 91*d9f75844SAndroid Build Coastguard Worker // converting to I420. But more efficient implementations may override it, 92*d9f75844SAndroid Build Coastguard Worker // especially for kNative. 93*d9f75844SAndroid Build Coastguard Worker // First, the image is cropped to `crop_width` and `crop_height` and then 94*d9f75844SAndroid Build Coastguard Worker // scaled to `scaled_width` and `scaled_height`. 95*d9f75844SAndroid Build Coastguard Worker virtual rtc::scoped_refptr<VideoFrameBuffer> CropAndScale(int offset_x, 96*d9f75844SAndroid Build Coastguard Worker int offset_y, 97*d9f75844SAndroid Build Coastguard Worker int crop_width, 98*d9f75844SAndroid Build Coastguard Worker int crop_height, 99*d9f75844SAndroid Build Coastguard Worker int scaled_width, 100*d9f75844SAndroid Build Coastguard Worker int scaled_height); 101*d9f75844SAndroid Build Coastguard Worker 102*d9f75844SAndroid Build Coastguard Worker // Alias for common use case. Scale(int scaled_width,int scaled_height)103*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> Scale(int scaled_width, 104*d9f75844SAndroid Build Coastguard Worker int scaled_height) { 105*d9f75844SAndroid Build Coastguard Worker return CropAndScale(0, 0, width(), height(), scaled_width, scaled_height); 106*d9f75844SAndroid Build Coastguard Worker } 107*d9f75844SAndroid Build Coastguard Worker 108*d9f75844SAndroid Build Coastguard Worker // These functions should only be called if type() is of the correct type. 109*d9f75844SAndroid Build Coastguard Worker // Calling with a different type will result in a crash. 110*d9f75844SAndroid Build Coastguard Worker const I420ABufferInterface* GetI420A() const; 111*d9f75844SAndroid Build Coastguard Worker const I422BufferInterface* GetI422() const; 112*d9f75844SAndroid Build Coastguard Worker const I444BufferInterface* GetI444() const; 113*d9f75844SAndroid Build Coastguard Worker const I010BufferInterface* GetI010() const; 114*d9f75844SAndroid Build Coastguard Worker const I210BufferInterface* GetI210() const; 115*d9f75844SAndroid Build Coastguard Worker const NV12BufferInterface* GetNV12() const; 116*d9f75844SAndroid Build Coastguard Worker 117*d9f75844SAndroid Build Coastguard Worker // From a kNative frame, returns a VideoFrameBuffer with a pixel format in 118*d9f75844SAndroid Build Coastguard Worker // the list of types that is in the main memory with a pixel perfect 119*d9f75844SAndroid Build Coastguard Worker // conversion for encoding with a software encoder. Returns nullptr if the 120*d9f75844SAndroid Build Coastguard Worker // frame type is not supported, mapping is not possible, or if the kNative 121*d9f75844SAndroid Build Coastguard Worker // frame has not implemented this method. Only callable if type() is kNative. 122*d9f75844SAndroid Build Coastguard Worker virtual rtc::scoped_refptr<VideoFrameBuffer> GetMappedFrameBuffer( 123*d9f75844SAndroid Build Coastguard Worker rtc::ArrayView<Type> types); 124*d9f75844SAndroid Build Coastguard Worker 125*d9f75844SAndroid Build Coastguard Worker protected: ~VideoFrameBuffer()126*d9f75844SAndroid Build Coastguard Worker ~VideoFrameBuffer() override {} 127*d9f75844SAndroid Build Coastguard Worker }; 128*d9f75844SAndroid Build Coastguard Worker 129*d9f75844SAndroid Build Coastguard Worker // Update when VideoFrameBuffer::Type is updated. 130*d9f75844SAndroid Build Coastguard Worker const char* VideoFrameBufferTypeToString(VideoFrameBuffer::Type type); 131*d9f75844SAndroid Build Coastguard Worker 132*d9f75844SAndroid Build Coastguard Worker // This interface represents planar formats. 133*d9f75844SAndroid Build Coastguard Worker class PlanarYuvBuffer : public VideoFrameBuffer { 134*d9f75844SAndroid Build Coastguard Worker public: 135*d9f75844SAndroid Build Coastguard Worker virtual int ChromaWidth() const = 0; 136*d9f75844SAndroid Build Coastguard Worker virtual int ChromaHeight() const = 0; 137*d9f75844SAndroid Build Coastguard Worker 138*d9f75844SAndroid Build Coastguard Worker // Returns the number of steps(in terms of Data*() return type) between 139*d9f75844SAndroid Build Coastguard Worker // successive rows for a given plane. 140*d9f75844SAndroid Build Coastguard Worker virtual int StrideY() const = 0; 141*d9f75844SAndroid Build Coastguard Worker virtual int StrideU() const = 0; 142*d9f75844SAndroid Build Coastguard Worker virtual int StrideV() const = 0; 143*d9f75844SAndroid Build Coastguard Worker 144*d9f75844SAndroid Build Coastguard Worker protected: ~PlanarYuvBuffer()145*d9f75844SAndroid Build Coastguard Worker ~PlanarYuvBuffer() override {} 146*d9f75844SAndroid Build Coastguard Worker }; 147*d9f75844SAndroid Build Coastguard Worker 148*d9f75844SAndroid Build Coastguard Worker // This interface represents 8-bit color depth formats: Type::kI420, 149*d9f75844SAndroid Build Coastguard Worker // Type::kI420A, Type::kI422 and Type::kI444. 150*d9f75844SAndroid Build Coastguard Worker class PlanarYuv8Buffer : public PlanarYuvBuffer { 151*d9f75844SAndroid Build Coastguard Worker public: 152*d9f75844SAndroid Build Coastguard Worker // Returns pointer to the pixel data for a given plane. The memory is owned by 153*d9f75844SAndroid Build Coastguard Worker // the VideoFrameBuffer object and must not be freed by the caller. 154*d9f75844SAndroid Build Coastguard Worker virtual const uint8_t* DataY() const = 0; 155*d9f75844SAndroid Build Coastguard Worker virtual const uint8_t* DataU() const = 0; 156*d9f75844SAndroid Build Coastguard Worker virtual const uint8_t* DataV() const = 0; 157*d9f75844SAndroid Build Coastguard Worker 158*d9f75844SAndroid Build Coastguard Worker protected: ~PlanarYuv8Buffer()159*d9f75844SAndroid Build Coastguard Worker ~PlanarYuv8Buffer() override {} 160*d9f75844SAndroid Build Coastguard Worker }; 161*d9f75844SAndroid Build Coastguard Worker 162*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT I420BufferInterface : public PlanarYuv8Buffer { 163*d9f75844SAndroid Build Coastguard Worker public: 164*d9f75844SAndroid Build Coastguard Worker Type type() const override; 165*d9f75844SAndroid Build Coastguard Worker 166*d9f75844SAndroid Build Coastguard Worker int ChromaWidth() const final; 167*d9f75844SAndroid Build Coastguard Worker int ChromaHeight() const final; 168*d9f75844SAndroid Build Coastguard Worker 169*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<I420BufferInterface> ToI420() final; 170*d9f75844SAndroid Build Coastguard Worker const I420BufferInterface* GetI420() const final; 171*d9f75844SAndroid Build Coastguard Worker 172*d9f75844SAndroid Build Coastguard Worker protected: ~I420BufferInterface()173*d9f75844SAndroid Build Coastguard Worker ~I420BufferInterface() override {} 174*d9f75844SAndroid Build Coastguard Worker }; 175*d9f75844SAndroid Build Coastguard Worker 176*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT I420ABufferInterface : public I420BufferInterface { 177*d9f75844SAndroid Build Coastguard Worker public: 178*d9f75844SAndroid Build Coastguard Worker Type type() const final; 179*d9f75844SAndroid Build Coastguard Worker virtual const uint8_t* DataA() const = 0; 180*d9f75844SAndroid Build Coastguard Worker virtual int StrideA() const = 0; 181*d9f75844SAndroid Build Coastguard Worker 182*d9f75844SAndroid Build Coastguard Worker protected: ~I420ABufferInterface()183*d9f75844SAndroid Build Coastguard Worker ~I420ABufferInterface() override {} 184*d9f75844SAndroid Build Coastguard Worker }; 185*d9f75844SAndroid Build Coastguard Worker 186*d9f75844SAndroid Build Coastguard Worker // Represents Type::kI422, 4:2:2 planar with 8 bits per pixel. 187*d9f75844SAndroid Build Coastguard Worker class I422BufferInterface : public PlanarYuv8Buffer { 188*d9f75844SAndroid Build Coastguard Worker public: 189*d9f75844SAndroid Build Coastguard Worker Type type() const final; 190*d9f75844SAndroid Build Coastguard Worker 191*d9f75844SAndroid Build Coastguard Worker int ChromaWidth() const final; 192*d9f75844SAndroid Build Coastguard Worker int ChromaHeight() const final; 193*d9f75844SAndroid Build Coastguard Worker 194*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> CropAndScale(int offset_x, 195*d9f75844SAndroid Build Coastguard Worker int offset_y, 196*d9f75844SAndroid Build Coastguard Worker int crop_width, 197*d9f75844SAndroid Build Coastguard Worker int crop_height, 198*d9f75844SAndroid Build Coastguard Worker int scaled_width, 199*d9f75844SAndroid Build Coastguard Worker int scaled_height) override; 200*d9f75844SAndroid Build Coastguard Worker 201*d9f75844SAndroid Build Coastguard Worker protected: ~I422BufferInterface()202*d9f75844SAndroid Build Coastguard Worker ~I422BufferInterface() override {} 203*d9f75844SAndroid Build Coastguard Worker }; 204*d9f75844SAndroid Build Coastguard Worker 205*d9f75844SAndroid Build Coastguard Worker // Represents Type::kI444, 4:4:4 planar with 8 bits per pixel. 206*d9f75844SAndroid Build Coastguard Worker class I444BufferInterface : public PlanarYuv8Buffer { 207*d9f75844SAndroid Build Coastguard Worker public: 208*d9f75844SAndroid Build Coastguard Worker Type type() const final; 209*d9f75844SAndroid Build Coastguard Worker 210*d9f75844SAndroid Build Coastguard Worker int ChromaWidth() const final; 211*d9f75844SAndroid Build Coastguard Worker int ChromaHeight() const final; 212*d9f75844SAndroid Build Coastguard Worker 213*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> CropAndScale(int offset_x, 214*d9f75844SAndroid Build Coastguard Worker int offset_y, 215*d9f75844SAndroid Build Coastguard Worker int crop_width, 216*d9f75844SAndroid Build Coastguard Worker int crop_height, 217*d9f75844SAndroid Build Coastguard Worker int scaled_width, 218*d9f75844SAndroid Build Coastguard Worker int scaled_height) override; 219*d9f75844SAndroid Build Coastguard Worker 220*d9f75844SAndroid Build Coastguard Worker protected: ~I444BufferInterface()221*d9f75844SAndroid Build Coastguard Worker ~I444BufferInterface() override {} 222*d9f75844SAndroid Build Coastguard Worker }; 223*d9f75844SAndroid Build Coastguard Worker 224*d9f75844SAndroid Build Coastguard Worker // This interface represents 8-bit to 16-bit color depth formats: Type::kI010 or 225*d9f75844SAndroid Build Coastguard Worker // Type::kI210 . 226*d9f75844SAndroid Build Coastguard Worker class PlanarYuv16BBuffer : public PlanarYuvBuffer { 227*d9f75844SAndroid Build Coastguard Worker public: 228*d9f75844SAndroid Build Coastguard Worker // Returns pointer to the pixel data for a given plane. The memory is owned by 229*d9f75844SAndroid Build Coastguard Worker // the VideoFrameBuffer object and must not be freed by the caller. 230*d9f75844SAndroid Build Coastguard Worker virtual const uint16_t* DataY() const = 0; 231*d9f75844SAndroid Build Coastguard Worker virtual const uint16_t* DataU() const = 0; 232*d9f75844SAndroid Build Coastguard Worker virtual const uint16_t* DataV() const = 0; 233*d9f75844SAndroid Build Coastguard Worker 234*d9f75844SAndroid Build Coastguard Worker protected: ~PlanarYuv16BBuffer()235*d9f75844SAndroid Build Coastguard Worker ~PlanarYuv16BBuffer() override {} 236*d9f75844SAndroid Build Coastguard Worker }; 237*d9f75844SAndroid Build Coastguard Worker 238*d9f75844SAndroid Build Coastguard Worker // Represents Type::kI010, allocates 16 bits per pixel and fills 10 least 239*d9f75844SAndroid Build Coastguard Worker // significant bits with color information. 240*d9f75844SAndroid Build Coastguard Worker class I010BufferInterface : public PlanarYuv16BBuffer { 241*d9f75844SAndroid Build Coastguard Worker public: 242*d9f75844SAndroid Build Coastguard Worker Type type() const override; 243*d9f75844SAndroid Build Coastguard Worker 244*d9f75844SAndroid Build Coastguard Worker int ChromaWidth() const final; 245*d9f75844SAndroid Build Coastguard Worker int ChromaHeight() const final; 246*d9f75844SAndroid Build Coastguard Worker 247*d9f75844SAndroid Build Coastguard Worker protected: ~I010BufferInterface()248*d9f75844SAndroid Build Coastguard Worker ~I010BufferInterface() override {} 249*d9f75844SAndroid Build Coastguard Worker }; 250*d9f75844SAndroid Build Coastguard Worker 251*d9f75844SAndroid Build Coastguard Worker // Represents Type::kI210, allocates 16 bits per pixel and fills 10 least 252*d9f75844SAndroid Build Coastguard Worker // significant bits with color information. 253*d9f75844SAndroid Build Coastguard Worker class I210BufferInterface : public PlanarYuv16BBuffer { 254*d9f75844SAndroid Build Coastguard Worker public: 255*d9f75844SAndroid Build Coastguard Worker Type type() const override; 256*d9f75844SAndroid Build Coastguard Worker 257*d9f75844SAndroid Build Coastguard Worker int ChromaWidth() const final; 258*d9f75844SAndroid Build Coastguard Worker int ChromaHeight() const final; 259*d9f75844SAndroid Build Coastguard Worker 260*d9f75844SAndroid Build Coastguard Worker protected: ~I210BufferInterface()261*d9f75844SAndroid Build Coastguard Worker ~I210BufferInterface() override {} 262*d9f75844SAndroid Build Coastguard Worker }; 263*d9f75844SAndroid Build Coastguard Worker 264*d9f75844SAndroid Build Coastguard Worker class BiplanarYuvBuffer : public VideoFrameBuffer { 265*d9f75844SAndroid Build Coastguard Worker public: 266*d9f75844SAndroid Build Coastguard Worker virtual int ChromaWidth() const = 0; 267*d9f75844SAndroid Build Coastguard Worker virtual int ChromaHeight() const = 0; 268*d9f75844SAndroid Build Coastguard Worker 269*d9f75844SAndroid Build Coastguard Worker // Returns the number of steps(in terms of Data*() return type) between 270*d9f75844SAndroid Build Coastguard Worker // successive rows for a given plane. 271*d9f75844SAndroid Build Coastguard Worker virtual int StrideY() const = 0; 272*d9f75844SAndroid Build Coastguard Worker virtual int StrideUV() const = 0; 273*d9f75844SAndroid Build Coastguard Worker 274*d9f75844SAndroid Build Coastguard Worker protected: ~BiplanarYuvBuffer()275*d9f75844SAndroid Build Coastguard Worker ~BiplanarYuvBuffer() override {} 276*d9f75844SAndroid Build Coastguard Worker }; 277*d9f75844SAndroid Build Coastguard Worker 278*d9f75844SAndroid Build Coastguard Worker class BiplanarYuv8Buffer : public BiplanarYuvBuffer { 279*d9f75844SAndroid Build Coastguard Worker public: 280*d9f75844SAndroid Build Coastguard Worker virtual const uint8_t* DataY() const = 0; 281*d9f75844SAndroid Build Coastguard Worker virtual const uint8_t* DataUV() const = 0; 282*d9f75844SAndroid Build Coastguard Worker 283*d9f75844SAndroid Build Coastguard Worker protected: ~BiplanarYuv8Buffer()284*d9f75844SAndroid Build Coastguard Worker ~BiplanarYuv8Buffer() override {} 285*d9f75844SAndroid Build Coastguard Worker }; 286*d9f75844SAndroid Build Coastguard Worker 287*d9f75844SAndroid Build Coastguard Worker // Represents Type::kNV12. NV12 is full resolution Y and half-resolution 288*d9f75844SAndroid Build Coastguard Worker // interleved UV. 289*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT NV12BufferInterface : public BiplanarYuv8Buffer { 290*d9f75844SAndroid Build Coastguard Worker public: 291*d9f75844SAndroid Build Coastguard Worker Type type() const override; 292*d9f75844SAndroid Build Coastguard Worker 293*d9f75844SAndroid Build Coastguard Worker int ChromaWidth() const final; 294*d9f75844SAndroid Build Coastguard Worker int ChromaHeight() const final; 295*d9f75844SAndroid Build Coastguard Worker 296*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<VideoFrameBuffer> CropAndScale(int offset_x, 297*d9f75844SAndroid Build Coastguard Worker int offset_y, 298*d9f75844SAndroid Build Coastguard Worker int crop_width, 299*d9f75844SAndroid Build Coastguard Worker int crop_height, 300*d9f75844SAndroid Build Coastguard Worker int scaled_width, 301*d9f75844SAndroid Build Coastguard Worker int scaled_height) override; 302*d9f75844SAndroid Build Coastguard Worker 303*d9f75844SAndroid Build Coastguard Worker protected: ~NV12BufferInterface()304*d9f75844SAndroid Build Coastguard Worker ~NV12BufferInterface() override {} 305*d9f75844SAndroid Build Coastguard Worker }; 306*d9f75844SAndroid Build Coastguard Worker 307*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 308*d9f75844SAndroid Build Coastguard Worker 309*d9f75844SAndroid Build Coastguard Worker #endif // API_VIDEO_VIDEO_FRAME_BUFFER_H_ 310