| Index: webrtc/modules/video_coding/main/source/generic_encoder.cc
|
| diff --git a/webrtc/modules/video_coding/main/source/generic_encoder.cc b/webrtc/modules/video_coding/main/source/generic_encoder.cc
|
| index e3ae0dd44b4da377a1a854d7d45a1ad237e67c8e..de196040f053df77ebfd7753ce038a1a52ff42db 100644
|
| --- a/webrtc/modules/video_coding/main/source/generic_encoder.cc
|
| +++ b/webrtc/modules/video_coding/main/source/generic_encoder.cc
|
| @@ -88,50 +88,43 @@ void CopyCodecSpecific(const CodecSpecificInfo* info, RTPVideoHeader* rtp) {
|
|
|
| //#define DEBUG_ENCODER_BIT_STREAM
|
|
|
| -VCMGenericEncoder::VCMGenericEncoder(VideoEncoder* encoder,
|
| - VideoEncoderRateObserver* rate_observer,
|
| - bool internalSource)
|
| +VCMGenericEncoder::VCMGenericEncoder(
|
| + VideoEncoder* encoder,
|
| + VideoEncoderRateObserver* rate_observer,
|
| + VCMEncodedFrameCallback* encoded_frame_callback,
|
| + bool internalSource)
|
| : encoder_(encoder),
|
| rate_observer_(rate_observer),
|
| - vcm_encoded_frame_callback_(nullptr),
|
| - encoder_params_({0, 0, 0, 0}),
|
| + vcm_encoded_frame_callback_(encoded_frame_callback),
|
| internal_source_(internalSource),
|
| + encoder_params_({0, 0, 0, 0}),
|
| rotation_(kVideoRotation_0),
|
| is_screenshare_(false) {}
|
|
|
| -VCMGenericEncoder::~VCMGenericEncoder()
|
| -{
|
| -}
|
| -
|
| -int32_t VCMGenericEncoder::Release()
|
| -{
|
| - {
|
| - rtc::CritScope lock(¶ms_lock_);
|
| - encoder_params_ = {0, 0, 0, 0};
|
| - vcm_encoded_frame_callback_ = nullptr;
|
| - }
|
| +VCMGenericEncoder::~VCMGenericEncoder() {}
|
|
|
| - return encoder_->Release();
|
| +int32_t VCMGenericEncoder::Release() {
|
| + return encoder_->Release();
|
| }
|
|
|
| -int32_t
|
| -VCMGenericEncoder::InitEncode(const VideoCodec* settings,
|
| - int32_t numberOfCores,
|
| - size_t maxPayloadSize)
|
| -{
|
| - {
|
| - rtc::CritScope lock(¶ms_lock_);
|
| - encoder_params_.target_bitrate = settings->startBitrate * 1000;
|
| - encoder_params_.input_frame_rate = settings->maxFramerate;
|
| - }
|
| +int32_t VCMGenericEncoder::InitEncode(const VideoCodec* settings,
|
| + int32_t numberOfCores,
|
| + size_t maxPayloadSize) {
|
| + {
|
| + rtc::CritScope lock(¶ms_lock_);
|
| + encoder_params_.target_bitrate = settings->startBitrate * 1000;
|
| + encoder_params_.input_frame_rate = settings->maxFramerate;
|
| + }
|
|
|
| - is_screenshare_ = settings->mode == VideoCodecMode::kScreensharing;
|
| - if (encoder_->InitEncode(settings, numberOfCores, maxPayloadSize) != 0) {
|
| - LOG(LS_ERROR) << "Failed to initialize the encoder associated with "
|
| - "payload name: " << settings->plName;
|
| - return -1;
|
| - }
|
| - return 0;
|
| + is_screenshare_ = settings->mode == VideoCodecMode::kScreensharing;
|
| + if (encoder_->InitEncode(settings, numberOfCores, maxPayloadSize) != 0) {
|
| + LOG(LS_ERROR) << "Failed to initialize the encoder associated with "
|
| + "payload name: "
|
| + << settings->plName;
|
| + return -1;
|
| + }
|
| + encoder_->RegisterEncodeCompleteCallback(vcm_encoded_frame_callback_);
|
| + return 0;
|
| }
|
|
|
| int32_t VCMGenericEncoder::Encode(const VideoFrame& inputFrame,
|
| @@ -142,12 +135,12 @@ int32_t VCMGenericEncoder::Encode(const VideoFrame& inputFrame,
|
|
|
| rotation_ = inputFrame.rotation();
|
|
|
| - if (vcm_encoded_frame_callback_) {
|
| - // Keep track of the current frame rotation and apply to the output of the
|
| - // encoder. There might not be exact as the encoder could have one frame
|
| - // delay but it should be close enough.
|
| - vcm_encoded_frame_callback_->SetRotation(rotation_);
|
| - }
|
| + // Keep track of the current frame rotation and apply to the output of the
|
| + // encoder. There might not be exact as the encoder could have one frame delay
|
| + // but it should be close enough.
|
| + // TODO(pbos): Map from timestamp, this is racy (even if rotation_ is locked
|
| + // properly, which it isn't). More than one frame may be in the pipeline.
|
| + vcm_encoded_frame_callback_->SetRotation(rotation_);
|
|
|
| int32_t result = encoder_->Encode(inputFrame, codecSpecificInfo, &frameTypes);
|
| if (is_screenshare_ &&
|
| @@ -201,14 +194,6 @@ int32_t VCMGenericEncoder::RequestFrame(
|
| return encoder_->Encode(image, NULL, &frame_types);
|
| }
|
|
|
| -int32_t
|
| -VCMGenericEncoder::RegisterEncodeCallback(VCMEncodedFrameCallback* VCMencodedFrameCallback)
|
| -{
|
| - VCMencodedFrameCallback->SetInternalSource(internal_source_);
|
| - vcm_encoded_frame_callback_ = VCMencodedFrameCallback;
|
| - return encoder_->RegisterEncodeCompleteCallback(VCMencodedFrameCallback);
|
| -}
|
| -
|
| bool
|
| VCMGenericEncoder::InternalSource() const
|
| {
|
|
|