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_ES_ADAPTER_VIDEO_H_
      6 #define MEDIA_FORMATS_MP2T_ES_ADAPTER_VIDEO_H_
      7 
      8 #include <deque>
      9 #include <list>
     10 #include <utility>
     11 
     12 #include "base/callback.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/time/time.h"
     15 #include "media/base/media_export.h"
     16 #include "media/base/stream_parser_buffer.h"
     17 
     18 namespace media {
     19 
     20 class VideoDecoderConfig;
     21 
     22 namespace mp2t {
     23 
     24 // Some constraints of the MSE spec are not necessarily met by video streams
     25 // inside an Mpeg2 TS stream.
     26 // The goal of the ES adapter is to modify the incoming buffers to meet these
     27 // constraints, e.g.
     28 // - get the frame duration,
     29 // - replace the leading non-key frames by the first key frame to avoid
     30 //   creating a hole in the video timeline.
     31 class MEDIA_EXPORT EsAdapterVideo {
     32  public:
     33   typedef base::Callback<void(const VideoDecoderConfig&)> NewVideoConfigCB;
     34   typedef base::Callback<void(scoped_refptr<StreamParserBuffer>)> EmitBufferCB;
     35 
     36   EsAdapterVideo(
     37       const NewVideoConfigCB& new_video_config_cb,
     38       const EmitBufferCB& emit_buffer_cb);
     39   ~EsAdapterVideo();
     40 
     41   // Force the emission of the pending video buffers.
     42   void Flush();
     43 
     44   // Reset the ES adapter to its initial state.
     45   void Reset();
     46 
     47   // Provide the configuration that applies to the upcoming video buffers.
     48   void OnConfigChanged(const VideoDecoderConfig& video_decoder_config);
     49 
     50   // Provide a new video buffer.
     51   void OnNewBuffer(
     52       const scoped_refptr<StreamParserBuffer>& stream_parser_buffer);
     53 
     54  private:
     55   typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue;
     56   typedef std::pair<int64, VideoDecoderConfig> ConfigEntry;
     57 
     58   void ProcessPendingBuffers(bool flush);
     59 
     60   // Return the PTS of the frame that comes just after |current_pts| in
     61   // presentation order. Return kNoTimestamp() if not found.
     62   base::TimeDelta GetNextFramePts(base::TimeDelta current_pts);
     63 
     64   // Replace the leading non key frames by |stream_parser_buffer|
     65   // (this one must be a key frame).
     66   void ReplaceDiscardedFrames(
     67       const scoped_refptr<StreamParserBuffer>& stream_parser_buffer);
     68 
     69   NewVideoConfigCB new_video_config_cb_;
     70   EmitBufferCB emit_buffer_cb_;
     71 
     72   bool has_valid_config_;
     73   bool has_valid_frame_;
     74 
     75   // Duration of the last video frame.
     76   base::TimeDelta last_frame_duration_;
     77 
     78   // Association between a video config and a buffer index.
     79   std::list<ConfigEntry> config_list_;
     80 
     81   // Global index of the first buffer in |buffer_list_|.
     82   int64 buffer_index_;
     83 
     84   // List of buffer to be emitted and PTS of frames already emitted.
     85   BufferQueue buffer_list_;
     86   std::list<base::TimeDelta> emitted_pts_;
     87 
     88   // - Minimum PTS of discarded frames.
     89   // - DTS of discarded frames.
     90   base::TimeDelta discarded_frames_min_pts_;
     91   std::list<DecodeTimestamp> discarded_frames_dts_;
     92 
     93   DISALLOW_COPY_AND_ASSIGN(EsAdapterVideo);
     94 };
     95 
     96 }  // namespace mp2t
     97 }  // namespace media
     98 
     99 #endif  // MEDIA_FORMATS_MP2T_ES_ADAPTER_VIDEO_H_
    100