📄 mp4_producer_audio.c
字号:
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
}
/* reserved */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* matrix */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x00010000))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x00010000))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x40000000))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 36;
/* XXX: width */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 4;
/* XXX: height */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x0))!=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_mdhd(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_MDHD, 0, 0, 0, &uFilePos))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize = 12;
/* creation time */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 4;
/* modification time */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 4;
/* time scale (audio: 8000Hz) */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 8000))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 4;
/* duration (audio) */
{
kal_uint32 uSampleCount;
MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_COUNT(uSampleCount);
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uSampleCount*160))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 4;
}
/* language */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0x15C7))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* predefined */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* 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_hdlr(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_HDLR, 0, 0, 0, &uFilePos))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize = 12;
/* predefined */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 4;
/* XXX: handler_type */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, HDLR_TYPE_SOUN))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 4;
/* reserved */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 12;
/* string */
{
kal_uint8 pBuf[] = "MTK Sound Handler";
if ((pstMp4Producer->eFSALErr=FSAL_Write_Bytes(pstMp4Producer->pstFSAL, pBuf, 18))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 18;
}
/* 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_url(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_URL, 0, 0, 1, &uFilePos))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize = 12;
/* 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_dref(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize)
{
MP4_Producer_Status ret;
kal_uint32 uFilePos;
kal_uint32 uUrlSize;
MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);
/* header */
if((ret=mp4_produce_fullbox(pstMp4Producer, BOX_TYPE_DREF, 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;
/* data entry box */
if((ret=mp4_produce_url(pstMp4Producer, &uUrlSize))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize += uUrlSize;
/* 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_dinf(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize)
{
MP4_Producer_Status ret;
kal_uint32 uFilePos;
kal_uint32 uDrefSize;
MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);
/* header */
if((ret=mp4_produce_box(pstMp4Producer, BOX_TYPE_DINF, 0, &uFilePos))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize = 8;
/* data information */
if((ret=mp4_produce_dref(pstMp4Producer, &uDrefSize))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize += uDrefSize;
/* 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;
}
static MP4_Producer_Status mp4_produce_damr(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_box(pstMp4Producer, BOX_TYPE_DAMR, 0, &uFilePos))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize = 8;
/* AMR Decoder Specific Structure */
/* vendor */
{
kal_uint8 pBuf[] = "MTK ";
if ((pstMp4Producer->eFSALErr=FSAL_Write_Bytes(pstMp4Producer->pstFSAL, pBuf, 4))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 4;
}
/* decoder version */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT8(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 1;
/* mode_set */
{
MP4_Audio_Type eAudioType;
kal_uint16 wModeSet;
eAudioType = MP4_AudioSampleData_GetAudioType(pstMp4Producer->pstMp4SampleData);
if (MP4_AUDIO_AMR == eAudioType) {
wModeSet = 0x81FF;
} else if (MP4_AUDIO_AMR_WB == eAudioType) {
wModeSet = 0x83FF;
} else {
return MP4_PRODUCER_SAMPLE_DATA_AUDIO_TYPE_ERROR;
}
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0x81FF))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
}
/* mode change period */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT8(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 1;
/* frame per sample */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT8(pstMp4Producer->pstFSAL, 1))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 1;
/* 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;
}
static MP4_Producer_Status mp4_produce_samr(STMp4Producer *pstMp4Producer, kal_uint32 *puBoxSize)
{
MP4_Producer_Status ret;
kal_uint32 uFilePos;
kal_uint32 uDamrSize;
MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
MP4_PRODUCER_CHECK_ARG(puBoxSize!=NULL);
/* header */
{
kal_uint32 uBoxType;
MP4_Audio_Type eAudioType;
eAudioType = MP4_AudioSampleData_GetAudioType(pstMp4Producer->pstMp4SampleData);
if (MP4_AUDIO_AMR == eAudioType) {
uBoxType = SAMPLE_FMT_SAMR;
} else if (MP4_AUDIO_AMR_WB == eAudioType) {
uBoxType = SAMPLE_FMT_SAWB;
} else {
return MP4_PRODUCER_SAMPLE_DATA_AUDIO_TYPE_ERROR;
}
if((ret=mp4_produce_box(pstMp4Producer, uBoxType, 0, &uFilePos))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize = 8;
}
/* reserved */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(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 += 6;
/* data reference index */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 1))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* reserved */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 8;
/* channel count = 2 */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 2))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* sample size = 16 */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 16))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* predefined */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* reserved */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* time scale (audio) */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 8000))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* reserved */
if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
return MP4_PRODUCER_FILE_WRITE_ERROR;
*puBoxSize += 2;
/* AMR Specific Box */
if((ret=mp4_produce_damr(pstMp4Producer, &uDamrSize))!=MP4_PRODUCER_OK)
return ret;
*puBoxSize += uDamrSize;
/* 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_stsd(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 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -