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 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 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