Home | History | Annotate | Download | only in mp2t
      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