⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flex_mux.c

📁 MPEG-4编解码的实现(包括MPEG4视音频编解码)
💻 C
📖 第 1 页 / 共 2 页
字号:
  
  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 + -