blob: b2a1124520e5c712bf589675b1b757980db06dac [file] [log] [blame]
[email protected]a4dae8e2012-03-15 23:35:311// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]a2b5c472011-09-13 20:24:102// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_BASE_DEMUXER_H_
6#define MEDIA_BASE_DEMUXER_H_
7
avi1323b9c22015-12-23 06:22:368#include <stdint.h>
9
danakj6aaed6a2016-04-26 01:25:4410#include <memory>
[email protected]322d22c2013-08-26 18:50:4111#include <vector>
12
avia82b9b52015-12-19 04:27:0813#include "base/macros.h"
servolk9bed6602017-02-24 01:20:1114#include "base/optional.h"
[email protected]7e72e7b2013-06-28 05:40:1015#include "base/time/time.h"
[email protected]236119c2011-12-16 17:14:2516#include "media/base/data_source.h"
[email protected]a2b5c472011-09-13 20:24:1017#include "media/base/demuxer_stream.h"
jrummellcf78967c2015-04-03 05:03:5818#include "media/base/eme_constants.h"
[email protected]a2b5c472011-09-13 20:24:1019#include "media/base/media_export.h"
servolkcfc91f152017-02-02 05:11:2320#include "media/base/media_resource.h"
servolkf25ceed2016-07-01 03:44:3821#include "media/base/media_track.h"
[email protected]a2b5c472011-09-13 20:24:1022#include "media/base/pipeline_status.h"
servolk21e682e2016-01-14 22:38:2323#include "media/base/ranges.h"
[email protected]a2b5c472011-09-13 20:24:1024
25namespace media {
26
servolk81e01e02016-03-05 03:29:1527class MediaTracks;
[email protected]8a561062013-11-22 01:19:3128
[email protected]a61ce5a92014-04-03 18:54:3929class MEDIA_EXPORT DemuxerHost {
[email protected]236119c2011-12-16 17:14:2530 public:
servolk21e682e2016-01-14 22:38:2331 // Notify the host that buffered time ranges have changed. Note that buffered
32 // time ranges can grow (when new media data is appended), but they can also
33 // shrink (when buffering reaches limit capacity and some buffered data
34 // becomes evicted, e.g. due to MSE GC algorithm, or by explicit removal of
35 // ranges directed by MSE web app).
36 virtual void OnBufferedTimeRangesChanged(
37 const Ranges<base::TimeDelta>& ranges) = 0;
[email protected]a61ce5a92014-04-03 18:54:3938
[email protected]60bf9222012-05-26 00:31:3439 // Sets the duration of the media in microseconds.
dalecurtis39a7f932016-07-19 18:34:5940 // Duration may be kInfiniteDuration if the duration is not known.
[email protected]236119c2011-12-16 17:14:2541 virtual void SetDuration(base::TimeDelta duration) = 0;
42
dalecurtis2ff781da2016-03-03 01:52:1343 // Stops execution of the pipeline due to a fatal error. Do not call this
44 // method with PIPELINE_OK. Stopping is not immediate so demuxers must be
45 // prepared to soft fail on subsequent calls. E.g., if Demuxer::Seek() is
46 // called after an unrecoverable error the provided PipelineStatusCB must be
47 // called with an error.
[email protected]236119c2011-12-16 17:14:2548 virtual void OnDemuxerError(PipelineStatus error) = 0;
[email protected]512d03f2012-06-26 01:06:0649
50 protected:
51 virtual ~DemuxerHost();
[email protected]236119c2011-12-16 17:14:2552};
[email protected]a2b5c472011-09-13 20:24:1053
servolkcfc91f152017-02-02 05:11:2354class MEDIA_EXPORT Demuxer : public MediaResource {
[email protected]a2b5c472011-09-13 20:24:1055 public:
[email protected]322d22c2013-08-26 18:50:4156 // A new potentially encrypted stream has been parsed.
57 // First parameter - The type of initialization data.
58 // Second parameter - The initialization data associated with the stream.
danakj6aaed6a2016-04-26 01:25:4459 using EncryptedMediaInitDataCB =
60 base::Callback<void(EmeInitDataType type,
61 const std::vector<uint8_t>& init_data)>;
[email protected]322d22c2013-08-26 18:50:4162
servolk81e01e02016-03-05 03:29:1563 // Notifies demuxer clients that media track configuration has been updated
servolkf25ceed2016-07-01 03:44:3864 // (e.g. the initial stream metadata has been parsed successfully, or a new
servolk81e01e02016-03-05 03:29:1565 // init segment has been parsed successfully in MSE case).
danakj6aaed6a2016-04-26 01:25:4466 using MediaTracksUpdatedCB =
67 base::Callback<void(std::unique_ptr<MediaTracks>)>;
servolk81e01e02016-03-05 03:29:1568
Ted Meyerda82b602018-04-19 00:36:5669 // Called once the demuxer has finished enabling or disabling tracks. The type
70 // argument is required because the vector may be empty.
71 using TrackChangeCB =
72 base::OnceCallback<void(DemuxerStream::Type type,
73 const std::vector<DemuxerStream*>&)>;
74
[email protected]236119c2011-12-16 17:14:2575 Demuxer();
dchengc24565478f2014-10-21 12:23:2776 ~Demuxer() override;
[email protected]236119c2011-12-16 17:14:2577
xhwanga9ca9db2015-06-11 23:52:3978 // Returns the name of the demuxer for logging purpose.
79 virtual std::string GetDisplayName() const = 0;
80
[email protected]9bfe9b82012-04-02 17:56:2781 // Completes initialization of the demuxer.
82 //
[email protected]d09ef252012-04-05 04:31:3083 // The demuxer does not own |host| as it is guaranteed to outlive the
dalecurtis21b128292015-01-21 11:09:2484 // lifetime of the demuxer. Don't delete it! |status_cb| must only be run
85 // after this method has returned.
[email protected]d09ef252012-04-05 04:31:3086 virtual void Initialize(DemuxerHost* host,
Ted Meyer4ca53de2018-05-26 00:21:3187 const PipelineStatusCB& status_cb) = 0;
[email protected]9bfe9b82012-04-02 17:56:2788
dalecurtisf299e192016-08-30 19:54:1989 // Aborts any pending read operations that the demuxer is involved with; any
sandersd216002c2016-12-05 22:28:5890 // read aborted will be aborted with a status of kAborted. Future reads will
91 // also be aborted until Seek() is called.
dalecurtisf299e192016-08-30 19:54:1992 virtual void AbortPendingReads() = 0;
93
sandersdb5e21462016-03-09 01:49:0794 // Indicates that a new Seek() call is on its way. Implementations may abort
95 // pending reads and future Read() calls may return kAborted until Seek() is
96 // executed. |seek_time| is the presentation timestamp of the new Seek() call.
97 //
98 // In actual use, this call occurs on the main thread while Seek() is called
99 // on the media thread. StartWaitingForSeek() can be used to synchronize the
100 // two.
101 //
102 // StartWaitingForSeek() MUST be called before Seek().
103 virtual void StartWaitingForSeek(base::TimeDelta seek_time) = 0;
104
105 // Indicates that the current Seek() operation is obsoleted by a new one.
106 // Implementations can expect that StartWaitingForSeek() will be called
107 // when the current seek operation completes.
108 //
109 // Like StartWaitingForSeek(), CancelPendingSeek() is called on the main
110 // thread. Ordering with respect to the to-be-canceled Seek() is not
111 // guaranteed. Regardless of ordering, implementations may abort pending reads
112 // and may return kAborted from future Read() calls, until after
113 // StartWaitingForSeek() and the following Seek() call occurs.
114 //
115 // |seek_time| should match that passed to the next StartWaitingForSeek(), but
116 // may not if the seek target changes again before the current seek operation
117 // completes or is aborted.
118 virtual void CancelPendingSeek(base::TimeDelta seek_time) = 0;
119
[email protected]a2b5c472011-09-13 20:24:10120 // Carry out any actions required to seek to the given time, executing the
121 // callback upon completion.
[email protected]7c63c2e2013-10-10 20:00:45122 virtual void Seek(base::TimeDelta time,
123 const PipelineStatusCB& status_cb) = 0;
[email protected]a2b5c472011-09-13 20:24:10124
xhwangfcdacaf2014-09-02 18:08:35125 // Stops this demuxer.
[email protected]8b754552013-08-22 00:31:05126 //
xhwangfcdacaf2014-09-02 18:08:35127 // After this call the demuxer may be destroyed. It is illegal to call any
128 // method (including Stop()) after a demuxer has stopped.
129 virtual void Stop() = 0;
[email protected]a2b5c472011-09-13 20:24:10130
dalecurtisb9ec078cf2014-09-16 22:23:21131 // Returns the starting time for the media file; it's always positive.
132 virtual base::TimeDelta GetStartTime() const = 0;
133
[email protected]db66d0092014-04-16 07:15:12134 // Returns Time represented by presentation timestamp 0.
135 // If the timstamps are not associated with a Time, then
136 // a null Time is returned.
137 virtual base::Time GetTimelineOffset() const = 0;
138
wdzierzanowski98368632015-12-04 09:22:01139 // Returns the memory usage in bytes for the demuxer.
dalecurtis83266c72015-10-29 18:43:20140 virtual int64_t GetMemoryUsage() const = 0;
141
Ted Meyerda82b602018-04-19 00:36:56142 // The |track_ids| vector has either 1 track, or is empty, indicating that
143 // all tracks should be disabled. |change_completed_cb| is fired after the
144 // demuxer streams are disabled, however this callback should then notify
145 // the appropriate renderer in order for tracks to be switched fully.
servolkf25ceed2016-07-01 03:44:38146 virtual void OnEnabledAudioTracksChanged(
147 const std::vector<MediaTrack::Id>& track_ids,
Ted Meyerda82b602018-04-19 00:36:56148 base::TimeDelta curr_time,
149 TrackChangeCB change_completed_cb) = 0;
servolkf25ceed2016-07-01 03:44:38150
servolkf25ceed2016-07-01 03:44:38151 virtual void OnSelectedVideoTrackChanged(
Ted Meyerda82b602018-04-19 00:36:56152 const std::vector<MediaTrack::Id>& track_ids,
153 base::TimeDelta curr_time,
154 TrackChangeCB change_completed_cb) = 0;
servolkf25ceed2016-07-01 03:44:38155
[email protected]a2b5c472011-09-13 20:24:10156 private:
[email protected]a2b5c472011-09-13 20:24:10157 DISALLOW_COPY_AND_ASSIGN(Demuxer);
158};
159
160} // namespace media
161
162#endif // MEDIA_BASE_DEMUXER_H_