Unify FrameType and VideoFrameType.
Prevents some heap allocation and frame-type conversion since interfaces mismatch. Also it's less confusing to have one type for this. BUG=webrtc:5042 R=magjed@webrtc.org, mflodman@webrtc.org, henrik.lundin@webrtc.org, solenberg@webrtc.org, stefan@webrtc.org Review URL: https://codereview.webrtc.org/1371043003 Cr-Commit-Position: refs/heads/master@{#10320}
This commit is contained in:
@ -181,7 +181,7 @@ TEST(TestDecodingState, UpdateOldPacket) {
|
||||
// Now insert empty packet belonging to the same frame.
|
||||
packet.timestamp = 1;
|
||||
packet.seqNum = 2;
|
||||
packet.frameType = kFrameEmpty;
|
||||
packet.frameType = kEmptyFrame;
|
||||
packet.sizeBytes = 0;
|
||||
dec_state.UpdateOldPacket(&packet);
|
||||
EXPECT_EQ(dec_state.sequence_num(), 2);
|
||||
@ -196,7 +196,7 @@ TEST(TestDecodingState, UpdateOldPacket) {
|
||||
// sequence number.
|
||||
packet.timestamp = 0;
|
||||
packet.seqNum = 4;
|
||||
packet.frameType = kFrameEmpty;
|
||||
packet.frameType = kEmptyFrame;
|
||||
packet.sizeBytes = 0;
|
||||
dec_state.UpdateOldPacket(&packet);
|
||||
EXPECT_EQ(dec_state.sequence_num(), 3);
|
||||
|
||||
@ -226,38 +226,4 @@ void VCMEncodedFrame::VerifyAndAllocate(size_t minimumSize)
|
||||
}
|
||||
}
|
||||
|
||||
webrtc::FrameType VCMEncodedFrame::ConvertFrameType(VideoFrameType frameType)
|
||||
{
|
||||
switch(frameType) {
|
||||
case kKeyFrame:
|
||||
return kVideoFrameKey;
|
||||
case kDeltaFrame:
|
||||
return kVideoFrameDelta;
|
||||
}
|
||||
// Bogus default return value.
|
||||
return kVideoFrameDelta;
|
||||
}
|
||||
|
||||
VideoFrameType VCMEncodedFrame::ConvertFrameType(webrtc::FrameType frame_type) {
|
||||
switch (frame_type) {
|
||||
case kVideoFrameKey:
|
||||
return kKeyFrame;
|
||||
case kVideoFrameDelta:
|
||||
return kDeltaFrame;
|
||||
default:
|
||||
assert(false);
|
||||
return kDeltaFrame;
|
||||
}
|
||||
}
|
||||
|
||||
void VCMEncodedFrame::ConvertFrameTypes(
|
||||
const std::vector<webrtc::FrameType>& frame_types,
|
||||
std::vector<VideoFrameType>* video_frame_types) {
|
||||
assert(video_frame_types);
|
||||
video_frame_types->reserve(frame_types.size());
|
||||
for (size_t i = 0; i < frame_types.size(); ++i) {
|
||||
(*video_frame_types)[i] = ConvertFrameType(frame_types[i]);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
} // namespace webrtc
|
||||
|
||||
@ -68,7 +68,7 @@ public:
|
||||
/**
|
||||
* Get frame type
|
||||
*/
|
||||
webrtc::FrameType FrameType() const {return ConvertFrameType(_frameType);}
|
||||
webrtc::FrameType FrameType() const { return _frameType; }
|
||||
/**
|
||||
* Get frame rotation
|
||||
*/
|
||||
@ -95,12 +95,6 @@ public:
|
||||
|
||||
const RTPFragmentationHeader* FragmentationHeader() const;
|
||||
|
||||
static webrtc::FrameType ConvertFrameType(VideoFrameType frameType);
|
||||
static VideoFrameType ConvertFrameType(webrtc::FrameType frameType);
|
||||
static void ConvertFrameTypes(
|
||||
const std::vector<webrtc::FrameType>& frame_types,
|
||||
std::vector<VideoFrameType>* video_frame_types);
|
||||
|
||||
protected:
|
||||
/**
|
||||
* Verifies that current allocated buffer size is larger than or equal to the input size.
|
||||
|
||||
@ -98,7 +98,7 @@ VCMFrameBuffer::InsertPacket(const VCMPacket& packet,
|
||||
// We only take the ntp timestamp of the first packet of a frame.
|
||||
ntp_time_ms_ = packet.ntp_time_ms_;
|
||||
_codec = packet.codec;
|
||||
if (packet.frameType != kFrameEmpty) {
|
||||
if (packet.frameType != kEmptyFrame) {
|
||||
// first media packet
|
||||
SetState(kStateIncomplete);
|
||||
}
|
||||
@ -280,7 +280,7 @@ VCMFrameBuffer::PrepareForDecode(bool continuous) {
|
||||
#endif
|
||||
// Transfer frame information to EncodedFrame and create any codec
|
||||
// specific information.
|
||||
_frameType = ConvertFrameType(_sessionInfo.FrameType());
|
||||
_frameType = _sessionInfo.FrameType();
|
||||
_completeFrame = _sessionInfo.complete();
|
||||
_missingFrame = !continuous;
|
||||
}
|
||||
|
||||
@ -140,9 +140,8 @@ VCMGenericEncoder::InitEncode(const VideoCodec* settings,
|
||||
int32_t VCMGenericEncoder::Encode(const VideoFrame& inputFrame,
|
||||
const CodecSpecificInfo* codecSpecificInfo,
|
||||
const std::vector<FrameType>& frameTypes) {
|
||||
std::vector<VideoFrameType> video_frame_types(frameTypes.size(),
|
||||
kDeltaFrame);
|
||||
VCMEncodedFrame::ConvertFrameTypes(frameTypes, &video_frame_types);
|
||||
for (FrameType frame_type : frameTypes)
|
||||
RTC_DCHECK(frame_type == kVideoFrameKey || frame_type == kVideoFrameDelta);
|
||||
|
||||
rotation_ = inputFrame.rotation();
|
||||
|
||||
@ -153,12 +152,11 @@ int32_t VCMGenericEncoder::Encode(const VideoFrame& inputFrame,
|
||||
vcm_encoded_frame_callback_->SetRotation(rotation_);
|
||||
}
|
||||
|
||||
int32_t result =
|
||||
encoder_->Encode(inputFrame, codecSpecificInfo, &video_frame_types);
|
||||
int32_t result = encoder_->Encode(inputFrame, codecSpecificInfo, &frameTypes);
|
||||
if (is_screenshare_ &&
|
||||
result == WEBRTC_VIDEO_CODEC_TARGET_BITRATE_OVERSHOOT) {
|
||||
// Target bitrate exceeded, encoder state has been reset - try again.
|
||||
return encoder_->Encode(inputFrame, codecSpecificInfo, &video_frame_types);
|
||||
return encoder_->Encode(inputFrame, codecSpecificInfo, &frameTypes);
|
||||
}
|
||||
|
||||
return result;
|
||||
@ -223,10 +221,7 @@ VCMGenericEncoder::SetPeriodicKeyFrames(bool enable)
|
||||
int32_t VCMGenericEncoder::RequestFrame(
|
||||
const std::vector<FrameType>& frame_types) {
|
||||
VideoFrame image;
|
||||
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);
|
||||
return encoder_->Encode(image, NULL, &frame_types);
|
||||
}
|
||||
|
||||
int32_t
|
||||
@ -294,6 +289,8 @@ int32_t VCMEncodedFrameCallback::Encoded(
|
||||
const EncodedImage& encodedImage,
|
||||
const CodecSpecificInfo* codecSpecificInfo,
|
||||
const RTPFragmentationHeader* fragmentationHeader) {
|
||||
RTC_DCHECK(encodedImage._frameType == kVideoFrameKey ||
|
||||
encodedImage._frameType == kVideoFrameDelta);
|
||||
post_encode_callback_->Encoded(encodedImage, NULL, NULL);
|
||||
|
||||
if (_sendCallback == NULL) {
|
||||
|
||||
@ -643,7 +643,7 @@ VCMFrameBufferEnum VCMJitterBuffer::InsertPacket(const VCMPacket& packet,
|
||||
|
||||
// Empty packets may bias the jitter estimate (lacking size component),
|
||||
// therefore don't let empty packet trigger the following updates:
|
||||
if (packet.frameType != kFrameEmpty) {
|
||||
if (packet.frameType != kEmptyFrame) {
|
||||
if (waiting_for_completion_.timestamp == packet.timestamp) {
|
||||
// This can get bad if we have a lot of duplicate packets,
|
||||
// we will then count some packet multiple times.
|
||||
|
||||
@ -168,10 +168,9 @@ class TestRunningJitterBuffer : public ::testing::Test {
|
||||
}
|
||||
|
||||
VCMFrameBufferEnum InsertFrame(FrameType frame_type) {
|
||||
stream_generator_->GenerateFrame(frame_type,
|
||||
(frame_type != kFrameEmpty) ? 1 : 0,
|
||||
(frame_type == kFrameEmpty) ? 1 : 0,
|
||||
clock_->TimeInMilliseconds());
|
||||
stream_generator_->GenerateFrame(
|
||||
frame_type, (frame_type != kEmptyFrame) ? 1 : 0,
|
||||
(frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
|
||||
VCMFrameBufferEnum ret = InsertPacketAndPop(0);
|
||||
clock_->AdvanceTimeMilliseconds(kDefaultFramePeriodMs);
|
||||
return ret;
|
||||
@ -1050,7 +1049,7 @@ TEST_F(TestBasicJitterBuffer, PacketLoss) {
|
||||
packet_->markerBit = false;
|
||||
packet_->seqNum = seq_num_;
|
||||
packet_->completeNALU = kNaluEnd;
|
||||
packet_->frameType = kFrameEmpty;
|
||||
packet_->frameType = kEmptyFrame;
|
||||
|
||||
EXPECT_EQ(jitter_buffer_->InsertPacket(*packet_, &retransmitted),
|
||||
kDecodableSession);
|
||||
@ -1524,7 +1523,7 @@ TEST_F(TestBasicJitterBuffer, EmptyLastFrame) {
|
||||
packet_->markerBit = false;
|
||||
packet_->seqNum = seq_num_;
|
||||
packet_->timestamp = timestamp_;
|
||||
packet_->frameType = kFrameEmpty;
|
||||
packet_->frameType = kEmptyFrame;
|
||||
|
||||
EXPECT_EQ(kNoError, jitter_buffer_->InsertPacket(*packet_,
|
||||
&retransmitted));
|
||||
@ -1895,7 +1894,7 @@ TEST_F(TestRunningJitterBuffer, TwoPacketsNonContinuous) {
|
||||
TEST_F(TestJitterBufferNack, EmptyPackets) {
|
||||
// Make sure empty packets doesn't clog the jitter buffer.
|
||||
jitter_buffer_->SetNackMode(kNack, media_optimization::kLowRttNackMs, -1);
|
||||
EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kFrameEmpty), kNoError);
|
||||
EXPECT_GE(InsertFrames(kMaxNumberOfFrames, kEmptyFrame), kNoError);
|
||||
InsertFrame(kVideoFrameKey);
|
||||
EXPECT_TRUE(DecodeCompleteFrame());
|
||||
}
|
||||
|
||||
@ -16,23 +16,21 @@
|
||||
namespace webrtc {
|
||||
|
||||
VCMPacket::VCMPacket()
|
||||
:
|
||||
payloadType(0),
|
||||
timestamp(0),
|
||||
ntp_time_ms_(0),
|
||||
seqNum(0),
|
||||
dataPtr(NULL),
|
||||
sizeBytes(0),
|
||||
markerBit(false),
|
||||
frameType(kFrameEmpty),
|
||||
codec(kVideoCodecUnknown),
|
||||
isFirstPacket(false),
|
||||
completeNALU(kNaluUnset),
|
||||
insertStartCode(false),
|
||||
width(0),
|
||||
height(0),
|
||||
codecSpecificHeader() {
|
||||
}
|
||||
: payloadType(0),
|
||||
timestamp(0),
|
||||
ntp_time_ms_(0),
|
||||
seqNum(0),
|
||||
dataPtr(NULL),
|
||||
sizeBytes(0),
|
||||
markerBit(false),
|
||||
frameType(kEmptyFrame),
|
||||
codec(kVideoCodecUnknown),
|
||||
isFirstPacket(false),
|
||||
completeNALU(kNaluUnset),
|
||||
insertStartCode(false),
|
||||
width(0),
|
||||
height(0),
|
||||
codecSpecificHeader() {}
|
||||
|
||||
VCMPacket::VCMPacket(const uint8_t* ptr,
|
||||
const size_t size,
|
||||
@ -88,7 +86,7 @@ void VCMPacket::Reset() {
|
||||
dataPtr = NULL;
|
||||
sizeBytes = 0;
|
||||
markerBit = false;
|
||||
frameType = kFrameEmpty;
|
||||
frameType = kEmptyFrame;
|
||||
codec = kVideoCodecUnknown;
|
||||
isFirstPacket = false;
|
||||
completeNALU = kNaluUnset;
|
||||
|
||||
@ -63,10 +63,8 @@ class TestVCMReceiver : public ::testing::Test {
|
||||
int32_t InsertFrame(FrameType frame_type, bool complete) {
|
||||
int num_of_packets = complete ? 1 : 2;
|
||||
stream_generator_->GenerateFrame(
|
||||
frame_type,
|
||||
(frame_type != kFrameEmpty) ? num_of_packets : 0,
|
||||
(frame_type == kFrameEmpty) ? 1 : 0,
|
||||
clock_->TimeInMilliseconds());
|
||||
frame_type, (frame_type != kEmptyFrame) ? num_of_packets : 0,
|
||||
(frame_type == kEmptyFrame) ? 1 : 0, clock_->TimeInMilliseconds());
|
||||
int32_t ret = InsertPacketAndPop(0);
|
||||
if (!complete) {
|
||||
// Drop the second packet.
|
||||
|
||||
@ -464,7 +464,7 @@ int VCMSessionInfo::InsertPacket(const VCMPacket& packet,
|
||||
uint8_t* frame_buffer,
|
||||
VCMDecodeErrorMode decode_error_mode,
|
||||
const FrameData& frame_data) {
|
||||
if (packet.frameType == kFrameEmpty) {
|
||||
if (packet.frameType == kEmptyFrame) {
|
||||
// Update sequence number of an empty packet.
|
||||
// Only media packets are inserted into the packet list.
|
||||
InformOfEmptyPacket(packet.seqNum);
|
||||
@ -516,7 +516,7 @@ int VCMSessionInfo::InsertPacket(const VCMPacket& packet,
|
||||
LOG(LS_WARNING) << "Received packet with a sequence number which is out "
|
||||
"of frame boundaries";
|
||||
return -3;
|
||||
} else if (frame_type_ == kFrameEmpty && packet.frameType != kFrameEmpty) {
|
||||
} else if (frame_type_ == kEmptyFrame && packet.frameType != kEmptyFrame) {
|
||||
// Update the frame type with the type of the first media packet.
|
||||
// TODO(mikhal): Can this trigger?
|
||||
frame_type_ = packet.frameType;
|
||||
|
||||
@ -175,7 +175,7 @@ TEST_F(TestSessionInfo, TestSimpleAPIs) {
|
||||
packet_.markerBit = true;
|
||||
packet_.seqNum = 2;
|
||||
packet_.sizeBytes = 0;
|
||||
packet_.frameType = kFrameEmpty;
|
||||
packet_.frameType = kEmptyFrame;
|
||||
EXPECT_EQ(0,
|
||||
session_.InsertPacket(packet_,
|
||||
frame_buffer_,
|
||||
@ -888,7 +888,7 @@ TEST_F(TestVP8Partitions, AggregationOverTwoPackets) {
|
||||
TEST_F(TestNalUnits, OnlyReceivedEmptyPacket) {
|
||||
packet_.isFirstPacket = false;
|
||||
packet_.completeNALU = kNaluComplete;
|
||||
packet_.frameType = kFrameEmpty;
|
||||
packet_.frameType = kEmptyFrame;
|
||||
packet_.sizeBytes = 0;
|
||||
packet_.seqNum = 0;
|
||||
packet_.markerBit = false;
|
||||
|
||||
@ -46,8 +46,8 @@ void StreamGenerator::GenerateFrame(FrameType type,
|
||||
++sequence_number_;
|
||||
}
|
||||
for (int i = 0; i < num_empty_packets; ++i) {
|
||||
packets_.push_back(GeneratePacket(
|
||||
sequence_number_, timestamp, 0, false, false, kFrameEmpty));
|
||||
packets_.push_back(GeneratePacket(sequence_number_, timestamp, 0, false,
|
||||
false, kEmptyFrame));
|
||||
++sequence_number_;
|
||||
}
|
||||
}
|
||||
|
||||
@ -88,7 +88,7 @@ TEST_F(TestVideoReceiver, PaddingOnlyFrames) {
|
||||
const uint8_t payload[kPaddingSize] = {0};
|
||||
WebRtcRTPHeader header;
|
||||
memset(&header, 0, sizeof(header));
|
||||
header.frameType = kFrameEmpty;
|
||||
header.frameType = kEmptyFrame;
|
||||
header.header.markerBit = false;
|
||||
header.header.paddingLength = kPaddingSize;
|
||||
header.header.payloadType = kUnusedPayloadType;
|
||||
@ -112,7 +112,7 @@ TEST_F(TestVideoReceiver, PaddingOnlyFramesWithLosses) {
|
||||
const uint8_t payload[kFrameSize] = {0};
|
||||
WebRtcRTPHeader header;
|
||||
memset(&header, 0, sizeof(header));
|
||||
header.frameType = kFrameEmpty;
|
||||
header.frameType = kEmptyFrame;
|
||||
header.header.markerBit = false;
|
||||
header.header.paddingLength = kPaddingSize;
|
||||
header.header.payloadType = kUnusedPayloadType;
|
||||
@ -127,7 +127,7 @@ TEST_F(TestVideoReceiver, PaddingOnlyFramesWithLosses) {
|
||||
clock_.AdvanceTimeMilliseconds(33);
|
||||
header.header.timestamp += 3000;
|
||||
|
||||
header.frameType = kFrameEmpty;
|
||||
header.frameType = kEmptyFrame;
|
||||
header.type.Video.isFirstPacket = false;
|
||||
header.header.markerBit = false;
|
||||
// Insert padding frames.
|
||||
@ -163,7 +163,7 @@ TEST_F(TestVideoReceiver, PaddingOnlyAndVideo) {
|
||||
const uint8_t payload[kFrameSize] = {0};
|
||||
WebRtcRTPHeader header;
|
||||
memset(&header, 0, sizeof(header));
|
||||
header.frameType = kFrameEmpty;
|
||||
header.frameType = kEmptyFrame;
|
||||
header.type.Video.isFirstPacket = false;
|
||||
header.header.markerBit = false;
|
||||
header.header.paddingLength = kPaddingSize;
|
||||
@ -188,7 +188,7 @@ TEST_F(TestVideoReceiver, PaddingOnlyAndVideo) {
|
||||
}
|
||||
|
||||
// Insert 2 padding only frames.
|
||||
header.frameType = kFrameEmpty;
|
||||
header.frameType = kEmptyFrame;
|
||||
header.type.Video.isFirstPacket = false;
|
||||
header.header.markerBit = false;
|
||||
for (int j = 0; j < 2; ++j) {
|
||||
|
||||
@ -313,7 +313,7 @@ int32_t VideoSender::AddVideoFrame(const VideoFrame& videoFrame,
|
||||
}
|
||||
// TODO(holmer): Add support for dropping frames per stream. Currently we
|
||||
// only have one frame dropper for all streams.
|
||||
if (_nextFrameTypes[0] == kFrameEmpty) {
|
||||
if (_nextFrameTypes[0] == kEmptyFrame) {
|
||||
return VCM_OK;
|
||||
}
|
||||
if (_mediaOpt.DropFrame()) {
|
||||
|
||||
@ -244,7 +244,7 @@ class TestVideoSenderWithMockEncoder : public TestVideoSender {
|
||||
}
|
||||
assert(stream >= 0);
|
||||
assert(stream < kNumberOfStreams);
|
||||
std::vector<VideoFrameType> frame_types(kNumberOfStreams, kDeltaFrame);
|
||||
std::vector<FrameType> frame_types(kNumberOfStreams, kDeltaFrame);
|
||||
frame_types[stream] = kKeyFrame;
|
||||
EXPECT_CALL(
|
||||
encoder_,
|
||||
|
||||
Reference in New Issue
Block a user