summaryrefslogtreecommitdiffstats
path: root/media/cast/framer
diff options
context:
space:
mode:
Diffstat (limited to 'media/cast/framer')
-rw-r--r--media/cast/framer/frame_buffer.cc47
-rw-r--r--media/cast/framer/frame_buffer.h8
-rw-r--r--media/cast/framer/frame_buffer_unittest.cc20
-rw-r--r--media/cast/framer/framer.cc8
-rw-r--r--media/cast/framer/framer.h4
-rw-r--r--media/cast/framer/framer_unittest.cc65
6 files changed, 87 insertions, 65 deletions
diff --git a/media/cast/framer/frame_buffer.cc b/media/cast/framer/frame_buffer.cc
index 2bfdeb5..0b6fa83 100644
--- a/media/cast/framer/frame_buffer.cc
+++ b/media/cast/framer/frame_buffer.cc
@@ -28,6 +28,8 @@ void FrameBuffer::InsertPacket(const uint8* payload_data,
frame_id_ = rtp_header.frame_id;
max_packet_id_ = rtp_header.max_packet_id;
is_key_frame_ = rtp_header.is_key_frame;
+ if (is_key_frame_)
+ DCHECK_EQ(rtp_header.frame_id, rtp_header.reference_frame_id);
last_referenced_frame_id_ = rtp_header.reference_frame_id;
rtp_timestamp_ = rtp_header.rtp_timestamp;
}
@@ -57,44 +59,27 @@ bool FrameBuffer::Complete() const {
return num_packets_received_ - 1 == max_packet_id_;
}
-bool FrameBuffer::GetEncodedAudioFrame(
- transport::EncodedAudioFrame* audio_frame) const {
+bool FrameBuffer::AssembleEncodedFrame(transport::EncodedFrame* frame) const {
if (!Complete())
return false;
// Frame is complete -> construct.
- audio_frame->frame_id = frame_id_;
- audio_frame->rtp_timestamp = rtp_timestamp_;
+ if (is_key_frame_)
+ frame->dependency = transport::EncodedFrame::KEY;
+ else if (frame_id_ == last_referenced_frame_id_)
+ frame->dependency = transport::EncodedFrame::INDEPENDENT;
+ else
+ frame->dependency = transport::EncodedFrame::DEPENDENT;
+ frame->frame_id = frame_id_;
+ frame->referenced_frame_id = last_referenced_frame_id_;
+ frame->rtp_timestamp = rtp_timestamp_;
// Build the data vector.
- audio_frame->data.clear();
- audio_frame->data.reserve(total_data_size_);
+ frame->data.clear();
+ frame->data.reserve(total_data_size_);
PacketMap::const_iterator it;
- for (it = packets_.begin(); it != packets_.end(); ++it) {
- audio_frame->data.insert(
- audio_frame->data.end(), it->second.begin(), it->second.end());
- }
- return true;
-}
-
-bool FrameBuffer::GetEncodedVideoFrame(
- transport::EncodedVideoFrame* video_frame) const {
- if (!Complete())
- return false;
- // Frame is complete -> construct.
- video_frame->key_frame = is_key_frame_;
- video_frame->frame_id = frame_id_;
- video_frame->last_referenced_frame_id = last_referenced_frame_id_;
- video_frame->rtp_timestamp = rtp_timestamp_;
-
- // Build the data vector.
- video_frame->data.clear();
- video_frame->data.reserve(total_data_size_);
- PacketMap::const_iterator it;
- for (it = packets_.begin(); it != packets_.end(); ++it) {
- video_frame->data.insert(
- video_frame->data.end(), it->second.begin(), it->second.end());
- }
+ for (it = packets_.begin(); it != packets_.end(); ++it)
+ frame->data.insert(frame->data.end(), it->second.begin(), it->second.end());
return true;
}
diff --git a/media/cast/framer/frame_buffer.h b/media/cast/framer/frame_buffer.h
index 65df021d..d4d5ded 100644
--- a/media/cast/framer/frame_buffer.h
+++ b/media/cast/framer/frame_buffer.h
@@ -25,9 +25,11 @@ class FrameBuffer {
const RtpCastHeader& rtp_header);
bool Complete() const;
- bool GetEncodedAudioFrame(transport::EncodedAudioFrame* audio_frame) const;
-
- bool GetEncodedVideoFrame(transport::EncodedVideoFrame* video_frame) const;
+ // If a frame is complete, sets the frame IDs and RTP timestamp in |frame|,
+ // and also copies the data from all packets into the data field in |frame|.
+ // Returns true if the frame was complete; false if incomplete and |frame|
+ // remains unchanged.
+ bool AssembleEncodedFrame(transport::EncodedFrame* frame) const;
bool is_key_frame() const { return is_key_frame_; }
diff --git a/media/cast/framer/frame_buffer_unittest.cc b/media/cast/framer/frame_buffer_unittest.cc
index c00aa2b..d6844f3e 100644
--- a/media/cast/framer/frame_buffer_unittest.cc
+++ b/media/cast/framer/frame_buffer_unittest.cc
@@ -29,26 +29,26 @@ TEST_F(FrameBufferTest, OnePacketInsertSanity) {
rtp_header_.frame_id = 5;
rtp_header_.reference_frame_id = 5;
buffer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
- transport::EncodedVideoFrame frame;
- EXPECT_TRUE(buffer_.GetEncodedVideoFrame(&frame));
+ transport::EncodedFrame frame;
+ EXPECT_TRUE(buffer_.AssembleEncodedFrame(&frame));
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(5u, frame.frame_id);
- EXPECT_TRUE(frame.key_frame);
+ EXPECT_EQ(5u, frame.referenced_frame_id);
EXPECT_EQ(3000u, frame.rtp_timestamp);
}
TEST_F(FrameBufferTest, EmptyBuffer) {
EXPECT_FALSE(buffer_.Complete());
- EXPECT_FALSE(buffer_.is_key_frame());
- transport::EncodedVideoFrame frame;
- EXPECT_FALSE(buffer_.GetEncodedVideoFrame(&frame));
+ transport::EncodedFrame frame;
+ EXPECT_FALSE(buffer_.AssembleEncodedFrame(&frame));
}
TEST_F(FrameBufferTest, DefaultOnePacketFrame) {
buffer_.InsertPacket(payload_.data(), payload_.size(), rtp_header_);
EXPECT_TRUE(buffer_.Complete());
EXPECT_FALSE(buffer_.is_key_frame());
- transport::EncodedVideoFrame frame;
- EXPECT_TRUE(buffer_.GetEncodedVideoFrame(&frame));
+ transport::EncodedFrame frame;
+ EXPECT_TRUE(buffer_.AssembleEncodedFrame(&frame));
EXPECT_EQ(payload_.size(), frame.data.size());
}
@@ -63,8 +63,8 @@ TEST_F(FrameBufferTest, MultiplePacketFrame) {
++rtp_header_.packet_id;
EXPECT_TRUE(buffer_.Complete());
EXPECT_TRUE(buffer_.is_key_frame());
- transport::EncodedVideoFrame frame;
- EXPECT_TRUE(buffer_.GetEncodedVideoFrame(&frame));
+ transport::EncodedFrame frame;
+ EXPECT_TRUE(buffer_.AssembleEncodedFrame(&frame));
EXPECT_EQ(3 * payload_.size(), frame.data.size());
}
diff --git a/media/cast/framer/framer.cc b/media/cast/framer/framer.cc
index d510d8b..ee5e6aa 100644
--- a/media/cast/framer/framer.cc
+++ b/media/cast/framer/framer.cc
@@ -69,7 +69,7 @@ bool Framer::InsertPacket(const uint8* payload_data,
}
// This does not release the frame.
-bool Framer::GetEncodedAudioFrame(transport::EncodedAudioFrame* audio_frame,
+bool Framer::GetEncodedAudioFrame(transport::EncodedFrame* audio_frame,
bool* next_frame) {
uint32 frame_id;
// Find frame id.
@@ -88,11 +88,11 @@ bool Framer::GetEncodedAudioFrame(transport::EncodedAudioFrame* audio_frame,
if (it == frames_.end())
return false;
- return it->second->GetEncodedAudioFrame(audio_frame);
+ return it->second->AssembleEncodedFrame(audio_frame);
}
// This does not release the frame.
-bool Framer::GetEncodedVideoFrame(transport::EncodedVideoFrame* video_frame,
+bool Framer::GetEncodedVideoFrame(transport::EncodedFrame* video_frame,
bool* next_frame) {
uint32 frame_id;
// Find frame id.
@@ -115,7 +115,7 @@ bool Framer::GetEncodedVideoFrame(transport::EncodedVideoFrame* video_frame,
if (it == frames_.end())
return false;
- return it->second->GetEncodedVideoFrame(video_frame);
+ return it->second->AssembleEncodedFrame(video_frame);
}
void Framer::Reset() {
diff --git a/media/cast/framer/framer.h b/media/cast/framer/framer.h
index eb67064..0c7397b 100644
--- a/media/cast/framer/framer.h
+++ b/media/cast/framer/framer.h
@@ -44,10 +44,10 @@ class Framer {
// frame.
// Returns false if the frame does not exist or if the frame is not complete
// within the given time frame.
- bool GetEncodedVideoFrame(transport::EncodedVideoFrame* video_frame,
+ bool GetEncodedVideoFrame(transport::EncodedFrame* video_frame,
bool* next_frame);
- bool GetEncodedAudioFrame(transport::EncodedAudioFrame* audio_frame,
+ bool GetEncodedAudioFrame(transport::EncodedFrame* audio_frame,
bool* next_frame);
void ReleaseFrame(uint32 frame_id);
diff --git a/media/cast/framer/framer_unittest.cc b/media/cast/framer/framer_unittest.cc
index 06a340e..5cb12ce 100644
--- a/media/cast/framer/framer_unittest.cc
+++ b/media/cast/framer/framer_unittest.cc
@@ -33,13 +33,13 @@ class FramerTest : public ::testing::Test {
};
TEST_F(FramerTest, EmptyState) {
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
EXPECT_FALSE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
}
TEST_F(FramerTest, AlwaysStartWithKey) {
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool complete = false;
bool duplicate = false;
@@ -57,13 +57,14 @@ TEST_F(FramerTest, AlwaysStartWithKey) {
EXPECT_TRUE(complete);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(1u, frame.frame_id);
- EXPECT_TRUE(frame.key_frame);
+ EXPECT_EQ(1u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
}
TEST_F(FramerTest, CompleteFrame) {
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool complete = false;
bool duplicate = false;
@@ -75,8 +76,9 @@ TEST_F(FramerTest, CompleteFrame) {
EXPECT_TRUE(complete);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(0u, frame.frame_id);
- EXPECT_TRUE(frame.key_frame);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
// Incomplete delta.
@@ -100,7 +102,7 @@ TEST_F(FramerTest, CompleteFrame) {
}
TEST_F(FramerTest, DuplicatePackets) {
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool complete = false;
bool duplicate = false;
@@ -131,7 +133,9 @@ TEST_F(FramerTest, DuplicatePackets) {
EXPECT_TRUE(complete);
EXPECT_FALSE(duplicate);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(0u, frame.frame_id);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
// Add same packet again in complete key frame.
duplicate = false;
@@ -140,7 +144,9 @@ TEST_F(FramerTest, DuplicatePackets) {
EXPECT_FALSE(complete);
EXPECT_TRUE(duplicate);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(0u, frame.frame_id);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
// Incomplete delta frame.
@@ -171,7 +177,9 @@ TEST_F(FramerTest, DuplicatePackets) {
EXPECT_TRUE(complete);
EXPECT_FALSE(duplicate);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
+ EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
EXPECT_EQ(1u, frame.frame_id);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
// Add same packet again in complete delta frame.
duplicate = false;
@@ -180,11 +188,13 @@ TEST_F(FramerTest, DuplicatePackets) {
EXPECT_FALSE(complete);
EXPECT_TRUE(duplicate);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
+ EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
EXPECT_EQ(1u, frame.frame_id);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
}
TEST_F(FramerTest, ContinuousSequence) {
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool complete = false;
bool duplicate = false;
@@ -196,8 +206,9 @@ TEST_F(FramerTest, ContinuousSequence) {
EXPECT_TRUE(complete);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(0u, frame.frame_id);
- EXPECT_TRUE(frame.key_frame);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
// Complete - not continuous.
@@ -212,7 +223,7 @@ TEST_F(FramerTest, ContinuousSequence) {
TEST_F(FramerTest, Wrap) {
// Insert key frame, frame_id = 255 (will jump to that)
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool duplicate = false;
@@ -224,7 +235,9 @@ TEST_F(FramerTest, Wrap) {
payload_.data(), payload_.size(), rtp_header_, &duplicate);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(255u, frame.frame_id);
+ EXPECT_EQ(255u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
// Insert wrapped delta frame - should be continuous.
@@ -234,12 +247,14 @@ TEST_F(FramerTest, Wrap) {
payload_.data(), payload_.size(), rtp_header_, &duplicate);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
EXPECT_EQ(256u, frame.frame_id);
+ EXPECT_EQ(255u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
}
TEST_F(FramerTest, Reset) {
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool complete = false;
bool duplicate = false;
@@ -254,7 +269,7 @@ TEST_F(FramerTest, Reset) {
}
TEST_F(FramerTest, RequireKeyAfterReset) {
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool duplicate = false;
@@ -276,7 +291,7 @@ TEST_F(FramerTest, RequireKeyAfterReset) {
}
TEST_F(FramerTest, BasicNonLastReferenceId) {
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool duplicate = false;
@@ -300,7 +315,7 @@ TEST_F(FramerTest, BasicNonLastReferenceId) {
TEST_F(FramerTest, InOrderReferenceFrameSelection) {
// Create pattern: 0, 1, 4, 5.
- transport::EncodedVideoFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool duplicate = false;
@@ -324,15 +339,21 @@ TEST_F(FramerTest, InOrderReferenceFrameSelection) {
framer_.InsertPacket(
payload_.data(), payload_.size(), rtp_header_, &duplicate);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(0u, frame.frame_id);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
EXPECT_EQ(1u, frame.frame_id);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
EXPECT_FALSE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
EXPECT_EQ(4u, frame.frame_id);
+ EXPECT_EQ(0u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
// Insert remaining packet of frame #2 - should no be continuous.
rtp_header_.frame_id = 2;
@@ -348,12 +369,14 @@ TEST_F(FramerTest, InOrderReferenceFrameSelection) {
payload_.data(), payload_.size(), rtp_header_, &duplicate);
EXPECT_TRUE(framer_.GetEncodedVideoFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::DEPENDENT, frame.dependency);
EXPECT_EQ(5u, frame.frame_id);
+ EXPECT_EQ(4u, frame.referenced_frame_id);
}
TEST_F(FramerTest, AudioWrap) {
// All audio frames are marked as key frames.
- transport::EncodedAudioFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool duplicate = false;
@@ -365,7 +388,9 @@ TEST_F(FramerTest, AudioWrap) {
payload_.data(), payload_.size(), rtp_header_, &duplicate);
EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(254u, frame.frame_id);
+ EXPECT_EQ(254u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
rtp_header_.frame_id = 255;
@@ -381,18 +406,22 @@ TEST_F(FramerTest, AudioWrap) {
EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(255u, frame.frame_id);
+ EXPECT_EQ(255u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(256u, frame.frame_id);
+ EXPECT_EQ(256u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
}
TEST_F(FramerTest, AudioWrapWithMissingFrame) {
// All audio frames are marked as key frames.
- transport::EncodedAudioFrame frame;
+ transport::EncodedFrame frame;
bool next_frame = false;
bool duplicate = false;
@@ -404,7 +433,9 @@ TEST_F(FramerTest, AudioWrapWithMissingFrame) {
payload_.data(), payload_.size(), rtp_header_, &duplicate);
EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(253u, frame.frame_id);
+ EXPECT_EQ(253u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
// Insert third and fourth packets.
@@ -420,11 +451,15 @@ TEST_F(FramerTest, AudioWrapWithMissingFrame) {
// Get third and fourth packets.
EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &next_frame));
EXPECT_FALSE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(255u, frame.frame_id);
+ EXPECT_EQ(255u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
EXPECT_TRUE(framer_.GetEncodedAudioFrame(&frame, &next_frame));
EXPECT_TRUE(next_frame);
+ EXPECT_EQ(transport::EncodedFrame::KEY, frame.dependency);
EXPECT_EQ(256u, frame.frame_id);
+ EXPECT_EQ(256u, frame.referenced_frame_id);
framer_.ReleaseFrame(frame.frame_id);
}