mirror of https://github.com/gwuhaolin/livego.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.2 KiB
71 lines
1.2 KiB
package amf |
|
|
|
import ( |
|
"bytes" |
|
"fmt" |
|
|
|
log "github.com/sirupsen/logrus" |
|
) |
|
|
|
const ( |
|
ADD = 0x0 |
|
DEL = 0x3 |
|
) |
|
|
|
const ( |
|
SetDataFrame string = "@setDataFrame" |
|
OnMetaData string = "onMetaData" |
|
) |
|
|
|
var setFrameFrame []byte |
|
|
|
func init() { |
|
b := bytes.NewBuffer(nil) |
|
encoder := &Encoder{} |
|
if _, err := encoder.Encode(b, SetDataFrame, AMF0); err != nil { |
|
log.Fatal(err) |
|
} |
|
setFrameFrame = b.Bytes() |
|
} |
|
|
|
func MetaDataReform(p []byte, flag uint8) ([]byte, error) { |
|
r := bytes.NewReader(p) |
|
decoder := &Decoder{} |
|
switch flag { |
|
case ADD: |
|
v, err := decoder.Decode(r, AMF0) |
|
if err != nil { |
|
return nil, err |
|
} |
|
switch v.(type) { |
|
case string: |
|
vv := v.(string) |
|
if vv != SetDataFrame { |
|
tmplen := len(setFrameFrame) |
|
b := make([]byte, tmplen+len(p)) |
|
copy(b, setFrameFrame) |
|
copy(b[tmplen:], p) |
|
p = b |
|
} |
|
default: |
|
return nil, fmt.Errorf("setFrameFrame error") |
|
} |
|
case DEL: |
|
v, err := decoder.Decode(r, AMF0) |
|
if err != nil { |
|
return nil, err |
|
} |
|
switch v.(type) { |
|
case string: |
|
vv := v.(string) |
|
if vv == SetDataFrame { |
|
p = p[len(setFrameFrame):] |
|
} |
|
default: |
|
return nil, fmt.Errorf("metadata error") |
|
} |
|
default: |
|
return nil, fmt.Errorf("invalid flag:%d", flag) |
|
} |
|
return p, nil |
|
}
|
|
|