summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorstefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2012-10-25 11:29:51 +0000
committerstefan@webrtc.org <stefan@webrtc.org@4adac7df-926f-26a2-2b94-8c16560cd09d>2012-10-25 11:29:51 +0000
commit4dd77597fb230d3c98e6c166f9f4a00ede798337 (patch)
treec3c07c868309685064c90b6108767b7858158097
parent9f269d2d33e102713402c4c6aa84ac65a590f719 (diff)
downloadwebrtc-4dd77597fb230d3c98e6c166f9f4a00ede798337.tar.gz
Fixes issues related to intra requests.
TEST=video_coding_unittests BUG= Review URL: https://webrtc-codereview.appspot.com/936005 git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@2991 4adac7df-926f-26a2-2b94-8c16560cd09d
-rw-r--r--modules/video_coding/main/source/generic_encoder.cc22
-rw-r--r--modules/video_coding/main/source/generic_encoder.h4
-rw-r--r--modules/video_coding/main/source/video_coding_impl.cc9
-rw-r--r--modules/video_coding/main/source/video_coding_impl_unittest.cc26
4 files changed, 42 insertions, 19 deletions
diff --git a/modules/video_coding/main/source/generic_encoder.cc b/modules/video_coding/main/source/generic_encoder.cc
index 727ca253..d641e52a 100644
--- a/modules/video_coding/main/source/generic_encoder.cc
+++ b/modules/video_coding/main/source/generic_encoder.cc
@@ -24,7 +24,7 @@ _codecType(kVideoCodecUnknown),
_VCMencodedFrameCallback(NULL),
_bitRate(0),
_frameRate(0),
-_internalSource(false)
+_internalSource(internalSource)
{
}
@@ -59,12 +59,10 @@ VCMGenericEncoder::InitEncode(const VideoCodec* settings,
WebRtc_Word32
VCMGenericEncoder::Encode(const I420VideoFrame& inputFrame,
const CodecSpecificInfo* codecSpecificInfo,
- const std::vector<FrameType>* frameTypes) {
- std::vector<VideoFrameType> video_frame_types(frameTypes->size(),
+ const std::vector<FrameType>& frameTypes) {
+ std::vector<VideoFrameType> video_frame_types(frameTypes.size(),
kDeltaFrame);
- if (frameTypes) {
- VCMEncodedFrame::ConvertFrameTypes(*frameTypes, &video_frame_types);
- }
+ VCMEncodedFrame::ConvertFrameTypes(frameTypes, &video_frame_types);
return _encoder.Encode(inputFrame, codecSpecificInfo, &video_frame_types);
}
@@ -115,15 +113,11 @@ VCMGenericEncoder::SetPeriodicKeyFrames(bool enable)
}
WebRtc_Word32 VCMGenericEncoder::RequestFrame(
- const std::vector<FrameType>* frame_types) {
- if (!frame_types) {
- return 0;
- }
+ const std::vector<FrameType>& frame_types) {
I420VideoFrame image;
- std::vector<VideoFrameType> video_frame_types(kVideoFrameDelta);
- if (frame_types) {
- VCMEncodedFrame::ConvertFrameTypes(*frame_types, &video_frame_types);
- }
+ std::vector<VideoFrameType> video_frame_types(frame_types.size(),
+ kDeltaFrame);
+ VCMEncodedFrame::ConvertFrameTypes(frame_types, &video_frame_types);
return _encoder.Encode(image, NULL, &video_frame_types);
}
diff --git a/modules/video_coding/main/source/generic_encoder.h b/modules/video_coding/main/source/generic_encoder.h
index 9f7432be..aab33678 100644
--- a/modules/video_coding/main/source/generic_encoder.h
+++ b/modules/video_coding/main/source/generic_encoder.h
@@ -101,7 +101,7 @@ public:
*/
WebRtc_Word32 Encode(const I420VideoFrame& inputFrame,
const CodecSpecificInfo* codecSpecificInfo,
- const std::vector<FrameType>* frameTypes);
+ const std::vector<FrameType>& frameTypes);
/**
* Set new target bit rate and frame rate
* Return Value: new bit rate if OK, otherwise <0s
@@ -127,7 +127,7 @@ public:
WebRtc_Word32 SetPeriodicKeyFrames(bool enable);
- WebRtc_Word32 RequestFrame(const std::vector<FrameType>* frame_types);
+ WebRtc_Word32 RequestFrame(const std::vector<FrameType>& frame_types);
bool InternalSource() const;
diff --git a/modules/video_coding/main/source/video_coding_impl.cc b/modules/video_coding/main/source/video_coding_impl.cc
index 0f8f1eb4..9494bc2b 100644
--- a/modules/video_coding/main/source/video_coding_impl.cc
+++ b/modules/video_coding/main/source/video_coding_impl.cc
@@ -683,7 +683,7 @@ VideoCodingModuleImpl::AddVideoFrame(const I420VideoFrame& videoFrame,
_mediaOpt.updateContentData(contentMetrics);
WebRtc_Word32 ret = _encoder->Encode(videoFrame,
codecSpecificInfo,
- &_nextFrameTypes);
+ _nextFrameTypes);
if (_encoderInputFile != NULL)
{
if (PrintI420VideoFrame(videoFrame, _encoderInputFile) < 0)
@@ -707,13 +707,16 @@ VideoCodingModuleImpl::AddVideoFrame(const I420VideoFrame& videoFrame,
}
WebRtc_Word32 VideoCodingModuleImpl::IntraFrameRequest(int stream_index) {
- assert(stream_index >= 0);
CriticalSectionScoped cs(_sendCritSect);
+ if (stream_index < 0 ||
+ static_cast<unsigned int>(stream_index) >= _nextFrameTypes.size()) {
+ return -1;
+ }
_nextFrameTypes[stream_index] = kVideoFrameKey;
if (_encoder != NULL && _encoder->InternalSource()) {
// Try to request the frame if we have an external encoder with
// internal source since AddVideoFrame never will be called.
- if (_encoder->RequestFrame(&_nextFrameTypes) ==
+ if (_encoder->RequestFrame(_nextFrameTypes) ==
WEBRTC_VIDEO_CODEC_OK) {
_nextFrameTypes[stream_index] = kVideoFrameDelta;
}
diff --git a/modules/video_coding/main/source/video_coding_impl_unittest.cc b/modules/video_coding/main/source/video_coding_impl_unittest.cc
index 43cca986..27297ac4 100644
--- a/modules/video_coding/main/source/video_coding_impl_unittest.cc
+++ b/modules/video_coding/main/source/video_coding_impl_unittest.cc
@@ -109,6 +109,32 @@ TEST_F(TestVideoCodingModule, TestIntraRequests) {
EXPECT_EQ(0, vcm_->AddVideoFrame(input_frame_, NULL, NULL));
ExpectIntraRequest(-1);
EXPECT_EQ(0, vcm_->AddVideoFrame(input_frame_, NULL, NULL));
+
+ EXPECT_EQ(-1, vcm_->IntraFrameRequest(3));
+ ExpectIntraRequest(-1);
+ EXPECT_EQ(0, vcm_->AddVideoFrame(input_frame_, NULL, NULL));
+
+ EXPECT_EQ(-1, vcm_->IntraFrameRequest(-1));
+ ExpectIntraRequest(-1);
+ EXPECT_EQ(0, vcm_->AddVideoFrame(input_frame_, NULL, NULL));
+}
+
+TEST_F(TestVideoCodingModule, TestIntraRequestsInternalCapture) {
+ // De-register current external encoder.
+ EXPECT_EQ(0, vcm_->RegisterExternalEncoder(NULL, kUnusedPayloadType, false));
+ // Register encoder with internal capture.
+ EXPECT_EQ(0, vcm_->RegisterExternalEncoder(&encoder_, kUnusedPayloadType,
+ true));
+ EXPECT_EQ(0, vcm_->RegisterSendCodec(&settings_, 1, 1200));
+ ExpectIntraRequest(0);
+ EXPECT_EQ(0, vcm_->IntraFrameRequest(0));
+ ExpectIntraRequest(1);
+ EXPECT_EQ(0, vcm_->IntraFrameRequest(1));
+ ExpectIntraRequest(2);
+ EXPECT_EQ(0, vcm_->IntraFrameRequest(2));
+ // No requests expected since these indices are out of bounds.
+ EXPECT_EQ(-1, vcm_->IntraFrameRequest(3));
+ EXPECT_EQ(-1, vcm_->IntraFrameRequest(-1));
}
} // namespace webrtc