OMX_ERRORTYPE WmaDec::AudioFilterReset()
{
	return AudioFilterCodecInit();
}
OMX_ERRORTYPE AudioFilter::ProcessDataBuffer()
{
	OMX_ERRORTYPE ret = OMX_ErrorNone;
	LOG_LOG("Audio filter In: %d, Out: %d\n", ports[AUDIO_FILTER_INPUT_PORT]->BufferNum(), ports[AUDIO_FILTER_OUTPUT_PORT]->BufferNum());

	if(((ports[AUDIO_FILTER_INPUT_PORT]->BufferNum() == 0 && pInBufferHdr == NULL )
	        || pInBufferHdr != NULL) /**< Ring buffer full */
	        && (ports[AUDIO_FILTER_OUTPUT_PORT]->BufferNum() == 0  && pOutBufferHdr == NULL))
		return OMX_ErrorNoMore;
	if(pOutBufferHdr == NULL && ports[AUDIO_FILTER_OUTPUT_PORT]->BufferNum() > 0)
	{
		ports[AUDIO_FILTER_OUTPUT_PORT]->GetBuffer(&pOutBufferHdr);
		pOutBufferHdr->nFlags = 0;
	}

	if(pInBufferHdr == NULL && ports[AUDIO_FILTER_INPUT_PORT]->BufferNum() > 0)
	{
		ports[AUDIO_FILTER_INPUT_PORT]->GetBuffer(&pInBufferHdr);
		if(pInBufferHdr != NULL)
		{
			ret = ProcessInputBufferFlag();
			if (ret != OMX_ErrorNone)
			{
				LOG_ERROR("Process input buffer flag fail.\n");
				return ret;
			}
		}
	}

	if(pInBufferHdr != NULL)
	{
		ret = ProcessInputDataBuffer();
		if (ret != OMX_ErrorNone)
		{
			LOG_ERROR("Process input data buffer fail.\n");
			return ret;
		}
	}

	if (bInstanceReset == OMX_TRUE)
	{
		bInstanceReset = OMX_FALSE;
		ret = AudioFilterInstanceReset();
		if (ret != OMX_ErrorNone)
		{
			LOG_ERROR("Audio filter instance reset fail.\n");
			bDecoderEOS = OMX_TRUE;
			SendEvent(OMX_EventError, ret, 0, NULL);
			return ret;
		}
	}

	if (bFirstFrame == OMX_TRUE)
	{
		ret = AudioFilterCheckFrameHeader();
		if (ret != OMX_ErrorNone)
		{
			LOG_ERROR("AudioFilterCheckFrameHeader fail.\n");
		}

	}

	LOG_LOG("Audio Filter Ringbuffer data len: %d\n", AudioRingBuffer.AudioDataLen());
	if ((AudioRingBuffer.AudioDataLen() < nPushModeInputLen && bReceivedEOS == OMX_FALSE)
	        || bDecoderEOS == OMX_TRUE)
	{
		LOG_DEBUG("Input buffer is not enough for filter.\n");
		if(ports[AUDIO_FILTER_INPUT_PORT]->BufferNum() > 0)
			return OMX_ErrorNone;
		else
			return OMX_ErrorNoMore;
	}

	if (bCodecInit == OMX_FALSE)
	{
		bCodecInit = OMX_TRUE;
		ret = AudioFilterCodecInit();
		if (ret != OMX_ErrorNone)
		{
			LOG_ERROR("Audio decoder codec init fail.\n");
			bDecoderInitFail = OMX_TRUE;
		}
	}

	if(pOutBufferHdr != NULL)
	{
		ret = ProcessOutputDataBuffer();
		if (ret != OMX_ErrorNone)
			LOG_ERROR("Process Output data buffer fail.\n");
	}

	return OMX_ErrorNone;
}