com.wowza.util
Class FLVUtils

Object
  extended by com.wowza.util.FLVUtils

public final class FLVUtils
extends Object

FLVUtils: utility for reading and writing .flv files.


Field Summary
static int FLV_CHUNKHEADER_BUFFERSIZE
          Size of temporary buffer needed for flv reading (byte[])
static int FLV_CHUNKHEADER_FIRSTBYTE
          Header values: first byte of packet data
static int FLV_CHUNKHEADER_HEADERSIZE
          Size of packet header (byte[])
static int FLV_CHUNKHEADER_ISIZE
          Header values: packet size
static int FLV_CHUNKHEADER_ITIMECODE
          Header values: timecode (milliseconds)
static int FLV_CHUNKHEADER_ITYPE
          Heaeder values: packet type
static int FLV_CHUNKHEADER_SECONDBYTE
          Header values: second byte of packet data
static int FLV_CHUNKHEADER_VALUESIZE
          Size of header values array (long[])
static int FLV_DFRAME
          D video frame type (partial frame based on key frame)
static int FLV_KFRAME
          Key video frame type
static int FLV_PFRAME
          P video frame type (partial frame based on previous frame)
static int FLV_TCINDEXAUDIO
           
static int FLV_TCINDEXDATA
           
static int FLV_TCINDEXVIDEO
           
static int FLV_UFRAME
          Unknown video frame type
 
Constructor Summary
FLVUtils()
           
 
Method Summary
static long adjustFirstPacketTCs(java.util.List audioTCs, java.util.List videoTCs, java.util.List dataTCs)
          Align list of timecode for each data type.
static String audioCodecToString(int codec)
          Get a printable string representation of the audio codecs defined as IVHost.CODEC_AUDIO_*
static String frameTypeToString(int frameType)
           
static int getAudioCodec(AMFPacket packet)
          Get the codec id for this audio packet.
static int getAudioCodec(int value)
          Return the codec portion of the first byte of an audio packet.
static int getFrameType(byte value)
          Given the first byte of a video packet, determine the frame type (FLV_*FRAME)
static int getFrameType(int value)
          Given the first byte of a video packet, determine the frame type (FLV_*FRAME)
static int getFrameType(int[] values)
          Given the headers values (including first byte of the packet), determine the type of video frame (FLV_*FRAME)
static long getLastTC(java.io.File file)
          Get the duration of an .flv file.
static int getVideoCodec(AMFPacket packet)
          Get the codec id for this video packet.
static int getVideoCodec(int value)
          Return the codec portion of the first byte of an video packet.
static java.util.List<AMFPacket> interleavePackets(java.util.List audioPackets, java.util.List videoPackets, java.util.List dataPackets, java.util.List audioTCs, java.util.List videoTCs, java.util.List dataTCs, java.util.List dataTypes, long[] currentTCs)
          This is a utility function primarily used for IMediaWriters.
static java.util.List interleavePackets(java.util.List audioPackets, java.util.List videoPackets, java.util.List dataPackets, java.util.List audioTCs, java.util.List videoTCs, java.util.List dataTCs, long[] currentTCs)
          This is a utility function primarily used for IMediaWriters.
static boolean isAudioCodecConfig(AMFPacket packet)
          Returns true if the packet is a video codec config packet
static boolean isVideoCodecConfig(AMFPacket packet)
          Returns true if the packet is a video codec config packet
static boolean isVideoKeyFrame(AMFPacket packet)
          Returns true if the packet is a video key frame
static boolean isVideoKeyFrame(byte[] buffer)
          Returns true if the packet is a video key frame
static boolean isVideoKeyFrame(java.nio.ByteBuffer buffer)
          Returns true if the packet is a video key frame
static boolean isVideoKeyFrame(int[] chunkHeaderValues)
          Returns true if the packet is a video key frame
static AMFPacket readChunk(java.io.DataInput is)
          Read a packets worth of .flv data from an InputStream and return as an AMFPacket
static AMFPacket readChunk(java.io.InputStream is)
          Read a packets worth of .flv data from an InputStream and return as an AMFPacket
static void readChunkHeader(java.io.RandomAccessFile is, byte[] buffer, int[] values)
          Read packet header.
