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

📄 mp4_producer_audio.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
   if((ret=mp4_produce_fullbox(pstMp4Producer, BOX_TYPE_STSD, 0, 0, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 12;

   /* entry count */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 1))!=FSAL_OK)
 	   return MP4_PRODUCER_FILE_WRITE_ERROR;
   *puBoxSize += 4;

   /* XXX: soun */
   if((ret=mp4_produce_samr(pstMp4Producer, &uSampleSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uSampleSize;

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}



MP4_Producer_Status mp4_produce_stts(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);

   /* header */
   if((ret=mp4_produce_fullbox(pstMp4Producer, BOX_TYPE_STTS, 0, 0, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 12;

   /* entry count */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 1))!=FSAL_OK)
 	   return MP4_PRODUCER_FILE_WRITE_ERROR;

   *puBoxSize += 4;

   /* sample count */
   {
      kal_uint32 uSampleCount;
      MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_COUNT(uSampleCount);
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSampleCount))!=FSAL_OK)
 	      return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;
   }

   /* sample delta */
   {
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 160))!=FSAL_OK)
 	      return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;
   }

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}



MP4_Producer_Status mp4_produce_stsc(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;
   kal_uint32 uEntryCount;
   kal_uint32 uSampleCount;
   kal_uint32 uSamplePerChunk;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);

   /* header */
   if((ret=mp4_produce_fullbox(pstMp4Producer, BOX_TYPE_STSC, 0, 0, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 12;

   /* get sample count */
   MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_COUNT(uSampleCount);

   /* entry count */
   {
      if(uSampleCount<25) {
         uSamplePerChunk = uSampleCount;
         uEntryCount = 1;
      } else {
         uSamplePerChunk = 25;
         if (0==uSampleCount%25) {
            uEntryCount = 1;
         } else {
            uEntryCount = 2;
         }
      }
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uEntryCount))!=FSAL_OK)
 	      return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;
   }

   /* first chunk */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 1))!=FSAL_OK)
 	   return MP4_PRODUCER_FILE_WRITE_ERROR;
   *puBoxSize += 4;

   /* samples per chunk */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSamplePerChunk))!=FSAL_OK)
      return MP4_PRODUCER_FILE_WRITE_ERROR;
   *puBoxSize += 4;

   /* sample description index */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 1))!=FSAL_OK)
      return MP4_PRODUCER_FILE_WRITE_ERROR;
   *puBoxSize += 4;

   if (uEntryCount==2) {
      /* first chunk */
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, (uSampleCount / 25) + 1))!=FSAL_OK)
         return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;

      /* samples per chunk */
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSampleCount % 25))!=FSAL_OK)
         return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;

      /* sample description index */
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 1))!=FSAL_OK)
         return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;
   }

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}



MP4_Producer_Status mp4_produce_stsz(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;
   kal_uint32 uSampleSize;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);

   /* header */
   if((ret=mp4_produce_fullbox(pstMp4Producer, BOX_TYPE_STSZ, 0, 0, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 12;

   /* sample size */
   {
      //if(KAL_TRUE==MP4_SampleData_Audio_EqualSampleSize())
      //   uSampleSize = MP4_SampleData_Audio_GetSampleSize(pstMp4Producer->pstMp4SampleData);
      //else
         uSampleSize = 0;
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSampleSize))!=FSAL_OK)
         return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;
   }


   if(0==uSampleSize) {
      /* sample count */
      kal_uint32 uSampleCount;
      kal_uint32 uSampleNo;

      MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_COUNT(uSampleCount);
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSampleCount))!=FSAL_OK)
         return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;

#if MP4_PRODUCER_AUDIO_VERBOSE
      printf("sample count=%d\n", uSampleCount);
#endif
      for(uSampleNo=0; uSampleNo<uSampleCount; uSampleNo++) {
         kal_uint32 uSampleSize;
         MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_SIZE(uSampleNo, uSampleSize);
         if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSampleSize))!=FSAL_OK)
            return MP4_PRODUCER_FILE_WRITE_ERROR;
         *puBoxSize += 4;
      }

   }

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}



MP4_Producer_Status mp4_produce_stco(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize, kal_uint32 uAudioDataOffset)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;
   kal_uint32 uSampleCount;
   kal_uint32 uChunkCount;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);

   /* header */
   if((ret=mp4_produce_fullbox(pstMp4Producer, BOX_TYPE_STCO, 0, 0, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 12;

   MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_COUNT(uSampleCount);
   uChunkCount = (uSampleCount+24) / 25;
#if MP4_PRODUCER_AUDIO_VERBOSE
   printf("uSampleCount = %d, uChunkCount = %d\n", uSampleCount, uChunkCount);
#endif

   /* chunk count (audio) */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uChunkCount))!=FSAL_OK)
       return MP4_PRODUCER_FILE_WRITE_ERROR;
   *puBoxSize += 4;

   /* chunk offset */
   if( uChunkCount > 0 )
   {
      kal_uint32 uChunkNo = 0;
      kal_uint32 uSampleOffset;
      MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_OFFSET(0, uSampleOffset, 0, 8);
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSampleOffset+uAudioDataOffset))!=FSAL_OK)
         return MP4_PRODUCER_FILE_WRITE_ERROR;
      *puBoxSize += 4;
      for(uChunkNo=1; uChunkNo<uChunkCount; uChunkNo++) {
         MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_OFFSET(uChunkNo * 25, uSampleOffset, uChunkNo * 25 - 25, uSampleOffset);
         if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSampleOffset+uAudioDataOffset))!=FSAL_OK)
            return MP4_PRODUCER_FILE_WRITE_ERROR;
         *puBoxSize += 4;
      }
   }

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}



MP4_Producer_Status mp4_produce_stbl(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize, kal_uint32 uAudioDataOffset)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;
   kal_uint32 uStsdSize, uSttsSize, uStscSize, uStszSize, uStcoSize;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);

   /* header */
   if((ret=mp4_produce_box(pstMp4Producer, BOX_TYPE_STBL, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 8;

   /* sample description */
   if((ret=mp4_produce_stsd(pstMp4Producer, &uStsdSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uStsdSize;

   /* decoding time-to-sample */
   if((ret=mp4_produce_stts(pstMp4Producer, &uSttsSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uSttsSize;

   /* sample-to-chunk */
   if((ret=mp4_produce_stsc(pstMp4Producer, &uStscSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uStscSize;

   /* sample sizes (framing) */
   if((ret=mp4_produce_stsz(pstMp4Producer, &uStszSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uStszSize;

   /* chunk offset */
   if((ret=mp4_produce_stco(pstMp4Producer, &uStcoSize, uAudioDataOffset))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uStcoSize;

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}

MP4_Producer_Status mp4_produce_smhd(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);

   /* header */
   if((ret=mp4_produce_fullbox(pstMp4Producer, BOX_TYPE_SMHD, 0, 0, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 12;

   if((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
      return MP4_PRODUCER_FILE_WRITE_ERROR;

   if((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
      return MP4_PRODUCER_FILE_WRITE_ERROR;

   *puBoxSize+=4;

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}

MP4_Producer_Status mp4_produce_minf(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize, kal_uint32 uAudioDataOffset)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;
   kal_uint32 uDinfSize, uStblSize, uSmhdSize;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);

   /* header */
   if((ret=mp4_produce_box(pstMp4Producer, BOX_TYPE_MINF, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 8;

   if((ret=mp4_produce_smhd(pstMp4Producer, &uSmhdSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uSmhdSize;

   /* data information */
   if((ret=mp4_produce_dinf(pstMp4Producer, &uDinfSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uDinfSize;

   /* sample table */
   if((ret=mp4_produce_stbl(pstMp4Producer, &uStblSize, uAudioDataOffset))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uStblSize;

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}



MP4_Producer_Status mp4_produce_mdia(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize, kal_uint32 uAudioDataOffset)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;
   kal_uint32 uMdhdSize, uHdlrSize, uMinfSize;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);

   /* header */
   if((ret=mp4_produce_box(pstMp4Producer, BOX_TYPE_MDIA, 0, &uFilePos))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize = 8;

   /* media header */
   if((ret=mp4_produce_mdhd(pstMp4Producer, &uMdhdSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uMdhdSize;

   /* handler */
   if((ret=mp4_produce_hdlr(pstMp4Producer, &uHdlrSize))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uHdlrSize;

   /* media information */
   if((ret=mp4_produce_minf(pstMp4Producer, &uMinfSize, uAudioDataOffset))!=MP4_PRODUCER_OK)
      return ret;
   *puBoxSize += uMinfSize;

   /* update box size */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT_AT(pstMp4Producer->pstFSAL, *puBoxSize, uFilePos))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -