ourwav.cpp
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is MPEG4IP.
  13.  * 
  14.  * The Initial Developer of the Original Code is Cisco Systems Inc.
  15.  * Portions created by Cisco Systems Inc. are
  16.  * Copyright (C) Cisco Systems Inc. 2000, 2001.  All Rights Reserved.
  17.  * 
  18.  * Contributor(s): 
  19.  *              Bill May        wmay@cisco.com
  20.  */
  21. #include "ourwav.h"
  22. #define DEBUG_SYNC
  23. /*
  24.  * Create CAACodec class
  25.  */
  26. static codec_data_t *wav_codec_create (format_list_t *media_fmt,
  27.        audio_info_t *audio,
  28.        const uint8_t *userdata,
  29.        uint32_t userdata_size,
  30.        audio_vft_t *vft,
  31.        void *ifptr)
  32.   wav_codec_t *wav = (wav_codec_t *)malloc(sizeof(wav_codec_t));
  33.   memset(wav, 0, sizeof(*wav));
  34.   wav->m_vft = vft;
  35.   wav->m_ifptr = ifptr;
  36.   wav->m_sdl_config = (SDL_AudioSpec *)userdata;
  37.   return ((codec_data_t *)wav);
  38. }
  39. static void wav_close (codec_data_t *ptr)
  40. {
  41.   wav_codec_t *wav;
  42.   wav = (wav_codec_t *)ptr;
  43.   if (wav->m_wav_buffer != NULL) {
  44.     SDL_FreeWAV(wav->m_wav_buffer);
  45.     wav->m_wav_buffer = NULL;
  46.   }
  47.   if (wav->m_sdl_config != NULL) {
  48.     free(wav->m_sdl_config);
  49.     wav->m_sdl_config = NULL;
  50.   }
  51.   free(ptr);
  52. }
  53. /*
  54.  * Handle pause - basically re-init the codec
  55.  */
  56. static void wav_do_pause (codec_data_t *ifptr)
  57. {
  58. }
  59. /*
  60.  * Decode task call for FAAC
  61.  */
  62. static int wav_decode (codec_data_t *ifptr, 
  63.        uint64_t ts, 
  64.        int from_rtp,
  65.        int *sync_frame,
  66.        uint8_t *buffer, 
  67.        uint32_t buflen,
  68.        void *userdata)
  69. {
  70.   uint8_t *buff;
  71.   wav_codec_t *wav = (wav_codec_t *)ifptr;
  72.   if (wav->m_configured == 0) {
  73.     wav->m_configured = 1;
  74.     wav->m_vft->audio_configure(wav->m_ifptr,
  75. wav->m_sdl_config->freq, 
  76. wav->m_sdl_config->channels, 
  77. wav->m_sdl_config->format, 
  78. wav->m_sdl_config->samples);
  79.     if (wav->m_sdl_config->format == AUDIO_U8 || 
  80. wav->m_sdl_config->format == AUDIO_S8)
  81.       wav->m_bytes_per_channel = 1;
  82.     else
  83.       wav->m_bytes_per_channel = 2;
  84.   }
  85.   /* 
  86.    * Get an audio buffer
  87.    */
  88.   buff = wav->m_vft->audio_get_buffer(wav->m_ifptr);
  89.   if (buff == NULL) {
  90.     return (-1);
  91.   }
  92.   uint32_t bytes_to_copy;
  93.   bytes_to_copy = wav->m_sdl_config->samples * 
  94.     wav->m_sdl_config->channels * 
  95.     wav->m_bytes_per_channel;
  96.   
  97.   uint32_t bytes;
  98.     
  99.   bytes = MIN(bytes_to_copy, buflen);
  100.   memcpy(buff, buffer, bytes);
  101.   if (bytes < bytes_to_copy) {
  102.     memset(&buff[bytes], 0, bytes_to_copy - bytes);
  103.   }
  104.   wav->m_vft->audio_filled_buffer(wav->m_ifptr, ts, 0);
  105.   return (bytes);
  106. }
  107. static int wav_codec_check (lib_message_func_t message,
  108.     const char *compressor,
  109.     int audio_format,
  110.     int profile, 
  111.     format_list_t *fptr,
  112.     const uint8_t *userdata,
  113.     uint32_t userdata_size)
  114. {
  115.   return -1;
  116. }
  117. AUDIO_CODEC_WITH_RAW_FILE_PLUGIN("wav", 
  118.  wav_codec_create,
  119.  wav_do_pause,
  120.  wav_decode,
  121.  NULL,
  122.  wav_close,
  123.  wav_codec_check,
  124.  wav_file_check,
  125.  wav_file_next_frame,
  126.  wav_file_used_for_frame,
  127.  NULL,
  128.  wav_file_eof);
  129. /* end file ourwav.cpp */