Skip to content

Commit

Permalink
Bug 1308405 - p2: Nodify and recycle sample objects. r=snorp
Browse files Browse the repository at this point in the history
Differential Revision: https://phabricator.services.mozilla.com/D24588

--HG--
extra : moz-landing-system : lando
  • Loading branch information
jhlin committed Mar 28, 2019
1 parent f5eaaf3 commit 385270e
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 101 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ private synchronized void onSample(final Sample sample) {
}

Sample dequeued = mDequeuedSamples.remove();
dequeued.info = sample.info;
dequeued.cryptoInfo = sample.cryptoInfo;
dequeued.setBufferInfo(sample.info);
dequeued.setCryptoInfo(sample.cryptoInfo);
queueSample(dequeued);

sample.dispose();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public final class Sample implements Parcelable {
public static final Sample EOS;
static {
BufferInfo eosInfo = new BufferInfo();
eosInfo.set(0, 0, Long.MIN_VALUE, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
EOS = new Sample(null, eosInfo, null);
EOS = new Sample();
EOS.info.set(0, 0, Long.MIN_VALUE, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
}

public interface Buffer extends Parcelable {
Expand All @@ -32,99 +32,20 @@ public interface Buffer extends Parcelable {
void dispose();
}

private static final class ArrayBuffer implements Buffer {
private byte[] mArray;

public static final Creator<ArrayBuffer> CREATOR = new Creator<ArrayBuffer>() {
@Override
public ArrayBuffer createFromParcel(final Parcel in) {
return new ArrayBuffer(in);
}

@Override
public ArrayBuffer[] newArray(final int size) {
return new ArrayBuffer[size];
}
};

private ArrayBuffer(final Parcel in) {
mArray = in.createByteArray();
}

private ArrayBuffer(final byte[] bytes) {
mArray = bytes;
}

@Override
public int describeContents() {
return 0;
}

@Override
public void writeToParcel(final Parcel dest, final int flags) {
dest.writeByteArray(mArray);
}

@Override
public int capacity() {
return mArray != null ? mArray.length : 0;
}

@Override
public void readFromByteBuffer(final ByteBuffer src, final int offset, final int size)
throws IOException {
src.position(offset);
if (mArray == null || mArray.length != size) {
mArray = new byte[size];
}
src.get(mArray, 0, size);
}

@Override
public void writeToByteBuffer(final ByteBuffer dest, final int offset, final int size)
throws IOException {
dest.put(mArray, offset, size);
}

@Override
public void dispose() {
mArray = null;
}
}

public Buffer buffer;
@WrapForJNI
public BufferInfo info;
public BufferInfo info = new BufferInfo();
public CryptoInfo cryptoInfo;

public static Sample create() {
return create(null, new BufferInfo(), null);
}

public static Sample create(final ByteBuffer src, final BufferInfo info,
final CryptoInfo cryptoInfo) {
ArrayBuffer buffer = new ArrayBuffer(byteArrayFromBuffer(src, info.offset, info.size));

BufferInfo bufferInfo = new BufferInfo();
bufferInfo.set(0, info.size, info.presentationTimeUs, info.flags);

return new Sample(buffer, bufferInfo, cryptoInfo);
}

public static Sample create(final SharedMemory sharedMem) {
return new Sample(new SharedMemBuffer(sharedMem), new BufferInfo(), null);
}
// Simple Linked list for recycling objects.
// Used to nodify Sample objects. Do not marshal/unmarshal.
private Sample mNext;
private static Sample sPool = new Sample();
private static int sPoolSize = 1;

private Sample(final Buffer bytes, final BufferInfo info, final CryptoInfo cryptoInfo) {
public Sample() { }
public Sample(Buffer bytes) {
buffer = bytes;
this.info = info;
this.cryptoInfo = cryptoInfo;
}

private Sample(final Parcel in) {
readInfo(in);
readCrypto(in);
buffer = in.readParcelable(Sample.class.getClassLoader());
}

private void readInfo(final Parcel in) {
Expand All @@ -133,7 +54,6 @@ private void readInfo(final Parcel in) {
long pts = in.readLong();
int flags = in.readInt();

info = new BufferInfo();
info.set(offset, size, pts, flags);
}

Expand All @@ -150,7 +70,9 @@ private void readCrypto(final Parcel in) {
int[] numBytesOfEncryptedData = in.createIntArray();
int numSubSamples = in.readInt();

cryptoInfo = new CryptoInfo();
if (cryptoInfo == null) {
cryptoInfo = new CryptoInfo();
}
cryptoInfo.set(numSubSamples,
numBytesOfClearData,
numBytesOfEncryptedData,
Expand All @@ -164,10 +86,30 @@ public Sample set(final ByteBuffer bytes, final BufferInfo info, final CryptoInf
if (bytes != null && info.size > 0) {
buffer.readFromByteBuffer(bytes, info.offset, info.size);
}
setBufferInfo(info);
setCryptoInfo(cryptoInfo);
return this;
}

public void setBufferInfo(final BufferInfo info) {
this.info.set(0, info.size, info.presentationTimeUs, info.flags);
this.cryptoInfo = cryptoInfo;
}

return this;
public void setCryptoInfo(final CryptoInfo crypto) {
if (crypto == null) {
cryptoInfo = null;
return;
}

if (cryptoInfo == null) {
cryptoInfo = new CryptoInfo();
}
cryptoInfo.set(crypto.numSubSamples,
crypto.numBytesOfClearData,
crypto.numBytesOfEncryptedData,
crypto.key,
crypto.iv,
crypto.mode);
}

public void dispose() {
Expand All @@ -179,8 +121,17 @@ public void dispose() {
buffer.dispose();
buffer = null;
}
info = null;
cryptoInfo = null;
info.set(0, 0, 0, 0);
if (cryptoInfo != null) {
cryptoInfo.set(0, null, null, null, null, 0);
}

// Recycle it.
synchronized (CREATOR) {
this.mNext = sPool;
sPool = this;
sPoolSize++;
}
}

public boolean isEOS() {
Expand All @@ -191,13 +142,29 @@ public boolean isEOS() {
public static final Creator<Sample> CREATOR = new Creator<Sample>() {
@Override
public Sample createFromParcel(final Parcel in) {
return new Sample(in);
return obtainSample(in);
}

@Override
public Sample[] newArray(final int size) {
return new Sample[size];
}

private synchronized Sample obtainSample(final Parcel in) {
Sample s = null;
if (sPoolSize > 0) {
s = sPool;
sPool = s.mNext;
s.mNext = null;
sPoolSize--;
} else {
s = new Sample();
}
s.buffer = in.readParcelable(Sample.class.getClassLoader());
s.readInfo(in);
s.readCrypto(in);
return s;
}
};

@Override
Expand All @@ -207,9 +174,9 @@ public int describeContents() {

@Override
public void writeToParcel(final Parcel dest, final int parcelableFlags) {
dest.writeParcelable(buffer, parcelableFlags);
writeInfo(dest);
writeCrypto(dest);
dest.writeParcelable(buffer, parcelableFlags);
}

private void writeInfo(final Parcel dest) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ private synchronized Sample obtain(final int size) {
}

if (mBufferless) {
return Sample.create();
return new Sample();
} else {
return allocateSharedMemorySample(size);
}
Expand All @@ -52,7 +52,7 @@ private Sample allocateSharedMemorySample(final int size) {
throw new UnsupportedOperationException(e);
}

return Sample.create(shm);
return new Sample(new SharedMemBuffer(shm));
}

private synchronized void recycle(final Sample recycled) {
Expand Down

0 comments on commit 385270e

Please sign in to comment.