static boolean readHeader(java.io.DataInput is)
          Read file header.
static boolean readHeader(java.io.InputStream is)
          Read file header.
static void readPrevChunkHeader(java.io.RandomAccessFile is, byte[] buffer, int[] values)
          Back up one packet from current position in the file and read the packet header.
static String streamCodecToString(int codec)
          Get a printable string representation of the stream codecs defined as IVHost.CODEC_STREAM_*
static AMFPacket updateOnCuePointTimecode(AMFPacket packet, long timecode)
           
static java.nio.ByteBuffer updateOnCuePointTimecode(java.nio.ByteBuffer data, int dataType, long timecode)
           
static String videoCodecToString(int codec)
          Get a printable string representation of the video codecs defined as IVHost.CODEC_VIDEO_*
static void writeChunk(java.io.DataOutput ds, java.nio.ByteBuffer data, int size, long timecode, byte type)
           
static void writeChunk(java.io.OutputStream ds, java.nio.ByteBuffer data, int size, long timecode, byte type)
          Write a packets worth of data.
static void writeDuration(java.io.File file, double duration)
          Write the duration to an existing .flv file.
static void writeHeader(java.io.OutputStream ds, double duration, int audiocodecid, int videocodecid, String createdBy, java.util.Map extraMetadata)
          Write file header including onMetaData packet.
static void writeHeader(java.io.OutputStream ds, double duration, java.util.Map extraMetadata)
          Write file header including onMetaData packet.
static void writePackets(java.io.OutputStream ds, java.util.List audioPackets, java.util.List videoPackets, java.util.List dataPackets, java.util.List audioTCs, java.util.List videoTCs, java.util.List dataTCs, java.util.List dataTypes, long[] currentTCs)
          Write a bunch of packets to .flv file all at once.
static void writePackets(java.io.OutputStream ds, java.util.List audioPackets, java.util.List videoPackets, java.util.List dataPackets, java.util.List audioTCs, java.util.List videoTCs, java.util.List dataTCs, java.util.List dataTypes, long[] currentTCs, com.wowza.util.IFLVWriterAdjustTimecode dataPacketTimecodeAdjuster)
          Write a bunch of packets to .flv file all at once.
static void writePackets(java.io.OutputStream ds, java.util.List audioPackets, java.util.List videoPackets, java.util.List dataPackets, java.util.List audioTCs, java.util.List videoTCs, java.util.List dataTCs, long[] currentTCs)
          Write a bunch of packets to .flv file all at once.
static void writePackets(java.io.OutputStream ds, java.util.List packetList, long tcOffset)
          Write audio/video/data packets to an .flv file.
static void writeShortHeader(java.io.DataOutput ds)
           
static void writeShortHeader(java.io.OutputStream ds)
          Write just the FLV file header (without the metadata packet)
 
Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

FLV_CHUNKHEADER_BUFFERSIZE

public static final int FLV_CHUNKHEADER_BUFFERSIZE
Size of temporary buffer needed for flv reading (byte[])

See Also:
Constant Field Values

FLV_CHUNKHEADER_FIRSTBYTE

public static final int FLV_CHUNKHEADER_FIRSTBYTE
Header values: first byte of packet data

See Also:
Constant Field Values

FLV_CHUNKHEADER_HEADERSIZE

public static final int FLV_CHUNKHEADER_HEADERSIZE
Size of packet header (byte[])

See Also:
Constant Field Values

FLV_CHUNKHEADER_ISIZE

public static final int FLV_CHUNKHEADER_ISIZE
Header values: packet size

See Also:
Constant Field Values

FLV_CHUNKHEADER_ITIMECODE

public static final int FLV_CHUNKHEADER_ITIMECODE
Header values: timecode (milliseconds)

See Also:
Constant Field Values

FLV_CHUNKHEADER_ITYPE

public static final int FLV_CHUNKHEADER_ITYPE
Heaeder values: packet type

See Also:
Constant Field Values

FLV_CHUNKHEADER_SECONDBYTE

public static final int FLV_CHUNKHEADER_SECONDBYTE
Header values: second byte of packet data

See Also:
Constant Field Values

FLV_CHUNKHEADER_VALUESIZE

