private void DecodeTask() { H264VideoPayloadParser parser = new H264VideoPayloadParser(new RtspClientSharp.Codecs.Video.H264CodecInfo()); FFmpegVideoDecoder decoder = FFmpegVideoDecoder.CreateDecoder(FFmpegVideoCodecId.H264); parser.FrameGenerated += (frame) => { lock (m_decoderLock) { IDecodedVideoFrame decodedFrame = decoder.TryDecode((RawVideoFrame)frame); if (decodedFrame != null) { m_lastDecodedFrame = decodedFrame; FrameReceived?.Invoke(this, decodedFrame); } else { Log.e(TAG, "Failed to decode frame"); } } }; while (!m_CancelToken.Token.IsCancellationRequested) { try { Payload nextFramePayload = m_payloadQueue.Receive(m_CancelToken.Token); parser.Parse(new TimeSpan(1), new ArraySegment <byte>(nextFramePayload.Data.GetBuffer(), (int)nextFramePayload.Data.Position, (int)nextFramePayload.Data.Remaining()), true); } catch (OperationCanceledException) { break; } } }
public void Parse_DifferentAggregationUnits_ReturnsValidIFrame(byte[] testBytes) { H264CodecInfo testCodecInfo = CreateTestH264CodecInfo(); RawH264Frame frame = null; var parser = new H264VideoPayloadParser(testCodecInfo); parser.FrameGenerated = rawFrame => frame = (RawH264Frame)rawFrame; parser.Parse(TimeSpan.Zero, new ArraySegment <byte>(testBytes), true); Assert.IsNotNull(frame); Assert.IsInstanceOfType(frame, typeof(RawH264IFrame)); }