org.red5.io.mp4.impl

## Class MP4Reader

- java.lang.Object
- - org.red5.io.mp4.impl.MP4Reader

All Implemented Interfaces:
  IKeyFrameDataAnalyzer, IoConstants, ITagReader

    public class MP4Reader
    extends Object
    implements IoConstants, ITagReader, IKeyFrameDataAnalyzer

This reader is used to read the contents of an MP4 file. NOTE: This class is not implemented as thread-safe, the caller should ensure the thread-safety.

New NetStream notifications
Two new notifications facilitate the implementation of the playback components:

- NetStream.Play.FileStructureInvalid: This event is sent if the player detects an MP4 with an invalid file structure. Flash Player cannot play files that have invalid file structures.
- NetStream.Play.NoSupportedTrackFound: This event is sent if the player does not detect any supported tracks. If there aren't any supported video, audio or data tracks found, Flash Player does not play the file.

Author:
  The Red5 Project (red5@osflash.org), Paul Gregoire (mondain@gmail.com)

### Nested Class Summary

### Nested classes/interfaces inherited from interface org.red5.io.flv.IKeyFrameDataAnalyzer

`IKeyFrameDataAnalyzer.KeyFrameMeta`

### Field Summary

Fields
`static byte[]` `EMPTY_AAC` Blank AAC data
`static byte[]` `PREFIX_AUDIO_FRAME` Audio packet prefix
`static byte[]` `PREFIX_VIDEO_CONFIG_FRAME` Video packet prefix for the decoder frame
`static byte[]` `PREFIX_VIDEO_FRAME` Video packet prefix for standard frames (interframe)
`static byte[]` `PREFIX_VIDEO_KEYFRAME` Video packet prefix for key frames

### Fields inherited from interface org.red5.io.IoConstants

`AVC_PACKET_TYPE_END_OF_SEQUENCE, AVC_PACKET_TYPE_NALU, AVC_PACKET_TYPE_SEQUENCE_HEADER, FLAG_CODEC_H263, FLAG_CODEC_SCREEN, FLAG_CODEC_VP6, FLAG_FORMAT_ADPCM, FLAG_FORMAT_MP3, FLAG_FORMAT_NELLYMOSER, FLAG_FORMAT_NELLYMOSER_8_KHZ, FLAG_FORMAT_RAW, FLAG_FRAMETYPE_DISPOSABLE, FLAG_FRAMETYPE_GENERATED_KEYFRAME, FLAG_FRAMETYPE_INFO, FLAG_FRAMETYPE_INTERFRAME, FLAG_FRAMETYPE_KEYFRAME, FLAG_RATE_11_KHZ, FLAG_RATE_22_KHZ, FLAG_RATE_44_KHZ, FLAG_RATE_48_KHZ, FLAG_RATE_5_5_KHZ, FLAG_SIZE_16_BIT, FLAG_SIZE_8_BIT, FLAG_TYPE_MONO, FLAG_TYPE_STEREO, INFO_PACKET_SEEK_END, INFO_PACKET_SEEK_START, MASK_SOUND_FORMAT, MASK_SOUND_RATE, MASK_SOUND_SIZE, MASK_SOUND_TYPE, MASK_VIDEO_CODEC, MASK_VIDEO_FRAMETYPE, TYPE_AUDIO, TYPE_ENCRYPTED, TYPE_ENCRYPTED_AUDIO, TYPE_ENCRYPTED_METADATA, TYPE_ENCRYPTED_VIDEO, TYPE_METADATA, TYPE_VIDEO`

### Constructor Summary

Constructors
Constructor and Description
`MP4Reader(File f)` Creates MP4 reader from file input stream, sets up metadata generation flag.

### Method Summary

Methods
`void` `analyzeFrames()` Performs frame analysis and generates metadata for use in seeking.
`IKeyFrameDataAnalyzer.KeyFrameMeta` `analyzeKeyFrames()` Analyze and return keyframe metadata.
`void` `close()` Closes the reader and free any allocated memory.
`void` `decodeHeader()` This handles the moov atom being at the beginning or end of the file, so the mdat may also be before or after the moov atom.
`String` `getAudioCodecId()`
`long` `getBytesRead()` Returns the amount of bytes read
`long` `getDuration()` Return length in seconds
`IStreamableFile` `getFile()` Return the file that is loaded.
`org.apache.mina.core.buffer.IoBuffer` `getFileData()` Returns the file buffer.
`int` `getOffset()` Returns the offet length
`long` `getTotalBytes()` Get the total readable bytes in a file or IoBuffer.
`String` `getVideoCodecId()`
`boolean` `hasMoreTags()` Returns a boolean stating whether the FLV has more tags
`boolean` `hasVideo()` Check if the reader also has video tags.
`void` `position(long pos)` Put the current position to pos.
`ITag` `readTag()` Packages media data for return to providers
`ITag` `readTagHeader()`
`void` `setAudioCodecId(String audioCodecId)`
`void` `setVideoCodecId(String videoCodecId)`

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Field Detail