public static final int FLV_CHUNKHEADER_VALUESIZE
Size of header values array (long[])

See Also:
Constant Field Values

FLV_DFRAME

public static final int FLV_DFRAME
D video frame type (partial frame based on key frame)

See Also:
Constant Field Values

FLV_KFRAME

public static final int FLV_KFRAME
Key video frame type

See Also:
Constant Field Values

FLV_PFRAME

public static final int FLV_PFRAME
P video frame type (partial frame based on previous frame)

See Also:
Constant Field Values

FLV_TCINDEXAUDIO

public static final int FLV_TCINDEXAUDIO
See Also:
Constant Field Values

FLV_TCINDEXDATA

public static final int FLV_TCINDEXDATA
See Also:
Constant Field Values

FLV_TCINDEXVIDEO

public static final int FLV_TCINDEXVIDEO
See Also:
Constant Field Values

FLV_UFRAME

public static final int FLV_UFRAME
Unknown video frame type

See Also:
Constant Field Values
Constructor Detail

FLVUtils

public FLVUtils()
Method Detail

adjustFirstPacketTCs

public static long adjustFirstPacketTCs(java.util.List audioTCs,
                                        java.util.List videoTCs,
                                        java.util.List dataTCs)
Align list of timecode for each data type. Assume first entry in each list is absolute timecode. When done lowest entry in three lists will be zero and other lists will be offset accordingly.

Parameters:
audioTCs - list of audio timecodes
videoTCs - list of video timecodes
dataTCs - list of data timecodes
Returns:
lowest of three absolute timecodes

audioCodecToString

public static String audioCodecToString(int codec)
Get a printable string representation of the audio codecs defined as IVHost.CODEC_AUDIO_*

Parameters:
codec - codec id defined IVHost.CODEC_AUDIO_*
Returns:
codec name

frameTypeToString

public static String frameTypeToString(int frameType)

getAudioCodec

public static int getAudioCodec(AMFPacket packet)
Get the codec id for this audio packet. Returns IVHost.CODEC_AUDIO_UNKNOWN is unknown or not audio packet

Parameters:
packet - packet
Returns:
codec id IVHost.CODEC_AUDIO_*

getAudioCodec

public static int getAudioCodec(int value)
Return the codec portion of the first byte of an audio packet. Return should be one of IVHost.CODEC_AUDIO_*

Parameters:
value - first byte of audio packet
Returns:
codec id

getFrameType

public static int getFrameType(byte value)
Given the first byte of a video packet, determine the frame type (FLV_*FRAME)

Parameters:
value - first byte of packet
Returns:
type of video frame (FLV_*FRAME)

getFrameType

public static int getFrameType(int value)
Given the first byte of a video packet, determine the frame type (FLV_*FRAME)

Parameters:
value - first byte of packet
Returns:
type of video frame (FLV_*FRAME)

getFrameType

public static int getFrameType(int[] values)
Given the headers values (including first byte of the packet), determine the type of video frame (FLV_*FRAME)

Parameters:
values - header values
Returns:
type of video frame (FLV_*FRAME)

getLastTC

public static long getLastTC(java.io.File file)
Get the duration of an .flv file. This routine will find the onMetaData packet and the duration metadata and return the value. If not found it will read the last packet in the file and return the timecode of that packet.

Parameters:
file -
Returns:
duration (milliseconds)

getVideoCodec

public static int getVideoCodec(AMFPacket packet)
Get the codec id for this video packet. Returns IVHost.CODEC_VIDEO_UNKNOWN is unknown or not video packet

Parameters:
packet - packet
Returns:
codec id IVHost.CODEC_VIDEO_*

getVideoCodec

public static int getVideoCodec(int value)
Return the codec portion of the first byte of an video packet. Return should be one of IVHost.CODEC_VIDEO_*

Parameters:
value - first byte of audio packet
Returns:
codec id

interleavePackets

public static java.util.List<AMFPacket> interleavePackets(java.util.List audioPackets,
                                                          java.util.List videoPackets,
                                                          java.util.List dataPackets,
                                                          java.util.List audioTCs,
                                                          java.util.List videoTCs,
                                                          java.util.List dataTCs,
                                                          java.util.List dataTypes,
                                                          long[] currentTCs)
