1// Copyright 2014 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_FORMATS_MP2T_MP2T_STREAM_PARSER_H_
6#define MEDIA_FORMATS_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
19namespace media {
20
21class StreamParserBuffer;
22
23namespace mp2t {
24
25class PidState;
26
27class 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                    bool ignore_text_tracks,
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  // At the beginning of a new segment, some video frames might be discarded.
96  // This function fills the hole by duplicating the first valid key frame
97  // given by |stream_parser_buffer|.
98  void FillVideoGap(
99      const scoped_refptr<StreamParserBuffer>& stream_parser_buffer);
100
101  // List of callbacks.
102  InitCB init_cb_;
103  NewConfigCB config_cb_;
104  NewBuffersCB new_buffers_cb_;
105  NeedKeyCB need_key_cb_;
106  NewMediaSegmentCB new_segment_cb_;
107  base::Closure end_of_segment_cb_;
108  LogCB log_cb_;
109
110  // True when AAC SBR extension is signalled in the mimetype
111  // (mp4a.40.5 in the codecs parameter).
112  bool sbr_in_mimetype_;
113
114  // Bytes of the TS stream.
115  ByteQueue ts_byte_queue_;
116
117  // List of PIDs and their state.
118  PidMap pids_;
119
120  // Selected audio and video PIDs.
121  int selected_audio_pid_;
122  int selected_video_pid_;
123
124  // DTS of discarded buffers.
125  // Min PTS of discarded buffers.
126  std::list<base::TimeDelta> discarded_frames_dts_;
127  base::TimeDelta discarded_frames_min_pts_;
128
129  // Pending audio & video buffers.
130  std::list<BufferQueueWithConfig> buffer_queue_chain_;
131
132  // Whether |init_cb_| has been invoked.
133  bool is_initialized_;
134
135  // Indicate whether a segment was started.
136  bool segment_started_;
137  bool first_video_frame_in_segment_;
138  base::TimeDelta time_offset_;
139
140  DISALLOW_COPY_AND_ASSIGN(Mp2tStreamParser);
141};
142
143}  // namespace mp2t
144}  // namespace media
145
146#endif
147
148