1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef MEDIA_BASE_TEXT_RENDERER_H_
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define MEDIA_BASE_TEXT_RENDERER_H_
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <map>
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <set>
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/callback.h"
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/memory/weak_ptr.h"
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/base/demuxer_stream.h"
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/base/media_export.h"
16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/base/pipeline_status.h"
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/base/text_track.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace base {
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MessageLoopProxy;
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace media {
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TextCue;
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class TextTrackConfig;
27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Receives decoder buffers from the upstream demuxer, decodes them to text
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// cues, and then passes them onto the TextTrack object associated with each
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// demuxer text stream.
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MEDIA_EXPORT TextRenderer {
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |message_loop| is the thread on which TextRenderer will execute.
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  //
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |add_text_track_cb] is called when the demuxer requests (via its host)
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // that a new text track be created.
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TextRenderer(const scoped_refptr<base::MessageLoopProxy>& message_loop,
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)               const AddTextTrackCB& add_text_track_cb);
39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ~TextRenderer();
40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |ended_cb| is executed when all of the text tracks have reached
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // end of stream, following a play request.
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Initialize(const base::Closure& ended_cb);
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Start text track cue decoding and rendering, executing |callback| when
46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // playback is underway.
47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Play(const base::Closure& callback);
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Temporarily suspend decoding and rendering, executing |callback| when
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // playback has been suspended.
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Pause(const base::Closure& callback);
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Discard any text data, executing |callback| when completed.
54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Flush(const base::Closure& callback);
55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Stop all operations in preparation for being deleted, executing |callback|
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // when complete.
58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Stop(const base::Closure& callback);
59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Add new |text_stream|, having the indicated |config|, to the text stream
61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // collection managed by this text renderer.
62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void AddTextStream(DemuxerStream* text_stream,
63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                     const TextTrackConfig& config);
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Remove |text_stream| from the text stream collection.
66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void RemoveTextStream(DemuxerStream* text_stream);
67f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Returns true if there are extant text tracks.
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool HasTracks() const;
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct TextTrackState {
73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // To determine read progress.
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    enum ReadState {
75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      kReadIdle,
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      kReadPending
77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    };
78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    explicit TextTrackState(scoped_ptr<TextTrack> text_track);
80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ~TextTrackState();
81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ReadState read_state;
83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    scoped_ptr<TextTrack> text_track;
84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Callback delivered by the demuxer |text_stream| when
87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // a read from the stream completes.
88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void BufferReady(DemuxerStream* text_stream,
89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   DemuxerStream::Status status,
90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   const scoped_refptr<DecoderBuffer>& input);
91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Dispatches the decoded cue delivered on the demuxer's |text_stream|.
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CueReady(DemuxerStream* text_stream,
94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                const scoped_refptr<TextCue>& text_cue);
95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Dispatched when the AddTextTrackCB completes, after having created
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // the TextTrack object associated with |text_stream|.
98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void OnAddTextTrackDone(DemuxerStream* text_stream,
99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                          scoped_ptr<TextTrack> text_track);
100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Utility function to post a read request on |text_stream|.
102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void Read(TextTrackState* state, DemuxerStream* text_stream);
103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_;
105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtrFactory<TextRenderer> weak_factory_;
106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::WeakPtr<TextRenderer> weak_this_;
107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const AddTextTrackCB add_text_track_cb_;
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Callbacks provided during Initialize().
110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::Closure ended_cb_;
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Callback provided to Pause().
113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::Closure pause_cb_;
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Callback provided to Stop().
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::Closure stop_cb_;
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Simple state tracking variable.
119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  enum State {
120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    kUninitialized,
121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    kPausePending,
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    kPaused,
123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    kPlaying,
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    kEnded,
125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    kStopPending,
126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    kStopped
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  };
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  State state_;
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef std::map<DemuxerStream*, TextTrackState*> TextTrackStateMap;
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TextTrackStateMap text_track_state_map_;
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Indicates how many read requests are in flight.
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int pending_read_count_;
135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Indicates which text streams have not delivered end-of-stream yet.
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef std::set<DemuxerStream*> PendingEosSet;
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  PendingEosSet pending_eos_set_;
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_IMPLICIT_CONSTRUCTORS(TextRenderer);
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace media
144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // MEDIA_BASE_TEXT_RENDERER_H_
146