#### PREFIX_AUDIO_FRAME

    public static final byte[] PREFIX_AUDIO_FRAME

Audio packet prefix

#### EMPTY_AAC

    public static final byte[] EMPTY_AAC

Blank AAC data

#### PREFIX_VIDEO_CONFIG_FRAME

    public static final byte[] PREFIX_VIDEO_CONFIG_FRAME

Video packet prefix for the decoder frame

#### PREFIX_VIDEO_KEYFRAME

    public static final byte[] PREFIX_VIDEO_KEYFRAME

Video packet prefix for key frames

#### PREFIX_VIDEO_FRAME

    public static final byte[] PREFIX_VIDEO_FRAME

Video packet prefix for standard frames (interframe)

### Constructor Detail

#### MP4Reader

    public MP4Reader(File f)
              throws IOException

Creates MP4 reader from file input stream, sets up metadata generation flag.

Parameters:
  `f` - File input stream
Throws:
  `IOException`

### Method Detail

#### decodeHeader

    public void decodeHeader()

This handles the moov atom being at the beginning or end of the file, so the mdat may also be before or after the moov atom.

Specified by:
  `decodeHeader` in interface `ITagReader`

#### getTotalBytes

    public long getTotalBytes()

Get the total readable bytes in a file or IoBuffer.

Specified by:
  `getTotalBytes` in interface `ITagReader`
Returns:
  Total readable bytes

#### hasVideo

    public boolean hasVideo()

Check if the reader also has video tags.

Specified by:
  `hasVideo` in interface `ITagReader`
Returns:
  has video

#### getFileData

    public org.apache.mina.core.buffer.IoBuffer getFileData()

Returns the file buffer.

Returns:
  File contents as byte buffer

#### getFile

    public IStreamableFile getFile()

Return the file that is loaded.

Specified by:
  `getFile` in interface `ITagReader`
Returns:
  the file to be loaded

#### getOffset

    public int getOffset()

Returns the offet length

Specified by:
  `getOffset` in interface `ITagReader`
Returns:
  int

#### getBytesRead

    public long getBytesRead()

Returns the amount of bytes read

Specified by:
  `getBytesRead` in interface `ITagReader`
Returns:
  long

#### getDuration

    public long getDuration()

Return length in seconds

Specified by:
  `getDuration` in interface `ITagReader`
Returns:
  length in seconds

#### getVideoCodecId

    public String getVideoCodecId()

#### getAudioCodecId

    public String getAudioCodecId()

#### hasMoreTags

    public boolean hasMoreTags()

Returns a boolean stating whether the FLV has more tags

Specified by:
  `hasMoreTags` in interface `ITagReader`
Returns:
  boolean

#### readTag

    public ITag readTag()

Packages media data for return to providers

Specified by:
  `readTag` in interface `ITagReader`
Returns:
  Tag

#### analyzeFrames

    public void analyzeFrames()

Performs frame analysis and generates metadata for use in seeking. All the frames are analyzed and sorted together based on time and offset.

#### position

    public void position(long pos)

Put the current position to pos. The caller must ensure the pos is a valid one.

Specified by:
  `position` in interface `ITagReader`
Parameters:
  `pos` - position to move to in file / channel

#### close

    public void close()

Closes the reader and free any allocated memory.

Specified by:
  `close` in interface `ITagReader`

#### setVideoCodecId

    public void setVideoCodecId(String videoCodecId)

#### setAudioCodecId

    public void setAudioCodecId(String audioCodecId)

#### readTagHeader

    public ITag readTagHeader()

#### analyzeKeyFrames

    public IKeyFrameDataAnalyzer.KeyFrameMeta analyzeKeyFrames()

Description copied from interface: `IKeyFrameDataAnalyzer`
Analyze and return keyframe metadata.

Specified by:
  `analyzeKeyFrames` in interface `IKeyFrameDataAnalyzer`
Returns:
  Metadata object