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