• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // 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_MP2T_MP2T_STREAM_PARSER_H_
6 #define MEDIA_MP2T_MP2T_STREAM_PARSER_H_
7 
8 #include <list>
9 #include <map>
10 
11 #include "base/memory/ref_counted.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "media/base/audio_decoder_config.h"
14 #include "media/base/byte_queue.h"
15 #include "media/base/media_export.h"
16 #include "media/base/stream_parser.h"
17 #include "media/base/video_decoder_config.h"
18 
19 namespace media {
20 
21 class StreamParserBuffer;
22 
23 namespace mp2t {
24 
25 class PidState;
26 
27 class MEDIA_EXPORT Mp2tStreamParser : public StreamParser {
28  public:
29   explicit Mp2tStreamParser(bool sbr_in_mimetype);
30   virtual ~Mp2tStreamParser();
31 
32   // StreamParser implementation.
33   virtual void Init(const InitCB& init_cb,
34                     const NewConfigCB& config_cb,
35                     const NewBuffersCB& new_buffers_cb,
36                     const NewTextBuffersCB& text_cb,
37                     const NeedKeyCB& need_key_cb,
38                     const NewMediaSegmentCB& new_segment_cb,
39                     const base::Closure& end_of_segment_cb,
40                     const LogCB& log_cb) OVERRIDE;
41   virtual void Flush() OVERRIDE;
42   virtual bool Parse(const uint8* buf, int size) OVERRIDE;
43 
44  private:
45   typedef std::map<int, PidState*> PidMap;
46 
47   struct BufferQueueWithConfig {
48     BufferQueueWithConfig(bool is_cfg_sent,
49                           const AudioDecoderConfig& audio_cfg,
50                           const VideoDecoderConfig& video_cfg);
51     ~BufferQueueWithConfig();
52 
53     bool is_config_sent;
54     AudioDecoderConfig audio_config;
55     StreamParser::BufferQueue audio_queue;
56     VideoDecoderConfig video_config;
57     StreamParser::BufferQueue video_queue;
58   };
59 
60   // Callback invoked to register a Program Map Table.
61   // Note: Does nothing if the PID is already registered.
62   void RegisterPmt(int program_number, int pmt_pid);
63 
64   // Callback invoked to register a PES pid.
65   // Possible values for |stream_type| are defined in:
66   // ISO-13818.1 / ITU H.222 Table 2.34 "Stream type assignments".
67   // |pes_pid| is part of the Program Map Table refered by |pmt_pid|.
68   void RegisterPes(int pmt_pid, int pes_pid, int stream_type);
69 
70   // Since the StreamParser interface allows only one audio & video streams,
71   // an automatic PID filtering should be applied to select the audio & video
72   // streams.
73   void UpdatePidFilter();
74 
75   // Callback invoked each time the audio/video decoder configuration is
76   // changed.
77   void OnVideoConfigChanged(int pes_pid,
78                             const VideoDecoderConfig& video_decoder_config);
79   void OnAudioConfigChanged(int pes_pid,
80                             const AudioDecoderConfig& audio_decoder_config);
81 
82   // Invoke the initialization callback if needed.
83   bool FinishInitializationIfNeeded();
84 
85   // Callback invoked by the ES stream parser
86   // to emit a new audio/video access unit.
87   void OnEmitAudioBuffer(
88       int pes_pid,
89       scoped_refptr<StreamParserBuffer> stream_parser_buffer);
90   void OnEmitVideoBuffer(
91       int pes_pid,
92       scoped_refptr<StreamParserBuffer> stream_parser_buffer);
93   bool EmitRemainingBuffers();
94 
95   // List of callbacks.
96   InitCB init_cb_;
97   NewConfigCB config_cb_;
98   NewBuffersCB new_buffers_cb_;
99   NeedKeyCB need_key_cb_;
100   NewMediaSegmentCB new_segment_cb_;
101   base::Closure end_of_segment_cb_;
102   LogCB log_cb_;
103 
104   // True when AAC SBR extension is signalled in the mimetype
105   // (mp4a.40.5 in the codecs parameter).
106   bool sbr_in_mimetype_;
107 
108   // Bytes of the TS stream.
109   ByteQueue ts_byte_queue_;
110 
111   // List of PIDs and their state.
112   PidMap pids_;
113 
114   // Selected audio and video PIDs.
115   int selected_audio_pid_;
116   int selected_video_pid_;
117 
118   // Pending audio & video buffers.
119   std::list<BufferQueueWithConfig> buffer_queue_chain_;
120 
121   // Whether |init_cb_| has been invoked.
122   bool is_initialized_;
123 
124   // Indicate whether a segment was started.
125   bool segment_started_;
126   bool first_video_frame_in_segment_;
127   base::TimeDelta time_offset_;
128 
129   DISALLOW_COPY_AND_ASSIGN(Mp2tStreamParser);
130 };
131 
132 }  // namespace mp2t
133 }  // namespace media
134 
135 #endif
136 
137