MjpegStreamWriterTests.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using System.IO;
  2. using System.Windows.Media.Imaging;
  3. using IvfTl.ControlHost.Debug;
  4. using Xunit;
  5. namespace IvfTl.ControlHost.Tests
  6. {
  7. public class MjpegStreamWriterTests
  8. {
  9. // 造一张 4x4 纯色 24bpp BGR 像素(每像素 3 字节)。
  10. private static byte[] SolidBgr(int w, int h, byte b, byte g, byte r)
  11. {
  12. var buf = new byte[w * h * 3];
  13. for (int i = 0; i < w * h; i++) { buf[i * 3] = b; buf[i * 3 + 1] = g; buf[i * 3 + 2] = r; }
  14. return buf;
  15. }
  16. [Fact]
  17. public void EncodeJpeg_ProducesDecodableJpeg_WithRightSize()
  18. {
  19. var rgb = SolidBgr(4, 4, 10, 20, 30);
  20. byte[] jpeg = MjpegStreamWriter.EncodeJpeg(rgb, 4, 4);
  21. Assert.NotNull(jpeg);
  22. Assert.True(jpeg.Length > 2);
  23. // JPEG 魔数 FF D8 开头
  24. Assert.Equal(0xFF, jpeg[0]);
  25. Assert.Equal(0xD8, jpeg[1]);
  26. // 能被解码器读回、尺寸对
  27. var dec = new JpegBitmapDecoder(new MemoryStream(jpeg),
  28. BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
  29. Assert.Equal(4, dec.Frames[0].PixelWidth);
  30. Assert.Equal(4, dec.Frames[0].PixelHeight);
  31. }
  32. [Fact]
  33. public void FrameBytes_WrapsJpegInMultipartBoundary()
  34. {
  35. var jpeg = new byte[] { 0xFF, 0xD8, 1, 2, 0xFF, 0xD9 };
  36. byte[] frame = MjpegStreamWriter.FrameBytes(jpeg);
  37. string head = System.Text.Encoding.ASCII.GetString(frame, 0, 60);
  38. Assert.Contains("--frame", head);
  39. Assert.Contains("Content-Type: image/jpeg", head);
  40. Assert.Contains("Content-Length: 6", head);
  41. // 帧尾部含 jpeg 原始字节 + 末尾 \r\n
  42. Assert.Equal(0xFF, frame[frame.Length - 8]); // jpeg 起点附近(粗校验帧体存在)
  43. Assert.Equal((byte)'\r', frame[frame.Length - 2]);
  44. Assert.Equal((byte)'\n', frame[frame.Length - 1]);
  45. }
  46. }
  47. }