OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/filters/chunk_demuxer.h" | 5 #include "media/filters/chunk_demuxer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <deque> | 8 #include <deque> |
9 #include <limits> | 9 #include <limits> |
10 #include <list> | 10 #include <list> |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 // with the track numbers in |text_map|. | 183 // with the track numbers in |text_map|. |
184 // Returns true on a successful call. Returns false if an error occurred while | 184 // Returns true on a successful call. Returns false if an error occurred while |
185 // processing the buffers. | 185 // processing the buffers. |
186 bool OnNewBuffers(const StreamParser::BufferQueue& audio_buffers, | 186 bool OnNewBuffers(const StreamParser::BufferQueue& audio_buffers, |
187 const StreamParser::BufferQueue& video_buffers, | 187 const StreamParser::BufferQueue& video_buffers, |
188 const StreamParser::TextBufferQueueMap& text_map); | 188 const StreamParser::TextBufferQueueMap& text_map); |
189 | 189 |
190 // Helper function for OnNewBuffers() when new text buffers have been parsed. | 190 // Helper function for OnNewBuffers() when new text buffers have been parsed. |
191 // It applies |timestamp_offset_| to all buffers in |buffers| and then appends | 191 // It applies |timestamp_offset_| to all buffers in |buffers| and then appends |
192 // the (modified) buffers to the demuxer stream associated with | 192 // the (modified) buffers to the demuxer stream associated with |
193 // the track having |text_track_number|. | 193 // the track having |text_track_id|. |
194 // Returns true on a successful call. Returns false if an error occurred while | 194 // Returns true on a successful call. Returns false if an error occurred while |
195 // processing the buffers. | 195 // processing the buffers. |
196 bool OnTextBuffers(int text_track_number, | 196 bool OnTextBuffers(StreamParser::TrackId text_track_id, |
197 const StreamParser::BufferQueue& buffers); | 197 const StreamParser::BufferQueue& buffers); |
198 | 198 |
199 // Helper function that appends |buffers| to |stream| and calls | 199 // Helper function that appends |buffers| to |stream| and calls |
200 // |increase_duration_cb_| to potentially update the duration. | 200 // |increase_duration_cb_| to potentially update the duration. |
201 // Returns true if the append was successful. Returns false if | 201 // Returns true if the append was successful. Returns false if |
202 // |stream| is NULL or something in |buffers| caused the append to fail. | 202 // |stream| is NULL or something in |buffers| caused the append to fail. |
203 bool AppendAndUpdateDuration(ChunkDemuxerStream* stream, | 203 bool AppendAndUpdateDuration(ChunkDemuxerStream* stream, |
204 const StreamParser::BufferQueue& buffers); | 204 const StreamParser::BufferQueue& buffers); |
205 | 205 |
206 // Helper function that adds |timestamp_offset_| to each buffer in |buffers|. | 206 // Helper function that adds |timestamp_offset_| to each buffer in |buffers|. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 | 248 |
249 // The object used to parse appended data. | 249 // The object used to parse appended data. |
250 scoped_ptr<StreamParser> stream_parser_; | 250 scoped_ptr<StreamParser> stream_parser_; |
251 | 251 |
252 ChunkDemuxerStream* audio_; | 252 ChunkDemuxerStream* audio_; |
253 bool audio_needs_keyframe_; | 253 bool audio_needs_keyframe_; |
254 | 254 |
255 ChunkDemuxerStream* video_; | 255 ChunkDemuxerStream* video_; |
256 bool video_needs_keyframe_; | 256 bool video_needs_keyframe_; |
257 | 257 |
258 typedef std::map<int, ChunkDemuxerStream*> TextStreamMap; | 258 typedef std::map<StreamParser::TrackId, ChunkDemuxerStream*> TextStreamMap; |
259 TextStreamMap text_stream_map_; | 259 TextStreamMap text_stream_map_; |
260 | 260 |
261 LogCB log_cb_; | 261 LogCB log_cb_; |
262 | 262 |
263 DISALLOW_COPY_AND_ASSIGN(SourceState); | 263 DISALLOW_COPY_AND_ASSIGN(SourceState); |
264 }; | 264 }; |
265 | 265 |
266 class ChunkDemuxerStream : public DemuxerStream { | 266 class ChunkDemuxerStream : public DemuxerStream { |
267 public: | 267 public: |
268 typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue; | 268 typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue; |
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
766 new_media_segment_ = false; | 766 new_media_segment_ = false; |
767 } | 767 } |
768 | 768 |
769 bool SourceState::OnNewBuffers( | 769 bool SourceState::OnNewBuffers( |
770 const StreamParser::BufferQueue& audio_buffers, | 770 const StreamParser::BufferQueue& audio_buffers, |
771 const StreamParser::BufferQueue& video_buffers, | 771 const StreamParser::BufferQueue& video_buffers, |
772 const StreamParser::TextBufferQueueMap& text_map) { | 772 const StreamParser::TextBufferQueueMap& text_map) { |
773 DCHECK(!audio_buffers.empty() || !video_buffers.empty() || | 773 DCHECK(!audio_buffers.empty() || !video_buffers.empty() || |
774 !text_map.empty()); | 774 !text_map.empty()); |
775 | 775 |
| 776 // TODO(wolenetz): DCHECK + return false if any of these buffers have UNKNOWN |
| 777 // type() in upcoming coded frame processing compliant implementation. See |
| 778 // http://crbug.com/249422. |
| 779 |
776 AdjustBufferTimestamps(audio_buffers); | 780 AdjustBufferTimestamps(audio_buffers); |
777 AdjustBufferTimestamps(video_buffers); | 781 AdjustBufferTimestamps(video_buffers); |
778 | 782 |
779 StreamParser::BufferQueue filtered_audio; | 783 StreamParser::BufferQueue filtered_audio; |
780 StreamParser::BufferQueue filtered_video; | 784 StreamParser::BufferQueue filtered_video; |
781 | 785 |
782 FilterWithAppendWindow(audio_buffers, &audio_needs_keyframe_, | 786 FilterWithAppendWindow(audio_buffers, &audio_needs_keyframe_, |
783 &filtered_audio); | 787 &filtered_audio); |
784 | 788 |
785 FilterWithAppendWindow(video_buffers, &video_needs_keyframe_, | 789 FilterWithAppendWindow(video_buffers, &video_needs_keyframe_, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
838 if (!OnTextBuffers(itr->first, text_buffers)) | 842 if (!OnTextBuffers(itr->first, text_buffers)) |
839 return false; | 843 return false; |
840 } | 844 } |
841 } | 845 } |
842 | 846 |
843 DCHECK(!all_text_buffers_empty); | 847 DCHECK(!all_text_buffers_empty); |
844 return true; | 848 return true; |
845 } | 849 } |
846 | 850 |
847 bool SourceState::OnTextBuffers( | 851 bool SourceState::OnTextBuffers( |
848 int text_track_number, | 852 StreamParser::TrackId text_track_id, |
849 const StreamParser::BufferQueue& buffers) { | 853 const StreamParser::BufferQueue& buffers) { |
850 DCHECK(!buffers.empty()); | 854 DCHECK(!buffers.empty()); |
851 | 855 |
852 TextStreamMap::iterator itr = text_stream_map_.find(text_track_number); | 856 TextStreamMap::iterator itr = text_stream_map_.find(text_track_id); |
853 if (itr == text_stream_map_.end()) | 857 if (itr == text_stream_map_.end()) |
854 return false; | 858 return false; |
855 | 859 |
856 AdjustBufferTimestamps(buffers); | 860 AdjustBufferTimestamps(buffers); |
857 | 861 |
858 StreamParser::BufferQueue filtered_buffers; | 862 StreamParser::BufferQueue filtered_buffers; |
859 bool needs_keyframe = false; | 863 bool needs_keyframe = false; |
860 FilterWithAppendWindow(buffers, &needs_keyframe, &filtered_buffers); | 864 FilterWithAppendWindow(buffers, &needs_keyframe, &filtered_buffers); |
861 | 865 |
862 if (filtered_buffers.empty()) | 866 if (filtered_buffers.empty()) |
(...skipping 998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1861 } | 1865 } |
1862 | 1866 |
1863 void ChunkDemuxer::ShutdownAllStreams() { | 1867 void ChunkDemuxer::ShutdownAllStreams() { |
1864 for (SourceStateMap::iterator itr = source_state_map_.begin(); | 1868 for (SourceStateMap::iterator itr = source_state_map_.begin(); |
1865 itr != source_state_map_.end(); ++itr) { | 1869 itr != source_state_map_.end(); ++itr) { |
1866 itr->second->Shutdown(); | 1870 itr->second->Shutdown(); |
1867 } | 1871 } |
1868 } | 1872 } |
1869 | 1873 |
1870 } // namespace media | 1874 } // namespace media |
OLD | NEW |