go-mpd: Go Coverage Report (original) (raw)

package mpd

import ( "encoding/xml" "fmt" "strconv" )

// ConditionalUint (ConditionalUintType) defined in XSD as a union of unsignedInt and boolean. type ConditionalUint struct { u *uint64 b *bool }

// MarshalXMLAttr encodes ConditionalUint. func (c ConditionalUint) MarshalXMLAttr(name xml.Name) (xml.Attr, error) { if c.u != nil { return xml.Attr{Name: name, Value: strconv.FormatUint(*c.u, 10)}, nil }

    if c.b != nil {
            return xml.Attr{Name: name, Value: strconv.FormatBool(*c.b)}, nil
    }

    // both are nil - no attribute, client will threat it like "false"
    return xml.Attr{}, nil

}

// UnmarshalXMLAttr decodes ConditionalUint. func (c *ConditionalUint) UnmarshalXMLAttr(attr xml.Attr) error { u, err := strconv.ParseUint(attr.Value, 10, 64) if err == nil { c.u = &u return nil }

    b, err := strconv.ParseBool(attr.Value)
    if err == nil {
            c.b = &b
            return nil
    }

    return fmt.Errorf("ConditionalUint: can't UnmarshalXMLAttr %#v", attr)

}

// check interfaces var ( _ xml.MarshalerAttr = ConditionalUint{} _ xml.UnmarshalerAttr = &ConditionalUint{} )

// Package mpd implements parsing and generating of MPEG-DASH Media Presentation Description (MPD) files. package mpd

import ( "bytes" "encoding/xml" "io" "regexp"

    "github.com/unki2aut/go-xsd-types"

)

// http://mpeg.chiariglione.org/standards/mpeg-dash // https://www.brendanlong.com/the-structure-of-an-mpeg-dash-mpd.html // http://standards.iso.org/ittf/PubliclyAvailableStandards/MPEG-DASH_schema_files/DASH-MPD.xsd

var emptyElementRE = regexp.MustCompile(></[A-Za-z]+>)

// MPD represents root XML element. type MPD struct { XMLNS *string xml:"xmlns,attr" Type *string xml:"type,attr" MinimumUpdatePeriod *xsd.Duration xml:"minimumUpdatePeriod,attr" AvailabilityStartTime *xsd.DateTime xml:"availabilityStartTime,attr" AvailabilityEndTime *xsd.DateTime xml:"availabilityEndTime,attr" MediaPresentationDuration *xsd.Duration xml:"mediaPresentationDuration,attr" MinBufferTime *xsd.Duration xml:"minBufferTime,attr" SuggestedPresentationDelay *xsd.Duration xml:"suggestedPresentationDelay,attr" TimeShiftBufferDepth *xsd.Duration xml:"timeShiftBufferDepth,attr" PublishTime *xsd.DateTime xml:"publishTime,attr" Profiles string xml:"profiles,attr" BaseURL []*BaseURL xml:"BaseURL,omitempty" Period []*Period xml:"Period,omitempty" }

// Do not try to use encoding.TextMarshaler and encoding.TextUnmarshaler: // https://github.com/golang/go/issues/6859#issuecomment-118890463

// Encode generates MPD XML. func (m *MPD) Encode() ([]byte, error) { x := new(bytes.Buffer) e := xml.NewEncoder(x) e.Indent("", " ") err := e.Encode(m) if err != nil { return nil, err }

    // hacks for self-closing tags
    res := new(bytes.Buffer)
    res.WriteString(`<?xml version="1.0" encoding="utf-8"?>`)
    res.WriteByte('\n')
    for {
            s, err := x.ReadString('\n')
            if s != "" {
                    s = emptyElementRE.ReplaceAllString(s, `/>`)
                    res.WriteString(s)
            }
            if err == io.EOF {
                    break
            }
            if err != nil {
                    return nil, err
            }
    }
    res.WriteByte('\n')
    return res.Bytes(), err

}

// Decode parses MPD XML. func (m *MPD) Decode(b []byte) error { return xml.Unmarshal(b, m) }

// Period represents XSD's PeriodType. type Period struct { Start *xsd.Duration xml:"start,attr" ID *string xml:"id,attr" Duration *xsd.Duration xml:"duration,attr" AdaptationSets []*AdaptationSet xml:"AdaptationSet,omitempty" BaseURL []*BaseURL xml:"BaseURL,omitempty" }

// BaseURL represents XSD's BaseURLType. type BaseURL struct { Value string xml:",chardata" ServiceLocation *string xml:"serviceLocation,attr" ByteRange *string xml:"byteRange,attr" AvailabilityTimeOffset *uint64 xml:"availabilityTimeOffset,attr" AvailabilityTimeComplete *bool xml:"availabilityTimeComplete,attr" }

// AdaptationSet represents XSD's AdaptationSetType. type AdaptationSet struct { MimeType string xml:"mimeType,attr" ContentType *string xml:"contentType,attr" SegmentAlignment ConditionalUint xml:"segmentAlignment,attr" SubsegmentAlignment ConditionalUint xml:"subsegmentAlignment,attr" StartWithSAP ConditionalUint xml:"startWithSAP,attr" SubsegmentStartsWithSAP ConditionalUint xml:"subsegmentStartsWithSAP,attr" BitstreamSwitching *bool xml:"bitstreamSwitching,attr" Lang *string xml:"lang,attr" Par *string xml:"par,attr" Codecs *string xml:"codecs,attr" Role []*Descriptor xml:"Role,omitempty" BaseURL []*BaseURL xml:"BaseURL,omitempty" SegmentTemplate *SegmentTemplate xml:"SegmentTemplate,omitempty" ContentProtections []Descriptor xml:"ContentProtection,omitempty" Representations []Representation xml:"Representation,omitempty" }

// Representation represents XSD's RepresentationType. type Representation struct { ID *string xml:"id,attr" Width *uint64 xml:"width,attr" Height *uint64 xml:"height,attr" FrameRate *string xml:"frameRate,attr" Bandwidth *uint64 xml:"bandwidth,attr" AudioSamplingRate *string xml:"audioSamplingRate,attr" Codecs *string xml:"codecs,attr" SAR *string xml:"sar,attr" ScanType *string xml:"scanType,attr" ContentProtections []Descriptor xml:"ContentProtection,omitempty" SegmentTemplate *SegmentTemplate xml:"SegmentTemplate,omitempty" BaseURL []*BaseURL xml:"BaseURL,omitempty" }

// Descriptor represents XSD's DescriptorType. type Descriptor struct { SchemeIDURI *string xml:"schemeIdUri,attr" Value *string xml:"value,attr" CencDefaultKeyId *string xml:"cenc:default_KID,attr,omitempty" MSPRPro *string xml:"mspr:pro,omitempty" CencPSSH *string xml:"cenc:pssh,omitempty" }

// SegmentTemplate represents XSD's SegmentTemplateType. type SegmentTemplate struct { Duration *uint64 xml:"duration,attr" Timescale *uint64 xml:"timescale,attr" Media *string xml:"media,attr" Initialization *string xml:"initialization,attr" StartNumber *uint64 xml:"startNumber,attr" PresentationTimeOffset *uint64 xml:"presentationTimeOffset,attr" SegmentTimeline *SegmentTimeline xml:"SegmentTimeline,omitempty" }

// SegmentTimeline represents XSD's SegmentTimelineType. type SegmentTimeline struct { S []*SegmentTimelineS xml:"S" }

// SegmentTimelineS represents XSD's SegmentTimelineType's inner S elements. type SegmentTimelineS struct { T *uint64 xml:"t,attr" D uint64 xml:"d,attr" R *int64 xml:"r,attr" }