Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(397)

Unified Diff: media/formats/mp2t/es_adapter_video.h

Issue 364823008: Mpeg2TS - estimate duration for video frames. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix MEDIA_EXPORT needed by the ES adapter unit test. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | media/formats/mp2t/es_adapter_video.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/formats/mp2t/es_adapter_video.h
diff --git a/media/formats/mp2t/es_adapter_video.h b/media/formats/mp2t/es_adapter_video.h
new file mode 100644
index 0000000000000000000000000000000000000000..0739fc3c276904757cab2dca1a6390fb63d84415
--- /dev/null
+++ b/media/formats/mp2t/es_adapter_video.h
@@ -0,0 +1,98 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_FORMATS_MP2T_ES_ADAPTER_VIDEO_H_
+#define MEDIA_FORMATS_MP2T_ES_ADAPTER_VIDEO_H_
+
+#include <deque>
+#include <list>
+#include <utility>
+
+#include "base/callback.h"
+#include "base/memory/ref_counted.h"
+#include "base/time/time.h"
+#include "media/base/media_export.h"
+
+namespace media {
+class StreamParserBuffer;
+class VideoDecoderConfig;
+
+namespace mp2t {
+
+// Some constraints of the MSE spec are not necessarily met by video streams
+// inside an Mpeg2 TS stream.
+// The goal of the ES adapter is to modify the incoming buffers to meet these
+// constraints, e.g.
+// - get the frame duration,
+// - replace the leading non-key frames by the first key frame to avoid
+// creating a hole in the video timeline.
+class MEDIA_EXPORT EsAdapterVideo {
+ public:
+ typedef base::Callback<void(const VideoDecoderConfig&)> NewVideoConfigCB;
+ typedef base::Callback<void(scoped_refptr<StreamParserBuffer>)> EmitBufferCB;
+
+ EsAdapterVideo(
+ const NewVideoConfigCB& new_video_config_cb,
+ const EmitBufferCB& emit_buffer_cb);
+ ~EsAdapterVideo();
+
+ // Force the emission of the pending video buffers.
+ void Flush();
+
+ // Reset the ES adapter to its initial state.
+ void Reset();
+
+ // Provide the configuration that applies to the upcoming video buffers.
+ void OnConfigChanged(const VideoDecoderConfig& video_decoder_config);
+
+ // Provide a new video buffer.
+ void OnNewBuffer(
+ const scoped_refptr<StreamParserBuffer>& stream_parser_buffer);
+
+ private:
+ typedef std::deque<scoped_refptr<StreamParserBuffer> > BufferQueue;
+ typedef std::pair<int64, VideoDecoderConfig> ConfigEntry;
+
+ void ProcessPendingBuffers(bool flush);
+
+ // Return the PTS of the frame that comes just after |current_pts| in
+ // presentation order. Return kNoTimestamp() if not found.
+ base::TimeDelta GetNextFramePts(base::TimeDelta current_pts);
+
+ // Replace the leading non key frames by |stream_parser_buffer|
+ // (this one must be a key frame).
+ void ReplaceDiscardedFrames(
+ const scoped_refptr<StreamParserBuffer>& stream_parser_buffer);
+
+ NewVideoConfigCB new_video_config_cb_;
+ EmitBufferCB emit_buffer_cb_;
+
+ bool has_valid_config_;
+ bool has_valid_frame_;
+
+ // Duration of the last video frame.
+ base::TimeDelta last_frame_duration_;
+
+ // Association between a video config and a buffer index.
+ std::list<ConfigEntry> config_list_;
+
+ // Global index of the first buffer in |buffer_list_|.
+ int64 buffer_index_;
+
+ // List of buffer to be emitted and PTS of frames already emitted.
+ BufferQueue buffer_list_;
+ std::list<base::TimeDelta> emitted_pts_;
+
+ // - Minimum PTS of discarded frames.
+ // - DTS of discarded frames.
+ base::TimeDelta discarded_frames_min_pts_;
+ std::list<base::TimeDelta> discarded_frames_dts_;
+
+ DISALLOW_COPY_AND_ASSIGN(EsAdapterVideo);
+};
+
+} // namespace mp2t
+} // namespace media
+
+#endif // MEDIA_FORMATS_MP2T_ES_ADAPTER_VIDEO_H_
« no previous file with comments | « no previous file | media/formats/mp2t/es_adapter_video.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698