diff --git a/plugin/gb28181pro/index.go b/plugin/gb28181pro/index.go index c213721..2ff0f2b 100644 --- a/plugin/gb28181pro/index.go +++ b/plugin/gb28181pro/index.go @@ -44,7 +44,7 @@ type GB28181ProPlugin struct { m7s.Plugin AutoInvite bool `default:"true" desc:"自动邀请"` Serial string `default:"34020000002000000001" desc:"sip 服务 id"` //sip 服务器 id, 默认 34020000002000000001 - Realm string `default:"3402000000" desc:"sip 服务域"` //sip 服务器域,默认 3402000000 + Realm string `default:"3402000000" desc:"sip 服务域"` //sip 服务器域,默认 3402000000 Username string Password string Sip SipConfig diff --git a/plugin/mp4/api.go b/plugin/mp4/api.go index b674a96..5249d8d 100644 --- a/plugin/mp4/api.go +++ b/plugin/mp4/api.go @@ -18,6 +18,7 @@ import ( "m7s.live/v5/pb" "m7s.live/v5/pkg" "m7s.live/v5/pkg/config" + "m7s.live/v5/pkg/task" "m7s.live/v5/pkg/util" mp4pb "m7s.live/v5/plugin/mp4/pb" mp4 "m7s.live/v5/plugin/mp4/pkg" @@ -351,6 +352,14 @@ func (p *MP4Plugin) download(w http.ResponseWriter, r *http.Request) { func (p *MP4Plugin) StartRecord(ctx context.Context, req *mp4pb.ReqStartRecord) (res *mp4pb.ResponseStartRecord, err error) { var recordExists bool + var filePath = "." + var fragment = time.Minute + if req.Fragment != nil { + fragment = req.Fragment.AsDuration() + } + if req.FilePath != "" { + filePath = req.FilePath + } res = &mp4pb.ResponseStartRecord{} p.Server.Records.Call(func() error { _, recordExists = p.Server.Records.Find(func(job *m7s.RecordJob) bool { @@ -366,11 +375,32 @@ func (p *MP4Plugin) StartRecord(ctx context.Context, req *mp4pb.ReqStartRecord) if stream, ok := p.Server.Streams.Get(req.StreamPath); ok { recordConf := config.Record{ Append: false, - Fragment: req.Fragment.AsDuration(), - FilePath: req.FilePath, + Fragment: fragment, + FilePath: filePath, } job := p.Record(stream, recordConf, nil) res.Data = uint64(uintptr(unsafe.Pointer(job.GetTask()))) + } else { + err = pkg.ErrNotFound + } + return nil + }) + return +} + +func (p *MP4Plugin) StopRecord(ctx context.Context, req *mp4pb.ReqStopRecord) (res *mp4pb.ResponseStopRecord, err error) { + res = &mp4pb.ResponseStopRecord{} + var recordJob *m7s.RecordJob + p.Server.Records.Call(func() error { + recordJob, _ = p.Server.Records.Find(func(job *m7s.RecordJob) bool { + return job.StreamPath == req.StreamPath + }) + if recordJob != nil { + t := recordJob.GetTask() + if t != nil { + res.Data = uint64(uintptr(unsafe.Pointer(t))) + t.Stop(task.ErrStopByUser) + } } return nil }) diff --git a/plugin/mp4/pb/mp4.pb.go b/plugin/mp4/pb/mp4.pb.go index 0996b9d..58bb142 100644 --- a/plugin/mp4/pb/mp4.pb.go +++ b/plugin/mp4/pb/mp4.pb.go @@ -490,6 +490,110 @@ func (x *ResponseStartRecord) GetData() uint64 { return 0 } +type ReqStopRecord struct { + state protoimpl.MessageState `protogen:"open.v1"` + StreamPath string `protobuf:"bytes,1,opt,name=streamPath,proto3" json:"streamPath,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ReqStopRecord) Reset() { + *x = ReqStopRecord{} + mi := &file_mp4_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ReqStopRecord) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReqStopRecord) ProtoMessage() {} + +func (x *ReqStopRecord) ProtoReflect() protoreflect.Message { + mi := &file_mp4_proto_msgTypes[6] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReqStopRecord.ProtoReflect.Descriptor instead. +func (*ReqStopRecord) Descriptor() ([]byte, []int) { + return file_mp4_proto_rawDescGZIP(), []int{6} +} + +func (x *ReqStopRecord) GetStreamPath() string { + if x != nil { + return x.StreamPath + } + return "" +} + +type ResponseStopRecord struct { + state protoimpl.MessageState `protogen:"open.v1"` + Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Data uint64 `protobuf:"varint,3,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ResponseStopRecord) Reset() { + *x = ResponseStopRecord{} + mi := &file_mp4_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ResponseStopRecord) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResponseStopRecord) ProtoMessage() {} + +func (x *ResponseStopRecord) ProtoReflect() protoreflect.Message { + mi := &file_mp4_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResponseStopRecord.ProtoReflect.Descriptor instead. +func (*ResponseStopRecord) Descriptor() ([]byte, []int) { + return file_mp4_proto_rawDescGZIP(), []int{7} +} + +func (x *ResponseStopRecord) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +func (x *ResponseStopRecord) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +func (x *ResponseStopRecord) GetData() uint64 { + if x != nil { + return x.Data + } + return 0 +} + var File_mp4_proto protoreflect.FileDescriptor var file_mp4_proto_rawDesc = string([]byte{ @@ -563,39 +667,54 @@ var file_mp4_proto_rawDesc = string([]byte{ 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xdf, 0x03, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x12, - 0x57, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x12, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, - 0x71, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x73, - 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x6d, 0x70, 0x34, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x50, 0x61, 0x74, 0x68, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x54, 0x0a, 0x07, 0x43, 0x61, 0x74, 0x61, - 0x6c, 0x6f, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, - 0x61, 0x6c, 0x6f, 0x67, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x6d, - 0x70, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x62, - 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, - 0x65, 0x71, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x16, - 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, - 0x2a, 0x22, 0x1f, 0x2f, 0x6d, 0x70, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x2a, - 0x2a, 0x7d, 0x12, 0x5c, 0x0a, 0x0a, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x13, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x71, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x18, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, - 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x6d, 0x70, 0x34, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x12, 0x67, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, - 0x13, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x71, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x18, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x29, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x6d, 0x70, 0x34, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x2a, 0x2a, 0x7d, 0x42, 0x1b, 0x5a, 0x19, 0x6d, 0x37, 0x73, - 0x2e, 0x6c, 0x69, 0x76, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, - 0x6d, 0x70, 0x34, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x04, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x2f, 0x0a, 0x0d, 0x52, 0x65, 0x71, 0x53, 0x74, + 0x6f, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x74, 0x68, 0x22, 0x56, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x32, 0xc4, 0x04, 0x0a, 0x03, 0x61, 0x70, 0x69, 0x12, 0x57, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x12, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x71, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1f, 0x12, 0x1d, 0x2f, 0x6d, 0x70, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6c, 0x69, 0x73, + 0x74, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x2a, 0x2a, + 0x7d, 0x12, 0x54, 0x0a, 0x07, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x43, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x22, 0x18, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x12, 0x10, 0x2f, 0x6d, 0x70, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x63, 0x61, 0x74, 0x61, 0x6c, 0x6f, 0x67, 0x12, 0x62, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x12, 0x14, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x71, 0x52, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, + 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x6d, 0x70, 0x34, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x2f, 0x7b, 0x73, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x2a, 0x2a, 0x7d, 0x12, 0x5c, 0x0a, 0x0a, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x13, 0x2e, 0x6d, 0x70, 0x34, 0x2e, + 0x52, 0x65, 0x71, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x18, + 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, + 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x6d, 0x70, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x67, 0x0a, 0x0b, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x13, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, + 0x65, 0x71, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x18, 0x2e, + 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x29, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, + 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x6d, 0x70, 0x34, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, 0x61, 0x74, 0x68, 0x3d, 0x2a, + 0x2a, 0x7d, 0x12, 0x63, 0x0a, 0x0a, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x12, 0x12, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x71, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x1a, 0x17, 0x2e, 0x6d, 0x70, 0x34, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x28, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x6d, 0x70, 0x34, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x73, 0x74, 0x6f, 0x70, 0x2f, 0x7b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x50, + 0x61, 0x74, 0x68, 0x3d, 0x2a, 0x2a, 0x7d, 0x42, 0x1b, 0x5a, 0x19, 0x6d, 0x37, 0x73, 0x2e, 0x6c, + 0x69, 0x76, 0x65, 0x2f, 0x76, 0x35, 0x2f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x2f, 0x6d, 0x70, + 0x34, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) var ( @@ -610,7 +729,7 @@ func file_mp4_proto_rawDescGZIP() []byte { return file_mp4_proto_rawDescData } -var file_mp4_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_mp4_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_mp4_proto_goTypes = []any{ (*ReqRecordList)(nil), // 0: mp4.ReqRecordList (*ReqRecordDelete)(nil), // 1: mp4.ReqRecordDelete @@ -618,26 +737,30 @@ var file_mp4_proto_goTypes = []any{ (*ResponseEventRecord)(nil), // 3: mp4.ResponseEventRecord (*ReqStartRecord)(nil), // 4: mp4.ReqStartRecord (*ResponseStartRecord)(nil), // 5: mp4.ResponseStartRecord - (*durationpb.Duration)(nil), // 6: google.protobuf.Duration - (*emptypb.Empty)(nil), // 7: google.protobuf.Empty - (*pb.ResponseList)(nil), // 8: global.ResponseList - (*pb.ResponseCatalog)(nil), // 9: global.ResponseCatalog - (*pb.ResponseDelete)(nil), // 10: global.ResponseDelete + (*ReqStopRecord)(nil), // 6: mp4.ReqStopRecord + (*ResponseStopRecord)(nil), // 7: mp4.ResponseStopRecord + (*durationpb.Duration)(nil), // 8: google.protobuf.Duration + (*emptypb.Empty)(nil), // 9: google.protobuf.Empty + (*pb.ResponseList)(nil), // 10: global.ResponseList + (*pb.ResponseCatalog)(nil), // 11: global.ResponseCatalog + (*pb.ResponseDelete)(nil), // 12: global.ResponseDelete } var file_mp4_proto_depIdxs = []int32{ - 6, // 0: mp4.ReqStartRecord.fragment:type_name -> google.protobuf.Duration + 8, // 0: mp4.ReqStartRecord.fragment:type_name -> google.protobuf.Duration 0, // 1: mp4.api.List:input_type -> mp4.ReqRecordList - 7, // 2: mp4.api.Catalog:input_type -> google.protobuf.Empty + 9, // 2: mp4.api.Catalog:input_type -> google.protobuf.Empty 1, // 3: mp4.api.Delete:input_type -> mp4.ReqRecordDelete 2, // 4: mp4.api.EventStart:input_type -> mp4.ReqEventRecord 4, // 5: mp4.api.StartRecord:input_type -> mp4.ReqStartRecord - 8, // 6: mp4.api.List:output_type -> global.ResponseList - 9, // 7: mp4.api.Catalog:output_type -> global.ResponseCatalog - 10, // 8: mp4.api.Delete:output_type -> global.ResponseDelete - 3, // 9: mp4.api.EventStart:output_type -> mp4.ResponseEventRecord - 5, // 10: mp4.api.StartRecord:output_type -> mp4.ResponseStartRecord - 6, // [6:11] is the sub-list for method output_type - 1, // [1:6] is the sub-list for method input_type + 6, // 6: mp4.api.StopRecord:input_type -> mp4.ReqStopRecord + 10, // 7: mp4.api.List:output_type -> global.ResponseList + 11, // 8: mp4.api.Catalog:output_type -> global.ResponseCatalog + 12, // 9: mp4.api.Delete:output_type -> global.ResponseDelete + 3, // 10: mp4.api.EventStart:output_type -> mp4.ResponseEventRecord + 5, // 11: mp4.api.StartRecord:output_type -> mp4.ResponseStartRecord + 7, // 12: mp4.api.StopRecord:output_type -> mp4.ResponseStopRecord + 7, // [7:13] is the sub-list for method output_type + 1, // [1:7] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name @@ -654,7 +777,7 @@ func file_mp4_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_mp4_proto_rawDesc), len(file_mp4_proto_rawDesc)), NumEnums: 0, - NumMessages: 6, + NumMessages: 8, NumExtensions: 0, NumServices: 1, }, diff --git a/plugin/mp4/pb/mp4.pb.gw.go b/plugin/mp4/pb/mp4.pb.gw.go index d01707e..0402e83 100644 --- a/plugin/mp4/pb/mp4.pb.gw.go +++ b/plugin/mp4/pb/mp4.pb.gw.go @@ -266,6 +266,66 @@ func local_request_Api_StartRecord_0(ctx context.Context, marshaler runtime.Mars } +func request_Api_StopRecord_0(ctx context.Context, marshaler runtime.Marshaler, client ApiClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReqStopRecord + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["streamPath"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "streamPath") + } + + protoReq.StreamPath, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "streamPath", err) + } + + msg, err := client.StopRecord(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Api_StopRecord_0(ctx context.Context, marshaler runtime.Marshaler, server ApiServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ReqStopRecord + var metadata runtime.ServerMetadata + + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["streamPath"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "streamPath") + } + + protoReq.StreamPath, err = runtime.String(val) + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "streamPath", err) + } + + msg, err := server.StopRecord(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterApiHandlerServer registers the http handlers for service Api to "mux". // UnaryRPC :call ApiServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -398,6 +458,31 @@ func RegisterApiHandlerServer(ctx context.Context, mux *runtime.ServeMux, server }) + mux.Handle("POST", pattern_Api_StopRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/mp4.Api/StopRecord", runtime.WithHTTPPathPattern("/mp4/api/stop/{streamPath=**}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Api_StopRecord_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Api_StopRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -549,6 +634,28 @@ func RegisterApiHandlerClient(ctx context.Context, mux *runtime.ServeMux, client }) + mux.Handle("POST", pattern_Api_StopRecord_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/mp4.Api/StopRecord", runtime.WithHTTPPathPattern("/mp4/api/stop/{streamPath=**}")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Api_StopRecord_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Api_StopRecord_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -562,6 +669,8 @@ var ( pattern_Api_EventStart_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"mp4", "api", "event", "start"}, "")) pattern_Api_StartRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 3, 0, 4, 1, 5, 3}, []string{"mp4", "api", "start", "streamPath"}, "")) + + pattern_Api_StopRecord_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 3, 0, 4, 1, 5, 3}, []string{"mp4", "api", "stop", "streamPath"}, "")) ) var ( @@ -574,4 +683,6 @@ var ( forward_Api_EventStart_0 = runtime.ForwardResponseMessage forward_Api_StartRecord_0 = runtime.ForwardResponseMessage + + forward_Api_StopRecord_0 = runtime.ForwardResponseMessage ) diff --git a/plugin/mp4/pb/mp4.proto b/plugin/mp4/pb/mp4.proto index 6304679..2d78358 100644 --- a/plugin/mp4/pb/mp4.proto +++ b/plugin/mp4/pb/mp4.proto @@ -36,6 +36,12 @@ service api { body: "*" }; } + rpc StopRecord (ReqStopRecord) returns (ResponseStopRecord) { + option (google.api.http) = { + post: "/mp4/api/stop/{streamPath=**}" + body: "*" + }; + } } message ReqRecordList { @@ -85,4 +91,14 @@ message ResponseStartRecord { int32 code = 1; string message = 2; uint64 data = 3; +} + +message ReqStopRecord { + string streamPath = 1; +} + +message ResponseStopRecord { + int32 code = 1; + string message = 2; + uint64 data = 3; } \ No newline at end of file diff --git a/plugin/mp4/pb/mp4_grpc.pb.go b/plugin/mp4/pb/mp4_grpc.pb.go index f1c8a41..ea27e0c 100644 --- a/plugin/mp4/pb/mp4_grpc.pb.go +++ b/plugin/mp4/pb/mp4_grpc.pb.go @@ -26,6 +26,7 @@ const ( Api_Delete_FullMethodName = "/mp4.api/Delete" Api_EventStart_FullMethodName = "/mp4.api/EventStart" Api_StartRecord_FullMethodName = "/mp4.api/StartRecord" + Api_StopRecord_FullMethodName = "/mp4.api/StopRecord" ) // ApiClient is the client API for Api service. @@ -37,6 +38,7 @@ type ApiClient interface { Delete(ctx context.Context, in *ReqRecordDelete, opts ...grpc.CallOption) (*pb.ResponseDelete, error) EventStart(ctx context.Context, in *ReqEventRecord, opts ...grpc.CallOption) (*ResponseEventRecord, error) StartRecord(ctx context.Context, in *ReqStartRecord, opts ...grpc.CallOption) (*ResponseStartRecord, error) + StopRecord(ctx context.Context, in *ReqStopRecord, opts ...grpc.CallOption) (*ResponseStopRecord, error) } type apiClient struct { @@ -97,6 +99,16 @@ func (c *apiClient) StartRecord(ctx context.Context, in *ReqStartRecord, opts .. return out, nil } +func (c *apiClient) StopRecord(ctx context.Context, in *ReqStopRecord, opts ...grpc.CallOption) (*ResponseStopRecord, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ResponseStopRecord) + err := c.cc.Invoke(ctx, Api_StopRecord_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ApiServer is the server API for Api service. // All implementations must embed UnimplementedApiServer // for forward compatibility. @@ -106,6 +118,7 @@ type ApiServer interface { Delete(context.Context, *ReqRecordDelete) (*pb.ResponseDelete, error) EventStart(context.Context, *ReqEventRecord) (*ResponseEventRecord, error) StartRecord(context.Context, *ReqStartRecord) (*ResponseStartRecord, error) + StopRecord(context.Context, *ReqStopRecord) (*ResponseStopRecord, error) mustEmbedUnimplementedApiServer() } @@ -131,6 +144,9 @@ func (UnimplementedApiServer) EventStart(context.Context, *ReqEventRecord) (*Res func (UnimplementedApiServer) StartRecord(context.Context, *ReqStartRecord) (*ResponseStartRecord, error) { return nil, status.Errorf(codes.Unimplemented, "method StartRecord not implemented") } +func (UnimplementedApiServer) StopRecord(context.Context, *ReqStopRecord) (*ResponseStopRecord, error) { + return nil, status.Errorf(codes.Unimplemented, "method StopRecord not implemented") +} func (UnimplementedApiServer) mustEmbedUnimplementedApiServer() {} func (UnimplementedApiServer) testEmbeddedByValue() {} @@ -242,6 +258,24 @@ func _Api_StartRecord_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } +func _Api_StopRecord_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReqStopRecord) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApiServer).StopRecord(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Api_StopRecord_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApiServer).StopRecord(ctx, req.(*ReqStopRecord)) + } + return interceptor(ctx, in, info, handler) +} + // Api_ServiceDesc is the grpc.ServiceDesc for Api service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -269,6 +303,10 @@ var Api_ServiceDesc = grpc.ServiceDesc{ MethodName: "StartRecord", Handler: _Api_StartRecord_Handler, }, + { + MethodName: "StopRecord", + Handler: _Api_StopRecord_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "mp4.proto",