| 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 // SourceBufferStream is a data structure that stores media Buffers in ranges. | 5 // SourceBufferStream is a data structure that stores media Buffers in ranges. |
| 6 // Buffers can be appended out of presentation order. Buffers are retrieved by | 6 // Buffers can be appended out of presentation order. Buffers are retrieved by |
| 7 // seeking to the desired start point and calling GetNextBuffer(). Buffers are | 7 // seeking to the desired start point and calling GetNextBuffer(). Buffers are |
| 8 // returned in sequential presentation order. | 8 // returned in sequential presentation order. |
| 9 | 9 |
| 10 #ifndef MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_ | 10 #ifndef MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_ |
| 11 #define MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_ | 11 #define MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_ |
| 12 | 12 |
| 13 #include <deque> | 13 #include <deque> |
| 14 #include <list> | 14 #include <list> |
| 15 #include <string> | 15 #include <string> |
| 16 #include <utility> | 16 #include <utility> |
| 17 #include <vector> | 17 #include <vector> |
| 18 | 18 |
| 19 #include "base/callback_forward.h" |
| 19 #include "base/memory/ref_counted.h" | 20 #include "base/memory/ref_counted.h" |
| 20 #include "media/base/audio_decoder_config.h" | 21 #include "media/base/audio_decoder_config.h" |
| 21 #include "media/base/media_export.h" | 22 #include "media/base/media_export.h" |
| 22 #include "media/base/media_log.h" | 23 #include "media/base/media_log.h" |
| 23 #include "media/base/ranges.h" | 24 #include "media/base/ranges.h" |
| 24 #include "media/base/stream_parser_buffer.h" | 25 #include "media/base/stream_parser_buffer.h" |
| 25 #include "media/base/text_track_config.h" | 26 #include "media/base/text_track_config.h" |
| 26 #include "media/base/video_decoder_config.h" | 27 #include "media/base/video_decoder_config.h" |
| 27 | 28 |
| 28 namespace media { | 29 namespace media { |
| 29 | 30 |
| 30 class SourceBufferRange; | 31 class SourceBufferRange; |
| 31 | 32 |
| 32 // See file-level comment for complete description. | 33 // See file-level comment for complete description. |
| 33 class MEDIA_EXPORT SourceBufferStream { | 34 class MEDIA_EXPORT SourceBufferStream { |
| 34 public: | 35 public: |
| 35 typedef StreamParser::BufferQueue BufferQueue; | 36 typedef StreamParser::BufferQueue BufferQueue; |
| 36 typedef std::list<SourceBufferRange*> RangeList; | 37 typedef std::list<SourceBufferRange*> RangeList; |
| 38 typedef base::Callback<bool(DecodeTimestamp start_dts, |
| 39 DecodeTimestamp end_dts)> NotifyRangeRemovalCB; |
| 37 | 40 |
| 38 // Status returned by GetNextBuffer(). | 41 // Status returned by GetNextBuffer(). |
| 39 // kSuccess: Indicates that the next buffer was returned. | 42 // kSuccess: Indicates that the next buffer was returned. |
| 40 // kNeedBuffer: Indicates that we need more data before a buffer can be | 43 // kNeedBuffer: Indicates that we need more data before a buffer can be |
| 41 // returned. | 44 // returned. |
| 42 // kConfigChange: Indicates that the next buffer requires a config change. | 45 // kConfigChange: Indicates that the next buffer requires a config change. |
| 43 enum Status { | 46 enum Status { |
| 44 kSuccess, | 47 kSuccess, |
| 45 kNeedBuffer, | 48 kNeedBuffer, |
| 46 kConfigChange, | 49 kConfigChange, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 58 bool splice_frames_enabled); | 61 bool splice_frames_enabled); |
| 59 SourceBufferStream(const VideoDecoderConfig& video_config, | 62 SourceBufferStream(const VideoDecoderConfig& video_config, |
| 60 const LogCB& log_cb, | 63 const LogCB& log_cb, |
| 61 bool splice_frames_enabled); | 64 bool splice_frames_enabled); |
| 62 SourceBufferStream(const TextTrackConfig& text_config, | 65 SourceBufferStream(const TextTrackConfig& text_config, |
| 63 const LogCB& log_cb, | 66 const LogCB& log_cb, |
| 64 bool splice_frames_enabled); | 67 bool splice_frames_enabled); |
| 65 | 68 |
| 66 ~SourceBufferStream(); | 69 ~SourceBufferStream(); |
| 67 | 70 |
| 71 // Allows callers to register for notification of range removal. The |
| 72 // registration must be valid during any range removal algorithm execution, as |
| 73 // can result from duration truncation, explicit Remove(), or garbage |
| 74 // collection. Coded frame removals done during Append are not included (nor |
| 75 // should they be according to MSE spec.) |
| 76 void set_range_removal_cb(const NotifyRangeRemovalCB& range_removal_cb) { |
| 77 range_removal_cb_ = range_removal_cb; |
| 78 } |
| 79 |
| 68 // Signals that the next buffers appended are part of a new media segment | 80 // Signals that the next buffers appended are part of a new media segment |
| 69 // starting at |media_segment_start_time|. | 81 // starting at |media_segment_start_time|. |
| 70 // TODO(acolwell/wolenetz): This should be changed to a presentation | 82 // TODO(acolwell/wolenetz): This should be changed to a presentation |
| 71 // timestamp. See http://crbug.com/402502 | 83 // timestamp. See http://crbug.com/402502 |
| 72 void OnNewMediaSegment(DecodeTimestamp media_segment_start_time); | 84 void OnNewMediaSegment(DecodeTimestamp media_segment_start_time); |
| 73 | 85 |
| 74 // Add the |buffers| to the SourceBufferStream. Buffers within the queue are | 86 // Add the |buffers| to the SourceBufferStream. Buffers within the queue are |
| 75 // expected to be in order, but multiple calls to Append() may add buffers out | 87 // expected to be in order, but multiple calls to Append() may add buffers out |
| 76 // of order or overlapping. Assumes all buffers within |buffers| are in | 88 // of order or overlapping. Assumes all buffers within |buffers| are in |
| 77 // presentation order and are non-overlapping. | 89 // presentation order and are non-overlapping. |
| (...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 void GenerateSpliceFrame(const BufferQueue& new_buffers); | 334 void GenerateSpliceFrame(const BufferQueue& new_buffers); |
| 323 | 335 |
| 324 // If |out_buffer| has splice buffers or preroll, sets |pending_buffer_| | 336 // If |out_buffer| has splice buffers or preroll, sets |pending_buffer_| |
| 325 // appropriately and returns true. Otherwise returns false. | 337 // appropriately and returns true. Otherwise returns false. |
| 326 bool SetPendingBuffer(scoped_refptr<StreamParserBuffer>* out_buffer); | 338 bool SetPendingBuffer(scoped_refptr<StreamParserBuffer>* out_buffer); |
| 327 | 339 |
| 328 // Callback used to report log messages that can help the web developer figure | 340 // Callback used to report log messages that can help the web developer figure |
| 329 // out what is wrong with the content. | 341 // out what is wrong with the content. |
| 330 LogCB log_cb_; | 342 LogCB log_cb_; |
| 331 | 343 |
| 344 // Callback used to report range removal to support detection and processing |
| 345 // by the MSE Coded Frame Processing Algorithm's of an append discontinuity |
| 346 // that may have been introduced by the range's removal. |
| 347 NotifyRangeRemovalCB range_removal_cb_; |
| 348 |
| 332 // List of disjoint buffered ranges, ordered by start time. | 349 // List of disjoint buffered ranges, ordered by start time. |
| 333 RangeList ranges_; | 350 RangeList ranges_; |
| 334 | 351 |
| 335 // Indicates which decoder config is being used by the decoder. | 352 // Indicates which decoder config is being used by the decoder. |
| 336 // GetNextBuffer() is only allows to return buffers that have a | 353 // GetNextBuffer() is only allows to return buffers that have a |
| 337 // config ID that matches this index. If there is a mismatch then | 354 // config ID that matches this index. If there is a mismatch then |
| 338 // it must signal that a config change is needed. | 355 // it must signal that a config change is needed. |
| 339 int current_config_index_; | 356 int current_config_index_; |
| 340 | 357 |
| 341 // Indicates which decoder config to associate with new buffers | 358 // Indicates which decoder config to associate with new buffers |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 | 432 |
| 416 // Indicates that splice frame generation is enabled. | 433 // Indicates that splice frame generation is enabled. |
| 417 const bool splice_frames_enabled_; | 434 const bool splice_frames_enabled_; |
| 418 | 435 |
| 419 DISALLOW_COPY_AND_ASSIGN(SourceBufferStream); | 436 DISALLOW_COPY_AND_ASSIGN(SourceBufferStream); |
| 420 }; | 437 }; |
| 421 | 438 |
| 422 } // namespace media | 439 } // namespace media |
| 423 | 440 |
| 424 #endif // MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_ | 441 #endif // MEDIA_FILTERS_SOURCE_BUFFER_STREAM_H_ |
| OLD | NEW |