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