-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathremuxer_test.go
More file actions
127 lines (111 loc) · 3.02 KB
/
Copy pathremuxer_test.go
File metadata and controls
127 lines (111 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
//go:build amd64 || arm64
package ffmpeg
import (
"errors"
"path/filepath"
"strconv"
"strings"
"sync"
"testing"
"unsafe"
"github.com/bstkhq/go-ffmpeg-ffi/avcodec"
)
func TestRemuxerWritePacketPropagatesPacketRefError(t *testing.T) {
want := errors.New("packet ref failed")
packetStorage := byte(0)
r := &Remuxer{
streamMap: map[int]int{0: 0},
inputTimeBases: make(map[int]Rational),
outputTimeBases: make(map[int]Rational),
headerWritten: true,
packetRef: func(avcodec.Packet, avcodec.Packet) error {
return want
},
}
err := r.WritePacket(avcodec.Packet(unsafe.Pointer(&packetStorage)), 0)
if !errors.Is(err, want) {
t.Fatalf("WritePacket error = %v, want %v", err, want)
}
}
func TestRemuxerWritePacketRejectsNilPacket(t *testing.T) {
r := &Remuxer{streamMap: map[int]int{0: 0}}
if err := r.WritePacket(nil, 0); err == nil {
t.Fatal("WritePacket(nil) succeeded")
}
}
func TestRemuxerStreamMappingReturnsSnapshot(t *testing.T) {
r := &Remuxer{streamMap: map[int]int{2: 0, 5: 1}}
mapping := r.StreamMapping()
mapping[2] = 99
delete(mapping, 5)
got := r.StreamMapping()
if got[2] != 0 || got[5] != 1 || len(got) != 2 {
t.Fatalf("internal stream mapping was mutated: %v", got)
}
}
func TestRemuxerCopyDecoderStreamsRejectsClosedDecoder(t *testing.T) {
r := &Remuxer{}
d := &Decoder{closed: true}
if err := r.copyDecoderStreams(d, nil); !errors.Is(err, errDecoderClosed) {
t.Fatalf("copyDecoderStreams error = %v, want %v", err, errDecoderClosed)
}
}
func TestNewRemuxerRejectsDuplicateStreams(t *testing.T) {
if !requireFFmpeg(t) {
return
}
decoder, err := NewDecoder(createTestVideo(t), nil)
if err != nil {
t.Fatal(err)
}
defer decoder.Close()
outputPath := filepath.Join(t.TempDir(), "duplicate-streams.mkv")
remuxer, err := NewRemuxer(outputPath, decoder, &RemuxerConfig{InputStreams: []int{0, 0}})
if remuxer != nil {
_ = remuxer.Close()
}
if err == nil || !strings.Contains(err.Error(), "duplicate input stream index 0") {
t.Fatalf("NewRemuxer error = %v, want duplicate stream rejection", err)
}
}
func TestNewRemuxerConcurrentDecoderClose(t *testing.T) {
if !requireFFmpeg(t) {
return
}
inputPath := createTestVideo(t)
outputDir := t.TempDir()
const attempts = 8
for attempt := 0; attempt < attempts; attempt++ {
decoder, err := NewDecoder(inputPath, nil)
if err != nil {
t.Fatal(err)
}
start := make(chan struct{})
var wg sync.WaitGroup
wg.Add(2)
var remuxer *Remuxer
var remuxErr, closeErr error
go func() {
defer wg.Done()
<-start
outputPath := filepath.Join(outputDir, strconv.Itoa(attempt)+".mkv")
remuxer, remuxErr = NewRemuxer(outputPath, decoder, nil)
}()
go func() {
defer wg.Done()
<-start
closeErr = decoder.Close()
}()
close(start)
wg.Wait()
if remuxer != nil {
_ = remuxer.Close()
}
if closeErr != nil {
t.Fatalf("attempt %d: Decoder.Close: %v", attempt, closeErr)
}
if remuxErr != nil && !errors.Is(remuxErr, errDecoderClosed) {
t.Fatalf("attempt %d: NewRemuxer: %v", attempt, remuxErr)
}
}
}