Beispiel #1
0
int
xvid_decore(void *handle,
			int opt,
			void *param1,
			void *param2)
{
	switch (opt) {
	case XVID_DEC_CREATE:
		return decoder_create((xvid_dec_create_t *) param1);

	case XVID_DEC_DESTROY:
		return decoder_destroy((DECODER *) handle);

	case XVID_DEC_DECODE:
		return decoder_decode((DECODER *) handle, (xvid_dec_frame_t *) param1, (xvid_dec_stats_t*) param2);

	default:
		return XVID_ERR_FAIL;
	}
}
Beispiel #2
0
HRESULT XAudPlayer::CreateBuffer(const int volume)
{
   /*const int status =*/ decoder_decode(m_decoder, NULL);

   WAVEFORMATEX wfex;
   wfex.wFormatTag = WAVE_FORMAT_PCM;
   wfex.nChannels = 2;//m_decoder->output_buffer->nb_channels;
   wfex.nSamplesPerSec = 44100; //Bogus frequency value - the real value gets set as data is decompressed - look for SetFrequency
   wfex.wBitsPerSample = 16;//m_decoder->output_buffer->bytes_per_sample;
   wfex.cbSize = 0;
   wfex.nBlockAlign = (wfex.nChannels * wfex.wBitsPerSample) / (WORD)8;
   wfex.nAvgBytesPerSec = wfex.nBlockAlign * wfex.nSamplesPerSec;

   CreateStreamingBuffer(&wfex);

   m_pDSBuffer->SetCurrentPosition(0);

   m_pDSBuffer->SetVolume(volume);

   return S_OK;
}
Beispiel #3
0
gboolean
decoder_chain_decode(Decoder *self, guchar *rawData, gsize rawSize)
{
        DecoderPrivate *priv = DECODER_GET_PRIVATE (self);
        gboolean ret = TRUE;

        if (priv->chain != NULL) {
                priv->enc_data = g_malloc0(sizeof(guchar) * priv->enc_size);
                ret = decoder_chain_decode(priv->chain, priv->enc_data, priv->enc_size);
        }

        if (ret)
                ret = decoder_decode(self, rawData, rawSize, priv->enc_data, priv->enc_size);


        priv->raw_data = rawData;
        g_free(priv->enc_data);
        priv->enc_data = NULL;

        if (priv->chain != NULL)
                decoder_chain_cleanup(priv->chain);

        return ret;
}
Beispiel #4
0
int XAudPlayer::Tick()
{
   DWORD playpos, writepos;
   m_pDSBuffer->GetCurrentPosition(&playpos, &writepos);

   if (m_fEndData)
   {
      int timeplayed = playpos - m_lastplaypos;
      if (timeplayed < 0)
      {
         timeplayed += m_dwBufferSize;
      }

      m_cDataLeft -= timeplayed;

      if (m_cDataLeft < 0)
      {
         End();
         return 0;
      }

      m_lastplaypos = playpos;

      return 1;
   }

   const DWORD halfaround = (playpos + m_dwBufferSize/2);// % m_dwBufferSize;

   if (halfaround > m_dwBufferSize)
   {
      if (m_dwNextWriteOffset < playpos && (m_dwNextWriteOffset > (halfaround % m_dwBufferSize)))
      {
         return 1;
      }
   }
   else if (m_dwNextWriteOffset < playpos || m_dwNextWriteOffset > halfaround)
   {
      return 1;
   }

   int status = decoder_decode(m_decoder, NULL);

   if (status == XA_ERROR_TIMEOUT) // Need more input
   {
      unsigned char mp3_buffer[4096];
      const int nb_read = fread(mp3_buffer, 1, 4096, file);

      if (nb_read == 0)
      {
         //if (feof(file))
         //	{
         //fprintf(stderr, "end of file\n");
         status = 0xffff;
         //	}
         //else
         //	{
         //fprintf(stderr, "cannot read bytes from input\n");
         //status = 0xffff;
         //	}
      }
      else
      {
         /* feed the input buffer */
         decoder_input_send_message(m_decoder, XA_MEMORY_INPUT_MESSAGE_FEED, 
            mp3_buffer, nb_read);

         status = decoder_decode(m_decoder, NULL);
      }
   }

   if (status == XA_SUCCESS)
   {
      /*HRESULT hr =*/ m_pDSBuffer->SetFrequency(m_decoder->status->info.frequency);

      const unsigned int cbData = m_decoder->output_buffer->nb_samples*m_decoder->output_buffer->bytes_per_sample*m_decoder->output_buffer->nb_channels;

      VOID* pbBuffer  = NULL;
      DWORD dwBufferLength;

      VOID* pbBuffer2 = NULL;
      DWORD dwBufferLength2;

      HRESULT hr;
      if( FAILED( hr = m_pDSBuffer->Lock(m_dwNextWriteOffset, cbData, 
         &pbBuffer, &dwBufferLength, &pbBuffer2, &dwBufferLength2, 0L) ) )
         return 0;

      memcpy(pbBuffer, m_decoder->output_buffer->pcm_samples, dwBufferLength);

      if (dwBufferLength < cbData)
      {
         memcpy(pbBuffer2, ((char*)(m_decoder->output_buffer->pcm_samples))+dwBufferLength, dwBufferLength2);
      }

      m_pDSBuffer->Unlock(pbBuffer,dwBufferLength, pbBuffer2, dwBufferLength2);
      pbBuffer = NULL;

      m_dwNextWriteOffset += cbData;
      m_dwNextWriteOffset %= m_dwBufferSize;

      if (!m_fStarted)
      {
         m_pDSBuffer->Play(0, 0, DSBPLAY_LOOPING);
         m_fStarted = true;
      }
   }
   else
   {
      m_fEndData = true;
      m_cDataLeft = m_dwNextWriteOffset - playpos;
      if (m_cDataLeft < 0)
      {
         m_cDataLeft += m_dwBufferSize;
      }
      m_lastplaypos = playpos;
      //End();
   }

   return 1;
}