Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
IMAAudioRTP/RTPRssmIMAAudio/Headers/IMAAudioPayload.h
/* |
File: IMAAudioPayload.h |
Contains: Declaration of IMAAudioPayload datatype and its operations |
Copyright: © 1997-1999 by Apple Computer Inc. all rights reserved. |
X-Sample-IMA-ADPCM-4-1-v0 Payload |
----------------------------------------------------------------- |
RTP clock rate: 55125 Hz |
220500 Hz is the least common mutiple of the frame rates |
(sample rate divided by samples per frame) this payload |
format uses. At this clock rate, the duration of a frame at |
any sample rate would be an exact integer number of clock |
cycles. This frequency is somewhat high, though, given the |
available timestamp precision. But removing two factors of |
2, yielding 55125 Hz, gives a reasonable clock rate and still |
allows for integer durations using multiples of, at worst, |
four (i.e., two factors of 2) frames. |
Payload Format: |
1 |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 |
+-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+ |
| SR | CC | IC | IX | IT | |
+-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+ |
: Audio Data : |
+-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+ |
SR - 4 bits |
RFC 1890 recommended sample rate as follows: |
0 = 8000 Hz |
1 = 11025 |
2 = 16000 |
3 = 22050 |
4 = 24000 |
5 = 32000 |
6 = 44100 |
7 = 48000 |
8-15 - reserved |
Although this payload encoding uses the sample rates |
recommended by RFC 1890, other payload encodings are not |
restricted to these rates. An encoding may use any sample |
rates it requires. |
CC - 3 bits |
One less than the channel count. That is, 0 = mono, |
1 = stereo, 2 = 3 channels, etc. |
IC - 3 bits |
One less than the count of network packets in the current |
interleave group. |
IX - 3 bits |
Interleave index. Position, from zero to IC, of this network |
packet in the current interleave group. |
IT - 3 bits |
Interleave tail. Interleave index (IX) of the network packet |
that contains the last frame of data in the current |
interleave group. |
Audio Data - 1 or more 34-octet frames |
IMA 4:1 ADPCM encoded audio data. The total frame count in |
an interleave group is a multiple of the channel count |
(i.e., CC + 1). |
E X A M P L E |
----------------------------------------------------------------- |
Deriving the first interleave group for the described audio data |
according to the given user settings: |
Audio Data |
Sample rate = 11025 Hz |
Channels = 2 |
Length = 2000 frames |
Start time = 3 seconds |
Duration = 5.805 seconds (1000 frames) |
+------+------+------+------+------+ +------+------+------+ |
| L0 | R0 | L1 | R1 | L2 |...| R998 | L999 | R999 | |
+------+------+------+------+------+ +------+------+------+ |
User Settings |
Interleaving = 3 |
Packet length limit = 1460 bytes (header and 42 frames) |
Packet duration limit = 100 ms (17 frames) |
Interleave Group 1 |
Timestamp = 165375 (55125 Hz x 3 seconds) |
Length = 50 frames (17 x 3 packets rounded to 2-channel multiple) |
Packet 1 Packet 2 Packet 3 |
Timestamp = 165375 Timestamp = 165375 Timestamp = 165375 |
Length = 17 fr Length = 17 fr Length = 16 fr |
Duration = 0 Duration = 0 Duration = 8000 (25 fr) |
Header: Header: Header: |
SR = 1 SR = 1 SR = 1 |
CC = 1 CC = 1 CC = 1 |
IC = 2 IC = 2 IC = 2 |
IX = 0 IX = 1 IX = 2 |
IT = 1 IT = 1 IT = 1 |
Data: Data: Data: |
+------+ +------+ +------+ |
| L0 | | R0 | | L1 | |
+------+ +------+ +------+ |
| R1 | | L2 | : : |
+------+ +------+ : : |
: : : : : : |
: : : : +------+ |
: : : : | R23 | |
+------+ +------+ +------+ |
| L24 | | R24 | |
+------+ +------+ |
*/ |
#ifndef __COMPONENTVIDEOPAYLOAD__ |
#define __COMPONENTVIDEOPAYLOAD__ |
/* --------------------------------------------------------------------------- |
* H E A D E R S |
* --------------------------------------------------------------------------- |
*/ |
#include <MacTypes.h> |
/* --------------------------------------------------------------------------- |
* M A C R O S |
* --------------------------------------------------------------------------- |
*/ |
#ifndef REZ |
# if __cplusplus |
# define C_CAST( aType ) ( aType ) |
# define REINTERPRET_CAST( aType ) reinterpret_cast< aType > |
# define STATIC_CAST( aType ) static_cast< aType > |
# define CONST_CAST( aType ) const_cast< aType > |
# else |
# define __CAST( anExpression ) ( anExpression ) |
# define C_CAST( aType ) ( aType ) __CAST |
# define REINTERPRET_CAST( aType ) C_CAST( aType ) |
# define STATIC_CAST( aType ) C_CAST( aType ) |
# define CONST_CAST( aType ) C_CAST( aType ) |
# endif /* __cplusplus */ |
#endif /* REZ */ |
/* --------------------------------------------------------------------------- |
* C O N S T A N T S |
* --------------------------------------------------------------------------- |
*/ |
enum |
{ |
kIMAAudioPayloadRTPTimeScale = 55125UL |
}; |
enum |
{ |
kIMAAudioPayloadFixedHeaderWordCount = 1 |
}; |
enum |
{ |
kIMAAudioPayloadFrameSampleCount = 64UL, |
kIMAAudioPayloadWordSampleCount = 4, |
kIMAAudioPayloadInterleaveCountLimit = 8 |
}; |
/* --------------------------------------------------------------------------- |
* D A T A T Y P E S |
* --------------------------------------------------------------------------- |
* |
* The IMAAudioPayload structure represents the payload format defined |
* above. Unfortunately, the position of bit fields in C data structures is |
* implementation-dependent, so the data structure cannot declare individual |
* fields of the payload format. |
* |
*/ |
typedef struct |
{ |
UInt16 itsPredictor; |
UInt16 itsAudioData[ |
kIMAAudioPayloadFrameSampleCount / kIMAAudioPayloadWordSampleCount ]; |
} IMAAudioFrame; |
typedef struct |
{ |
UInt16 itsFixedHeader[ kIMAAudioPayloadFixedHeaderWordCount ]; |
IMAAudioFrame itsAudioFrames[ 1 ]; |
} IMAAudioPayload; |
/* --------------------------------------------------------------------------- |
* P R O T O T Y P E S |
* --------------------------------------------------------------------------- |
* |
* These functions get and set fields of the IMAAudioPayload. Some functions |
* use values that differ from the representation encoded in the payload: |
* |
* IMAAudioPayloadChannelCountLimit() |
* IMAAudioPayloadSetChannelCount() |
* IMAAudioPayloadChannelCount() These functions expect or return |
* actual count of channels, not one |
* less than the channel count. |
* |
* IMAAudioPayloadSetSampleRate() |
* IMAAudioPayloadSampleRate() These functions expect or return |
* actual UnsignedFixed sample rates, |
* not symbolic constants. |
* IMAAudioPayloadSetSampleRate() |
* returns the rate actually encoded, |
* which might differ from the rate |
* given. |
* |
* IMAAudioPayloadSetInterleaving() |
* IMAAudioPayloadInterleaveCount() These functions expect or return |
* actual count of interleaved |
* packets, not one less than the |
* interleave count. |
*/ |
UInt32 |
IMAAudioPayloadChannelCountLimit( |
void ); |
UInt32 |
IMAAudioPayloadInterleaveCountLimit( |
void ); |
IMAAudioPayload * |
IMAAudioPayloadInitialize( |
IMAAudioPayload * inPayload ); |
UInt32 |
IMAAudioPayloadSetChannelCount( |
IMAAudioPayload * inPayload, |
UInt32 inChannelCount ); |
UnsignedFixed |
IMAAudioPayloadSetSampleRate( |
IMAAudioPayload * inPayload, |
UnsignedFixed inSampleRate ); |
UInt32 |
IMAAudioPayloadSetInterleaving( |
IMAAudioPayload * inPayload, |
UInt32 inInterleaveCount, |
UInt32 inInterleaveGroupFrameCount ); |
UInt32 |
IMAAudioPayloadIncrementInterleaveIndex( |
IMAAudioPayload * inPayload ); |
UInt32 |
IMAAudioPayloadChannelCount( |
const IMAAudioPayload * inPayload ); |
UnsignedFixed |
IMAAudioPayloadSampleRate( |
const IMAAudioPayload * inPayload ); |
UInt32 |
IMAAudioPayloadInterleaveCount( |
const IMAAudioPayload * inPayload ); |
UInt32 |
IMAAudioPayloadInterleaveIndex( |
const IMAAudioPayload * inPayload ); |
UInt32 |
IMAAudioPayloadInterleaveTail( |
const IMAAudioPayload * inPayload ); |
#endif /* __COMPONENTVIDEOPAYLOAD__ */ |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14