io.humble.video.Demuxer Maven / Gradle / Ivy
Show all versions of humble-video-noarch Show documentation
/* ----------------------------------------------------------------------------
* This file was automatically generated by SWIG (http://www.swig.org).
* Version 2.0.6
*
* Do not make changes to this file unless you know what you are doing--modify
* the SWIG interface file instead.
* ----------------------------------------------------------------------------- */
package io.humble.video;
import io.humble.ferry.*;
/**
* A Container that MediaPacket objects can be read from.
*/
public class Demuxer extends Container {
// JNIHelper.swg: Start generated code
// >>>>>>>>>>>>>>>>>>>>>>>>>>>
/**
* This method is only here to use some references and remove
* a Eclipse compiler warning.
*/
@SuppressWarnings("unused")
private void noop()
{
Buffer.make(null, 1);
}
private volatile long swigCPtr;
/**
* Internal Only.
*/
protected Demuxer(long cPtr, boolean cMemoryOwn) {
super(VideoJNI.Demuxer_SWIGUpcast(cPtr), cMemoryOwn);
swigCPtr = cPtr;
}
/**
* Internal Only.
*/
protected Demuxer(long cPtr, boolean cMemoryOwn,
java.util.concurrent.atomic.AtomicLong ref)
{
super(VideoJNI.Demuxer_SWIGUpcast(cPtr),
cMemoryOwn, ref);
swigCPtr = cPtr;
}
/**
* Internal Only. Not part of public API.
*
* Get the raw value of the native object that obj is proxying for.
*
* @param obj The java proxy object for a native object.
* @return The raw pointer obj is proxying for.
*/
protected static long getCPtr(Demuxer obj) {
if (obj == null) return 0;
return obj.getMyCPtr();
}
/**
* Internal Only. Not part of public API.
*
* Get the raw value of the native object that we're proxying for.
*
* @return The raw pointer we're proxying for.
*/
protected long getMyCPtr() {
if (swigCPtr == 0) throw new IllegalStateException("underlying native object already deleted");
return swigCPtr;
}
/**
* Create a new Demuxer object that is actually referring to the
* exact same underlying native object.
*
* @return the new Java object.
*/
@Override
public Demuxer copyReference() {
if (swigCPtr == 0)
return null;
else
return new Demuxer(swigCPtr, swigCMemOwn, getJavaRefCount());
}
/**
* Compares two values, returning true if the underlying objects in native code are the same object.
*
* That means you can have two different Java objects, but when you do a comparison, you'll find out
* they are the EXACT same object.
*
* @return True if the underlying native object is the same. False otherwise.
*/
public boolean equals(Object obj) {
boolean equal = false;
if (obj instanceof Demuxer)
equal = (((Demuxer)obj).swigCPtr == this.swigCPtr);
return equal;
}
/**
* Get a hashable value for this object.
*
* @return the hashable value.
*/
public int hashCode() {
return (int)swigCPtr;
}
// <<<<<<<<<<<<<<<<<<<<<<<<<<<
// JNIHelper.swg: End generated code
@Override
public String toString() {
final StringBuilder b = new StringBuilder(super.toString());
b.append("[")
.append("url="+getURL()+";")
.append("format:"+getFormat()+";")
.append("]");
return b.toString();
}
/**
* Create a new Demuxer
*/
public static Demuxer make() {
long cPtr = VideoJNI.Demuxer_make();
return (cPtr == 0) ? null : new Demuxer(cPtr, false);
}
/**
* Get the current state of the container.
*/
public Demuxer.State getState() {
return Demuxer.State.swigToEnum(VideoJNI.Demuxer_getState(swigCPtr, this));
}
/**
* Get the DemuxerFormat associated with this Demuxer
* or null if unknown.
*/
public DemuxerFormat getFormat() {
long cPtr = VideoJNI.Demuxer_getFormat(swigCPtr, this);
return (cPtr == 0) ? null : new DemuxerFormat(cPtr, false);
}
/**
* Set the buffer length Humble Video will suggest to FFMPEG for reading inputs.
*
* If called when a Container is open, the call is ignored and -1 is returned.
*
* @param size The suggested buffer size.
* @throws InvalidArgument if size <= 0
*/
public void setInputBufferLength(int size) {
VideoJNI.Demuxer_setInputBufferLength(swigCPtr, this, size);
}
/**
* Return the input buffer length.
*
* @return The input buffer length Humble Video told FFMPEG to assume.
* 0 means FFMPEG should choose it's own
* size (and it'll probably be 32768).
*/
public int getInputBufferLength() {
return VideoJNI.Demuxer_getInputBufferLength(swigCPtr, this);
}
/**
* Open this container and make it ready for reading, optionally
* reading as far into the container as necessary to find all streams.
* The caller must call #close() when done, but if not, the
* Demuxer will eventually close
* them later but warn to the logging system.
*
* @param url The resource to open; The format of this string is any
* url that FFMPEG supports (including additional protocols if added
* through the video.customio library).
*
* @param format A pointer to a InputFormat object specifying
* the format of this container, or null if you want us to guess.
* @param streamsCanBeAddedDynamically If true, open() will expect that new
* streams can be added at any time, even after the format header has been read.
* @param queryStreamMetaData If true, open() will call #queryStreamMetaData()
* on this container, which will potentially block until it has ready
* enough data to find all streams in a container. If false, it will only
* block to read a minimal header for this container format.
* @param options If not null, a set of key-value pairs that will be set on the container immediately
* the format is determined. Some options cannot be set on input formats until
* the system has had a chance to determine what the format is, so this
* is the only way to set InputFormat-specific options.
* @param optionsNotSet If not null, on return this KeyValueBag object will be cleared out, and
* replace with any key/value pairs that were in options
but could not be set on this
* Demuxer.
*
* @return >= 0 on success; < 0 on error.
*/
public void open(String url, DemuxerFormat format, boolean streamsCanBeAddedDynamically, boolean queryStreamMetaData, KeyValueBag options, KeyValueBag optionsNotSet) throws java.lang.InterruptedException, java.io.IOException {
VideoJNI.Demuxer_open(swigCPtr, this, url, DemuxerFormat.getCPtr(format), format, streamsCanBeAddedDynamically, queryStreamMetaData, KeyValueBag.getCPtr(options), options, KeyValueBag.getCPtr(optionsNotSet), optionsNotSet);
}
/**
* Close the container. open() must have been called first, or
* else an error is returned.
*
* If this method exits because of an interruption,
* all resources will be closed anyway.
*
*/
public void close() throws java.lang.InterruptedException, java.io.IOException {
VideoJNI.Demuxer_close(swigCPtr, this);
}
/**
* Get the stream at the given position.
*
* @param streamIndex the index of this stream in the container
* @return The stream at that position in the container, or null if none there.
*/
public DemuxerStream getStream(int streamIndex) throws java.lang.InterruptedException, java.io.IOException {
long cPtr = VideoJNI.Demuxer_getStream(swigCPtr, this, streamIndex);
return (cPtr == 0) ? null : new DemuxerStream(cPtr, false);
}
/**
* Reads the next packet in the Demuxer into the Packet. This method will
* release any buffers currently held by this packet and allocate
* new ones.
*
* For non-blocking IO data sources, it is possible for this method
* to return as successful but with no complete packet. In that case
* the caller should retry again later (think EAGAIN) semantics.
*
*
* @param packet [In/Out] The packet the Demuxer will read into.
*
* @return 0 if successful, or <0 if not.
* @throws RuntimeException if an error occurs except for EOF (in which case <0 returned)
* or EAGAIN (in which case 0 returned with an incomplete packet).
*/
public int read(MediaPacket packet) throws java.lang.InterruptedException, java.io.IOException {
return VideoJNI.Demuxer_read(swigCPtr, this, MediaPacket.getCPtr(packet), packet);
}
/**
* Attempts to read all the meta data in this stream, potentially by reading ahead
* and decoding packets.
*
* Any packets this method reads ahead will be cached and correctly returned when you
* read packets, but this method can be non-blocking potentially until end of container
* to get all meta data. Take care when you call it.
*
After this method is called, other meta data methods like #getDuration() should
* work.
*/
public void queryStreamMetaData() throws java.lang.InterruptedException, java.io.IOException {
VideoJNI.Demuxer_queryStreamMetaData(swigCPtr, this);
}
/**
* Gets the duration, if known, of this container.
*
* This will only work for non-streamable containers where Demuxer
* can calculate the container size.
*
* @return The duration, or Global#NO_PTS if not known.
*/
public long getDuration() {
return VideoJNI.Demuxer_getDuration(swigCPtr, this);
}
/**
* Get the starting timestamp in microseconds of the first packet of the earliest stream in this container.
*
* This will only return value values either either (a) for non-streamable
* containers where Demuxer can calculate the container size or
* (b) after Demuxer has actually read the
* first packet from a streamable Demuxer.
*
*
* @return The starting timestamp in microseconds, or Global#NO_PTS if not known.
*/
public long getStartTime() {
return VideoJNI.Demuxer_getStartTime(swigCPtr, this);
}
/**
* Get the file size in bytes of this container.
*
* This will only return a valid value if the container is non-streamed and supports seek.
*
* @return The file size in bytes, or <0 on error.
*/
public long getFileSize() {
return VideoJNI.Demuxer_getFileSize(swigCPtr, this);
}
/**
* Get the calculated overall bit rate of this file.
*
* This will only return a valid value if the container is non-streamed and supports seek.
*
* @return The overall bit rate in bytes per second, or <0 on error.
*/
public int getBitRate() {
return VideoJNI.Demuxer_getBitRate(swigCPtr, this);
}
/**
* Get the flags associated with this object.
*
* @return The (compacted) value of all flags set.
*/
public int getFlags() {
return VideoJNI.Demuxer_getFlags(swigCPtr, this);
}
/**
* Set the flags to use with this object. All values
* must be ORed (|) together.
*
* @see Flags
*
* @param newFlags The new set flags for this codec.
*/
public void setFlags(int newFlags) {
VideoJNI.Demuxer_setFlags(swigCPtr, this, newFlags);
}
/**
* Get the setting for the specified flag
*
* @param flag The flag you want to find the setting for
*
* @return 0 for false; non-zero for true
*/
public boolean getFlag(Container.Flag flag) {
return VideoJNI.Demuxer_getFlag(swigCPtr, this, flag.swigValue());
}
/**
* Set the flag.
*
* @param flag The flag to set
* @param value The value to set it to (true or false)
*/
public void setFlag(Container.Flag flag, boolean value) {
VideoJNI.Demuxer_setFlag(swigCPtr, this, flag.swigValue(), value);
}
/**
* Get the URL the Demuxer was opened with.
* May return null if unknown.
* @return the URL opened, or null.
*/
public String getURL() {
return VideoJNI.Demuxer_getURL(swigCPtr, this);
}
/**
* Get the number of times Demuxer#readNextPacket(Packet)
* will retry a read if it gets a Error.Type#ERROR_AGAIN
* value back.
*
* Defaults to 1 times. <0 means it will keep retrying indefinitely.
*
* @return the read retry count
*/
public int getReadRetryCount() {
return VideoJNI.Demuxer_getReadRetryCount(swigCPtr, this);
}
/**
* Sets the read retry count.
*
* @see #getReadRetryCount()
*
* @param count The read retry count. <0 means keep trying.
*/
public void setReadRetryCount(int count) {
VideoJNI.Demuxer_setReadRetryCount(swigCPtr, this, count);
}
/**
* Can streams be added dynamically to this container?
*
* @return true if streams can be added dynamically
*/
public boolean canStreamsBeAddedDynamically() {
return VideoJNI.Demuxer_canStreamsBeAddedDynamically(swigCPtr, this);
}
/**
* Get the KeyValueBag of media MetaData for this object,
* or null if none.
*
* If the Demuxer or IStream object
* that this KeyValueBag came from was opened
* for reading, then changes via KeyValueBag#setValue(String, String)
* will have no effect on the underlying media.
*
*
* If the Demuxer or IStream object
* that this KeyValueBag came from was opened
* for writing, then changes via KeyValueBag#setValue(String, String)
* will have no effect after Demuxer#writeHeader()
* is called.
*
* @return the KeyValueBag.
*/
public KeyValueBag getMetaData() {
long cPtr = VideoJNI.Demuxer_getMetaData(swigCPtr, this);
return (cPtr == 0) ? null : new KeyValueBag(cPtr, false);
}
/**
* Forces the Demuxer to assume all audio streams are
* encoded with the given audio codec when demuxing.
* @param id The codec id
* @return < 0 on error (e.g. not an audio codec); >= 0 on success.
*/
public int setForcedAudioCodec(Codec.ID id) {
return VideoJNI.Demuxer_setForcedAudioCodec(swigCPtr, this, id.swigValue());
}
/**
* Forces the Demuxer to assume all video streams are
* encoded with the given video codec when demuxing.
* @param id The codec id
* @return < 0 on error (e.g. not an video codec); >= 0 on success.
*/
public int setForcedVideoCodec(Codec.ID id) {
return VideoJNI.Demuxer_setForcedVideoCodec(swigCPtr, this, id.swigValue());
}
/**
* Forces the Demuxer to assume all subtitle streams are
* encoded with the given subtitle codec when demuxing.
* @param id The codec id
* @return < 0 on error (e.g. not an subtitle codec); >= 0 on success.
*/
public int setForcedSubtitleCodec(Codec.ID id) {
return VideoJNI.Demuxer_setForcedSubtitleCodec(swigCPtr, this, id.swigValue());
}
/**
* Seek to timestamp ts.
*
* Seeking will be done so that the point from which all active streams
* can be presented successfully will be closest to ts and within min/max_ts.
* Active streams are all streams that have Stream.getDiscardSetting <
* Codec.DISCARD_ALL.
*
* If flags contain SeekFlags.SEEK_BYTE, then all timestamps are in bytes and
* are the file position (this may not be supported by all demuxers).
* If flags contain SeekFlags.SEEK_FRAME, then all timestamps are in frames
* in the stream with stream_index (this may not be supported by all demuxers).
* Otherwise all timestamps are in units of the stream selected by stream_index
* or if stream_index is -1, in (1/Global.DEFAULT_PTS_MICROSECONDS} units.
* If flags contain SeekFlags.SEEK_ANY, then non-keyframes are treated as
* keyframes (this may not be supported by all demuxers).
*
* @param stream_index index of the stream which is used as time base reference
* @param min_ts smallest acceptable timestamp
* @param ts target timestamp
* @param max_ts largest acceptable timestamp
* @param flags flags
* @return >=0 on success, error code otherwise
*
* Note: This is part of the new seek API which is still under construction.
* Thus do not use this yet. It may change at any time, do not expect
* ABI compatibility yet!
*/
public int seek(int stream_index, long min_ts, long ts, long max_ts, int flags) throws java.lang.InterruptedException, java.io.IOException {
return VideoJNI.Demuxer_seek(swigCPtr, this, stream_index, min_ts, ts, max_ts, flags);
}
/**
* Gets the AVFormatContext.max_delay property if possible.
* @return The max delay, error code otherwise.
*/
public int getMaxDelay() {
return VideoJNI.Demuxer_getMaxDelay(swigCPtr, this);
}
/**
* Start playing a network source. Call #pause() to pause.
*/
public void play() throws java.lang.InterruptedException, java.io.IOException {
VideoJNI.Demuxer_play(swigCPtr, this);
}
/**
* Pause a playing network source. Call #play() to unpause.
*
* @return 0 on success; <0 if state is not #State.STATE_PLAYING or error.
*/
public void pause() throws java.lang.InterruptedException, java.io.IOException {
VideoJNI.Demuxer_pause(swigCPtr, this);
}
/**
* Demuxers can only be in one of these states:
*/
public enum State {
/**
* STATE_INITED: Allocated but open has not been called yet. Transitions to STATE_OPENED when ::open(...)
* is successfully called, or STATE_ERROR if ::open(...) has an error.
*/
STATE_INITED,
/**
* STATE_OPENED: Opened and read to read or write data. Transitions to STATE_CLOSED on successful ::close(...)
* or STATE_ERROR if ::close(...) has an error.
*/
STATE_OPENED,
/**
* Some Sources can be live (i.e. in Play mode)
*/
STATE_PLAYING,
/**
* Some containers (e.g. networks) can be paused.
*/
STATE_PAUSED,
/**
* STATE_CLOSED: Container is closed and should be discarded.
*/
STATE_CLOSED,
/**
* STATE_ERROR: Container had an error and should be discarded.
*/
STATE_ERROR,
;
public final int swigValue() {
return swigValue;
}
public static State swigToEnum(int swigValue) {
State[] swigValues = State.class.getEnumConstants();
if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue)
return swigValues[swigValue];
for (State swigEnum : swigValues)
if (swigEnum.swigValue == swigValue)
return swigEnum;
throw new IllegalArgumentException("No enum " + State.class + " with value " + swigValue);
}
@SuppressWarnings("unused")
private State() {
this.swigValue = SwigNext.next++;
}
@SuppressWarnings("unused")
private State(int swigValue) {
this.swigValue = swigValue;
SwigNext.next = swigValue+1;
}
@SuppressWarnings("unused")
private State(State swigEnum) {
this.swigValue = swigEnum.swigValue;
SwigNext.next = this.swigValue+1;
}
private final int swigValue;
private static class SwigNext {
private static int next = 0;
}
}
/**
* Flags that can be bitmasked in the #seek method. If no
* flag, then key-frame-only/forward seeking is assumed.
*/
public enum SeekFlag {
/**
* Seek backwards.
*/
SEEK_BACKWARD(VideoJNI.Demuxer_SEEK_BACKWARD_get()),
/**
* Seek based on position in bytes.
*/
SEEK_BYTE(VideoJNI.Demuxer_SEEK_BYTE_get()),
/**
* Seek to any frame, even non-keyframes
*/
SEEK_ANY(VideoJNI.Demuxer_SEEK_ANY_get()),
/**
* Seek based on frame number
*/
SEEK_FRAME(VideoJNI.Demuxer_SEEK_FRAME_get()),
;
public final int swigValue() {
return swigValue;
}
public static SeekFlag swigToEnum(int swigValue) {
SeekFlag[] swigValues = SeekFlag.class.getEnumConstants();
if (swigValue < swigValues.length && swigValue >= 0 && swigValues[swigValue].swigValue == swigValue)
return swigValues[swigValue];
for (SeekFlag swigEnum : swigValues)
if (swigEnum.swigValue == swigValue)
return swigEnum;
throw new IllegalArgumentException("No enum " + SeekFlag.class + " with value " + swigValue);
}
@SuppressWarnings("unused")
private SeekFlag() {
this.swigValue = SwigNext.next++;
}
@SuppressWarnings("unused")
private SeekFlag(int swigValue) {
this.swigValue = swigValue;
SwigNext.next = swigValue+1;
}
@SuppressWarnings("unused")
private SeekFlag(SeekFlag swigEnum) {
this.swigValue = swigEnum.swigValue;
SwigNext.next = this.swigValue+1;
}
private final int swigValue;
private static class SwigNext {
private static int next = 0;
}
}
}