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

📄 mp4_producer_audio.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*******************************************************************************
 *
 * Filename:
 * ---------
 *   mp4_producer_audio.c
 *
 * Project:
 * --------
 *   MAUI
 *
 * Description:
 * ------------
 *   MPEG-4 Producer, for audio track
 *
 * Author:
 * -------
 * -------
 *
 *==============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
 *
 * removed!
 * removed!
  *
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *==============================================================================
 *******************************************************************************/

#include "mp4_producer_audio.h"
#include "mp4_sample_data_audio.h"
#include "fsal.h"



extern const kal_uint16 lenSpeechBitsAMR[9];
extern const kal_uint16 lenSpeechBitsAMR_WB[10];




#define MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_COUNT(uSampleCount)                  \
   if (MP4_AudioSampleData_GetSampleCount(pstMp4Producer->pstMp4SampleData,  \
      &(uSampleCount)) != MP4_SAMPLE_DATA_OK)                                 \
      return MP4_PRODUCER_SAMPLE_DATA_READ_ERROR

#define MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_SIZE(uSampleNo, uSampleSize)         \
   if (MP4_AudioSampleData_GetSampleSize(pstMp4Producer->pstMp4SampleData,   \
      (uSampleNo), &(uSampleSize)) != MP4_SAMPLE_DATA_OK)                     \
      return MP4_PRODUCER_SAMPLE_DATA_READ_ERROR

#define MP4_SAMPLE_DATA_GET_AUDIO_SAMPLE_OFFSET(uSampleNo, uSampleOffset, uSampleNo_Ref, uSampleOffset_Ref)     \
   if (MP4_AudioSampleData_GetSampleOffset(pstMp4Producer->pstMp4SampleData, \
      (uSampleNo), &(uSampleOffset), (uSampleNo_Ref), (uSampleOffset_Ref)) != MP4_SAMPLE_DATA_OK)                   \
      return MP4_PRODUCER_SAMPLE_DATA_READ_ERROR

#define MP4_PRODUCER_FILE_GET_CUR_POS(pos) \
   if (FSAL_GetCurPos(pstMp4Producer->pstFSAL, &(pos))!=FSAL_OK) \
      return MP4_PRODUCER_FILE_ACCESS_ERROR

static MP4_Producer_Status mp4_produce_box(STMp4Producer *pstMp4Producer, kal_uint32 uBoxType, kal_uint32 uBoxSize, kal_uint32 *puFileOffset)
{
   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);
   MP4_PRODUCER_CHECK_ARG(puFileOffset!=NULL);

   MP4_PRODUCER_FILE_GET_CUR_POS(*puFileOffset);

	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uBoxSize))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, uBoxType))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}

static MP4_Producer_Status mp4_produce_fullbox(STMp4Producer *pstMp4Producer, kal_uint32 uBoxType, kal_uint32 uBoxSize, kal_uint8 bVersion, kal_uint32 uFlags, kal_uint32 *puFileOffset)
{
   MP4_Producer_Status ret;
   kal_uint8 pBuf[4];

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

   if ((ret=mp4_produce_box(pstMp4Producer, uBoxType, uBoxSize, puFileOffset))!=MP4_PRODUCER_OK)
      return ret;

   pBuf[0] = bVersion;
   pBuf[1] = (uFlags >> 16) & 0xFF;
   pBuf[2] = (uFlags >> 8) & 0xFF;
   pBuf[3] = (uFlags) & 0xFF;

	if ((pstMp4Producer->eFSALErr=FSAL_Write_Bytes(pstMp4Producer->pstFSAL, pBuf, 4))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   return MP4_PRODUCER_OK;
}


MP4_Producer_Status MP4_Produce_FileTypeBox(STMp4Producer *pstMp4Producer)
{
   MP4_Producer_Status ret;
   kal_uint32 uFilePos;
   kal_uint32 uBoxSize;

   MP4_PRODUCER_CHECK_ARG(pstMp4Producer!=NULL);

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

   /* major brand */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, MP4_BRAND_3GP5))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   /* minor version */
  	if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x00000100))!=FSAL_OK)
		return MP4_PRODUCER_FILE_WRITE_ERROR;

   uBoxSize = 16;

   /* compatible_brands */
   {
      kal_uint8 pBuf[] = "3gp53gp4";

   	if ((pstMp4Producer->eFSALErr=FSAL_Write_Bytes(pstMp4Producer->pstFSAL, pBuf, 8))!=FSAL_OK)
		   return MP4_PRODUCER_FILE_WRITE_ERROR;

      uBoxSize += 8;
   }

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

   return MP4_PRODUCER_OK;
}



MP4_Producer_Status mp4_produce_mvhd(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_MVHD, 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;

   /* timescale: (audio: 8000) */
  	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;
   }

   /* rate */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x00010000))!=FSAL_OK)
	   return MP4_PRODUCER_FILE_WRITE_ERROR;
   *puBoxSize += 4;

   /* volume */
   {
      kal_uint16 wVolume;
      if (MP4_TRACK_AUDIO==pstMp4Producer->eCurTrack) {
         wVolume = 0x0100;
      } else {
         wVolume = 0;
      }
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, wVolume))!=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;
   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 += 10;

   /* 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;

   /* pre_defined */
   {
      kal_int16 i;

      for(i=0; i<6; i++) {
         if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
	         return MP4_PRODUCER_FILE_WRITE_ERROR;
      }
      *puBoxSize += 24;
   }

   /* XXX: next_track_ID */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x07))!=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_tkhd(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_TKHD, 0, 0, 0x0007, &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;

   /* XXX: track_ID */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT(pstMp4Producer->pstFSAL, 0x06))!=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;
   *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;
   }

   /* 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;

   /* layer */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
      return MP4_PRODUCER_FILE_WRITE_ERROR;
   *puBoxSize += 2;

   /* alternate group */
   if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, 0))!=FSAL_OK)
      return MP4_PRODUCER_FILE_WRITE_ERROR;
   *puBoxSize += 2;

   /* volume */
   {
      kal_uint16 wVolume;
      if (MP4_TRACK_AUDIO==pstMp4Producer->eCurTrack) {
         wVolume = 0x0100;
      } else {
         wVolume = 0;
      }
      if ((pstMp4Producer->eFSALErr=FSAL_Write_UINT16(pstMp4Producer->pstFSAL, wVolume))!=FSAL_OK)

⌨️ 快捷键说明

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