private NvEncoder CreateEncoder(Texture2D texture) { if (_initialized) { return(_encoder); } var desc = texture.Description; var encoder = OpenEncoderForDirectX(texture.Device.NativePointer); var initparams = new NvEncInitializeParams { Version = NV_ENC_INITIALIZE_PARAMS_VER, EncodeGuid = NvEncCodecGuids.H264, EncodeHeight = (uint)desc.Height, EncodeWidth = (uint)desc.Width, MaxEncodeHeight = (uint)desc.Height, MaxEncodeWidth = (uint)desc.Width, DarHeight = (uint)desc.Height, DarWidth = (uint)desc.Width, FrameRateNum = _frameDuration, FrameRateDen = 1, ReportSliceOffsets = false, EnableSubFrameWrite = false, PresetGuid = NvEncPresetGuids.LowLatencyDefault, EnableEncodeAsync = 0 }; encoder.InitializeEncoder(ref initparams); _bitstreamBuffer = encoder.CreateBitstreamBuffer(); _encoder = encoder; _initialized = true; return(encoder); }
static void Main(string[] args) { while (true) { Console.WriteLine("0: Demo,1: MF"); string select; select = Console.ReadLine(); if (select == "0") { Console.WriteLine("---------Press Enter to intialize NvEncoder ---------"); Console.ReadLine(); NvEncoder nvEncoder = new NvEncoder(); Console.ReadLine(); //nvEncoder.GetAPIFromManaged(dllPointer, procAddress); Console.WriteLine("Start EncodeMain"); Console.ReadLine(); string stop; while (true) { int result = nvEncoder.EncodeMain(); Console.WriteLine("Key in 'stop' to stop the while loop"); stop = Console.ReadLine(); if (stop == "stop") { break; } } break; } else if (select == "1") { HResult hr = MFExtern.MFStartup(MF_VERSION, MFStartup.Full); IMFSourceReader ppSourceReader; //public extern static HResult MFCreateSourceReaderFromByteStream(IMFByteStream pByteStream, IMFAttributes pAttributes, out IMFSourceReader ppSourceReader); hr = MFExtern.MFCreateSourceReaderFromURL(@"06-13-17-15-58-17-1.mp4", null, out ppSourceReader); //IMFSourceResolver sourceResolver; //MFObjectType pObjectType; //object ppObject; //MFExtern.MFCreateSourceResolver(out sourceResolver); //HResult CreateObjectFromURL(string pwszURL, MFResolution dwFlags, IPropertyStore pProps, out MFObjectType pObjectType, out object ppObject); //hr = sourceResolver.CreateObjectFromURL(@"tulips_yvu420_prog_planar_qcif.yuv", MFResolution.MediaSource, null, out pObjectType, out ppObject); //IMFMediaSource medaiaSource; //hr = MFExtern.MFCreateSourceReaderFromMediaSource(); int pdwActualStreamIndex; MF_SOURCE_READER_FLAG pdwStreamFlags = MF_SOURCE_READER_FLAG.None; long pllTimestamp; IMFSample ppSample; //Guid temp; IMFMediaType mediaType; MFExtern.MFCreateMediaType(out mediaType); mediaType.SetGUID(MFAttributesClsid.MF_MT_MAJOR_TYPE, MFMediaType.Video); mediaType.SetGUID(MFAttributesClsid.MF_MT_SUBTYPE, MFMediaType.NV12); hr = MFExtern.MFSetAttributeSize(mediaType, MFAttributesClsid.MF_MT_FRAME_SIZE, 1920, 1080); hr = MFExtern.MFSetAttributeRatio(mediaType, MFAttributesClsid.MF_MT_FRAME_RATE, 30, 1); mediaType.SetUINT32(MFAttributesClsid.MF_MT_INTERLACE_MODE, (int)MFVideoInterlaceMode.Progressive); hr = MFExtern.MFSetAttributeRatio(mediaType, MFAttributesClsid.MF_MT_PIXEL_ASPECT_RATIO, 1, 1); hr = ppSourceReader.SetCurrentMediaType(1, null, mediaType); MFError.ThrowExceptionForHR(hr); COMBase.SafeRelease(mediaType); //IMFMediaType tempMediaType; //ppSourceReader.GetCurrentMediaType(1, out tempMediaType); //tempMediaType.GetGUID(MFAttributesClsid.MF_MT_SUBTYPE, out temp); //COMBase.SafeRelease(tempMediaType); Console.WriteLine("---------Press Enter to intialize NvEncoder ---------"); NvEncoder nvEncoder = new NvEncoder(); Console.ReadLine(); //nvEncoder.GetAPIFromManaged(dllPointer, procAddress); Console.WriteLine("Initialize NvEncoder"); bool result = true; result = nvEncoder.InitializeNvEncoder(MFMediaType.NV12, 1920, 1088, 30); //byte[] inputData = null; //byte[] outputData = null; //IntPtr outputData = IntPtr.Zero; //for (int i = 0; i < inputData.Length; i++ ) //{ // inputData[i] = 1; //} //IntPtr inputPointer = Marshal.AllocHGlobal(inputData.Length); //Marshal.Copy(inputData, 0, inputPointer, inputData.Length); //IntPtr outputPointer = Marshal.AllocHGlobal(outputData.Length); //Marshal.Copy(outputData, 0, outputPointer, outputData.Length); int processResult = 0; StartByteArrayToFile("Newh264AtProgram.h264"); while (result) { byte[] inputData = null; byte[] outputData = null; bool isKey = false; //HResult ReadSample(int dwStreamIndex, MF_SOURCE_READER_CONTROL_FLAG dwControlFlags, out int pdwActualStreamIndex, out MF_SOURCE_READER_FLAG pdwStreamFlags, out long pllTimestamp, out IMFSample ppSample); ppSourceReader.ReadSample(1, MF_SOURCE_READER_CONTROL_FLAG.None, out pdwActualStreamIndex, out pdwStreamFlags, out pllTimestamp, out ppSample); if (pdwStreamFlags == MF_SOURCE_READER_FLAG.EndOfStream) { Console.WriteLine("End of stream"); nvEncoder.EndOfProcessData(); while (true) { processResult = nvEncoder.ProcessData(null, 1920, 1088, out outputData); if (outputData != null) { ByteArrayToFile(outputData); } if (processResult == -1) { break; } } StopByteArrayToFile(); nvEncoder.FinalizeEncoder(); break; } if (ppSample != null) { inputData = MFLib.GetDataFromMediaSample(ppSample); nvEncoder.ProcessData(inputData, 1920, 1088, out outputData); if (outputData != null) { Console.WriteLine(outputData[4]); ByteArrayToFile(outputData); } // Call unmanaged code //Marshal.FreeHGlobal(inputPointer); //Marshal.FreeHGlobal(outputPointer); COMBase.SafeRelease(ppSample); } System.Threading.Thread.Sleep(100); } //Release COM objects COMBase.SafeRelease(ppSourceReader); MFExtern.MFShutdown(); Console.WriteLine("Shutdown MF"); Console.ReadLine(); break; } } //double x = 1; //double y = 2; //double result = 0; //Arithmetics ar = new Arithmetics(); //result = ar.Add(x, y); //Console.WriteLine("x = {0}, y = {1}, result = {2}", x, y, result); //Console.ReadLine(); //Console.WriteLine("---------Press Enter to get API---------"); //Console.ReadLine(); //IntPtr dllPointer = LoadLibrary("nvEncodeAPI.dll"); //IntPtr procAddress = GetProcAddress(dllPointer, "NvEncodeAPICreateInstance"); }