VideoFrame

Configurations of the video frame.

public interface Buffer extends RefCounted {
    
    @CalledByNative("Buffer") int getWidth();
    @CalledByNative("Buffer") int getHeight();   
    @Override @CalledByNative("Buffer") void retain(); 
    @Override @CalledByNative("Buffer") void release();
    @CalledByNative("Buffer")
    Buffer cropAndScale(
        int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth, int scaleHeight);

    
    @CalledByNative("Buffer") @Nullable Buffer mirror(int frameRotation);

    
    @CalledByNative("Buffer") @Nullable Buffer rotate(int frameRotation);
    
    @CalledByNative("Buffer")
    @Nullable
    Buffer transform(int cropX, int cropY, int cropWidth, int cropHeight, int scaleWidth,
        int scaleHeight, int frameRotation);
  }

  public interface ColorSpace {
    enum Range {
      Invalid(0),
      Limited(1),
      Full(2),
      Derived(3);
      private final int range;
      private Range(int range) {
        this.range = range;
      }
      public int getRange() {
        return range;
      };
    }

    enum Matrix {
      RGB(0),
      BT709(1),
      Unspecified(2),
      FCC(4),
      BT470BG(5),
      SMPTE170M(6),
      SMPTE240M(7),
      YCOCG(8),
      BT2020_NCL(9),
      BT2020_CL(10),
      SMPTE2085(11),
      CDNCLS(12),
      CDCLS(13),
      BT2100_ICTCP(14);
      private final int matrix;
      private Matrix(int matrix) {
        this.matrix = matrix;
      }
      public int getMatrix() {
        return matrix;
      };
    }

    enum Transfer {
      BT709(1),
      Unspecified(2),
      GAMMA22(4),
      GAMMA28(5),
      SMPTE170M(6),
      SMPTE240M(7),
      LINEAR(8),
      LOG(9),
      LOG_SQRT(10),
      IEC61966_2_4(11),
      BT1361_ECG(12),
      IEC61966_2_1(13),
      BT2020_10(14),
      BT2020_12(15),
      SMPTEST2084(16),
      SMPTEST428(17),
      ARIB_STD_B67(18);
      private final int transfer;
      private Transfer(int transfer) {
        this.transfer = transfer;
      }
      public int getTransfer() {
        return transfer;
      }
    }

    enum Primary {
      BT709(1),
      Unspecified(2),
      BT470M(4),
      BT470BG(5),
      kSMPTE170M(6), 
      kSMPTE240M(7),
      kFILM(8),
      kBT2020(9),
      kSMPTEST428(10),
      kSMPTEST431(11),
      kSMPTEST432(12),
      kJEDECP22(22);
      private final int primary;
      private Primary(int primary) {
        this.primary = primary;
      }
      public int getPrimary() {
        return primary;
      }
    }

    Range getRange();
    Matrix getMatrix();
    Transfer getTransfer();
    Primary getPrimary();
  }

  public enum SourceType {
    kFrontCamera,
    kBackCamera,
    kUnspecified,
  }

  
  private Buffer buffer;
  private int rotation;
  private long timestampNs;
  private ColorSpace colorSpace;
  private SourceType sourceType;
  private float sampleAspectRatio;
  public VideoFrame(Buffer buffer, int rotation, long timestampNs) {
    this(buffer, rotation, timestampNs, null, null, 1.0f, SourceType.kUnspecified.ordinal());
  }

  @CalledByNative
  public VideoFrame(Buffer buffer, int rotation, long timestampNs, ColorSpace colorSpace,
    float sampleAspectRatio, int sourceType) {
    if (buffer == null) {
      throw new IllegalArgumentException("buffer not allowed to be null");
    }
    if (rotation % 90 != 0) {
      throw new IllegalArgumentException("rotation must be a multiple of 90");
    }
    this.buffer = buffer;
    this.rotation = rotation;
    this.timestampNs = timestampNs;
    this.colorSpace = colorSpace;
    this.sampleAspectRatio = sampleAspectRatio;
    this.sourceType = SourceType.values()[sourceType];
  }

  @CalledByNative
  public SourceType getSourceType() {
    return sourceType;
  }

  public float getSampleAspectRatio() {
    return sampleAspectRatio;
  }

  @CalledByNative
  public Buffer getBuffer() {
    return buffer;
  }

  @CalledByNative
  public int getRotation() {
    return rotation;
  }

  @CalledByNative
  public long getTimestampNs() {
    return timestampNs;
  }

  public int getRotatedWidth() {
    if (rotation % 180 == 0) {
      return buffer.getWidth();
    }
    return buffer.getHeight();
  }

  public int getRotatedHeight() {
    if (rotation % 180 == 0) {
      return buffer.getHeight();
    }
    return buffer.getWidth();
  }

  
  public void replaceBuffer(Buffer buffer, int rotation, long timestampNs) {
    release();
    this.buffer = buffer;
    this.rotation = rotation;
    this.timestampNs = timestampNs;
  }

  public ColorSpace getColorSpace() {
    return colorSpace;
  }

  @Override
  public void retain() {
    buffer.retain();
  }

  @Override
  @CalledByNative
  public void release() {
    buffer.release();
  }
}

The video data format is YUV420. Note that the buffer provides a pointer to a pointer. This interface cannot modify the pointer of the buffer, but it can modify the content of the buffer.

Attributes

buffer
CAUTION: This parameter cannot be empty; otherwise, an error can occur.
Buffer data. The methods associated with this parameter are as follows:
  • getRotatedWidth: Gets the width of the rotated video frame.
  • getRotatedHeight: Gets the height of the rotated video frame.
  • replaceBuffer: Replaces the data in the buffer with the new video frames.
  • retain: Increments the reference count of the buffer by 1.
  • release: Decrements the reference count of the buffer by 1. When the count reaches 0, the buffer's resources are released.
rotation
The clockwise rotation of the video frame before rendering. Supported values include 0, 90, 180, and 270 degrees.
timestampNs
The timestamp (ns) of a video frame.
colorSpace
The color space of a video frame. See VideoColorSpace.
sourceType
When using the SDK to capture video, this indicates the type of the video source.
  • kFrontCamera: The front camera.
  • kBackCamera: The rear camera.
  • kUnspecified: (Default) The video source type is unknown.
sampleAspectRatio
The aspect ratio of a single pixel, which is the ratio of the width to the height of each pixel.