diff --git a/transcoder/src/info.go b/transcoder/src/info.go index 2caf1536..a1e167fb 100644 --- a/transcoder/src/info.go +++ b/transcoder/src/info.go @@ -9,6 +9,7 @@ import ( "path/filepath" "strconv" "strings" + "sync" "time" "golang.org/x/text/language" @@ -55,6 +56,9 @@ type MediaInfo struct { Fonts []string `json:"fonts"` /// The list of chapters. See Chapter for more information. Chapters []Chapter `json:"chapters"` + + /// lock used to read/set keyframes of video/audio + lock sync.Mutex } type Video struct { diff --git a/transcoder/src/keyframes.go b/transcoder/src/keyframes.go index 65c3910a..c13e1c15 100644 --- a/transcoder/src/keyframes.go +++ b/transcoder/src/keyframes.go @@ -89,11 +89,17 @@ type KeyframeKey struct { } func (s *MetadataService) GetKeyframes(info *MediaInfo, isVideo bool, idx uint32) (*Keyframe, error) { + info.lock.Lock() + var ret *Keyframe if isVideo && info.Videos[idx].Keyframes != nil { - return info.Videos[idx].Keyframes, nil + ret = info.Videos[idx].Keyframes } if !isVideo && info.Audios[idx].Keyframes != nil { - return info.Audios[idx].Keyframes, nil + ret = info.Audios[idx].Keyframes + } + info.lock.Unlock() + if ret != nil { + return ret, nil } get_running, set := s.keyframeLock.Start(KeyframeKey{ @@ -111,6 +117,14 @@ func (s *MetadataService) GetKeyframes(info *MediaInfo, isVideo bool, idx uint32 } kf.info.ready.Add(1) + info.lock.Lock() + if isVideo { + info.Videos[idx].Keyframes = kf + } else { + info.Audios[idx].Keyframes = kf + } + info.lock.Unlock() + go func() { var table string var err error