📄 flex_mux.c
字号:
BsRWBitWrapper(bitStream, &(es->URLFlag.value), es->URLFlag.length,WriteFlag);
if (es->streamDependence.value != 0) {
BsRWBitWrapper(bitStream, &(es->dependsOn_Es_number.value), es->dependsOn_Es_number.length,WriteFlag);
}
BsRWBitWrapper(bitStream, &(es->extensFlag.value), es->extensFlag.length,WriteFlag);
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.profileAndLevelIndication.value), es->DecConfigDescr.profileAndLevelIndication.length,WriteFlag);
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.streamType.value) , es->DecConfigDescr.streamType.length,WriteFlag) ;
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.upsteam.value) , es->DecConfigDescr.upsteam.length,WriteFlag) ;
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.specificInfoFlag.value) , es->DecConfigDescr.specificInfoFlag.length,WriteFlag) ;
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.bufferSizeDB.value) , es->DecConfigDescr.bufferSizeDB.length,WriteFlag) ;
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.maxBitrate.value) , es->DecConfigDescr.maxBitrate.length,WriteFlag) ;
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.avgBitrate.value) , es->DecConfigDescr.avgBitrate.length,WriteFlag) ;
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.specificInfoLength.value) , es->DecConfigDescr.specificInfoLength.length,WriteFlag) ;
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.audioSpecificConfig.audioDecoderType.value),
es->DecConfigDescr.audioSpecificConfig.audioDecoderType.length,WriteFlag) ;
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.audioSpecificConfig.samplingFreqencyIndex.value),
es->DecConfigDescr.audioSpecificConfig.samplingFreqencyIndex.length,WriteFlag);
BsRWBitWrapper(bitStream, &(es->DecConfigDescr.audioSpecificConfig.channelConfiguration.value),
es->DecConfigDescr.audioSpecificConfig.channelConfiguration.length,WriteFlag);
switch (es->DecConfigDescr.audioSpecificConfig.audioDecoderType.value)
{
case GA :
initTFspecConf ( &(es->DecConfigDescr.audioSpecificConfig.specConf.TFSpecificConfig));
advanceTFspecConf(bitStream,&(es->DecConfigDescr.audioSpecificConfig.specConf.TFSpecificConfig),WriteFlag);
break;
case CELP :
initCelpSpecConf (&(es->DecConfigDescr.audioSpecificConfig.specConf.celpSpecificConfig));
advanceCelpSpecConf(bitStream,&(es->DecConfigDescr.audioSpecificConfig.specConf.celpSpecificConfig),WriteFlag);
break;
case HVXC: /* AI 990616 */
initHvxcSpecConf (&(es->DecConfigDescr.audioSpecificConfig.specConf.hvxcSpecificConfig));
advanceHvxcSpecConf(bitStream,&(es->DecConfigDescr.audioSpecificConfig.specConf.hvxcSpecificConfig),WriteFlag);
break;
default :
CommonExit(-1,"audioDecoderType not implemented");
break;
}
BsRWBitWrapper(bitStream, &(es->ALConfigDescriptor.useAccessUnitStartFlag.value),es->ALConfigDescriptor.useAccessUnitStartFlag.length,WriteFlag);
BsRWBitWrapper(bitStream, &(es->ALConfigDescriptor.useAccessUnitEndFlag.value),es->ALConfigDescriptor.useAccessUnitEndFlag.length,WriteFlag);
BsRWBitWrapper(bitStream, &(es->ALConfigDescriptor.useRandomAccessPointFlag.value),es->ALConfigDescriptor.useRandomAccessPointFlag.length,WriteFlag);
BsRWBitWrapper(bitStream, &(es->ALConfigDescriptor.usePaddingFlag.value),es->ALConfigDescriptor.usePaddingFlag.length,WriteFlag);
BsRWBitWrapper(bitStream, &(es->ALConfigDescriptor.seqNumLength.value),es->ALConfigDescriptor.seqNumLength.length,WriteFlag);
}
void advanceODescr ( BsBitStream* bitStream, OBJECT_DESCRIPTOR *od,int WriteFlag)
{
od->ODLength.length=32;
od->ODescrId.length=10;
od->streamCount.length=5;
od->extensionFlag.length=1;
/* &(od->ODLength.value); is written later as soon as length is known*/
BsRWBitWrapper(bitStream, &(od->ODescrId.value), od->ODescrId.length,WriteFlag);
BsRWBitWrapper(bitStream, &(od->streamCount.value), od->streamCount.length,WriteFlag);
BsRWBitWrapper(bitStream, &(od->extensionFlag.value), od->extensionFlag.length,WriteFlag);
}
void getAccessUnit( BsBitStream* bitStream , BsBitBuffer* AUBuffer,unsigned int *AUIndex, unsigned long *totalLength, ES_DESCRIPTOR *es)
{
unsigned long index,length,AUStartFlag,AUEndFlag,dummy;
unsigned long seq_number;
/* read default AL-PDU header */
BsGetBit(bitStream,&index,8);
BsGetBit(bitStream,&length,8);
*totalLength += length;
if (es->ALConfigDescriptor.useAccessUnitStartFlag.value)
BsGetBit(bitStream,&AUStartFlag,1);
if (AUStartFlag!=1) CommonExit(-1,"error in getAccessUnit");
if (es->ALConfigDescriptor.useAccessUnitEndFlag.value)
BsGetBit(bitStream,&AUEndFlag,1);
if (es->ALConfigDescriptor.seqNumLength.value > 0)
BsGetBit(bitStream,&seq_number,es->ALConfigDescriptor.seqNumLength.value);
else
BsGetBit(bitStream,&dummy,6); /*6 padding bits (alm) */
*AUIndex = index;
if (AUStartFlag!=1) CommonExit(-1,"Error AL-PDU header ");
#if 0
BsGetBuffer( bitStream, AUBuffer,length*8);
#else
BsGetBufferAppend( bitStream, AUBuffer,1,length*8);
#endif
while (AUEndFlag!=1) {
BsGetBit(bitStream,&index,8);
if (*AUIndex != index)
CommonExit(-1,"FlexMux index error");
BsGetBit(bitStream,&length,8);
*totalLength += length;
if (es->ALConfigDescriptor.useAccessUnitStartFlag.value)
BsGetBit(bitStream,&AUStartFlag,1);
if (AUStartFlag==1) CommonExit(-1,"error in getAccessUnit");
if (es->ALConfigDescriptor.useAccessUnitEndFlag.value)
BsGetBit(bitStream,&AUEndFlag,1);
if (es->ALConfigDescriptor.seqNumLength.value > 0)
BsGetBit(bitStream,&seq_number,es->ALConfigDescriptor.seqNumLength.value);
else
BsGetBit(bitStream,&dummy,6); /*6 padding bits (alm) */
BsGetBufferAppend( bitStream, AUBuffer,1,length*8);
}
}
int nextAccessUnit( BsBitStream* bitStream ,
unsigned int* layer,
FRAME_DATA* frameData
)
{
unsigned long index, dummy,AUStartFlag,AUEndFlag,AUIndex;
unsigned long length;
unsigned long seq_number;
ES_DESCRIPTOR* es;
BsBitBuffer* AUBuffer ;
/* read default AL-PDU header */
/* suppose trivial streammap table: index 0 = layer 0 ; index 1 = layer 1 etc.*/
BsGetBit(bitStream,&index,8);
*layer = index;
AUIndex = index;
BsGetBit(bitStream,&length,8);
es = frameData->od->ESDescriptor[index];
AUBuffer = frameData->layer[index].bitBuf ;
if (es->ALConfigDescriptor.useAccessUnitStartFlag.value)
if (BsGetBit(bitStream,&AUStartFlag,1)== -1) {
return -1;
};
if (AUStartFlag!=1) CommonExit(-1,"error in getAccessUnit");
if (es->ALConfigDescriptor.useAccessUnitEndFlag.value)
BsGetBit(bitStream,&AUEndFlag,1);
if (es->ALConfigDescriptor.seqNumLength.value > 0)
BsGetBit(bitStream,&seq_number,es->ALConfigDescriptor.seqNumLength.value);
else
BsGetBit(bitStream,&dummy,6); /*6 padding bits (alm) */
if (AUStartFlag!=1) CommonExit(-1,"Error AL-PDU header ");
if (AUBuffer!=0 ) {
if ((AUBuffer->size - AUBuffer->numBit) > (long)length*8 ) {
BsGetBufferAppend( bitStream, AUBuffer,1,length*8);
frameData->layer[AUIndex].NoAUInBuffer++;/* each decoder must decrease this by the number of decoded AU */
} else {
BsGetSkip(bitStream,length*8);
CommonWarning ("flexmux input buffer overflow for layer %d ; skiping next AU",index);
}
} else {
BsGetSkip(bitStream,length*8);
}
while (AUEndFlag!=1) {
BsGetBit(bitStream,&index,8);
if (AUIndex != index)
CommonExit(-1,"FlexMux index error");
BsGetBit(bitStream,&length,8);
if (es->ALConfigDescriptor.useAccessUnitStartFlag.value)
BsGetBit(bitStream,&AUStartFlag,1);
if (AUStartFlag==1) CommonExit(-1,"error in getAccessUnit");
if (es->ALConfigDescriptor.useAccessUnitEndFlag.value)
BsGetBit(bitStream,&AUEndFlag,1);
if (es->ALConfigDescriptor.seqNumLength.value > 0)
BsGetBit(bitStream,&seq_number,es->ALConfigDescriptor.seqNumLength.value);
else
BsGetBit(bitStream,&dummy,6); /*6 padding bits (alm) */
if (AUBuffer!=0 ) {
if ((AUBuffer->size - AUBuffer->numBit) > (long)length*8 ) {
BsGetBufferAppend( bitStream, AUBuffer,1,length*8);
} else {
BsGetSkip(bitStream,length*8);
CommonWarning ("flexmux input buffer overflow for layer %d ; skiping next AU",index);
}
} else {
BsGetSkip(bitStream,length*8);
}
}
return 0;
}
void writeFlexMuxPDU(int index,BsBitStream* bitStream , BsBitBuffer* AUBuffer)
{
unsigned long align,tmp,i;
unsigned long length,AUStartFlag,AUEndFlag;
int maxBytes=255;
BsBitStream *AUStream;
AUEndFlag=1;
AUStartFlag=1;
AUStream= BsOpenBufferRead ( AUBuffer) ;
AUStartFlag=1;
while ( AUBuffer->numBit> maxBytes*8 ) {
AUEndFlag=0;
BsGetBuffer ( AUStream,tmpBuf,maxBytes*8);
/* remove all completely read bytes from AUBuffer,
dirty 'cause bitstream.c does not yet have a funktion for that !*/
tmp = AUStream->currentBit/8;
for( i=0; i<(AUBuffer->size/8)-tmp; i++ ) {
AUBuffer->data[i] = AUBuffer->data[i+tmp];
}
AUStream->currentBit -= tmp*8;
AUBuffer->numBit -= tmp*8;
BsPutBit(bitStream,index,8);
BsPutBit(bitStream,maxBytes,8);
BsPutBit(bitStream,AUStartFlag,1);
BsPutBit(bitStream,AUEndFlag,1);
BsPutBit(bitStream,0,6);/* padding bits */
BsPutBuffer(bitStream,tmpBuf);
AUStartFlag=0;
}
BsCloseRemove ( AUStream,1) ;
AUEndFlag=1;
length= AUBuffer->numBit/8;
align = 8 - AUBuffer->numBit % 8;
if (align == 8) align = 0;
if (align != 0) {
length+=1;
}
BsPutBit(bitStream,index,8);
BsPutBit(bitStream,length,8);
BsPutBit(bitStream,AUStartFlag,1);
BsPutBit(bitStream,AUEndFlag,1);
BsPutBit(bitStream,0,6);/* padding bits */
BsPutBuffer(bitStream,AUBuffer);
BsPutBit(bitStream,0,align);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -