How to use last method of gop Package

Best Got code snippet using gop.last

gop_cache.go

Source:gop_cache.go Github

copy

Full Screen

1// Copyright 2019, Chef. All rights reserved.2// https://github.com/souliot/siot-av3//4// Use of this source code is governed by a MIT-style license5// that can be found in the License file.6//7// Author: Chef (191201771@qq.com)8package logic9import (10 "github.com/souliot/siot-av/pkg/base"11 "github.com/souliot/naza/pkg/log"12 "github.com/souliot/siot-av/pkg/remux"13 "github.com/souliot/siot-av/pkg/rtmp"14)15// 考虑以下两种场景:16// - 只有上行,没有下行,没有必要做rtmp chunk切片的操作17// - 有多个下行,只需要做一次rtmp chunk切片18// 所以这一步做了懒处理19type LazyChunkDivider struct {20 message []byte21 header *base.RTMPHeader22 chunks []byte23}24func (lcd *LazyChunkDivider) Init(message []byte, header *base.RTMPHeader) {25 lcd.message = message26 lcd.header = header27}28func (lcd *LazyChunkDivider) Get() []byte {29 if lcd.chunks == nil {30 lcd.chunks = rtmp.Message2Chunks(lcd.message, lcd.header)31 }32 return lcd.chunks33}34// 懒转换35type LazyRTMPMsg2FLVTag struct {36 msg base.RTMPMsg37 tag []byte38}39func (l *LazyRTMPMsg2FLVTag) Init(msg base.RTMPMsg) {40 l.msg = msg41}42func (l *LazyRTMPMsg2FLVTag) Get() []byte {43 if l.tag == nil {44 l.tag = remux.RTMPMsg2FLVTag(l.msg).Raw45 }46 return l.tag47}48type GOPCache struct {49 t string50 uniqueKey string51 Metadata []byte52 VideoSeqHeader []byte53 AACSeqHeader []byte54 gopRing []GOP55 gopRingFirst int56 gopRingLast int57 gopSize int58 log log.Logger59}60func NewGOPCache(t string, uniqueKey string, gopNum int, logger log.Logger) *GOPCache {61 logger.WithPrefix("pkg.logic.gop_cache")62 return &GOPCache{63 t: t,64 uniqueKey: uniqueKey,65 gopSize: gopNum + 1,66 gopRing: make([]GOP, gopNum+1, gopNum+1),67 gopRingFirst: 0,68 gopRingLast: 0,69 log: logger,70 }71}72func (s *GOPCache) Log() log.Logger {73 if s.log == nil {74 s.log = log.DefaultBeeLogger75 }76 s.log.WithPrefix("pkg.logic.gop_cache")77 return s.log78}79type LazyGet func() []byte80func (gc *GOPCache) Feed(msg base.RTMPMsg, lg LazyGet) {81 switch msg.Header.MsgTypeID {82 case base.RTMPTypeIDMetadata:83 gc.Metadata = lg()84 gc.Log().Debug("[%s] cache %s metadata. size:%d", gc.uniqueKey, gc.t, len(gc.Metadata))85 return86 case base.RTMPTypeIDAudio:87 if msg.IsAACSeqHeader() {88 gc.AACSeqHeader = lg()89 gc.Log().Debug("[%s] cache %s aac seq header. size:%d", gc.uniqueKey, gc.t, len(gc.AACSeqHeader))90 return91 }92 case base.RTMPTypeIDVideo:93 if msg.IsVideoKeySeqHeader() {94 gc.VideoSeqHeader = lg()95 gc.Log().Debug("[%s] cache %s video seq header. size:%d", gc.uniqueKey, gc.t, len(gc.VideoSeqHeader))96 return97 }98 }99 // 这个size的判断去掉也行100 if gc.gopSize > 1 {101 if msg.IsVideoKeyNALU() {102 gc.feedNewGOP(msg, lg())103 } else {104 gc.feedLastGOP(msg, lg())105 }106 }107}108func (gc *GOPCache) GetGOPCount() int {109 return (gc.gopRingLast + gc.gopSize - gc.gopRingFirst) % gc.gopSize110}111func (gc *GOPCache) GetGOPDataAt(pos int) [][]byte {112 if pos >= gc.GetGOPCount() || pos < 0 {113 return nil114 }115 return gc.gopRing[(pos+gc.gopRingFirst)%gc.gopSize].data116}117func (gc *GOPCache) Clear() {118 gc.Metadata = nil119 gc.VideoSeqHeader = nil120 gc.AACSeqHeader = nil121 gc.gopRingLast = 0122 gc.gopRingFirst = 0123}124func (gc *GOPCache) feedLastGOP(msg base.RTMPMsg, b []byte) {125 if !gc.isGOPRingEmpty() {126 gc.gopRing[(gc.gopRingLast-1+gc.gopSize)%gc.gopSize].Feed(msg, b)127 }128}129func (gc *GOPCache) feedNewGOP(msg base.RTMPMsg, b []byte) {130 if gc.isGOPRingFull() {131 gc.gopRingFirst = (gc.gopRingFirst + 1) % gc.gopSize132 }133 gc.gopRing[gc.gopRingLast].Clear()134 gc.gopRing[gc.gopRingLast].Feed(msg, b)135 gc.gopRingLast = (gc.gopRingLast + 1) % gc.gopSize136}137func (gc *GOPCache) isGOPRingFull() bool {138 return (gc.gopRingLast+1)%gc.gopSize == gc.gopRingFirst139}140func (gc *GOPCache) isGOPRingEmpty() bool {141 return gc.gopRingFirst == gc.gopRingLast142}143type GOP struct {144 data [][]byte145}146func (g *GOP) Feed(msg base.RTMPMsg, b []byte) {147 g.data = append(g.data, b)148}149func (g *GOP) Clear() {150 g.data = g.data[:0]151}...

