public IEnumerator CallVideoDecoderMethods() { if (encoderType == EncoderType.Hardware) { //Todo: If Support Codec VP8/VP9 on HardwareEncoder or Support Codec H264 on Decoder, it can test on hardware encoder. yield break; } var context = NativeMethods.ContextCreate(0, encoderType, true); const int width = 1280; const int height = 720; var renderTexture = CreateRenderTexture(width, height); var receiveTexture = CreateRenderTexture(width, height); var source = NativeMethods.ContextCreateVideoTrackSource(context); var track = NativeMethods.ContextCreateVideoTrack(context, "video", source); var renderer = NativeMethods.CreateVideoRenderer(context); var rendererId = NativeMethods.GetVideoRendererId(renderer); NativeMethods.VideoTrackAddOrUpdateSink(track, renderer); var renderEvent = NativeMethods.GetRenderEventFunc(context); var updateTextureEvent = NativeMethods.GetUpdateTextureFunc(context); NativeMethods.ContextSetVideoEncoderParameter(context, track, width, height, renderTexture.graphicsFormat, renderTexture.GetNativeTexturePtr()); VideoEncoderMethods.InitializeEncoder(renderEvent, track); yield return(new WaitForSeconds(1.0f)); VideoEncoderMethods.Encode(renderEvent, track); yield return(new WaitForSeconds(1.0f)); // this method is not supported on Direct3D12 VideoDecoderMethods.UpdateRendererTexture(updateTextureEvent, receiveTexture, rendererId); yield return(new WaitForSeconds(1.0f)); VideoEncoderMethods.FinalizeEncoder(renderEvent, track); yield return(new WaitForSeconds(1.0f)); NativeMethods.VideoTrackRemoveSink(track, renderer); NativeMethods.DeleteVideoRenderer(context, renderer); NativeMethods.ContextDeleteRefPtr(context, track); NativeMethods.ContextDeleteRefPtr(context, source); NativeMethods.ContextDestroy(0); UnityEngine.Object.DestroyImmediate(renderTexture); UnityEngine.Object.DestroyImmediate(receiveTexture); }
public IEnumerator CallVideoDecoderMethods() { var context = NativeMethods.ContextCreate(0); const int width = 1280; const int height = 720; var renderTexture = CreateRenderTexture(width, height); var receiveTexture = CreateRenderTexture(width, height); var source = NativeMethods.ContextCreateVideoTrackSource(context); var track = NativeMethods.ContextCreateVideoTrack(context, "video", source); var renderer = NativeMethods.CreateVideoRenderer(context, OnVideoFrameResize, true); var rendererId = NativeMethods.GetVideoRendererId(renderer); NativeMethods.VideoTrackAddOrUpdateSink(track, renderer); var renderEvent = NativeMethods.GetRenderEventFunc(context); var updateTextureEvent = NativeMethods.GetUpdateTextureFunc(context); yield return(new WaitForSeconds(1.0f)); VideoTrackSource.EncodeData data = new VideoTrackSource.EncodeData(renderTexture, source); IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VideoTrackSource.EncodeData))); Marshal.StructureToPtr(data, ptr, true); VideoEncoderMethods.Encode(renderEvent, ptr); yield return(new WaitForSeconds(1.0f)); // this method is not supported on Direct3D12 VideoDecoderMethods.UpdateRendererTexture(updateTextureEvent, receiveTexture, rendererId); yield return(new WaitForSeconds(1.0f)); yield return(new WaitForSeconds(1.0f)); Marshal.FreeHGlobal(ptr); NativeMethods.VideoTrackRemoveSink(track, renderer); NativeMethods.DeleteVideoRenderer(context, renderer); NativeMethods.ContextDeleteRefPtr(context, track); NativeMethods.ContextDeleteRefPtr(context, source); NativeMethods.ContextDestroy(0); UnityEngine.Object.DestroyImmediate(renderTexture); UnityEngine.Object.DestroyImmediate(receiveTexture); }