📄 mp4_producer_audio.c
字号:
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 + -