Full Screen

Full Screen

gop_cache_mpegts.go

Source:gop_cache_mpegts.go Github

copy

Full Screen

1// Copyright 2022, Chef. All rights reserved.2// https://github.com/q191201771/lal3//4// Use of this source code is governed by a MIT-style license5// that can be found in the License file.6//7// Author: Chef (191201771@qq.com)8package remux9// TODO(chef) 将gop_cache.go和gop_cache_mpegts.go的待完成项统一记录在这里10// - GopCache 和 GopCacheMpegts 尽量统一11// - 是否有必要单独存储帧,也即一个Gop的多个帧是一块内存,还是多块内存,从性能,功能,可读考虑12// - GopCache中非gop功能(包括meta和header的缓存)考虑移动到其他地方13type GopCacheMpegts struct {14 uniqueKey string15 gopNum int16 gopRing []GopMpegts17 gopRingFirst int18 gopRingLast int19 gopSize int20}21func NewGopCacheMpegts(uniqueKey string, gopNum int) *GopCacheMpegts {22 return &GopCacheMpegts{23 uniqueKey: uniqueKey,24 gopNum: gopNum,25 gopSize: gopNum + 1,26 gopRing: make([]GopMpegts, gopNum+1, gopNum+1),27 gopRingFirst: 0,28 gopRingLast: 0,29 }30}31// Feed32//33// @param b: 内部持有该内存块34//35func (gc *GopCacheMpegts) Feed(b []byte, boundary bool) {36 if gc.gopSize > 1 {37 if boundary {38 gc.feedNewGop(b)39 } else {40 gc.feedLastGop(b)41 }42 }43}44// GetGopCount 获取GOP数量,注意,最后一个可能是不完整的45//46func (gc *GopCacheMpegts) GetGopCount() int {47 return (gc.gopRingLast + gc.gopSize - gc.gopRingFirst) % gc.gopSize48}49func (gc *GopCacheMpegts) GetGopDataAt(pos int) [][]byte {50 if pos >= gc.GetGopCount() || pos < 0 {51 return nil52 }53 return gc.gopRing[(pos+gc.gopRingFirst)%gc.gopSize].data54}55func (gc *GopCacheMpegts) Clear() {56 gc.gopRingLast = 057 gc.gopRingFirst = 058}59// ---------------------------------------------------------------------------------------------------------------------60// feedLastGop61//62// 往最后一个GOP元素追加一个msg63// 注意,如果GopCache为空,则不缓存msg64//65func (gc *GopCacheMpegts) feedLastGop(b []byte) {66 if !gc.isGopRingEmpty() {67 gc.gopRing[(gc.gopRingLast-1+gc.gopSize)%gc.gopSize].Feed(b)68 }69}70// feedNewGop71//72// 生成一个最新的GOP元素,并往里追加一个msg73//74func (gc *GopCacheMpegts) feedNewGop(b []byte) {75 if gc.isGopRingFull() {76 gc.gopRingFirst = (gc.gopRingFirst + 1) % gc.gopSize77 }78 gc.gopRing[gc.gopRingLast].Clear()79 gc.gopRing[gc.gopRingLast].Feed(b)80 gc.gopRingLast = (gc.gopRingLast + 1) % gc.gopSize81}82func (gc *GopCacheMpegts) isGopRingFull() bool {83 return (gc.gopRingLast+1)%gc.gopSize == gc.gopRingFirst84}85func (gc *GopCacheMpegts) isGopRingEmpty() bool {86 return gc.gopRingFirst == gc.gopRingLast87}88// ---------------------------------------------------------------------------------------------------------------------89// GopMpegts90//91// 单个Gop,包含多帧数据92//93type GopMpegts struct {94 data [][]byte95}96// Feed97//98// @param b: 内部持有`b`内存块99//100func (g *GopMpegts) Feed(b []byte) {101 g.data = append(g.data, b)102}103func (g *GopMpegts) Clear() {104 g.data = g.data[:0]105}...

