Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(708)

Unified Diff: media/filters/adaptive_demuxer.h

Issue 7044008: Initial implementation of stream switching in AdaptiveDemuxer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: _ Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/filters/adaptive_demuxer.h
diff --git a/media/filters/adaptive_demuxer.h b/media/filters/adaptive_demuxer.h
index 6402b039022a997d5b4c31002b3bbe10b5ab0338..dc39fcb788d71cb0c63f2ee0708abea9fc9e8c9e 100644
--- a/media/filters/adaptive_demuxer.h
+++ b/media/filters/adaptive_demuxer.h
@@ -23,10 +23,15 @@
namespace media {
class AdaptiveDemuxer;
+class StreamSwitchManager;
+
+typedef base::Callback<void(PipelineStatus, base::TimeDelta)> SeekHelperCB;
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 Any reason these need to be outside in namespace s
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 Doco these typedefs. Their naming is leaving me sc
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 Done.
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 Done.
+typedef base::Callback<void(const base::TimeDelta&, SeekHelperCB)> SeekHelper;
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 TimeDelta is an int64; no need to pass by const&.
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 Done.
class AdaptiveDemuxerStream : public DemuxerStream {
public:
typedef std::vector<scoped_refptr<DemuxerStream> > StreamVector;
+ typedef std::deque<ReadCallback> ReadCBQueue;
// Keeps references to the passed-in streams. |streams| must be non-empty and
// all the streams in it must agree on type and media_format (or be NULL).
@@ -35,9 +40,13 @@ class AdaptiveDemuxerStream : public DemuxerStream {
AdaptiveDemuxerStream(StreamVector const& streams, int initial_stream);
virtual ~AdaptiveDemuxerStream();
+ // Notifies this stream that a Seek() was requested on the demuxer.
+ void OnAdaptiveDemuxerSeek();
+
// Change the stream to satisfy subsequent Read() requests from. The
// referenced pointer must not be NULL.
- void ChangeCurrentStream(int index);
+ void ChangeCurrentStream(int index, const SeekHelper& seek_helper,
+ const PipelineStatusCB& cb);
// DemuxerStream methods.
virtual void Read(const ReadCallback& read_callback);
@@ -53,6 +62,19 @@ class AdaptiveDemuxerStream : public DemuxerStream {
// DEBUG_MODE-only CHECK that the data members are in a reasonable state.
void DCheckSanity();
+ void OnReadDone(Buffer* buffer);
+
+ bool IsSwitchPending_Locked() const;
+
+ // Starts the stream switch. This method expects that no Read()s are
+ // outstanding on | streams_[current_stream_index_] |.
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 Inward-facing spaces around |'s are unnecessary (h
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 Done.
+ void StartSwitch();
+
+ // Called by the SeekHelper when it has completed the seek on
+ // | streams_[switch_index_] |.
+ void OnSwitchSeekDone(PipelineStatus status,
+ const base::TimeDelta& seek_time);
+
StreamVector streams_;
// Guards the members below. Only held for simple variable reads/writes, not
// during async operation.
@@ -60,12 +82,32 @@ class AdaptiveDemuxerStream : public DemuxerStream {
int current_stream_index_;
bool bitstream_converter_enabled_;
+ // The number of outstanding Read()'s on streams_[current_stream_index_].
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 ||'ify code in comments (here and elsewhere).
+ int pending_reads_;
+
+ // A queue of callback objects passed to Read() calls on this object.
+ ReadCBQueue read_cb_queue_;
+
+ // Callback passed to ChangeCurrentStream(). This is called & reset when the
+ // stream switch has completed.
+ PipelineStatusCB switch_cb_;
+
+ // The index of the stream we are switching to.
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 Document value while not switching (or that value
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 Done.
+ int switch_index_;
+
+ // Helper object used to seek streams_|switch_index_| to a specific time.
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 brackets instead of pipes
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 Done.
+ SeekHelper switch_seek_helper_;
+
+ // The timestamp of the last buffered returned via a Read() callback.
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 s/buffered/buffer/
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 Done.
+ base::TimeDelta last_buffer_timestamp_;
+
DISALLOW_IMPLICIT_CONSTRUCTORS(AdaptiveDemuxerStream);
};
class AdaptiveDemuxer : public Demuxer {
public:
typedef std::vector<scoped_refptr<Demuxer> > DemuxerVector;
+ typedef std::vector<int> StreamIdVector;
// |demuxers| must be non-empty, and the index arguments must be valid indexes
// into |demuxers|, or -1 to indicate no demuxer is serving that type.
@@ -74,8 +116,14 @@ class AdaptiveDemuxer : public Demuxer {
int initial_video_demuxer_index);
virtual ~AdaptiveDemuxer();
- // Change which demuxers the streams will use.
- void ChangeCurrentDemuxer(int audio_index, int video_index);
+ // Change the to a different video stream.
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 English. I think this is the first time you/we enf
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 Done. For now I'm constraining code to video only
+ void ChangeVideoStream(int video_id, const PipelineStatusCB& done_cb);
+
+ // Get the ID of the current video stream.
Ami GONE FROM CHROMIUM 2011/05/19 20:27:37 This and the next method: are they really necessar
acolwell GONE FROM CHROMIUM 2011/05/20 01:26:37 These were added so a StreamSwitchManager object c
+ int GetCurrentVideoId() const;
+
+ // Get all of the video stream IDs.
+ StreamIdVector GetVideoIds() const;
// Filter implementation.
virtual void Stop(FilterCallback* callback);
@@ -92,14 +140,43 @@ class AdaptiveDemuxer : public Demuxer {
// Returns a pointer to the currently active demuxer of the given type.
Demuxer* current_demuxer(DemuxerStream::Type type);
+ // Called when the AdaptiveDemuxerStream completes a stream switch.
+ void ChangeVideoStreamDone(int new_stream_index,
+ const PipelineStatusCB& done_cb,
+ PipelineStatus status);
+
+ // Methods for SeekHelper.
+ // Initial method called when the AdaptiveDemuxerStream calls the SeekHelper.
+ void StartStreamSwitchSeek(DemuxerStream::Type type,
+ int stream_index,
+ const base::TimeDelta& seek_time,
+ const SeekHelperCB& seek_cb);
+
+ // Called when the seek for index data initiated by StartStreamSwitchSeek()
+ // completes.
+ void OnIndexSeekDone(DemuxerStream::Type type,
+ int stream_index,
+ const base::TimeDelta& seek_time,
+ const SeekHelperCB& seek_cb,
+ PipelineStatus status);
+
+ // Called when the stream seek initiated by StartStreamSwitchSeek() or
+ // OnIndexSeekDone() completes.
+ void OnStreamSeekDone(const base::TimeDelta& seek_point,
+ const SeekHelperCB& seek_cb,
+ PipelineStatus status);
+
DemuxerVector demuxers_;
scoped_refptr<AdaptiveDemuxerStream> audio_stream_;
scoped_refptr<AdaptiveDemuxerStream> video_stream_;
// Guards the members below. Only held for simple variable reads/writes, not
// during async operation.
- base::Lock lock_;
+ mutable base::Lock lock_;
int current_audio_demuxer_index_;
int current_video_demuxer_index_;
+ float playback_rate_;
+ bool switch_pending_;
+ scoped_refptr<StreamSwitchManager> stream_switch_manager_;
DISALLOW_IMPLICIT_CONSTRUCTORS(AdaptiveDemuxer);
};

Powered by Google App Engine
This is Rietveld 408576698