MjpegFrameParserTests.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System.Collections.Generic;
  2. using System.Text;
  3. using ivf_tl_Operate.Debug;
  4. using Xunit;
  5. namespace IvfTl.ControlHost.Tests
  6. {
  7. public class MjpegFrameParserTests
  8. {
  9. // 造一个 multipart 帧字节(与 control MjpegStreamWriter.FrameBytes 同格式)。
  10. private static byte[] MakeFrame(byte[] jpeg)
  11. {
  12. string head = $"--frame\r\nContent-Type: image/jpeg\r\nContent-Length: {jpeg.Length}\r\n\r\n";
  13. var ms = new List<byte>();
  14. ms.AddRange(Encoding.ASCII.GetBytes(head));
  15. ms.AddRange(jpeg);
  16. ms.AddRange(Encoding.ASCII.GetBytes("\r\n"));
  17. return ms.ToArray();
  18. }
  19. private static List<byte[]> FeedAll(MjpegFrameParser p, byte[] data)
  20. {
  21. var all = new List<byte[]>();
  22. all.AddRange(p.Feed(data, data.Length));
  23. return all;
  24. }
  25. [Fact]
  26. public void SingleWholeFrame_YieldsOneJpeg()
  27. {
  28. var jpeg = new byte[] { 0xFF, 0xD8, 1, 2, 3, 0xFF, 0xD9 };
  29. var p = new MjpegFrameParser();
  30. var frames = FeedAll(p, MakeFrame(jpeg));
  31. Assert.Single(frames);
  32. Assert.Equal(jpeg, frames[0]);
  33. }
  34. [Fact]
  35. public void TwoFramesInOneChunk_YieldsTwo()
  36. {
  37. var j1 = new byte[] { 0xFF, 0xD8, 1, 0xFF, 0xD9 };
  38. var j2 = new byte[] { 0xFF, 0xD8, 9, 8, 0xFF, 0xD9 };
  39. var combined = new List<byte>();
  40. combined.AddRange(MakeFrame(j1));
  41. combined.AddRange(MakeFrame(j2));
  42. var p = new MjpegFrameParser();
  43. var frames = FeedAll(p, combined.ToArray());
  44. Assert.Equal(2, frames.Count);
  45. Assert.Equal(j1, frames[0]);
  46. Assert.Equal(j2, frames[1]);
  47. }
  48. [Fact]
  49. public void FrameSplitAcrossChunks_Reassembles()
  50. {
  51. var jpeg = new byte[] { 0xFF, 0xD8, 5, 6, 7, 8, 0xFF, 0xD9 };
  52. byte[] full = MakeFrame(jpeg);
  53. var p = new MjpegFrameParser();
  54. // 在帧中间切两半喂
  55. int mid = full.Length / 2;
  56. var first = new byte[mid];
  57. var second = new byte[full.Length - mid];
  58. System.Array.Copy(full, 0, first, 0, mid);
  59. System.Array.Copy(full, mid, second, 0, second.Length);
  60. var frames = new List<byte[]>();
  61. frames.AddRange(p.Feed(first, first.Length));
  62. Assert.Empty(frames); // 半帧,还吐不出
  63. frames.AddRange(p.Feed(second, second.Length));
  64. Assert.Single(frames);
  65. Assert.Equal(jpeg, frames[0]);
  66. }
  67. }
  68. }