Full Screen

Full Screen

model_advanced_gop_length_test_.go

Source:model_advanced_gop_length_test_.go Github

copy

Full Screen

...16 OtherGopEnabled bool `json:"other_gop_enabled,omitempty"`17 OtherGopI string `json:"other_gop_i,omitempty"`18 OtherGopP string `json:"other_gop_p,omitempty"`19 OtherGopClosed OpenOrClosed `json:"other_gop_closed,omitempty"`20 LastGopEnabled bool `json:"last_gop_enabled,omitempty"`21 LastGopI string `json:"last_gop_i,omitempty"`22 LastGopP string `json:"last_gop_p,omitempty"`23 LastGopClosed OpenOrClosed `json:"last_gop_closed,omitempty"`24 Order GopOrder `json:"order,omitempty"`25 Report GopReport `json:"report,omitempty"`26 RejectOnError bool `json:"reject_on_error,omitempty"`27 Checked bool `json:"checked,omitempty"`28}...

Full Screen

Full Screen

last

Using AI Code Generation

copy

Full Screen

1import "fmt"2import "github.com/gop/gop"3func main() {4 fmt.Println(gop.Last())5}6import "fmt"7import "github.com/gop/gop"8func main() {9 fmt.Println(gop.First())10}

Full Screen

Full Screen

last

Using AI Code Generation

copy

Full Screen

1import "fmt"2func main() {3 gop.last()4}5import "fmt"6func main() {7 gop.last()8}9import "fmt"10func main() {11 gop.last()12}13import "fmt"14func main() {15 gop.last()16}17import "fmt"18func main() {19 gop.last()20}21import "fmt"22func main() {23 gop.last()24}25import "fmt"26func main() {27 gop.last()28}29import "fmt"30func main() {31 gop.last()32}33import "fmt"34func main() {35 gop.last()36}37import "fmt"38func main() {39 gop.last()40}41import "fmt"42func main() {43 gop.last()44}45import "fmt"46func main() {47 gop.last()48}49import "fmt"50func main() {51 gop.last()52}

Full Screen

Full Screen

last

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 fmt.Println("Hello, playground")4 gop.Gop()5}6import "fmt"7func Gop() {8 fmt.Println("Hello, playground")9}10import (11func main() {12 fmt.Println("Hello, playground")13 m := sparse.NewMatrix(10, 10)14 m.Set(5, 5, 1.0)15 v := m.Get(5, 5)16}

Full Screen

Full Screen

last

Using AI Code Generation

copy

Full Screen

1import "fmt"2func main(){3 fmt.Println("Hello world")4 gop := Gop{1,2}5 gop.last()6}7import "fmt"8func main(){9 fmt.Println("Hello world")10 gop := Gop{1,2}11 gop.last()12}13import "fmt"14func main(){15 fmt.Println("Hello world")16 gop := Gop{1,2}17 gop.last()18}19import "fmt"20func main(){21 fmt.Println("Hello world")22 gop := Gop{1,2}23 gop.last()24}25import "fmt"26func main(){27 fmt.Println("Hello world")28 gop := Gop{1,2}29 gop.last()30}31import "fmt"32func main(){33 fmt.Println("Hello world")34 gop := Gop{1,2}35 gop.last()36}37import "fmt"38func main(){39 fmt.Println("Hello world")40 gop := Gop{1,2}41 gop.last()42}43import "fmt"44func main(){45 fmt.Println("Hello world")46 gop := Gop{1,2}47 gop.last()48}49import "fmt"50func main(){51 fmt.Println("Hello world")52 gop := Gop{1,2}53 gop.last()54}55import "fmt"56func main(){57 fmt.Println("Hello world")58 gop := Gop{1,2}

Full Screen

Full Screen

last

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 g := gop.New()4 g.Set("hello", "world")5 g.Set("foo", "bar")6 g.Set("baz", "qux")7 g.Set("zoo", "zoo")8 g.Set("quux", "quux")9 g.Set("quuz", "quuz")10 g.Set("corge", "corge")11 g.Set("grault", "grault")12 g.Set("garply", "garply")13 g.Set("waldo", "waldo")14 g.Set("fred", "fred")15 g.Set("pl

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful