mirror of
https://github.com/go-gst/go-gst.git
synced 2025-10-05 07:56:51 +08:00
191 lines
5.3 KiB
Go
191 lines
5.3 KiB
Go
package gst
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// String implements a stringer on the message. It iterates over the type of the message
|
|
// and applies the correct parser, then dumps a string of the basic contents of the
|
|
// message. This function can be expensive and should only be used for debugging purposes
|
|
// or in routines where latency is not a concern.
|
|
//
|
|
// This stringer really just helps in keeping track of making sure all message types are
|
|
// accounted for in some way. It's the devil, writing it was the devil, and I hope you
|
|
// enjoy being able to `fmt.Println(msg)`.
|
|
func (m *Message) String() string {
|
|
msg := fmt.Sprintf("[%s] %s - ", m.Source(), strings.ToUpper(m.TypeName()))
|
|
switch m.Type() {
|
|
|
|
case MessageEOS:
|
|
msg += "End-of-stream reached in the pipeline"
|
|
|
|
case MessageInfo:
|
|
msg += m.parseToError().Message()
|
|
|
|
case MessageWarning:
|
|
msg += m.parseToError().Message()
|
|
|
|
case MessageError:
|
|
msg += m.parseToError().Message()
|
|
|
|
case MessageTag:
|
|
tags := m.ParseTags()
|
|
if tags != nil {
|
|
defer tags.Unref()
|
|
msg += tags.String()
|
|
}
|
|
|
|
case MessageBuffering:
|
|
stats := m.ParseBufferingStats()
|
|
msg += fmt.Sprintf(
|
|
"Buffering %s - %d%% complete (avg in %d/sec, avg out %d/sec, time left %s)",
|
|
stats.BufferingMode.String(),
|
|
m.ParseBuffering(),
|
|
stats.AverageIn,
|
|
stats.AverageOut,
|
|
stats.BufferingLeft.String(),
|
|
)
|
|
|
|
case MessageStateChanged:
|
|
oldState, newState := m.ParseStateChanged()
|
|
msg += fmt.Sprintf("State changed from %s to %s", oldState.String(), newState.String())
|
|
|
|
case MessageStateDirty:
|
|
msg += "(DEPRECATED MESSAGE) An element changed state in a streaming thread"
|
|
|
|
case MessageStepDone:
|
|
out, err := json.Marshal(m.ParseStepDone())
|
|
if err == nil {
|
|
msg += string(out)
|
|
}
|
|
|
|
case MessageClockProvide:
|
|
msg += "Element has clock provide capability"
|
|
|
|
case MessageClockLost:
|
|
msg += "Lost a clock"
|
|
|
|
case MessageNewClock:
|
|
msg += "Got a new clock"
|
|
|
|
case MessageStructureChange:
|
|
chgType, elem, busy := m.ParseStructureChange()
|
|
msg += fmt.Sprintf("Structure change of type %s from %s. (in progress: %v)", chgType.String(), elem.GetName(), busy)
|
|
|
|
case MessageStreamStatus:
|
|
statusType, elem := m.ParseStreamStatus()
|
|
msg += fmt.Sprintf("Stream status from %s: %s", elem.GetName(), statusType.String())
|
|
|
|
case MessageApplication:
|
|
msg += "Message posted by the application, possibly via an application-specific element."
|
|
|
|
case MessageElement:
|
|
msg += "Internal element message posted"
|
|
|
|
case MessageSegmentStart:
|
|
format, pos := m.ParseSegmentStart()
|
|
msg += fmt.Sprintf("Segment started at %d %s", pos, format.String())
|
|
|
|
case MessageSegmentDone:
|
|
format, pos := m.ParseSegmentDone()
|
|
msg += fmt.Sprintf("Segment started at %d %s", pos, format.String())
|
|
|
|
case MessageDurationChanged:
|
|
msg += "The duration of the pipeline changed"
|
|
|
|
case MessageLatency:
|
|
msg += "Element's latency has changed"
|
|
|
|
case MessageAsyncStart:
|
|
msg += "Async task started"
|
|
|
|
case MessageAsyncDone:
|
|
msg += "Async task completed"
|
|
if dur := m.ParseAsyncDone(); dur > 0 {
|
|
msg += fmt.Sprintf(" in %s", dur.String())
|
|
}
|
|
|
|
case MessageRequestState:
|
|
msg += fmt.Sprintf("State chnage request to %s", m.ParseRequestState().String())
|
|
|
|
case MessageStepStart:
|
|
out, err := json.Marshal(m.ParseStepStart())
|
|
if err == nil {
|
|
msg += string(out)
|
|
}
|
|
|
|
case MessageQoS:
|
|
out, err := json.Marshal(m.ParseQoS())
|
|
if err == nil {
|
|
msg += string(out)
|
|
}
|
|
|
|
case MessageProgress:
|
|
progressType, code, text := m.ParseProgress()
|
|
msg += fmt.Sprintf("%s - %s - %s", strings.ToUpper(progressType.String()), code, text)
|
|
|
|
case MessageTOC:
|
|
// TODO
|
|
|
|
case MessageResetTime:
|
|
msg += fmt.Sprintf("Running time: %s", m.ParseResetTime().String())
|
|
|
|
case MessageStreamStart:
|
|
msg += "Pipeline stream is starting"
|
|
|
|
case MessageNeedContext:
|
|
msg += "Element needs context"
|
|
|
|
case MessageHaveContext:
|
|
ctx := m.ParseHaveContext()
|
|
msg += fmt.Sprintf("Received context of type %s", ctx.GetType())
|
|
|
|
case MessageExtended:
|
|
msg += "Extended message type"
|
|
|
|
case MessageDeviceAdded:
|
|
if device := m.ParseDeviceAdded(); device != nil {
|
|
msg += fmt.Sprintf("Device %s added", device.DisplayName())
|
|
}
|
|
|
|
case MessageDeviceRemoved:
|
|
if device := m.ParseDeviceRemoved(); device != nil {
|
|
msg += fmt.Sprintf("Device %s removed", device.DisplayName())
|
|
}
|
|
|
|
case MessageDeviceChanged:
|
|
if device, _ := m.ParseDeviceChanged(); device != nil {
|
|
msg += fmt.Sprintf("Device %s had its properties updated", device.DisplayName())
|
|
}
|
|
|
|
case MessagePropertyNotify:
|
|
obj, propName, propVal := m.ParsePropertyNotify()
|
|
if obj != nil && propVal != nil {
|
|
goval, err := propVal.GoValue()
|
|
if err != nil {
|
|
msg += fmt.Sprintf("Object %s had property '%s' changed to %+v", obj.GetName(), propName, goval)
|
|
}
|
|
}
|
|
|
|
case MessageStreamCollection:
|
|
collection := m.ParseStreamCollection()
|
|
msg += fmt.Sprintf("New stream collection with upstream id: %s", collection.GetUpstreamID())
|
|
|
|
case MessageStreamsSelected:
|
|
collection := m.ParseStreamsSelected()
|
|
msg += fmt.Sprintf("Stream with upstream id '%s' has selected new streams", collection.GetUpstreamID())
|
|
|
|
case MessageRedirect:
|
|
msg += fmt.Sprintf("Received redirect message with %d entries", m.NumRedirectEntries())
|
|
|
|
case MessageUnknown:
|
|
msg += "Unknown message type"
|
|
|
|
case MessageAny:
|
|
msg += "Message did not match any known types"
|
|
}
|
|
return msg
|
|
}
|