This is a utility function primarily used for IMediaWriters. It is a way of taking the discrete audio/video/data packets and timecodes and interleaving them into a single list of AMFPacket objects. The currentTCs array is an array of longs containing the last timecode for each of the packet types FLV_TCINDEX* (long[3]). This array will be used to calculate the absolute timecode for a given packet. For example if the relative timecode for an audio packet is 26 and the currentTCs value for the audio channel is 1003 then the absolute timecode for that packet will be 1029. The currentTCs array will be updated after this call to reflect the absolute timecode of the last packet processed of each type.

Parameters:
audioPackets - list of audio packets (ByteBuffer)
videoPackets - list of video packets (ByteBuffer)
dataPackets - list of data packets (ByteBuffer)
audioTCs - list of relative audio timecodes (Long)
videoTCs - list of relative video timecodes (Long)
dataTCs - list of relative data timecodes (Long)
dataTypes - list of integer packets types (IVHost.CONTENTTYPE_DATA0, IVHost.CONTENTTYPE_DATA3) - if null assumed to be IVHost.CONTENTTYPE_DATA0
currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned in this same array.
Returns:
List of AMFPacket objects sorted by timecodes

interleavePackets

public static java.util.List interleavePackets(java.util.List audioPackets,
                                               java.util.List videoPackets,
                                               java.util.List dataPackets,
                                               java.util.List audioTCs,
                                               java.util.List videoTCs,
                                               java.util.List dataTCs,
                                               long[] currentTCs)
This is a utility function primarily used for IMediaWriters. It is a way of taking the discrete audio/video/data packets and timecodes and interleaving them into a single list of AMFPacket objects. The currentTCs array is an array of longs containing the last timecode for each of the packet types FLV_TCINDEX* (long[3]). This array will be used to calculate the absolute timecode for a given packet. For example if the relative timecode for an audio packet is 26 and the currentTCs value for the audio channel is 1003 then the absolute timecode for that packet will be 1029. The currentTCs array will be updated after this call to reflect the absolute timecode of the last packet processed of each type.

Parameters:
audioPackets - list of audio packets (ByteBuffer)
videoPackets - list of video packets (ByteBuffer)
dataPackets - list of data packets (ByteBuffer)
audioTCs - list of relative audio timecodes (Long)
videoTCs - list of relative video timecodes (Long)
dataTCs - list of relative data timecodes (Long)
currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned in this same array.
Returns:
List of AMFPacket objects sorted by timecodes

isAudioCodecConfig

public static boolean isAudioCodecConfig(AMFPacket packet)
Returns true if the packet is a video codec config packet

Parameters:
packet -
Returns:
true if the packet is a video codec config packet

isVideoCodecConfig

public static boolean isVideoCodecConfig(AMFPacket packet)
Returns true if the packet is a video codec config packet

Parameters:
packet -
Returns:
true if the packet is a video codec config packet

isVideoKeyFrame

public static boolean isVideoKeyFrame(AMFPacket packet)
Returns true if the packet is a video key frame

Parameters:
packet - packet
Returns:
true if is video key frame

isVideoKeyFrame

public static boolean isVideoKeyFrame(byte[] buffer)
Returns true if the packet is a video key frame

Parameters:
buffer - packet data (only need first two bytes of data)
Returns:
true if is video key frame

isVideoKeyFrame

public static boolean isVideoKeyFrame(java.nio.ByteBuffer buffer)
Returns true if the packet is a video key frame

Parameters:
buffer - packet data (only need first two bytes of data)
Returns:
true if is video key frame

isVideoKeyFrame

public static boolean isVideoKeyFrame(int[] chunkHeaderValues)
Returns true if the packet is a video key frame

Parameters:
chunkHeaderValues - chunk header values returned by FLVUtils.readChunkHeader
Returns:
true if is video key frame

readChunk

public static AMFPacket readChunk(java.io.DataInput is)
Read a packets worth of .flv data from an InputStream and return as an AMFPacket

Parameters:
is - InputStream
Returns:
AMFPacket of data or null if unsuccessful or end of file

readChunk

