feat(gateway): relay complete encoded frames
This commit is contained in:
@@ -22,9 +22,9 @@ func TestQualificationCatalogMatchesSection7(t *testing.T) {
|
||||
t.Fatalf("media profile count = %d, want 3", len(media))
|
||||
}
|
||||
wantMedia := []qualificationMediaProfile{
|
||||
{Name: "1080p60-h264", Codec: "h264", BitrateKbps: 20000, Duration: 10 * time.Minute, Warmup: time.Second, PacketBytes: 1179},
|
||||
{Name: "1440p120-hevc", Codec: "hevc", BitrateKbps: 50000, Duration: 10 * time.Minute, Warmup: time.Second, PacketBytes: 1179},
|
||||
{Name: "4k60-hevc", Codec: "hevc", BitrateKbps: 80000, Duration: 10 * time.Minute, Warmup: time.Second, PacketBytes: 1179},
|
||||
{Name: "1080p60-h264", Codec: "h264", BitrateKbps: 20000, FPS: 60, Duration: 10 * time.Minute, Warmup: time.Second, PacketBytes: 1179},
|
||||
{Name: "1440p120-hevc", Codec: "hevc", BitrateKbps: 50000, FPS: 120, Duration: 10 * time.Minute, Warmup: time.Second, PacketBytes: 1179},
|
||||
{Name: "4k60-hevc", Codec: "hevc", BitrateKbps: 80000, FPS: 60, Duration: 10 * time.Minute, Warmup: time.Second, PacketBytes: 1179},
|
||||
}
|
||||
if !reflect.DeepEqual(media, wantMedia) {
|
||||
t.Fatalf("media profiles = %#v, want %#v", media, wantMedia)
|
||||
@@ -145,6 +145,14 @@ func TestQualificationShortProcessingSubprocessCoversFixedProfiles(t *testing.T)
|
||||
}
|
||||
if summary.Count < 1 || summary.CPUScope != qualificationGatewayCPUScope ||
|
||||
summary.ClockOverhead <= 0 || summary.ClockMethod != qualificationClockOverheadMethod ||
|
||||
summary.Count != int64(profile.FPS) ||
|
||||
summary.ConfiguredFPS != profile.FPS ||
|
||||
summary.ObservedFPS < float64(profile.FPS)*0.95 ||
|
||||
summary.ObservedFPS > float64(profile.FPS)*1.05 ||
|
||||
summary.PayloadBytes != profile.BitrateKbps*1000/8 ||
|
||||
summary.MaximumFrameBytes <= summary.MinimumFrameBytes ||
|
||||
summary.MaximumFrameBytes <= 18_864 ||
|
||||
summary.PayloadSHA256 == "" ||
|
||||
summary.ObservedBitrateKbps < float64(profile.BitrateKbps)*0.95 ||
|
||||
summary.ObservedBitrateKbps > float64(profile.BitrateKbps)*1.05 {
|
||||
t.Fatalf("%s subprocess summary = %#v", profile.Name, summary)
|
||||
@@ -152,6 +160,19 @@ func TestQualificationShortProcessingSubprocessCoversFixedProfiles(t *testing.T)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQualificationShortProcessingUsesCompleteFrameCadence(t *testing.T) {
|
||||
profile := qualificationMediaProfiles()[0]
|
||||
profile.Duration = 100 * time.Millisecond
|
||||
profile.Warmup = time.Millisecond
|
||||
summary, err := runQualificationProcessing(t, profile, filepath.Join(t.TempDir(), "frames.csv.gz"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if summary.Count != 6 {
|
||||
t.Fatalf("100 ms of 1080p60 processed %d units, want 6 complete encoded frames", summary.Count)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQualificationSustainedProcessingKeepsCleanPathBounded(t *testing.T) {
|
||||
profile := qualificationMediaProfiles()[2]
|
||||
profile.Duration = 2 * time.Minute
|
||||
@@ -400,7 +421,7 @@ func TestQualificationGatewaySubprocessResourcesResetAndTrackWork(t *testing.T)
|
||||
Name: "resource-process", Codec: "h264", BitrateKbps: 100000,
|
||||
Duration: time.Second, Warmup: time.Millisecond, PacketBytes: 1000,
|
||||
}
|
||||
path := newQualificationProcessingPath(t, profile, qualificationMediaPacerKbps(profile, 0))
|
||||
path := newQualificationProcessingPath(t, profile, qualificationFramePacerKbps(profile))
|
||||
defer path.Close()
|
||||
output := t.TempDir()
|
||||
record := func(name string, work func() error) qualificationProcessRecordResult {
|
||||
@@ -552,3 +573,25 @@ func TestQualificationSmokeTraversesNativeApolloRecoveryQueuePacerAndQUIC(t *tes
|
||||
t.Fatalf("qualification production-path trace = %#v", trace)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQualificationCarriesCompleteLargeFramesThroughPublicPath(t *testing.T) {
|
||||
profile := qualificationMediaProfiles()[2]
|
||||
path := newQualificationPath(t, profile, 200000)
|
||||
defer path.Close()
|
||||
|
||||
for _, size := range []int{24 * 1024, 96 * 1024, 384 * 1024} {
|
||||
payload := make([]byte, size)
|
||||
for index := range payload {
|
||||
payload[index] = byte(index*31 + size)
|
||||
}
|
||||
trace, _, err := path.traverse(t, payload)
|
||||
if err != nil {
|
||||
t.Fatalf("frame bytes=%d: %v", size, err)
|
||||
}
|
||||
if !trace.NativeUDPIngress || !trace.ApolloRecovered || !trace.ProductionQueue ||
|
||||
!trace.ProductionMediaLoop || !trace.ProductionPacer || !trace.VerseQUIC ||
|
||||
!trace.PublicClientDecode || !trace.PayloadPreserved {
|
||||
t.Fatalf("frame bytes=%d skipped path: %#v", size, trace)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user