public static void Decode(NvdecDecoderContext context, ResourceManager rm, ref NvdecRegisters state) { PictureInfo pictureInfo = rm.Gmm.DeviceRead <PictureInfo>(state.SetPictureInfoOffset); H264PictureInfo info = pictureInfo.Convert(); ReadOnlySpan <byte> bitstream = rm.Gmm.DeviceGetSpan(state.SetBitstreamOffset, (int)pictureInfo.BitstreamSize); int width = (int)pictureInfo.PicWidthInMbs * MbSizeInPixels; int height = (int)pictureInfo.PicHeightInMbs * MbSizeInPixels; int surfaceIndex = (int)pictureInfo.OutputSurfaceIndex; uint lumaOffset = state.SetSurfaceLumaOffset[surfaceIndex]; uint chromaOffset = state.SetSurfaceChromaOffset[surfaceIndex]; Decoder decoder = context.GetH264Decoder(); ISurface outputSurface = rm.Cache.Get(decoder, 0, 0, width, height); if (decoder.Decode(ref info, outputSurface, bitstream)) { SurfaceWriter.Write(rm.Gmm, outputSurface, lumaOffset, chromaOffset); } rm.Cache.Put(outputSurface); }
public unsafe static void Decode(NvdecDevice device, ResourceManager rm, ref NvdecRegisters state) { PictureInfo pictureInfo = rm.Gmm.DeviceRead <PictureInfo>(state.SetPictureInfoOffset); H264PictureInfo info = pictureInfo.Convert(); ReadOnlySpan <byte> bitstream = rm.Gmm.DeviceGetSpan(state.SetBitstreamOffset, (int)pictureInfo.BitstreamSize); int width = (int)pictureInfo.PicWidthInMbs * MbSizeInPixels; int height = (int)pictureInfo.PicHeightInMbs * MbSizeInPixels; ISurface outputSurface = rm.Cache.Get(_decoder, CodecId.H264, 0, 0, width, height); if (_decoder.Decode(ref info, outputSurface, bitstream)) { int li = (int)pictureInfo.LumaOutputSurfaceIndex; int ci = (int)pictureInfo.ChromaOutputSurfaceIndex; uint lumaOffset = state.SetSurfaceLumaOffset[li]; uint chromaOffset = state.SetSurfaceChromaOffset[ci]; SurfaceWriter.Write(rm.Gmm, outputSurface, lumaOffset, chromaOffset); device.OnFrameDecoded(CodecId.H264, lumaOffset, chromaOffset); } rm.Cache.Put(outputSurface); }
public unsafe static void Decode(NvdecDevice device, ResourceManager rm, ref NvdecRegisters state) { PictureInfo pictureInfo = rm.Gmm.DeviceRead <PictureInfo>(state.SetPictureInfoOffset); EntropyProbs entropy = rm.Gmm.DeviceRead <EntropyProbs>(state.SetVp9EntropyProbsOffset); ISurface Rent(uint lumaOffset, uint chromaOffset, FrameSize size) { return(rm.Cache.Get(_decoder, CodecId.Vp9, lumaOffset, chromaOffset, size.Width, size.Height)); } ISurface lastSurface = Rent(state.SetSurfaceLumaOffset[0], state.SetSurfaceChromaOffset[0], pictureInfo.LastFrameSize); ISurface goldenSurface = Rent(state.SetSurfaceLumaOffset[1], state.SetSurfaceChromaOffset[1], pictureInfo.GoldenFrameSize); ISurface altSurface = Rent(state.SetSurfaceLumaOffset[2], state.SetSurfaceChromaOffset[2], pictureInfo.AltFrameSize); ISurface currentSurface = Rent(state.SetSurfaceLumaOffset[3], state.SetSurfaceChromaOffset[3], pictureInfo.CurrentFrameSize); Vp9PictureInfo info = pictureInfo.Convert(); info.LastReference = lastSurface; info.GoldenReference = goldenSurface; info.AltReference = altSurface; entropy.Convert(ref info.Entropy); ReadOnlySpan <byte> bitstream = rm.Gmm.DeviceGetSpan(state.SetBitstreamOffset, (int)pictureInfo.BitstreamSize); ReadOnlySpan <Vp9MvRef> mvsIn = ReadOnlySpan <Vp9MvRef> .Empty; if (info.UsePrevInFindMvRefs) { mvsIn = GetMvsInput(rm.Gmm, pictureInfo.CurrentFrameSize, state.SetVp9LastFrameMvsOffset); } int miCols = BitUtils.DivRoundUp(pictureInfo.CurrentFrameSize.Width, 8); int miRows = BitUtils.DivRoundUp(pictureInfo.CurrentFrameSize.Height, 8); using var mvsRegion = rm.Gmm.GetWritableRegion(ExtendOffset(state.SetVp9CurrFrameMvsOffset), miRows * miCols * 16); Span <Vp9MvRef> mvsOut = MemoryMarshal.Cast <byte, Vp9MvRef>(mvsRegion.Memory.Span); uint lumaOffset = state.SetSurfaceLumaOffset[3]; uint chromaOffset = state.SetSurfaceChromaOffset[3]; if (_decoder.Decode(ref info, currentSurface, bitstream, mvsIn, mvsOut)) { SurfaceWriter.Write(rm.Gmm, currentSurface, lumaOffset, chromaOffset); device.OnFrameDecoded(CodecId.Vp9, lumaOffset, chromaOffset); } WriteBackwardUpdates(rm.Gmm, state.SetVp9BackwardUpdatesOffset, ref info.BackwardUpdateCounts); rm.Cache.Put(lastSurface); rm.Cache.Put(goldenSurface); rm.Cache.Put(altSurface); rm.Cache.Put(currentSurface); }
public static void Decode(NvdecDecoderContext context, ResourceManager rm, ref NvdecRegisters state) { PictureInfo pictureInfo = rm.Gmm.DeviceRead <PictureInfo>(state.SetPictureInfoOffset); ReadOnlySpan <byte> bitstream = rm.Gmm.DeviceGetSpan(state.SetBitstreamOffset, (int)pictureInfo.VLDBufferSize); Decoder decoder = context.GetVp8Decoder(); ISurface outputSurface = rm.Cache.Get(decoder, 0, 0, pictureInfo.FrameWidth, pictureInfo.FrameHeight); Vp8PictureInfo info = pictureInfo.Convert(); uint lumaOffset = state.SetSurfaceLumaOffset[3]; uint chromaOffset = state.SetSurfaceChromaOffset[3]; if (decoder.Decode(ref info, outputSurface, bitstream)) { SurfaceWriter.Write(rm.Gmm, outputSurface, lumaOffset, chromaOffset); } rm.Cache.Put(outputSurface); }