VideoInControl.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using DirectShow;
  2. using Sonic;
  3. using System;
  4. using System.Drawing;
  5. using System.Runtime.InteropServices;
  6. using System.Windows.Forms;
  7. using VideoPlayLib.MadVR;
  8. namespace VideoPlayLib
  9. {
  10. internal class VideoInControl : BaseObject, IDisposable
  11. {
  12. private const int OaTrue = -1;
  13. private const int OaFalse = 0;
  14. private readonly Control _ctl;
  15. private readonly object _flt;
  16. private readonly Size _szOrignal;
  17. private readonly float _vdoRatio;
  18. private readonly IVideoWindow _ivw;
  19. private readonly IBasicVideo2 _ibv2;
  20. private readonly IMadVRInfo _imvr;
  21. public VideoInControl(DSFilter madVr, Control ctl, bool fitWindow = true)
  22. {
  23. _ctl = ctl;
  24. _flt = madVr.Value;
  25. _imvr = (IMadVRInfo)_flt;
  26. _ivw = (IVideoWindow)_flt;
  27. _ibv2 = (IBasicVideo2)_flt;
  28. _ivw.put_Owner(_ctl.Handle);
  29. _ivw.put_MessageDrain(_ctl.Handle);
  30. _ivw.put_FullScreenMode(OaFalse);
  31. _ivw.put_WindowStyle(0x40000000 | 0x4000000);
  32. CheckError(_imvr.GetSize("originalVideoSize", out _szOrignal));
  33. //TODO: °´Ã½ÌåÐÅÏ¢AR¼ÆËã¿í¸ß±È
  34. _vdoRatio = (float)_szOrignal.Width / _szOrignal.Height;
  35. if (fitWindow)
  36. {
  37. _ctl.ClientSize = _szOrignal;
  38. }
  39. ctl.Resize += EventHandler;
  40. EventHandler(null, null);
  41. }
  42. public VideoInControl(Graph graph, Control ctl)
  43. {
  44. _ctl = ctl;
  45. _flt = graph.Value;
  46. _ivw = (IVideoWindow)_flt;
  47. _ibv2 = (IBasicVideo2)_flt;
  48. _ivw.put_Owner(_ctl.Handle);
  49. _ivw.put_MessageDrain(_ctl.Handle);
  50. _ivw.put_FullScreenMode(OaFalse);
  51. _ivw.put_WindowStyle(0x40000000 | 0x4000000);
  52. ctl.Resize += EventHandler;
  53. EventHandler(null, null);
  54. }
  55. private void EventHandler(object sender, EventArgs e)
  56. {
  57. var ctl = sender as Control ?? _ctl;
  58. _ivw.SetWindowPosition(0, 0, ctl.ClientSize.Width, ctl.ClientSize.Height);
  59. if(_szOrignal==Size.Empty)
  60. return;
  61. int resultWidth, resultHeight, marginV, marginH;
  62. //calc lettel box
  63. var ctlRatio = (float)ctl.ClientSize.Width / ctl.ClientSize.Height;
  64. if (_vdoRatio > ctlRatio)
  65. {
  66. //width based
  67. resultWidth = ctl.ClientSize.Width;
  68. marginH = 0;
  69. resultHeight = (int)(((float)ctl.Width / _szOrignal.Width) * _szOrignal.Height);
  70. marginV = (ctl.ClientSize.Height - resultHeight) / 2;
  71. }
  72. else
  73. {
  74. //height based
  75. resultHeight = ctl.ClientSize.Height;
  76. marginV = 0;
  77. resultWidth = (int)(((float)ctl.Height / _szOrignal.Height) * _szOrignal.Width);
  78. marginH = (ctl.ClientSize.Width - resultWidth) / 2;
  79. }
  80. _ibv2.SetDestinationPosition(marginH, marginV, resultWidth, resultHeight);
  81. }
  82. public void Dispose()
  83. {
  84. Marshal.ReleaseComObject(_ivw);
  85. Marshal.ReleaseComObject(_ibv2);
  86. Marshal.ReleaseComObject(_imvr);
  87. }
  88. }
  89. }