| 4460 | } |
| 4461 | |
| 4462 | void Convert(char * outBuffer, const char * inBuffer, unsigned int inSampleCount, unsigned int & outSampleCount) |
| 4463 | { |
| 4464 | unsigned int inputBufferSize = _bytesPerSample * _channelCount * inSampleCount; |
| 4465 | if (_sampleRatio == 1) |
| 4466 | { |
| 4467 | // no sample rate conversion required |
| 4468 | memcpy(outBuffer, inBuffer, inputBufferSize); |
| 4469 | outSampleCount = inSampleCount; |
| 4470 | return; |
| 4471 | } |
| 4472 | |
| 4473 | unsigned int outputBufferSize = (unsigned int) ceilf(inputBufferSize * _sampleRatio) + (_bytesPerSample * _channelCount); |
| 4474 | |
| 4475 | IMFMediaBuffer * rInBuffer; |
| 4476 | IMFSample * rInSample; |
| 4477 | BYTE * rInByteBuffer = NULL; |
| 4478 | |
| 4479 | // 5. Create Sample object from input data |
| 4480 | |
| 4481 | MFCreateMemoryBuffer(inputBufferSize, &rInBuffer); |
| 4482 | |
| 4483 | rInBuffer->Lock(&rInByteBuffer, NULL, NULL); |
| 4484 | memcpy(rInByteBuffer, inBuffer, inputBufferSize); |
| 4485 | rInBuffer->Unlock(); |
| 4486 | rInByteBuffer = NULL; |
| 4487 | |
| 4488 | rInBuffer->SetCurrentLength(inputBufferSize); |
| 4489 | |
| 4490 | MFCreateSample(&rInSample); |
| 4491 | rInSample->AddBuffer(rInBuffer); |
| 4492 | |
| 4493 | // 6. Pass input data to Resampler |
| 4494 | |
| 4495 | _transform->ProcessInput(0, rInSample, 0); |
| 4496 | |
| 4497 | SAFE_RELEASE(rInBuffer); |
| 4498 | SAFE_RELEASE(rInSample); |
| 4499 | |
| 4500 | // 7. Perform sample rate conversion |
| 4501 | |
| 4502 | IMFMediaBuffer * rOutBuffer = NULL; |
| 4503 | BYTE * rOutByteBuffer = NULL; |
| 4504 | |
| 4505 | MFT_OUTPUT_DATA_BUFFER rOutDataBuffer; |
| 4506 | DWORD rStatus; |
| 4507 | DWORD rBytes = outputBufferSize; // maximum bytes accepted per ProcessOutput |
| 4508 | |
| 4509 | // 7.1 Create Sample object for output data |
| 4510 | |
| 4511 | memset(&rOutDataBuffer, 0, sizeof rOutDataBuffer); |
| 4512 | MFCreateSample(&(rOutDataBuffer.pSample)); |
| 4513 | MFCreateMemoryBuffer(rBytes, &rOutBuffer); |
| 4514 | rOutDataBuffer.pSample->AddBuffer(rOutBuffer); |
| 4515 | rOutDataBuffer.dwStreamID = 0; |
| 4516 | rOutDataBuffer.dwStatus = 0; |
| 4517 | rOutDataBuffer.pEvents = NULL; |
| 4518 | |
| 4519 | // 7.2 Get output data from Resampler |