Index: media/base/stream_parser.cc |
diff --git a/media/base/stream_parser.cc b/media/base/stream_parser.cc |
index 12409194fede3cf0fcaa3d1671b7301416457409..b15d328643f06019c01fc54fdce674958c6478c1 100644 |
--- a/media/base/stream_parser.cc |
+++ b/media/base/stream_parser.cc |
@@ -4,10 +4,79 @@ |
#include "media/base/stream_parser.h" |
+#include "media/base/buffers.h" |
+#include "media/base/stream_parser_buffer.h" |
+ |
namespace media { |
StreamParser::StreamParser() {} |
StreamParser::~StreamParser() {} |
+bool StreamParser::MergeBufferQueues(const BufferQueue& audio_buffers, |
xhwang
2014/01/29 08:04:50
This function doesn't use any member variable. Doe
wolenetz
2014/02/05 02:49:53
Yeah, there's really no need other than possibly n
|
+ const BufferQueue& video_buffers, |
+ const TextBufferQueueMap& text_buffers, |
+ BufferQueue* merged_buffers) { |
+ DCHECK(merged_buffers); |
+ |
+ // Prepare vector containing pointers to any provided non-empty buffer queues. |
+ std::vector<const BufferQueue*> buffer_queues; |
+ if (!audio_buffers.empty()) |
+ buffer_queues.push_back(&audio_buffers); |
+ if (!video_buffers.empty()) |
+ buffer_queues.push_back(&video_buffers); |
+ for (TextBufferQueueMap::const_iterator map_itr = text_buffers.begin(); |
+ map_itr != text_buffers.end(); |
+ map_itr++) { |
+ if (!map_itr->second.empty()) |
+ buffer_queues.push_back(&(map_itr->second)); |
+ } |
+ |
+ // Do the merge. |
+ return MergeBufferQueues(buffer_queues, merged_buffers); |
+} |
+ |
+bool |
+StreamParser::MergeBufferQueues(std::vector<const BufferQueue*> buffer_queues, |
xhwang
2014/01/29 08:04:50
The implementation is complicated, we may need mor
wolenetz
2014/02/05 02:49:53
I've added more documentation now.
We'd need to h
|
+ BufferQueue* merged_buffers) { |
xhwang
2014/01/29 08:04:50
format looks odd; put bool and function name in th
wolenetz
2014/02/05 02:49:53
Done.
|
+ if (buffer_queues.empty()) |
+ return true; |
+ |
+ std::vector<BufferQueue::const_iterator> itrs; |
+ for (size_t i = 0; i < buffer_queues.size(); ++i) |
+ itrs.push_back(buffer_queues[i]->begin()); |
+ |
+ base::TimeDelta last_timestamp = kNoTimestamp(); |
+ if (!merged_buffers->empty()) |
+ last_timestamp = merged_buffers->back()->GetDecodeTimestamp(); |
+ |
+ while (true) { |
+ int index_of_queue_with_next_timestamp = -1; |
+ base::TimeDelta next_timestamp = kNoTimestamp(); |
+ |
+ for (size_t i = 0; i < buffer_queues.size(); ++i) { |
+ if (itrs[i] != buffer_queues[i]->end()) { |
+ base::TimeDelta ts = (*itrs[i])->GetDecodeTimestamp(); |
+ |
+ if (last_timestamp != kNoTimestamp() && ts < last_timestamp) |
+ return false; |
+ |
+ if (ts < next_timestamp || next_timestamp == kNoTimestamp()) { |
+ next_timestamp = ts; |
+ index_of_queue_with_next_timestamp = i; |
+ } |
+ } |
+ } |
+ |
+ if (index_of_queue_with_next_timestamp == -1) |
+ return true; |
+ |
+ scoped_refptr<StreamParserBuffer> buffer = |
+ *itrs[index_of_queue_with_next_timestamp]; |
+ last_timestamp = buffer->GetDecodeTimestamp(); |
+ merged_buffers->push_back(buffer); |
+ ++itrs[index_of_queue_with_next_timestamp]; |
+ } |
+} |
+ |
} // namespace media |