2b7682cdb3
- replace traditional for loop with range-based for loop for clarity
refactor(ffmpeg): simplify cut function loop
- utilize range-based for loop instead of traditional for loop
refactor(ring): update API response mapping type
- change map type from `interface{}` to `any` for better type safety
refactor(stream): handle nil source in NewStream
- add nil check for source elements before processing
refactor(webrtc): unify payload handling in GetToken
- change map type from `interface{}` to `any` for consistency
refactor(ascii): optimize nested loops in Write function
- replace traditional for loops with range-based for loops for readability
refactor(bits): enhance readability in Reader methods
- replace traditional for loops with range-based for loops in Read functions
refactor(h264): modernize loop structures in DecodeConfig
- switch to range-based for loops for cleaner code
refactor(h265): streamline profile_tier_level loops
- utilize range-based for loops instead of traditional for loops
chore(core): remove commented-out test function for clarity
refactor(core): simplify RandString function loop
- change traditional for loop to range-based for loop
refactor(flvt): optimize timestamp handling in TestTimeToRTP
- switch to range-based for loop for iterating frames
refactor(nest): improve error handling in ExchangeSDP
- format error message with printf-style formatting for clarity
refactor(tapo): enhance securityEncode function
- change traditional for loop to range-based for loop for readability
fix(tcp): correct masking in websocket Write method
- replace traditional for loop with range-based for loop
refactor(tutk): modernize encoding loops in crypto functions
- utilize range-based for loops for better readability
refactor(tuya): unify data types in MQTT message struct
- change map type from `interface{}` to `any` for consistency
refactor(webrtc): standardize codec registration
- change map type from `interface{}` to `any` for type safety
refactor(yaml): simplify Unmarshal function signature
- update parameter type from `interface{}` to `any` for better clarity
67 lines
1.4 KiB
Go
67 lines
1.4 KiB
Go
package mpegts
|
|
|
|
import (
|
|
"github.com/AlexxIT/go2rtc/pkg/bits"
|
|
)
|
|
|
|
// opusDT - each AU from FFmpeg has 5 OPUS packets. Each packet len = 960 in the 48000 clock.
|
|
const opusDT = 960 * ClockRate / 48000
|
|
|
|
// https://opus-codec.org/docs/
|
|
var opusInfo = []byte{ // registration_descriptor
|
|
0x05, // descriptor_tag
|
|
0x04, // descriptor_length
|
|
'O', 'p', 'u', 's', // format_identifier
|
|
}
|
|
|
|
//goland:noinspection GoSnakeCaseUsage
|
|
func CutOPUSPacket(b []byte) (packet []byte, left []byte) {
|
|
r := bits.NewReader(b)
|
|
|
|
size := opus_control_header(r)
|
|
if size == 0 {
|
|
return nil, nil
|
|
}
|
|
|
|
packet = r.ReadBytes(size)
|
|
left = r.Left()
|
|
return
|
|
}
|
|
|
|
//goland:noinspection GoSnakeCaseUsage
|
|
func opus_control_header(r *bits.Reader) int {
|
|
control_header_prefix := r.ReadBits(11)
|
|
if control_header_prefix != 0x3FF {
|
|
return 0
|
|
}
|
|
|
|
start_trim_flag := r.ReadBit()
|
|
end_trim_flag := r.ReadBit()
|
|
control_extension_flag := r.ReadBit()
|
|
_ = r.ReadBits(2) // reserved
|
|
|
|
var payload_size int
|
|
for {
|
|
i := r.ReadUint8()
|
|
payload_size += int(i)
|
|
if i < 255 {
|
|
break
|
|
}
|
|
}
|
|
|
|
if start_trim_flag != 0 {
|
|
_ = r.ReadBits(3)
|
|
_ = r.ReadBits(13)
|
|
}
|
|
if end_trim_flag != 0 {
|
|
_ = r.ReadBits(3)
|
|
_ = r.ReadBits(13)
|
|
}
|
|
if control_extension_flag != 0 {
|
|
control_extension_length := r.ReadUint8()
|
|
_ = r.ReadBytes(int(control_extension_length)) // reserved
|
|
}
|
|
|
|
return payload_size
|
|
}
|