public static AMFPacket readChunk(java.io.InputStream is)
Read a packets worth of .flv data from an InputStream and return as an AMFPacket

Parameters:
is - InputStream
Returns:
AMFPacket of data or null if unsuccessful or end of file

readChunkHeader

public static void readChunkHeader(java.io.RandomAccessFile is,
                                   byte[] buffer,
                                   int[] values)
Read packet header. This includes reading the first byte of the packet data. The file pointer will be positioned at the first byte of the packet data. values[FLV_CHUNKHEADER_ITYPE] will be set to 0x7f if failure or end of file.

Parameters:
is - RandomAccessFile
buffer - temporary buffer byte[FLV_CHUNKHEADER_BUFFERSIZE]
values - header values long[FLV_CHUNKHEADER_VALUESIZE]

readHeader

public static boolean readHeader(java.io.DataInput is)
Read file header. Return true if successful. Basically this just skips first 13 bytes in file.


readHeader

public static boolean readHeader(java.io.InputStream is)
Read file header. Return true if successful. Basically this just skips first 13 bytes in file.


readPrevChunkHeader

public static void readPrevChunkHeader(java.io.RandomAccessFile is,
                                       byte[] buffer,
                                       int[] values)
Back up one packet from current position in the file and read the packet header. This includes reading the first byte of the packet data. The file pointer will be positioned at the first byte of the packet data. values[FLV_CHUNKHEADER_ITYPE] will be set to 0x7f if failure or start of file.

Parameters:
is - RandomAccessFile
buffer - temporary buffer byte[FLV_CHUNKHEADER_BUFFERSIZE]
values - header values long[FLV_CHUNKHEADER_VALUESIZE]

streamCodecToString

public static String streamCodecToString(int codec)
Get a printable string representation of the stream codecs defined as IVHost.CODEC_STREAM_*

Parameters:
codec - codec id defined IVHost.CODEC_STREAM_*
Returns:
codec name

updateOnCuePointTimecode

public static AMFPacket updateOnCuePointTimecode(AMFPacket packet,
                                                 long timecode)

updateOnCuePointTimecode

public static java.nio.ByteBuffer updateOnCuePointTimecode(java.nio.ByteBuffer data,
                                                           int dataType,
                                                           long timecode)

videoCodecToString

public static String videoCodecToString(int codec)
Get a printable string representation of the video codecs defined as IVHost.CODEC_VIDEO_*

Parameters:
codec - codec id defined IVHost.CODEC_VIDEO_*
Returns:
codec name

writeChunk

public static void writeChunk(java.io.DataOutput ds,
                              java.nio.ByteBuffer data,
                              int size,
                              long timecode,
                              byte type)

writeChunk

public static void writeChunk(java.io.OutputStream ds,
                              java.nio.ByteBuffer data,
                              int size,
                              long timecode,
                              byte type)
Write a packets worth of data.

Parameters:
ds - OutputStream
data - packet data
size - size of the packet
timecode - timecode (milliseconds)
type - type of packet IVHost.CONTENTTYPE_*

writeDuration

public static void writeDuration(java.io.File file,
                                 double duration)
Write the duration to an existing .flv file. This routine will hunt through the .flv file for the onMetaData packet and the duration metadata. It will rewrite the value if found. If not found it will do nothing.

Parameters:
file - .flv file
duration - new duration value (seconds)

writeHeader

public static void writeHeader(java.io.OutputStream ds,
                               double duration,
                               int audiocodecid,
                               int videocodecid,
                               String createdBy,
                               java.util.Map extraMetadata)

Write file header including onMetaData packet.

With this method you can provide a Map of metadata to write to the file. This map can include a mixture of simple types like: int, long, String, boolean. These types will be wrapped in AMFData classes before they are written to the file. This map can also contain AMFData items. For example if you wanted to insert and array of cuePoints the code would look like:

Map extraMetadata = new HashMap();

