diff options
Diffstat (limited to 'media/cast/framer')
-rw-r--r-- | media/cast/framer/frame_buffer.cc | 47 | ||||
-rw-r--r-- | media/cast/framer/frame_buffer.h | 8 | ||||
-rw-r--r-- | media/cast/framer/frame_buffer_unittest.cc | 20 | ||||
-rw-r--r-- | media/cast/framer/framer.cc | 8 | ||||
-rw-r--r-- | media/cast/framer/framer.h | 4 | ||||
-rw-r--r-- | media/cast/framer/framer_unittest.cc | 65 |
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); } |