Prechádzať zdrojové kódy

refactor(d2-02): MjpegFrameParser Feed 加 null/空防御 + AddRange 高效写法;补 2 单测(空输入安全/坏帧跳过后恢复),全量 46 绿

huangjie 1 deň pred
rodič
commit
c9dc02a67c

+ 22 - 0
ivf_tl_operate_2.0/control/IvfTl.ControlHost.Tests/MjpegFrameParserTests.cs

@@ -70,5 +70,27 @@ namespace IvfTl.ControlHost.Tests
             Assert.Single(frames);
             Assert.Equal(jpeg, frames[0]);
         }
+
+        [Fact]
+        public void BadHeaderWithoutContentLength_SkippedThenRecovers()
+        {
+            var jpeg = new byte[] { 0xFF, 0xD8, 7, 0xFF, 0xD9 };
+            var bad = Encoding.ASCII.GetBytes("--frame\r\nContent-Type: image/jpeg\r\n\r\n"); // 无 Content-Length
+            var data = new List<byte>();
+            data.AddRange(bad);
+            data.AddRange(MakeFrame(jpeg));
+            var p = new MjpegFrameParser();
+            var frames = new List<byte[]>(p.Feed(data.ToArray(), data.Count));
+            Assert.Single(frames);
+            Assert.Equal(jpeg, frames[0]);
+        }
+
+        [Fact]
+        public void EmptyInput_ReturnsEmpty_NoThrow()
+        {
+            var p = new MjpegFrameParser();
+            var frames = new List<byte[]>(p.Feed(new byte[0], 0));
+            Assert.Empty(frames);
+        }
     }
 }

+ 3 - 1
ivf_tl_operate_2.0/ivf_tl_Operate/Debug/MjpegFrameParser.cs

@@ -18,7 +18,9 @@ namespace ivf_tl_Operate.Debug
         /// <summary>喂入一段字节,返回这次能切出的完整 JPEG 帧(可能 0~多帧)。</summary>
         public IEnumerable<byte[]> Feed(byte[] chunk, int count)
         {
-            for (int i = 0; i < count; i++) _buf.Add(chunk[i]);
+            if (chunk == null || count <= 0) return Array.Empty<byte[]>();
+            if (count == chunk.Length) _buf.AddRange(chunk);
+            else for (int i = 0; i < count; i++) _buf.Add(chunk[i]);
             var frames = new List<byte[]>();
 
             while (true)