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.
ComponentVideoRTP/RTPMPComponentVideo/Sources/ComponentVideoPayload.c
/* |
File: ComponentVideoPayload.c |
Contains: Definition of ComponentVideoPayload operations |
Copyright: © 1997-1999 by Apple Computer, Inc., all rights reserved. |
*/ |
#include "ComponentVideoPayload.h" |
#include <Endian.h> |
#include <string.h> |
enum /* fixed header fields */ |
{ |
__kDescriptionFlagWord = 0, |
__kDescriptionFlagPosition = 31, |
__kDescriptionFlagSize = 1, |
__kDescriptionSeedWord = 0, |
__kDescriptionSeedPosition = 0, |
__kDescriptionSeedSize = 31, |
__kOffsetWord = 1, |
__kOffsetPosition = 4, |
__kOffsetSize = 28 |
}; |
enum /* payload description fields */ |
{ |
__kWidthWord = 0, |
__kWidthPosition = 15, |
__kWidthSize = 15, |
__kHeightWord = 0, |
__kHeightPosition = 0, |
__kHeightSize = 15 |
}; |
static |
UInt32 |
__SetBitField( |
UInt32 * inStorageUnit, |
UInt32 inPosition, |
UInt32 inSize, |
UInt32 inValue ) |
{ |
UInt32 theMask = ( ( 1UL << inSize ) - 1 ) << inPosition; |
*inStorageUnit = |
EndianU32_NtoB( |
( EndianU32_BtoN( *inStorageUnit ) & ( ~theMask ) ) | |
( theMask & ( inValue << inPosition ) ) ); |
return( inValue & ( theMask >> inPosition ) ); |
} |
static |
UInt32 |
__BitField( |
const UInt32 * inStorageUnit, |
UInt32 inPosition, |
UInt32 inSize ) |
{ |
return( ( EndianU32_BtoN( *inStorageUnit ) >> inPosition ) & ( ( 1UL << inSize ) - 1 ) ); |
} |
UInt32 |
ComponentVideoPayloadDescriptionSeedLimit( |
void ) |
{ |
return( ( 1UL << __kDescriptionSeedSize ) - 1 ); |
} |
ComponentVideoPayload * |
ComponentVideoPayloadInitialize( |
ComponentVideoPayload * inPayload, |
UInt16 inWidth, |
UInt16 inHeight ) |
{ |
memset( inPayload, 0, sizeof( *inPayload ) ); |
ComponentVideoPayloadSetDescription( inPayload, inWidth, inHeight ); |
return( inPayload ); |
} |
UInt32 |
ComponentVideoPayloadSetOffset( |
ComponentVideoPayload * inPayload, |
UInt32 inOffset ) |
{ |
UInt32 theResult; |
theResult = |
__SetBitField( |
&inPayload->itsFixedHeader[ __kOffsetWord ], __kOffsetPosition, __kOffsetSize, |
inOffset >> 2 ) << 2; |
return( theResult ); |
} |
UInt32 |
ComponentVideoPayloadSetDescription( |
ComponentVideoPayload * inPayload, |
UInt16 inWidth, |
UInt16 inHeight ) |
{ |
UInt32 theResult; |
theResult = ComponentVideoPayloadDescriptionSeed( inPayload ); |
if( inWidth && inHeight ) |
{ |
if( |
inWidth != ComponentVideoPayloadWidth( inPayload ) || |
inHeight != ComponentVideoPayloadHeight( inPayload ) ) |
{ |
theResult = |
__SetBitField( |
&inPayload->itsFixedHeader[ __kDescriptionSeedWord ], |
__kDescriptionSeedPosition, __kDescriptionSeedSize, theResult + 1 ); |
__SetBitField( |
&inPayload->itsDescription[ __kWidthWord ], __kWidthPosition, __kWidthSize, |
inWidth ); |
__SetBitField( |
&inPayload->itsDescription[ __kHeightWord ], __kHeightPosition, |
__kHeightSize, inHeight ); |
} |
} |
__SetBitField( |
&inPayload->itsFixedHeader[ __kDescriptionFlagWord ], __kDescriptionFlagPosition, |
__kDescriptionFlagSize, inWidth && inHeight ); |
return( theResult ); |
} |
UInt32 |
ComponentVideoPayloadCopyDescription( |
ComponentVideoPayload * inTargetPayload, |
const ComponentVideoPayload * inSourcePayload ) |
{ |
UInt32 theResult; |
__SetBitField( |
&inTargetPayload->itsFixedHeader[ __kDescriptionFlagWord ], |
__kDescriptionFlagPosition, __kDescriptionFlagSize, |
ComponentVideoPayloadHasDescription( inSourcePayload ) ); |
theResult = |
__SetBitField( |
&inTargetPayload->itsFixedHeader[ __kDescriptionSeedWord ], |
__kDescriptionSeedPosition, __kDescriptionSeedSize, |
ComponentVideoPayloadDescriptionSeed( inSourcePayload ) ); |
__SetBitField( |
&inTargetPayload->itsDescription[ __kWidthWord ], __kWidthPosition, __kWidthSize, |
ComponentVideoPayloadWidth( inSourcePayload ) ); |
__SetBitField( |
&inTargetPayload->itsDescription[ __kHeightWord ], __kHeightPosition, __kHeightSize, |
ComponentVideoPayloadHeight( inSourcePayload ) ); |
return( theResult ); |
} |
Boolean |
ComponentVideoPayloadHasDescription( |
const ComponentVideoPayload * inPayload ) |
{ |
return( |
__BitField( |
&inPayload->itsFixedHeader[ __kDescriptionFlagWord ], |
__kDescriptionFlagPosition, __kDescriptionFlagSize ) ); |
} |
UInt32 |
ComponentVideoPayloadDescriptionSeed( |
const ComponentVideoPayload * inPayload ) |
{ |
return( |
__BitField( |
&inPayload->itsFixedHeader[ __kDescriptionSeedWord ], |
__kDescriptionSeedPosition, __kDescriptionSeedSize ) ); |
} |
UInt32 |
ComponentVideoPayloadOffset( |
const ComponentVideoPayload * inPayload ) |
{ |
return( |
__BitField( |
&inPayload->itsFixedHeader[ __kOffsetWord ], __kOffsetPosition, |
__kOffsetSize ) << 2 ); |
} |
UInt16 |
ComponentVideoPayloadWidth( |
const ComponentVideoPayload * inPayload ) |
{ |
return( |
__BitField( |
&inPayload->itsDescription[ __kWidthWord ], __kWidthPosition, __kWidthSize ) ); |
} |
UInt16 |
ComponentVideoPayloadHeight( |
const ComponentVideoPayload * inPayload ) |
{ |
return( |
__BitField( |
&inPayload->itsDescription[ __kHeightWord ], __kHeightPosition, |
__kHeightSize ) ); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14