VideoPacket.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace MediaUtil
  4. {
  5. public partial class VideoPacket : IDisposable
  6. {
  7. private readonly IntPtr _packetHandle;
  8. private bool _disposed;
  9. public IntPtr Handle => _packetHandle;
  10. /// <summary>
  11. /// Gets the index of this packet.
  12. /// </summary>
  13. public int Index { get; }
  14. /// <summary>
  15. /// Gets the data size of this packet.
  16. /// </summary>
  17. public int Size { get; }
  18. /// <summary>
  19. /// Gets the data of this packet.
  20. /// </summary>
  21. public byte[] Data
  22. {
  23. get
  24. {
  25. IntPtr dataPtr = Environment.Is64BitProcess ?
  26. Interop64.GetPacketData(_packetHandle) :
  27. Interop32.GetPacketData(_packetHandle);
  28. var data = new byte[Size];
  29. Marshal.Copy(dataPtr, data, 0, Size);
  30. return data;
  31. }
  32. }
  33. public VideoPacket(IntPtr packetHandle)
  34. {
  35. _packetHandle = packetHandle;
  36. Index = Environment.Is64BitProcess ?
  37. Interop64.GetPacketIndex(_packetHandle) :
  38. Interop32.GetPacketIndex(_packetHandle);
  39. Size = Environment.Is64BitProcess ?
  40. Interop64.GetPacketSize(_packetHandle) :
  41. Interop32.GetPacketSize(_packetHandle);
  42. }
  43. ~VideoPacket()
  44. {
  45. DoDispose();
  46. }
  47. private void DoDispose()
  48. {
  49. if (!_disposed)
  50. {
  51. var result = Environment.Is64BitProcess ?
  52. Interop64.DestroyPacket(_packetHandle) :
  53. Interop32.DestroyPacket(_packetHandle);
  54. if (result != 0)
  55. {
  56. throw new MediaException(result);
  57. }
  58. _disposed = true;
  59. }
  60. }
  61. public void Dispose()
  62. {
  63. DoDispose();
  64. GC.SuppressFinalize(this);
  65. }
  66. }
  67. }