diff options
Diffstat (limited to 'chromium/third_party/webrtc/modules/video_coding/main/source/generic_encoder.cc')
-rw-r--r-- | chromium/third_party/webrtc/modules/video_coding/main/source/generic_encoder.cc | 111 |
1 files changed, 46 insertions, 65 deletions
diff --git a/chromium/third_party/webrtc/modules/video_coding/main/source/generic_encoder.cc b/chromium/third_party/webrtc/modules/video_coding/main/source/generic_encoder.cc index 064470b1667..6fb2c9f81b7 100644 --- a/chromium/third_party/webrtc/modules/video_coding/main/source/generic_encoder.cc +++ b/chromium/third_party/webrtc/modules/video_coding/main/source/generic_encoder.cc @@ -13,8 +13,42 @@ #include "webrtc/modules/video_coding/main/source/generic_encoder.h" #include "webrtc/modules/video_coding/main/source/media_optimization.h" #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" +#include "webrtc/system_wrappers/interface/logging.h" namespace webrtc { +namespace { +// Map information from info into rtp. If no relevant information is found +// in info, rtp is set to NULL. +void CopyCodecSpecific(const CodecSpecificInfo* info, RTPVideoHeader** rtp) { + if (!info) { + *rtp = NULL; + return; + } + switch (info->codecType) { + case kVideoCodecVP8: { + (*rtp)->codec = kRtpVideoVp8; + (*rtp)->codecHeader.VP8.InitRTPVideoHeaderVP8(); + (*rtp)->codecHeader.VP8.pictureId = info->codecSpecific.VP8.pictureId; + (*rtp)->codecHeader.VP8.nonReference = + info->codecSpecific.VP8.nonReference; + (*rtp)->codecHeader.VP8.temporalIdx = info->codecSpecific.VP8.temporalIdx; + (*rtp)->codecHeader.VP8.layerSync = info->codecSpecific.VP8.layerSync; + (*rtp)->codecHeader.VP8.tl0PicIdx = info->codecSpecific.VP8.tl0PicIdx; + (*rtp)->codecHeader.VP8.keyIdx = info->codecSpecific.VP8.keyIdx; + (*rtp)->simulcastIdx = info->codecSpecific.VP8.simulcastIdx; + return; + } + case kVideoCodecGeneric: + (*rtp)->codec = kRtpVideoGeneric; + (*rtp)->simulcastIdx = info->codecSpecific.generic.simulcast_idx; + return; + default: + // No codec specific info. Change RTP header pointer to NULL. + *rtp = NULL; + return; + } +} +} // namespace //#define DEBUG_ENCODER_BIT_STREAM @@ -50,11 +84,12 @@ VCMGenericEncoder::InitEncode(const VideoCodec* settings, _bitRate = settings->startBitrate * 1000; _frameRate = settings->maxFramerate; _codecType = settings->codecType; - if (_VCMencodedFrameCallback != NULL) - { - _VCMencodedFrameCallback->SetCodecType(_codecType); + if (_encoder.InitEncode(settings, numberOfCores, maxPayloadSize) != 0) { + LOG(LS_ERROR) << "Failed to initialize the encoder associated with " + "payload name: " << settings->plName; + return -1; } - return _encoder.InitEncode(settings, numberOfCores, maxPayloadSize); + return 0; } int32_t @@ -127,8 +162,6 @@ int32_t VCMGenericEncoder::RegisterEncodeCallback(VCMEncodedFrameCallback* VCMencodedFrameCallback) { _VCMencodedFrameCallback = VCMencodedFrameCallback; - - _VCMencodedFrameCallback->SetCodecType(_codecType); _VCMencodedFrameCallback->SetInternalSource(_internalSource); return _encoder.RegisterEncodeCompleteCallback(_VCMencodedFrameCallback); } @@ -142,15 +175,13 @@ VCMGenericEncoder::InternalSource() const /*************************** * Callback Implementation ***************************/ -VCMEncodedFrameCallback::VCMEncodedFrameCallback(): +VCMEncodedFrameCallback::VCMEncodedFrameCallback( + EncodedImageCallback* post_encode_callback): _sendCallback(), _mediaOpt(NULL), -_encodedBytes(0), _payloadType(0), -_codecType(kVideoCodecUnknown), _internalSource(false), -post_encode_callback_lock_(CriticalSectionWrapper::CreateCriticalSection()), -post_encode_callback_(NULL) +post_encode_callback_(post_encode_callback) #ifdef DEBUG_ENCODER_BIT_STREAM , _bitStreamAfterEncoder(NULL) #endif @@ -180,12 +211,8 @@ VCMEncodedFrameCallback::Encoded( const CodecSpecificInfo* codecSpecificInfo, const RTPFragmentationHeader* fragmentationHeader) { - { - CriticalSectionScoped cs(post_encode_callback_lock_.get()); - if (post_encode_callback_) { - post_encode_callback_->Encoded(encodedImage); - } - } + post_encode_callback_->Encoded(encodedImage); + FrameType frameType = VCMEncodedFrame::ConvertFrameType(encodedImage._frameType); uint32_t encodedBytes = 0; @@ -202,14 +229,7 @@ VCMEncodedFrameCallback::Encoded( RTPVideoHeader rtpVideoHeader; RTPVideoHeader* rtpVideoHeaderPtr = &rtpVideoHeader; - if (codecSpecificInfo) - { - CopyCodecSpecific(*codecSpecificInfo, &rtpVideoHeaderPtr); - } - else - { - rtpVideoHeaderPtr = NULL; - } + CopyCodecSpecific(codecSpecificInfo, &rtpVideoHeaderPtr); int32_t callbackReturn = _sendCallback->SendData( frameType, @@ -229,9 +249,8 @@ VCMEncodedFrameCallback::Encoded( { return VCM_UNINITIALIZED; } - _encodedBytes = encodedBytes; if (_mediaOpt != NULL) { - _mediaOpt->UpdateWithEncodedData(_encodedBytes, encodedImage._timeStamp, + _mediaOpt->UpdateWithEncodedData(encodedBytes, encodedImage._timeStamp, frameType); if (_internalSource) { @@ -241,12 +260,6 @@ VCMEncodedFrameCallback::Encoded( return VCM_OK; } -uint32_t -VCMEncodedFrameCallback::EncodedBytes() -{ - return _encodedBytes; -} - void VCMEncodedFrameCallback::SetMediaOpt( media_optimization::MediaOptimization *mediaOpt) @@ -254,36 +267,4 @@ VCMEncodedFrameCallback::SetMediaOpt( _mediaOpt = mediaOpt; } -void VCMEncodedFrameCallback::CopyCodecSpecific(const CodecSpecificInfo& info, - RTPVideoHeader** rtp) { - switch (info.codecType) { - case kVideoCodecVP8: { - (*rtp)->codec = kRtpVideoVp8; - (*rtp)->codecHeader.VP8.InitRTPVideoHeaderVP8(); - (*rtp)->codecHeader.VP8.pictureId = info.codecSpecific.VP8.pictureId; - (*rtp)->codecHeader.VP8.nonReference = - info.codecSpecific.VP8.nonReference; - (*rtp)->codecHeader.VP8.temporalIdx = info.codecSpecific.VP8.temporalIdx; - (*rtp)->codecHeader.VP8.layerSync = info.codecSpecific.VP8.layerSync; - (*rtp)->codecHeader.VP8.tl0PicIdx = info.codecSpecific.VP8.tl0PicIdx; - (*rtp)->codecHeader.VP8.keyIdx = info.codecSpecific.VP8.keyIdx; - (*rtp)->simulcastIdx = info.codecSpecific.VP8.simulcastIdx; - return; - } - case kVideoCodecGeneric: - (*rtp)->codec = kRtpVideoGeneric; - (*rtp)->simulcastIdx = info.codecSpecific.generic.simulcast_idx; - return; - default: - // No codec specific info. Change RTP header pointer to NULL. - *rtp = NULL; - return; - } -} - -void VCMEncodedFrameCallback::RegisterPostEncodeImageCallback( - EncodedImageCallback* callback) { - CriticalSectionScoped cs(post_encode_callback_lock_.get()); - post_encode_callback_ = callback; -} } // namespace webrtc |