Live video on the AT Protocol
1package media
2
3import (
4 "context"
5 "io"
6 "os"
7 "testing"
8
9 "github.com/stretchr/testify/require"
10 "stream.place/streamplace/pkg/log"
11 "stream.place/streamplace/test/remote"
12)
13
14func TestMediaDataParser(t *testing.T) {
15 segmentsWithoutBFrames := []string{
16 remote.RemoteFixture("d63d26050db9a60c0944b4c2e2b1d052c4350a2a8a877324c7b0b7e7a0c1ae27/bframe-false-positive.mp4"),
17 getFixture("sample-segment.mp4"),
18 remote.RemoteFixture("604bebf51c97f27aa07a8952462ac9885dd963f7a88375154217f59db32e1573/2025-11-18T01-10-56-292Z-signed-segment.mp4"),
19 }
20 withNoGSTLeaks(t, func() {
21 for _, segment := range segmentsWithoutBFrames {
22 // Open input file
23 inputFile, err := os.Open(segment)
24 require.NoError(t, err)
25 defer inputFile.Close()
26 bs, err := io.ReadAll(inputFile)
27 require.NoError(t, err)
28
29 ctx := log.WithDebugValue(context.Background(), map[string]map[string]int{"GStreamerFunc": {"ParseSegmentMediaData": 9}})
30 mediaData, err := ParseSegmentMediaData(ctx, bs)
31 require.NoError(t, err)
32 require.NotNil(t, mediaData)
33 require.False(t, mediaData.Video[0].BFrames, "Video should not have BFrames")
34 require.Greater(t, mediaData.Duration, int64(0), "Video duration should not be empty")
35 }
36 })
37}
38
39func TestMediaDataParserBFrames(t *testing.T) {
40 withNoGSTLeaks(t, func() {
41 inputFile, err := os.Open(remote.RemoteFixture("5ea6c4491bade0cdcad3770aa0b63b2cd7a580e233ee320d5bc2282503b26491/segment-with-bframes.mp4"))
42 require.NoError(t, err)
43 defer inputFile.Close()
44 bs, err := io.ReadAll(inputFile)
45 require.NoError(t, err)
46
47 ctx := log.WithDebugValue(context.Background(), map[string]map[string]int{"GStreamerFunc": {"ParseSegmentMediaData": 9}})
48 mediaData, err := ParseSegmentMediaData(ctx, bs)
49 require.NoError(t, err)
50 require.NotNil(t, mediaData)
51 require.True(t, mediaData.Video[0].BFrames, "Video should have BFrames")
52 require.Greater(t, mediaData.Duration, int64(0), "Video duration should not be empty")
53 })
54}
55
56func TestMediaDataParserVideoHeaderWithNoVideo(t *testing.T) {
57 withNoGSTLeaks(t, func() {
58 inputFile, err := os.Open(remote.RemoteFixture("0aa38ed08bb6b6b0ae5f4891a97244717e2c952d5ca878e34450729770f7ca53/2025-11-16T23-05-04-512Z-converge-segment-did-key-zQ3shkzEYN8UrJoRAGS6pgPodXjdg8kF2fXQNGfJhpg3x4KJT.mp4"))
59 require.NoError(t, err)
60 defer inputFile.Close()
61 bs, err := io.ReadAll(inputFile)
62 require.NoError(t, err)
63
64 ctx := log.WithDebugValue(context.Background(), map[string]map[string]int{"GStreamerFunc": {"ParseSegmentMediaData": 9}})
65 mediaData, err := ParseSegmentMediaData(ctx, bs)
66 require.ErrorContains(t, err, "no video in segment")
67 require.Nil(t, mediaData)
68 })
69}