SharpDX MapSubresource垂直翻转C#

时间:2017-05-18 01:58:48

标签: directx ms-media-foundation sharpdx dxgi

如何在不将其转换为位图的情况下翻转SharpDX.Databox? 我正在使用SharpDX和Media Foundation进行屏幕录制。以下是我如何获得Databox的代码。

mapSource = device.ImmediateContext.MapSubresource(screenTexture, 0,SharpDX.Direct3D11.MapMode.Read, SharpDX.Direct3D11.MapFlags.None);

但是当我在mediafoundation.net中传递mapSource时,我制作了一个垂直视频。

        IMFSample sample = null;
        IMFMediaBuffer buffer = null;

        IntPtr data = new IntPtr();
        int bufferMaxLength;
        int bufferCurrentLength;

        int hr = (int)MFExtern.MFCreateMemoryBuffer(frameSizeBytes, out buffer);

        if (Succeeded(hr)) hr = (int)buffer.Lock(out data, out bufferMaxLength, out bufferCurrentLength);
        if (Succeeded(hr))
        {

            hr = (int)MFExtern.MFCopyImage(data, videoWidth * BYTES_PER_PIXEL, mapSource.DataPointer, videoWidth * BYTES_PER_PIXEL, videoWidth * BYTES_PER_PIXEL, videoHeight);
        }
        if (Succeeded(hr)) hr = (int)buffer.Unlock();
        if (Succeeded(hr)) hr = (int)buffer.SetCurrentLength(frameSizeBytes);
        if (Succeeded(hr)) hr = (int)MFExtern.MFCreateSample(out sample);
        if (Succeeded(hr)) hr = (int)sample.AddBuffer(buffer);
        if (Succeeded(hr)) hr = (int)sample.SetSampleTime(frame.prevRecordingDuration.Ticks);//(TICKS_PER_SECOND * frames / VIDEO_FPS);
        if (Succeeded(hr)) hr = (int)sample.SetSampleDuration((frame.recordDuration-frame.prevRecordingDuration).Ticks);
        if (Succeeded(hr)) hr = (int)sinkWriter.WriteSample(streamIndex, sample);
        if (Succeeded(hr)) frames++;

        COMBase.SafeRelease(sample);
        COMBase.SafeRelease(buffer);

enter image description here

1 个答案:

答案 0 :(得分:1)

在您的代码中,使用MFCopyImage的代码中存在错误。根据{{​​3}},您必须设置 _In_ LONG lDestStride, _In_ const BYTE *pSrc, _In_ LONG lSrcStride, - lDestStride和lSrcStride - 是用于存储一行像素的内存宽度 - 您的计算videoWidth * BYTES_PER_PIXEL不正确,因为对于Windows RGB格式,步幅可以是widther比videoWidth * BYTES_PER_PIXEL。你必须通过函数MFCopyImage function来计算目标步幅,你可以从你的图像源代码获得源代码 - 我不知道你的代码,但对于我使用的项目

D3D11_MAPPED_SUBRESOURCE resource;
                UINT subresource = D3D11CalcSubresource(0, 0, 0);
                ctx->Map(mDestImage, subresource, D3D11_MAP_READ_WRITE, 0, &resource);
                LOG_INVOKE_MF_FUNCTION(MFCopyImage,
                    aPtrData,
                    mStride,
                    (BYTE*)resource.pData,
                    resource.RowPitch,
  • RowPitch。

问候。

P.S。目标步幅mStride可以是负数 - 这意味着它需要从最后一行写入第一行。它可以通过下一次更改目标指针 - aPtrData += (mHeight - 1)*mStride;

来完成