mirror of
https://github.com/BililiveRecorder/BililiveRecorder.git
synced 2024-11-15 19:22:19 +08:00
Add test for FfmpegDetectionRule
This commit is contained in:
parent
d0c7863c9d
commit
8aa53b5b30
|
@ -2,6 +2,18 @@ namespace BililiveRecorder.Flv.Amf
|
||||||
{
|
{
|
||||||
public static class ScriptTagBodyExtensions
|
public static class ScriptTagBodyExtensions
|
||||||
{
|
{
|
||||||
public static ScriptDataEcmaArray? GetMetadataValue(this ScriptTagBody body) => body.Values.Count > 1 ? body.Values[1] as ScriptDataEcmaArray : null;
|
public static ScriptDataEcmaArray? GetMetadataValue(this ScriptTagBody body)
|
||||||
|
{
|
||||||
|
if (body.Values.Count > 1)
|
||||||
|
{
|
||||||
|
return body.Values[1] switch
|
||||||
|
{
|
||||||
|
ScriptDataEcmaArray array => array,
|
||||||
|
ScriptDataObject oect => oect,
|
||||||
|
_ => null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@ namespace BililiveRecorder.Flv.Pipeline.Rules
|
||||||
if (!this.LavfEncoderDetected && context.Actions.Any(action =>
|
if (!this.LavfEncoderDetected && context.Actions.Any(action =>
|
||||||
{
|
{
|
||||||
if (action is PipelineScriptAction scriptAction
|
if (action is PipelineScriptAction scriptAction
|
||||||
&& (scriptAction?.Tag?.ScriptData?.GetMetadataValue()?.Value?.TryGetValue("encoder", out var encoderValue) ?? false)
|
&& (scriptAction?.Tag?.ScriptData?.GetMetadataValue()?.TryGetValue("encoder", out var encoderValue) ?? false)
|
||||||
&& encoderValue is ScriptDataString encoder)
|
&& encoderValue is ScriptDataString encoder)
|
||||||
return encoder.Value.StartsWith("Lavf", StringComparison.Ordinal);
|
return encoder.Value.StartsWith("Lavf", StringComparison.Ordinal);
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using BililiveRecorder.Flv.Amf;
|
||||||
|
using BililiveRecorder.Flv.Pipeline;
|
||||||
|
using BililiveRecorder.Flv.Pipeline.Actions;
|
||||||
|
using BililiveRecorder.Flv.Pipeline.Rules;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace BililiveRecorder.Flv.Tests.RuleTests
|
||||||
|
{
|
||||||
|
public class FfmpegDetectionRuleTests
|
||||||
|
{
|
||||||
|
[Theory]
|
||||||
|
[MemberData(nameof(EndTagTestData))]
|
||||||
|
public void ShouldDetectEndTag(bool expectEndTag, PipelineAction pipelineAction)
|
||||||
|
{
|
||||||
|
var rule = new FfmpegDetectionRule();
|
||||||
|
var pipeline = new ProcessingPipelineBuilder(new ServiceCollection().BuildServiceProvider()).Add(rule).Build();
|
||||||
|
|
||||||
|
var context = new FlvProcessingContext(pipelineAction, new Dictionary<object, object?>());
|
||||||
|
|
||||||
|
pipeline(context);
|
||||||
|
|
||||||
|
Assert.Equal(expectEndTag, rule.EndTagDetected);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<object[]> EndTagTestData()
|
||||||
|
{
|
||||||
|
yield return new object[] { true, new PipelineEndAction(new Tag()) };
|
||||||
|
yield return new object[] { false, new PipelineScriptAction(new Tag()) };
|
||||||
|
yield return new object[] { false, new PipelineHeaderAction(Array.Empty<Tag>()) };
|
||||||
|
yield return new object[] { false, new PipelineDataAction(Array.Empty<Tag>()) };
|
||||||
|
yield return new object[] { false, PipelineNewFileAction.Instance };
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory]
|
||||||
|
[InlineData(true, @"[{""Type"":""String"",""Value"":""onMetaData""},{""Type"":""Object"",""Value"":{""encoder"":{""Type"":""String"",""Value"":""Lavf56.40.101""}}}]")]
|
||||||
|
[InlineData(true, @"[{""Type"":""String"",""Value"":""onMetaData""},{""Type"":""EcmaArray"",""Value"":{""encoder"":{""Type"":""String"",""Value"":""Lavf56.40.101""}}}]")]
|
||||||
|
[InlineData(true, @"[{""Type"":""String"",""Value"":""onMetaData""},{""Type"":""Object"",""Value"":{""encoder"":{""Type"":""String"",""Value"":""Lavf56.40.101""}}},{""Type"":""Null""}]")]
|
||||||
|
[InlineData(true, @"[{""Type"":""String"",""Value"":""onMetaData""},{""Type"":""Object"",""Value"":{""encoder"":{""Type"":""String"",""Value"":""Lavf123""}}}]")]
|
||||||
|
[InlineData(false, @"[{""Type"":""String"",""Value"":""onMetaData""},{""Type"":""EcmaArray"",""Value"":{""encoder"":{""Type"":""String"",""Value"":""libobs xxxx""}}}]")]
|
||||||
|
[InlineData(false, @"[{""Type"":""String"",""Value"":""onMetaData""},{""Type"":""EcmaArray"",""Value"":{}}]")]
|
||||||
|
[InlineData(false, @"[{""Type"":""String"",""Value"":""onMetaData""},{""Type"":""Object"",""Value"":{}}]")]
|
||||||
|
[InlineData(false, @"[{""Type"":""String"",""Value"":""aaa""},{""Type"":""Object"",""Value"":{}}]")]
|
||||||
|
public void ShouldDetectLvafEncoder(bool expectedValue, string metadataJson)
|
||||||
|
{
|
||||||
|
var rule = new FfmpegDetectionRule();
|
||||||
|
var pipeline = new ProcessingPipelineBuilder(new ServiceCollection().BuildServiceProvider()).Add(rule).Build();
|
||||||
|
|
||||||
|
var action = new PipelineScriptAction(new Tag
|
||||||
|
{
|
||||||
|
Type = TagType.Script,
|
||||||
|
ScriptData = ScriptTagBody.Parse(metadataJson)
|
||||||
|
});
|
||||||
|
|
||||||
|
var context = new FlvProcessingContext(action, new Dictionary<object, object?>());
|
||||||
|
|
||||||
|
pipeline(context);
|
||||||
|
|
||||||
|
Assert.Equal(expectedValue, rule.LavfEncoderDetected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user