?? 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 + -