mirror of
https://github.com/pion/webrtc.git
synced 2025-10-24 15:43:10 +08:00
Fix MediaEngine Copy
Copy the entire API. Since the MediaEngine is a pointer that would destroy the MediaEngine that is used by other PeerConnections Relates to #1662
This commit is contained in:
@@ -105,10 +105,6 @@ func NewPeerConnection(configuration Configuration) (*PeerConnection, error) {
|
|||||||
|
|
||||||
// NewPeerConnection creates a new PeerConnection with the provided configuration against the received API object
|
// NewPeerConnection creates a new PeerConnection with the provided configuration against the received API object
|
||||||
func (api *API) NewPeerConnection(configuration Configuration) (*PeerConnection, error) {
|
func (api *API) NewPeerConnection(configuration Configuration) (*PeerConnection, error) {
|
||||||
if !api.settingEngine.disableMediaEngineCopy {
|
|
||||||
api.mediaEngine = api.mediaEngine.copy()
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://w3c.github.io/webrtc-pc/#constructor (Step #2)
|
// https://w3c.github.io/webrtc-pc/#constructor (Step #2)
|
||||||
// Some variables defined explicitly despite their implicit zero values to
|
// Some variables defined explicitly despite their implicit zero values to
|
||||||
// allow better readability to understand what is happening.
|
// allow better readability to understand what is happening.
|
||||||
@@ -137,7 +133,13 @@ func (api *API) NewPeerConnection(configuration Configuration) (*PeerConnection,
|
|||||||
log: api.settingEngine.LoggerFactory.NewLogger("pc"),
|
log: api.settingEngine.LoggerFactory.NewLogger("pc"),
|
||||||
}
|
}
|
||||||
|
|
||||||
pc.interceptorRTCPWriter = api.interceptor.BindRTCPWriter(interceptor.RTCPWriterFunc(pc.writeRTCP))
|
if !api.settingEngine.disableMediaEngineCopy {
|
||||||
|
pc.api = &API{
|
||||||
|
settingEngine: api.settingEngine,
|
||||||
|
mediaEngine: api.mediaEngine.copy(),
|
||||||
|
interceptor: api.interceptor,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
if err = pc.initConfiguration(configuration); err != nil {
|
if err = pc.initConfiguration(configuration); err != nil {
|
||||||
@@ -173,6 +175,8 @@ func (api *API) NewPeerConnection(configuration Configuration) (*PeerConnection,
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
pc.interceptorRTCPWriter = api.interceptor.BindRTCPWriter(interceptor.RTCPWriterFunc(pc.writeRTCP))
|
||||||
|
|
||||||
return pc, nil
|
return pc, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -145,7 +145,9 @@ func TestSettingEngine_SetDisableMediaEngineCopy(t *testing.T) {
|
|||||||
m := &MediaEngine{}
|
m := &MediaEngine{}
|
||||||
assert.NoError(t, m.RegisterDefaultCodecs())
|
assert.NoError(t, m.RegisterDefaultCodecs())
|
||||||
|
|
||||||
offerer, answerer, err := NewAPI(WithMediaEngine(m)).newPair(Configuration{})
|
api := NewAPI(WithMediaEngine(m))
|
||||||
|
|
||||||
|
offerer, answerer, err := api.newPair(Configuration{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
_, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
|
_, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
|
||||||
@@ -153,11 +155,30 @@ func TestSettingEngine_SetDisableMediaEngineCopy(t *testing.T) {
|
|||||||
|
|
||||||
assert.NoError(t, signalPair(offerer, answerer))
|
assert.NoError(t, signalPair(offerer, answerer))
|
||||||
|
|
||||||
|
// Assert that the MediaEngine the user created isn't modified
|
||||||
assert.False(t, m.negotiatedVideo)
|
assert.False(t, m.negotiatedVideo)
|
||||||
assert.Empty(t, m.negotiatedVideoCodecs)
|
assert.Empty(t, m.negotiatedVideoCodecs)
|
||||||
|
|
||||||
|
// Assert that the internal MediaEngine is modified
|
||||||
|
assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
|
||||||
|
assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
|
||||||
|
|
||||||
assert.NoError(t, offerer.Close())
|
assert.NoError(t, offerer.Close())
|
||||||
assert.NoError(t, answerer.Close())
|
assert.NoError(t, answerer.Close())
|
||||||
|
|
||||||
|
newOfferer, newAnswerer, err := api.newPair(Configuration{})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
// Assert that the first internal MediaEngine hasn't been cleared
|
||||||
|
assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
|
||||||
|
assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
|
||||||
|
|
||||||
|
// Assert that the new internal MediaEngine isn't modified
|
||||||
|
assert.False(t, newOfferer.api.mediaEngine.negotiatedVideo)
|
||||||
|
assert.Empty(t, newAnswerer.api.mediaEngine.negotiatedVideoCodecs)
|
||||||
|
|
||||||
|
assert.NoError(t, newOfferer.Close())
|
||||||
|
assert.NoError(t, newAnswerer.Close())
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("No Copy", func(t *testing.T) {
|
t.Run("No Copy", func(t *testing.T) {
|
||||||
@@ -167,7 +188,9 @@ func TestSettingEngine_SetDisableMediaEngineCopy(t *testing.T) {
|
|||||||
s := SettingEngine{}
|
s := SettingEngine{}
|
||||||
s.DisableMediaEngineCopy(true)
|
s.DisableMediaEngineCopy(true)
|
||||||
|
|
||||||
offerer, answerer, err := NewAPI(WithMediaEngine(m), WithSettingEngine(s)).newPair(Configuration{})
|
api := NewAPI(WithMediaEngine(m), WithSettingEngine(s))
|
||||||
|
|
||||||
|
offerer, answerer, err := api.newPair(Configuration{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
||||||
_, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
|
_, err = offerer.AddTransceiverFromKind(RTPCodecTypeVideo)
|
||||||
@@ -175,10 +198,21 @@ func TestSettingEngine_SetDisableMediaEngineCopy(t *testing.T) {
|
|||||||
|
|
||||||
assert.NoError(t, signalPair(offerer, answerer))
|
assert.NoError(t, signalPair(offerer, answerer))
|
||||||
|
|
||||||
|
// Assert that the user MediaEngine was modified, so no copy happened
|
||||||
assert.True(t, m.negotiatedVideo)
|
assert.True(t, m.negotiatedVideo)
|
||||||
assert.NotEmpty(t, m.negotiatedVideoCodecs)
|
assert.NotEmpty(t, m.negotiatedVideoCodecs)
|
||||||
|
|
||||||
assert.NoError(t, offerer.Close())
|
assert.NoError(t, offerer.Close())
|
||||||
assert.NoError(t, answerer.Close())
|
assert.NoError(t, answerer.Close())
|
||||||
|
|
||||||
|
offerer, answerer, err = api.newPair(Configuration{})
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
// Assert that the new internal MediaEngine was modified, so no copy happened
|
||||||
|
assert.True(t, offerer.api.mediaEngine.negotiatedVideo)
|
||||||
|
assert.NotEmpty(t, offerer.api.mediaEngine.negotiatedVideoCodecs)
|
||||||
|
|
||||||
|
assert.NoError(t, offerer.Close())
|
||||||
|
assert.NoError(t, answerer.Close())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user