blob: 9c6607f9cb212555c5eee02d494b2b2e407d52a5 [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"
[email protected]7e72e7b2013-06-28 05:40:1014#include "base/time/time.h"
[email protected]236119c2011-12-16 17:14:2515#include "media/base/data_source.h"
[email protected]a2b5c472011-09-13 20:24:1016#include "media/base/demuxer_stream.h"
xhwang1c5668e2014-09-10 02:42:0417#include "media/base/demuxer_stream_provider.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"
[email protected]a2b5c472011-09-13 20:24:1020#include "media/base/pipeline_status.h"
servolk21e682e2016-01-14 22:38:2321#include "media/base/ranges.h"
[email protected]a2b5c472011-09-13 20:24:1022
23namespace media {
24
[email protected]8a561062013-11-22 01:19:3125class TextTrackConfig;
servolk81e01e02016-03-05 03:29:1526class MediaTracks;
[email protected]8a561062013-11-22 01:19:3127
[email protected]a61ce5a92014-04-03 18:54:3928class MEDIA_EXPORT DemuxerHost {
[email protected]236119c2011-12-16 17:14:2529 public:
servolk21e682e2016-01-14 22:38:2330 // Notify the host that buffered time ranges have changed. Note that buffered
31 // time ranges can grow (when new media data is appended), but they can also
32 // shrink (when buffering reaches limit capacity and some buffered data
33 // becomes evicted, e.g. due to MSE GC algorithm, or by explicit removal of
34 // ranges directed by MSE web app).
35 virtual void OnBufferedTimeRangesChanged(
36 const Ranges<base::TimeDelta>& ranges) = 0;
[email protected]a61ce5a92014-04-03 18:54:3937
[email protected]60bf9222012-05-26 00:31:3438 // Sets the duration of the media in microseconds.
39 // Duration may be kInfiniteDuration() if the duration is not known.
[email protected]236119c2011-12-16 17:14:2540 virtual void SetDuration(base::TimeDelta duration) = 0;
41
dalecurtis2ff781da2016-03-03 01:52:1342 // Stops execution of the pipeline due to a fatal error. Do not call this
43 // method with PIPELINE_OK. Stopping is not immediate so demuxers must be
44 // prepared to soft fail on subsequent calls. E.g., if Demuxer::Seek() is
45 // called after an unrecoverable error the provided PipelineStatusCB must be
46 // called with an error.
[email protected]236119c2011-12-16 17:14:2547 virtual void OnDemuxerError(PipelineStatus error) = 0;
[email protected]512d03f2012-06-26 01:06:0648
[email protected]8a561062013-11-22 01:19:3149 // Add |text_stream| to the collection managed by the text renderer.
50 virtual void AddTextStream(DemuxerStream* text_stream,
51 const TextTrackConfig& config) = 0;
52
53 // Remove |text_stream| from the presentation.
54 virtual void RemoveTextStream(DemuxerStream* text_stream) = 0;
55
[email protected]512d03f2012-06-26 01:06:0656 protected:
57 virtual ~DemuxerHost();
[email protected]236119c2011-12-16 17:14:2558};
[email protected]a2b5c472011-09-13 20:24:1059
xhwang1c5668e2014-09-10 02:42:0460class MEDIA_EXPORT Demuxer : public DemuxerStreamProvider {
[email protected]a2b5c472011-09-13 20:24:1061 public:
[email protected]322d22c2013-08-26 18:50:4162 // A new potentially encrypted stream has been parsed.
63 // First parameter - The type of initialization data.
64 // Second parameter - The initialization data associated with the stream.
danakj6aaed6a2016-04-26 01:25:4465 using EncryptedMediaInitDataCB =
66 base::Callback<void(EmeInitDataType type,
67 const std::vector<uint8_t>& init_data)>;
[email protected]322d22c2013-08-26 18:50:4168
servolk81e01e02016-03-05 03:29:1569 // Notifies demuxer clients that media track configuration has been updated
Per515ae3172016-04-18 10:29:3570 // (e.g. the inital stream metadata has been parsed successfully, or a new
servolk81e01e02016-03-05 03:29:1571 // init segment has been parsed successfully in MSE case).
danakj6aaed6a2016-04-26 01:25:4472 using MediaTracksUpdatedCB =
73 base::Callback<void(std::unique_ptr<MediaTracks>)>;
servolk81e01e02016-03-05 03:29:1574
[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,
[email protected]8a561062013-11-22 01:19:3187 const PipelineStatusCB& status_cb,
88 bool enable_text_tracks) = 0;
[email protected]9bfe9b82012-04-02 17:56:2789
sandersdb5e21462016-03-09 01:49:0790 // Indicates that a new Seek() call is on its way. Implementations may abort
91 // pending reads and future Read() calls may return kAborted until Seek() is
92 // executed. |seek_time| is the presentation timestamp of the new Seek() call.
93 //
94 // In actual use, this call occurs on the main thread while Seek() is called
95 // on the media thread. StartWaitingForSeek() can be used to synchronize the
96 // two.
97 //
98 // StartWaitingForSeek() MUST be called before Seek().
99 virtual void StartWaitingForSeek(base::TimeDelta seek_time) = 0;
100
101 // Indicates that the current Seek() operation is obsoleted by a new one.
102 // Implementations can expect that StartWaitingForSeek() will be called
103 // when the current seek operation completes.
104 //
105 // Like StartWaitingForSeek(), CancelPendingSeek() is called on the main
106 // thread. Ordering with respect to the to-be-canceled Seek() is not
107 // guaranteed. Regardless of ordering, implementations may abort pending reads
108 // and may return kAborted from future Read() calls, until after
109 // StartWaitingForSeek() and the following Seek() call occurs.
110 //
111 // |seek_time| should match that passed to the next StartWaitingForSeek(), but
112 // may not if the seek target changes again before the current seek operation
113 // completes or is aborted.
114 virtual void CancelPendingSeek(base::TimeDelta seek_time) = 0;
115
[email protected]a2b5c472011-09-13 20:24:10116 // Carry out any actions required to seek to the given time, executing the
117 // callback upon completion.
[email protected]7c63c2e2013-10-10 20:00:45118 virtual void Seek(base::TimeDelta time,
119 const PipelineStatusCB& status_cb) = 0;
[email protected]a2b5c472011-09-13 20:24:10120
xhwangfcdacaf2014-09-02 18:08:35121 // Stops this demuxer.
[email protected]8b754552013-08-22 00:31:05122 //
xhwangfcdacaf2014-09-02 18:08:35123 // After this call the demuxer may be destroyed. It is illegal to call any
124 // method (including Stop()) after a demuxer has stopped.
125 virtual void Stop() = 0;
[email protected]a2b5c472011-09-13 20:24:10126
dalecurtisb9ec078cf2014-09-16 22:23:21127 // Returns the starting time for the media file; it's always positive.
128 virtual base::TimeDelta GetStartTime() const = 0;
129
[email protected]db66d0092014-04-16 07:15:12130 // Returns Time represented by presentation timestamp 0.
131 // If the timstamps are not associated with a Time, then
132 // a null Time is returned.
133 virtual base::Time GetTimelineOffset() const = 0;
134
wdzierzanowski98368632015-12-04 09:22:01135 // Returns the memory usage in bytes for the demuxer.
dalecurtis83266c72015-10-29 18:43:20136 virtual int64_t GetMemoryUsage() const = 0;
137
[email protected]a2b5c472011-09-13 20:24:10138 private:
[email protected]a2b5c472011-09-13 20:24:10139 DISALLOW_COPY_AND_ASSIGN(Demuxer);
140};
141
142} // namespace media
143
144#endif // MEDIA_BASE_DEMUXER_H_