Avoid resetting video encoder for similar configs.
BUG=1681 R=holmer@google.com, mflodman@webrtc.org, stefan@webrtc.org Review URL: https://webrtc-codereview.appspot.com/1442006 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4008 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
parent
7707d060bb
commit
aa4efd1535
@ -318,6 +318,63 @@ VideoCodingModuleImpl::InitializeSender()
|
|||||||
return VCM_OK;
|
return VCM_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool VideoCodingModuleImpl::RequiresEncoderReset(const VideoCodec& send_codec) {
|
||||||
|
VideoCodec current_codec;
|
||||||
|
|
||||||
|
if (!_codecDataBase.SendCodec(¤t_codec)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_codec.codecType != send_codec.codecType ||
|
||||||
|
strcmp(current_codec.plName, send_codec.plName) != 0 ||
|
||||||
|
current_codec.plType != send_codec.plType ||
|
||||||
|
current_codec.width != send_codec.width ||
|
||||||
|
current_codec.height != send_codec.height ||
|
||||||
|
current_codec.qpMax != send_codec.qpMax ||
|
||||||
|
current_codec.numberOfSimulcastStreams !=
|
||||||
|
send_codec.numberOfSimulcastStreams ||
|
||||||
|
current_codec.mode != send_codec.mode ||
|
||||||
|
current_codec.extra_options != send_codec.extra_options) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (current_codec.codecType) {
|
||||||
|
case kVideoCodecVP8:
|
||||||
|
if (memcmp(¤t_codec.codecSpecific.VP8,
|
||||||
|
&send_codec.codecSpecific.VP8,
|
||||||
|
sizeof(current_codec.codecSpecific.VP8)) != 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case kVideoCodecGeneric:
|
||||||
|
if (memcmp(¤t_codec.codecSpecific.Generic,
|
||||||
|
&send_codec.codecSpecific.Generic,
|
||||||
|
sizeof(current_codec.codecSpecific.Generic)) != 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Known codecs without payload-specifics
|
||||||
|
case kVideoCodecI420:
|
||||||
|
case kVideoCodecRED:
|
||||||
|
case kVideoCodecULPFEC:
|
||||||
|
break;
|
||||||
|
// Unknown codec type, reset just to be sure.
|
||||||
|
case kVideoCodecUnknown:
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_codec.numberOfSimulcastStreams > 0) {
|
||||||
|
for (unsigned char i = 0; i < current_codec.numberOfSimulcastStreams; ++i) {
|
||||||
|
if (memcmp(¤t_codec.simulcastStream[i],
|
||||||
|
&send_codec.simulcastStream[i],
|
||||||
|
sizeof(current_codec.simulcastStream[i])) != 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Register the send codec to be used.
|
// Register the send codec to be used.
|
||||||
int32_t
|
int32_t
|
||||||
VideoCodingModuleImpl::RegisterSendCodec(const VideoCodec* sendCodec,
|
VideoCodingModuleImpl::RegisterSendCodec(const VideoCodec* sendCodec,
|
||||||
@ -329,13 +386,18 @@ VideoCodingModuleImpl::RegisterSendCodec(const VideoCodec* sendCodec,
|
|||||||
{
|
{
|
||||||
return VCM_PARAMETER_ERROR;
|
return VCM_PARAMETER_ERROR;
|
||||||
}
|
}
|
||||||
bool ret = _codecDataBase.RegisterSendCodec(sendCodec, numberOfCores,
|
|
||||||
maxPayloadSize);
|
bool requires_reconfigure = RequiresEncoderReset(*sendCodec);
|
||||||
if (!ret)
|
|
||||||
{
|
if (!_codecDataBase.RegisterSendCodec(sendCodec, numberOfCores,
|
||||||
|
maxPayloadSize)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!requires_reconfigure) {
|
||||||
|
return VCM_OK;
|
||||||
|
}
|
||||||
|
|
||||||
_encoder = _codecDataBase.GetEncoder(sendCodec, &_encodedFrameCallback);
|
_encoder = _codecDataBase.GetEncoder(sendCodec, &_encodedFrameCallback);
|
||||||
if (_encoder == NULL)
|
if (_encoder == NULL)
|
||||||
{
|
{
|
||||||
|
@ -279,9 +279,9 @@ public:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
int32_t Decode(const webrtc::VCMEncodedFrame& frame);
|
int32_t Decode(const webrtc::VCMEncodedFrame& frame);
|
||||||
|
bool RequiresEncoderReset(const VideoCodec& send_codec);
|
||||||
int32_t RequestKeyFrame();
|
int32_t RequestKeyFrame();
|
||||||
int32_t RequestSliceLossIndication(
|
int32_t RequestSliceLossIndication(const uint64_t pictureID) const;
|
||||||
const uint64_t pictureID) const;
|
|
||||||
int32_t NackList(uint16_t* nackList, uint16_t& size);
|
int32_t NackList(uint16_t* nackList, uint16_t& size);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
Reference in New Issue
Block a user