AMFDataArray amfArray = new AMFDataArray();
for(int i=0;i

Parameters:
ds - OutputStream
duration - duration of .flv file in seconds
audiocodecid - audio codec ID see IVHost.CODEC_AUDIO_* (-1 for now audio)
videocodecid - video codec ID see IVHost.CODEC_VIDEO_* (-1 for now video)
createdBy - created by string (null for empty)
extraMetadata - Map of name/value pairs of metadata that will be appended to the onMetaData block

writeHeader

public static void writeHeader(java.io.OutputStream ds,
                               double duration,
                               java.util.Map extraMetadata)
Write file header including onMetaData packet.

Parameters:
ds - OutputStream
duration - duration of .flv file in seconds
extraMetadata - Map of name/value pairs of metadata that will be appended to the onMetaData block

writePackets

public static void writePackets(java.io.OutputStream ds,
                                java.util.List audioPackets,
                                java.util.List videoPackets,
                                java.util.List dataPackets,
                                java.util.List audioTCs,
                                java.util.List videoTCs,
                                java.util.List dataTCs,
                                java.util.List dataTypes,
                                long[] currentTCs)
Write a bunch of packets to .flv file all at once. The packets will be sorted by timecode as written

Parameters:
ds - OutputStream
audioPackets - list of audio packets (ByteBuffer)
videoPackets - list of video packets (ByteBuffer)
dataPackets - list of data packets (ByteBuffer)
audioTCs - list of relative audio timecodes (Long)
videoTCs - list of relative video timecodes (Long)
dataTCs - list of relative data timecodes (Long)
dataTypes - list of integer packets types (IVHost.CONTENTTYPE_DATA0, IVHost.CONTENTTYPE_DATA3) - if null assumed to be IVHost.CONTENTTYPE_DATA0
currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned in this same array.

writePackets

public static void writePackets(java.io.OutputStream ds,
                                java.util.List audioPackets,
                                java.util.List videoPackets,
                                java.util.List dataPackets,
                                java.util.List audioTCs,
                                java.util.List videoTCs,
                                java.util.List dataTCs,
                                java.util.List dataTypes,
                                long[] currentTCs,
                                com.wowza.util.IFLVWriterAdjustTimecode dataPacketTimecodeAdjuster)
Write a bunch of packets to .flv file all at once. The packets will be sorted by timecode as written

Parameters:
ds - OutputStream
audioPackets - list of audio packets (ByteBuffer)
videoPackets - list of video packets (ByteBuffer)
dataPackets - list of data packets (ByteBuffer)
audioTCs - list of relative audio timecodes (Long)
videoTCs - list of relative video timecodes (Long)
dataTCs - list of relative data timecodes (Long)
dataTypes - list of integer packets types (IVHost.CONTENTTYPE_DATA0, IVHost.CONTENTTYPE_DATA3) - if null assumed to be IVHost.CONTENTTYPE_DATA0
currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned
dataPacketTimecodeAdjuster - class that implements the IFLVWriterAdjustTimecode interface for adjusting timecodes in this same array.

writePackets

public static void writePackets(java.io.OutputStream ds,
                                java.util.List audioPackets,
                                java.util.List videoPackets,
                                java.util.List dataPackets,
                                java.util.List audioTCs,
                                java.util.List videoTCs,
                                java.util.List dataTCs,
                                long[] currentTCs)
Write a bunch of packets to .flv file all at once. The packets will be sorted by timecode as written

Parameters:
ds - OutputStream
audioPackets - list of audio packets (ByteBuffer)
videoPackets - list of video packets (ByteBuffer)
dataPackets - list of data packets (ByteBuffer)
audioTCs - list of relative audio timecodes (Long)
videoTCs - list of relative video timecodes (Long)
dataTCs - list of relative data timecodes (Long)
currentTCs - array of longs containing last TCs written for each packet type FLV_TCINDEX* (long[3]). Last timecode written for each packet type wil be returned in this same array.

writePackets

public static void writePackets(java.io.OutputStream ds,
                                java.util.List packetList,
                                long tcOffset)
Write audio/video/data packets to an .flv file. They will be written in the packetList order.

Parameters:
ds - OutputStream
packetList - List of AMFPacket objects
tcOffset - timecode offset

writeShortHeader

public static void writeShortHeader(java.io.DataOutput ds)

writeShortHeader

public static void writeShortHeader(java.io.OutputStream ds)
Write just the FLV file header (without the metadata packet)

Parameters:
ds - OutputStream