aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/video_coding/main/source/generic_encoder.cc
diff options
context:
space:
mode:
authorguoweis@webrtc.org <guoweis@webrtc.org>2015-03-17 21:54:50 +0000
committerguoweis@webrtc.org <guoweis@webrtc.org>2015-03-17 21:55:37 +0000
commit54d072ea20594165c8f124ef382a3de0d111f938 (patch)
treedb5eaf7003e67312bd23e7d1417183cdded1aa0c /webrtc/modules/video_coding/main/source/generic_encoder.cc
parent63a10978e145afb7f3364e41da24d6434c3dcccc (diff)
downloadwebrtc-54d072ea20594165c8f124ef382a3de0d111f938.tar.gz
Add CVO support to video_coding layer.
CVO is, instead of rotating frame on the capture side, to have renderer rotate the frame based on a new rtp header extension. The change includes 1. encoder side needs to pass this from raw frame to the encoded frame. 2. decoder needs to copy it from rtp packet (only the last packet of a frame has this info) to decoded frame. R=mflodman@webrtc.org TBR=stefan@webrtc.org BUG=4145 Review URL: https://webrtc-codereview.appspot.com/46429006 Cr-Commit-Position: refs/heads/master@{#8767} git-svn-id: http://webrtc.googlecode.com/svn/trunk@8767 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'webrtc/modules/video_coding/main/source/generic_encoder.cc')
-rw-r--r--webrtc/modules/video_coding/main/source/generic_encoder.cc33
1 files changed, 25 insertions, 8 deletions
diff --git a/webrtc/modules/video_coding/main/source/generic_encoder.cc b/webrtc/modules/video_coding/main/source/generic_encoder.cc
index dcddf2f5ce..0cc2ec4e8d 100644
--- a/webrtc/modules/video_coding/main/source/generic_encoder.cc
+++ b/webrtc/modules/video_coding/main/source/generic_encoder.cc
@@ -60,9 +60,11 @@ VCMGenericEncoder::VCMGenericEncoder(VideoEncoder* encoder,
bool internalSource)
: encoder_(encoder),
rate_observer_(rate_observer),
+ vcm_encoded_frame_callback_(nullptr),
bit_rate_(0),
frame_rate_(0),
- internal_source_(internalSource) {
+ internal_source_(internalSource),
+ rotation_(kVideoRotation_0) {
}
VCMGenericEncoder::~VCMGenericEncoder()
@@ -75,6 +77,7 @@ int32_t VCMGenericEncoder::Release()
rtc::CritScope lock(&rates_lock_);
bit_rate_ = 0;
frame_rate_ = 0;
+ vcm_encoded_frame_callback_ = nullptr;
}
return encoder_->Release();
@@ -106,6 +109,16 @@ VCMGenericEncoder::Encode(const I420VideoFrame& inputFrame,
std::vector<VideoFrameType> video_frame_types(frameTypes.size(),
kDeltaFrame);
VCMEncodedFrame::ConvertFrameTypes(frameTypes, &video_frame_types);
+
+ 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_);
+ }
+
return encoder_->Encode(inputFrame, codecSpecificInfo, &video_frame_types);
}
@@ -178,6 +191,7 @@ int32_t
VCMGenericEncoder::RegisterEncodeCallback(VCMEncodedFrameCallback* VCMencodedFrameCallback)
{
VCMencodedFrameCallback->SetInternalSource(internal_source_);
+ vcm_encoded_frame_callback_ = VCMencodedFrameCallback;
return encoder_->RegisterEncodeCompleteCallback(VCMencodedFrameCallback);
}
@@ -191,14 +205,16 @@ VCMGenericEncoder::InternalSource() const
* Callback Implementation
***************************/
VCMEncodedFrameCallback::VCMEncodedFrameCallback(
- EncodedImageCallback* post_encode_callback):
-_sendCallback(),
-_mediaOpt(NULL),
-_payloadType(0),
-_internalSource(false),
-post_encode_callback_(post_encode_callback)
+ EncodedImageCallback* post_encode_callback)
+ : _sendCallback(),
+ _mediaOpt(NULL),
+ _payloadType(0),
+ _internalSource(false),
+ _rotation(kVideoRotation_0),
+ post_encode_callback_(post_encode_callback)
#ifdef DEBUG_ENCODER_BIT_STREAM
-, _bitStreamAfterEncoder(NULL)
+ ,
+ _bitStreamAfterEncoder(NULL)
#endif
{
#ifdef DEBUG_ENCODER_BIT_STREAM
@@ -241,6 +257,7 @@ int32_t VCMEncodedFrameCallback::Encoded(
memset(&rtpVideoHeader, 0, sizeof(RTPVideoHeader));
RTPVideoHeader* rtpVideoHeaderPtr = &rtpVideoHeader;
CopyCodecSpecific(codecSpecificInfo, &rtpVideoHeaderPtr);
+ rtpVideoHeader.rotation = _rotation;
int32_t callbackReturn = _sendCallback->SendData(
_payloadType, encodedImage, *fragmentationHeader, rtpVideoHeaderPtr);