summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/webrtc/modules/video_coding/main/source/generic_encoder.cc
diff options
context:
space:
mode:
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.cc111
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