/* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.media.tv; import android.annotation.NonNull; import android.media.MediaCodec.BufferFlag; import android.os.Parcel; import android.os.Parcelable; import android.os.SharedMemory; import java.io.IOException; /** * Buffer for advertisement data. */ public final class AdBuffer implements Parcelable { private final int mId; @NonNull private final String mMimeType; @NonNull private final SharedMemory mBuffer; private final int mOffset; private final int mLength; private final long mPresentationTimeUs; private final int mFlags; public AdBuffer( int id, @NonNull String mimeType, @NonNull SharedMemory buffer, int offset, int length, long presentationTimeUs, @BufferFlag int flags) { this.mId = id; this.mMimeType = mimeType; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, mimeType); this.mBuffer = buffer; com.android.internal.util.AnnotationValidations.validate( NonNull.class, null, buffer); this.mOffset = offset; this.mLength = length; this.mPresentationTimeUs = presentationTimeUs; this.mFlags = flags; } /** @hide **/ public static AdBuffer dupAdBuffer(AdBuffer buffer) throws IOException { if (buffer == null) { return null; } return new AdBuffer(buffer.mId, buffer.mMimeType, SharedMemory.fromFileDescriptor(buffer.mBuffer.getFdDup()), buffer.mOffset, buffer.mLength, buffer.mPresentationTimeUs, buffer.mFlags); } /** * Gets corresponding AD request ID. * * @return The ID of the ad request */ public int getId() { return mId; } /** * Gets the mime type of the data. * * @return The mime type of the data. */ @NonNull public String getMimeType() { return mMimeType; } /** * Gets the {@link SharedMemory} which stores the data. * *
Information on how the data in this buffer is formatted can be found using * {@link AdRequest#getMetadata()} *
This data lives in a {@link SharedMemory} instance because of the
* potentially large amount of data needed to store the ad. This optimizes the
* data communication between the ad data source and the service responsible for
* its display.
*
* @see SharedMemory#create(String, int)
* @return The {@link SharedMemory} that stores the data for this ad buffer.
*/
@NonNull
public SharedMemory getSharedMemory() {
return mBuffer;
}
/**
* Gets the offset into the shared memory to begin mapping.
*
* @see SharedMemory#map(int, int, int)
* @return The offset of this ad buffer in the shared memory in bytes.
*/
public int getOffset() {
return mOffset;
}
/**
* Gets the data length of this ad buffer.
*
* @return The data length of this ad buffer in bytes.
*/
public int getLength() {
return mLength;
}
/**
* Gets the presentation time.
*
* @return The presentation time in microseconds.
*/
public long getPresentationTimeUs() {
return mPresentationTimeUs;
}
/**
* Gets the buffer flags for this ad buffer.
*
* @see android.media.MediaCodec
* @return The buffer flags for this ad buffer.
*/
@BufferFlag
public int getFlags() {
return mFlags;
}
@Override
public void writeToParcel(@NonNull android.os.Parcel dest, int flags) {
dest.writeInt(mId);
dest.writeString(mMimeType);
dest.writeTypedObject(mBuffer, flags);
dest.writeInt(mOffset);
dest.writeInt(mLength);
dest.writeLong(mPresentationTimeUs);
dest.writeInt(mFlags);
}
@Override
public int describeContents() {
return 0;
}
private AdBuffer(@NonNull Parcel in) {
int id = in.readInt();
String mimeType = in.readString();
SharedMemory buffer = (SharedMemory) in.readTypedObject(SharedMemory.CREATOR);
int offset = in.readInt();
int length = in.readInt();
long presentationTimeUs = in.readLong();
int flags = in.readInt();
this.mId = id;
this.mMimeType = mimeType;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mMimeType);
this.mBuffer = buffer;
com.android.internal.util.AnnotationValidations.validate(
NonNull.class, null, mBuffer);
this.mOffset = offset;
this.mLength = length;
this.mPresentationTimeUs = presentationTimeUs;
this.mFlags = flags;
}
public static final @NonNull Parcelable.Creator