@@ -1,5 +1,5 @@
/*
* Copyright (C) 2015 Samuel Audet
* Copyright (C) 2015-2019 Samuel Audet
*
* Licensed either under the Apache License, Version 2.0, or (at your option)
* under the terms of the GNU General Public License as published by
@@ -24,7 +24,6 @@
import java.nio.Buffer ;
import java.nio.ByteBuffer ;
import java.nio.ByteOrder ;
import java.nio.DoubleBuffer ;
import java.nio.FloatBuffer ;
import java.nio.IntBuffer ;
@@ -37,6 +36,7 @@
import org.bytedeco.javacpp.FloatPointer ;
import org.bytedeco.javacpp.IntPointer ;
import org.bytedeco.javacpp.LongPointer ;
import org.bytedeco.javacpp.Pointer ;
import org.bytedeco.javacpp.ShortPointer ;
import org.bytedeco.javacpp.indexer.ByteIndexer ;
import org.bytedeco.javacpp.indexer.DoubleIndexer ;
@@ -94,7 +94,7 @@
/* * Buffers to hold audio samples from multiple channels for an audio frame. */
public Buffer [] samples;
/* * The underlying data object, for example, AVFrame, IplImage, or Mat. */
/* * The underlying data object, for example, Pointer, AVFrame, IplImage, or Mat. */
public Object opaque;
/* * Timestamp of the frame creation. */
@@ -120,7 +120,8 @@ public Frame(int width, int height, int depth, int channels, int imageStride) {
this . imageStride = imageStride;
this . image = new Buffer [1 ];
ByteBuffer buffer = ByteBuffer . allocateDirect(imageHeight * imageStride * pixelSize(depth)). order(ByteOrder . nativeOrder());
Pointer pointer = new BytePointer (imageHeight * imageStride * pixelSize(depth));
ByteBuffer buffer = pointer. asByteBuffer();
switch (imageDepth) {
case DEPTH_BYTE :
case DEPTH_UBYTE : image[0 ] = buffer; break ;
@@ -132,6 +133,7 @@ public Frame(int width, int height, int depth, int channels, int imageStride) {
case DEPTH_DOUBLE : image[0 ] = buffer. asDoubleBuffer(); break ;
default : throw new UnsupportedOperationException (" Unsupported depth value: " + imageDepth);
}
opaque = pointer;
}
/* * Returns {@code createIndexer(true, 0)}. */
@@ -198,49 +200,52 @@ public Frame(int width, int height, int depth, int channels, int imageStride) {
public Frame clone () {
Frame newFrame = new Frame ();
// Video part
newFrame. imageWidth = imageWidth;
newFrame. imageHeight = imageHeight;
newFrame. imageDepth = imageDepth;
newFrame. imageChannels = imageChannels;
newFrame. imageStride = imageStride;
newFrame. keyFrame = keyFrame;
newFrame. opaque = opaque;
newFrame. image = cloneBufferArray(image);
newFrame. opaque = new Pointer [2 ];
if (image != null ) {
newFrame. image = new Buffer [image. length];
((Pointer [])newFrame. opaque)[0 ] = cloneBufferArray(image, newFrame. image);
}
// Audio part
newFrame. audioChannels = audioChannels;
newFrame. sampleRate = sampleRate;
newFrame. samples = cloneBufferArray(samples);
if (samples != null ) {
newFrame. samples = new Buffer [samples. length];
((Pointer [])newFrame. opaque)[1 ] = cloneBufferArray(samples, newFrame. samples);
}
// Add timestamp
newFrame. timestamp = timestamp;
return newFrame;
}
/**
* This private method takes a buffer array as input and returns a deep copy.
* It is assumed that all buffers in the input array are of the same subclass.
*
* @param srcBuffers - Buffer array to be cloned
* @return New buffer array
* @param clonedBuffers - Buffer array to fill with clones
* @return Opaque object to store
*
* @author Extension proposed by Dragos Dutu
*/
private static Buffer [] cloneBufferArray (Buffer [] srcBuffers ) {
Buffer [] clonedBuffers = null ;
int i;
short dataSize;
private static Pointer cloneBufferArray (Buffer [] srcBuffers , Buffer [] clonedBuffers ) {
Pointer opaque = null ;
if (srcBuffers != null ) {
clonedBuffers = new Buffer [srcBuffers. length];
for (i = 0 ; i < srcBuffers. length; i++ )
if (srcBuffers != null && srcBuffers. length > 0 ) {
int totalCapacity = 0 ;
for (int i = 0 ; i < srcBuffers. length; i++ ) {
srcBuffers[i]. rewind();
totalCapacity += srcBuffers[i]. capacity();
}
/*
* In order to optimize the transfer we need a type check.
@@ -261,45 +266,63 @@ public Frame clone() {
*
*/
if (srcBuffers[0 ] instanceof ByteBuffer )
// dataSize is 1
for (i = 0 ; i < srcBuffers. length; i++ )
clonedBuffers[i] = ByteBuffer . allocateDirect(srcBuffers[i]. capacity())
.put((ByteBuffer ) srcBuffers[i]). rewind();
else if (srcBuffers[0 ] instanceof ShortBuffer ) {
dataSize = Short . SIZE >> 3 ; // dataSize is 2
for (i = 0 ; i < srcBuffers. length; i++ )
clonedBuffers[i] = ByteBuffer . allocateDirect(srcBuffers[i]. capacity() * dataSize)
.order(ByteOrder . nativeOrder()). asShortBuffer(). put((ShortBuffer ) srcBuffers[i]). rewind();
if (srcBuffers[0 ] instanceof ByteBuffer ) {
BytePointer pointer = new BytePointer (totalCapacity);
for (int i = 0 ; i < srcBuffers. length; i++ ) {
clonedBuffers[i] = pointer. limit(pointer. position() + srcBuffers[i]. limit())
.asBuffer(). put((ByteBuffer )srcBuffers[i]);
pointer. position(pointer. limit());
}
opaque = pointer;
} else if (srcBuffers[0 ] instanceof ShortBuffer ) {
ShortPointer pointer = new ShortPointer (totalCapacity);
for (int i = 0 ; i < srcBuffers. length; i++ ) {
clonedBuffers[i] = pointer. limit(pointer. position() + srcBuffers[i]. limit())
.asBuffer(). put((ShortBuffer )srcBuffers[i]);
pointer. position(pointer. limit());
}
opaque = pointer;
} else if (srcBuffers[0 ] instanceof IntBuffer ) {
dataSize = Integer . SIZE >> 3 ; // dataSize is 4
for (i = 0 ; i < srcBuffers. length; i++ )
clonedBuffers[i] = ByteBuffer . allocateDirect(srcBuffers[i]. capacity() * dataSize)
.order(ByteOrder . nativeOrder()). asIntBuffer(). put((IntBuffer ) srcBuffers[i]). rewind();
IntPointer pointer = new IntPointer (totalCapacity);
for (int i = 0 ; i < srcBuffers. length; i++ ) {
clonedBuffers[i] = pointer. limit(pointer. position() + srcBuffers[i]. limit())
.asBuffer(). put((IntBuffer )srcBuffers[i]);
pointer. position(pointer. limit());
}
opaque = pointer;
} else if (srcBuffers[0 ] instanceof LongBuffer ) {
dataSize = Long . SIZE >> 3 ; // dataSize is 8
for (i = 0 ; i < srcBuffers. length; i++ )
clonedBuffers[i] = ByteBuffer . allocateDirect(srcBuffers[i]. capacity() * dataSize)
.order(ByteOrder . nativeOrder()). asLongBuffer(). put((LongBuffer ) srcBuffers[i]). rewind();
LongPointer pointer = new LongPointer (totalCapacity);
for (int i = 0 ; i < srcBuffers. length; i++ ) {
clonedBuffers[i] = pointer. limit(pointer. position() + srcBuffers[i]. limit())
.asBuffer(). put((LongBuffer )srcBuffers[i]);
pointer. position(pointer. limit());
}
opaque = pointer;
} else if (srcBuffers[0 ] instanceof FloatBuffer ) {
dataSize = Float . SIZE >> 3 ; // dataSize is 4
for (i = 0 ; i < srcBuffers. length; i++ )
clonedBuffers[i] = ByteBuffer . allocateDirect(srcBuffers[i]. capacity() * dataSize)
.order(ByteOrder . nativeOrder()). asFloatBuffer(). put((FloatBuffer ) srcBuffers[i]). rewind();
FloatPointer pointer = new FloatPointer (totalCapacity);
for (int i = 0 ; i < srcBuffers. length; i++ ) {
clonedBuffers[i] = pointer. limit(pointer. position() + srcBuffers[i]. limit())
.asBuffer(). put((FloatBuffer )srcBuffers[i]);
pointer. position(pointer. limit());
}
opaque = pointer;
} else if (srcBuffers[0 ] instanceof DoubleBuffer ) {
dataSize = Double . SIZE >> 3 ; // dataSize is 8
for (i = 0 ; i < srcBuffers. length; i++ )
clonedBuffers[i] = ByteBuffer . allocateDirect(srcBuffers[i]. capacity() * dataSize)
.order(ByteOrder . nativeOrder()). asDoubleBuffer(). put((DoubleBuffer ) srcBuffers[i]). rewind();
DoublePointer pointer = new DoublePointer (totalCapacity);
for (int i = 0 ; i < srcBuffers. length; i++ ) {
clonedBuffers[i] = pointer. limit(pointer. position() + srcBuffers[i]. limit())
.asBuffer(). put((DoubleBuffer )srcBuffers[i]);
pointer. position(pointer. limit());
}
opaque = pointer;
}
for (i = 0 ; i < srcBuffers. length; i++ )
for (int i = 0 ; i < srcBuffers. length; i++ ) {
srcBuffers[i]. rewind();
clonedBuffers[i]. rewind();
}
}
return clonedBuffers;
return opaque;
}
/* * Returns types of data containing in the frame */
0 comments on commit
924f1d9