Refactoring #3

Merged
itten merged 87 commits from refactoring into main 2026-09-01 23:52:36 +03:00
Showing only changes of commit a7fcf12740 - Show all commits
+86 -16
View File
@@ -69,7 +69,7 @@ func Open(domain, flowID string) (*Source, error) {
if err := json.Unmarshal([]byte(def), &fd); err != nil { if err := json.Unmarshal([]byte(def), &fd); err != nil {
r.Close() r.Close()
inst.Close() inst.Close()
return nil, wrapError("parse flow definition JSON", ErrorKindInvalidConfig, err) return nil, wrapError("parse video flow definition JSON", ErrorKindInvalidConfig, err)
} }
if fd.FrameWidth == 0 || fd.FrameHeight == 0 { if fd.FrameWidth == 0 || fd.FrameHeight == 0 {
r.Close() r.Close()
@@ -311,19 +311,19 @@ type SyncSource struct {
func OpenSameDomainSync(domain, videoFlow, audioFlow string) (*SyncSource, error) { func OpenSameDomainSync(domain, videoFlow, audioFlow string) (*SyncSource, error) {
inst, err := mxl.NewInstance(domain, "") inst, err := mxl.NewInstance(domain, "")
if err != nil { if err != nil {
return nil, fmt.Errorf("NewInstance: %w", err) return nil, wrapError("new MXL instance", ErrorKindUnavailable, err)
} }
vr, err := inst.NewReader(videoFlow) vr, err := inst.NewReader(videoFlow)
if err != nil { if err != nil {
inst.Close() inst.Close()
return nil, fmt.Errorf("NewReader(video): %w", err) return nil, wrapError("open video reader", ErrorKindUnavailable, err)
} }
ar, err := inst.NewReader(audioFlow) ar, err := inst.NewReader(audioFlow)
if err != nil { if err != nil {
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("NewReader(audio): %w", err) return nil, wrapError("open audio reader", ErrorKindUnavailable, err)
} }
vInfo, err := vr.Info() vInfo, err := vr.Info()
@@ -331,26 +331,56 @@ func OpenSameDomainSync(domain, videoFlow, audioFlow string) (*SyncSource, error
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("Info(video): %w", err) return nil, wrapError("get video info", ErrorKindUnavailable, err)
} }
if !vInfo.Config.Common.Format.IsDiscrete() { if !vInfo.Config.Common.Format.IsDiscrete() {
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("video flow is not discrete") return nil, wrapError(
"validate video flow",
ErrorKindInvalidConfig,
errors.New("video flow is continuous"),
)
} }
aInfo, err := ar.Info() aInfo, err := ar.Info()
if err != nil { if err != nil {
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("Info(audio): %w", err) return nil, wrapError("get audio info", ErrorKindUnavailable, err)
} }
if aInfo.Config.Common.Format.IsDiscrete() { if aInfo.Config.Common.Format.IsDiscrete() {
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("audio flow is not continuous") return nil, wrapError(
"validate audio flow",
ErrorKindInvalidConfig,
errors.New("audio flow is discrete"),
)
}
channels := uint64(aInfo.Config.Continuous.ChannelCount)
if channels == 0 {
ar.Close()
vr.Close()
inst.Close()
return nil, wrapError(
"validate audio flow",
ErrorKindInvalidConfig,
errors.New("audio flow has no channels"),
)
}
aRate := aInfo.Config.Common.GrainRate
if aRate.Num <= 0 || aRate.Den <= 0 {
ar.Close()
vr.Close()
inst.Close()
return nil, wrapError(
"validate audio flow",
ErrorKindInvalidConfig,
fmt.Errorf("invalid audio rate: %d/%d", aRate.Num, aRate.Den),
)
} }
def, err := inst.FlowDef(videoFlow) def, err := inst.FlowDef(videoFlow)
@@ -358,14 +388,38 @@ func OpenSameDomainSync(domain, videoFlow, audioFlow string) (*SyncSource, error
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("FlowDef: %w", err) return nil, wrapError("read video flow definition", ErrorKindUnavailable, err)
} }
var fd flowDef var fd flowDef
if err := json.Unmarshal([]byte(def), &fd); err != nil { if err := json.Unmarshal([]byte(def), &fd); err != nil {
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("parse flow def: %w", err) return nil, wrapError("parse video flow definition JSON", ErrorKindInvalidConfig, err)
}
if fd.FrameWidth <= 0 || fd.FrameHeight <= 0 {
ar.Close()
vr.Close()
inst.Close()
return nil, wrapError(
"validate video flow",
ErrorKindInvalidConfig,
fmt.Errorf(
"invalid video dimensions: %dx%d",
fd.FrameWidth,
fd.FrameHeight,
),
)
}
if len(vInfo.Config.Discrete.SliceSizes) == 0 {
ar.Close()
vr.Close()
inst.Close()
return nil, wrapError(
"validate video flow",
ErrorKindInvalidConfig,
errors.New("video flow has no slice sizes"),
)
} }
vRate := vInfo.Config.Common.GrainRate vRate := vInfo.Config.Common.GrainRate
@@ -374,7 +428,11 @@ func OpenSameDomainSync(domain, videoFlow, audioFlow string) (*SyncSource, error
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("invalid video rate %d/%d", vRate.Num, vRate.Den) return nil, wrapError(
"validate video flow",
ErrorKindInvalidConfig,
fmt.Errorf("invalid grain rate: %d/%d", vRate.Num, vRate.Den),
)
} }
group, err := inst.NewSyncGroup() group, err := inst.NewSyncGroup()
@@ -382,21 +440,33 @@ func OpenSameDomainSync(domain, videoFlow, audioFlow string) (*SyncSource, error
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("NewSyncGroup: %w", err) return nil, wrapError(
"create native sync group",
ErrorKindUnavailable,
err,
)
} }
if err := group.AddReader(vr); err != nil { if err := group.AddReader(vr); err != nil {
group.Close() group.Close()
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("AddReader(video): %w", err) return nil, wrapError(
"add video reader to native sync group",
ErrorKindUnavailable,
err,
)
} }
if err := group.AddReader(ar); err != nil { if err := group.AddReader(ar); err != nil {
group.Close() group.Close()
ar.Close() ar.Close()
vr.Close() vr.Close()
inst.Close() inst.Close()
return nil, fmt.Errorf("AddReader(audio): %w", err) return nil, wrapError(
"add audio reader to native sync group",
ErrorKindUnavailable,
err,
)
} }
return &SyncSource{ return &SyncSource{
@@ -405,8 +475,8 @@ func OpenSameDomainSync(domain, videoFlow, audioFlow string) (*SyncSource, error
ar: ar, ar: ar,
group: group, group: group,
rate: vRate, rate: vRate,
aRate: aInfo.Config.Common.GrainRate, aRate: aRate,
chans: uint64(aInfo.Config.Continuous.ChannelCount), chans: channels,
idx: idx, idx: idx,
width: uint32(fd.FrameWidth), width: uint32(fd.FrameWidth),
height: uint32(fd.FrameHeight), height: uint32(fd.FrameHeight),