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

Unified Diff: media/filters/ffmpeg_demuxer.h

Issue 39295: Checking in media::FFmpegDemuxer and tests. (Closed)
Patch Set: Fixes Created 11 years, 9 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 | « media/build/media_unittests.vcproj ('k') | media/filters/ffmpeg_demuxer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/ffmpeg_demuxer.h
diff --git a/media/filters/ffmpeg_demuxer.h b/media/filters/ffmpeg_demuxer.h
new file mode 100644
index 0000000000000000000000000000000000000000..895dd65f18dd04e284afe67bcf5db1d7999b1ac9
--- /dev/null
+++ b/media/filters/ffmpeg_demuxer.h
@@ -0,0 +1,127 @@
+// Copyright (c) 2009 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.
+
+// Implements the Demuxer interface using FFmpeg's libavformat. At this time
+// will support demuxing any audio/video format thrown at it. The streams
+// output mime types audio/x-ffmpeg and video/x-ffmpeg and include an integer
+// key FFmpegCodecID which contains the CodecID enumeration value. The CodecIDs
+// can be used to create and initialize the corresponding FFmpeg decoder.
+//
+// FFmpegDemuxer sets the duration of pipeline during initialization by using
+// the duration of the longest audio/video stream.
+//
+// NOTE: since FFmpegDemuxer reads packets sequentially without seeking, media
+// files with very large drift between audio/video streams may result in
+// excessive memory consumption.
+
+#ifndef MEDIA_FILTERS_FFMPEG_DEMUXER_H_
+#define MEDIA_FILTERS_FFMPEG_DEMUXER_H_
+
+#include <deque>
+#include <vector>
+
+#include "base/lock.h"
+#include "media/base/buffers.h"
+#include "media/base/factory.h"
+#include "media/base/filters.h"
+#include "media/base/media_format.h"
+
+// FFmpeg forward declarations.
+struct AVCodecContext;
+struct AVBitStreamFilterContext;
+struct AVFormatContext;
+struct AVPacket;
+struct AVStream;
+enum CodecID;
+
+namespace media {
+
+class FFmpegDemuxer;
+
+class FFmpegDemuxerStream : public DemuxerStream {
+ public:
+ // Maintains a reference to |demuxer| and initializes itself using information
+ // inside |stream|.
+ FFmpegDemuxerStream(FFmpegDemuxer* demuxer, const AVStream& stream);
+
+ virtual ~FFmpegDemuxerStream();
+
+ // Returns true is this stream has pending reads, false otherwise.
+ bool HasPendingReads();
+
+ // Enqueues and takes ownership over the given AVPacket.
+ void EnqueuePacket(AVPacket* packet);
+
+ // Returns the duration of this stream.
+ base::TimeDelta duration() { return duration_; }
+
+ // DemuxerStream implementation.
+ virtual const MediaFormat* GetMediaFormat();
+ virtual void Read(Assignable<Buffer>* buffer);
+
+ private:
+ // Returns true if there are still pending reads.
+ bool FulfillPendingReads();
+
+ FFmpegDemuxer* demuxer_;
+ MediaFormat media_format_;
+ base::TimeDelta time_base_;
+ base::TimeDelta duration_;
+ Lock lock_;
+
+ typedef std::deque< scoped_refptr<Buffer> > InputQueue;
+ InputQueue input_queue_;
+
+ typedef std::deque< scoped_refptr< Assignable<Buffer> > > OutputQueue;
+ OutputQueue output_queue_;
+
+ DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerStream);
+};
+
+class FFmpegDemuxer : public Demuxer {
+ public:
+ // FilterFactory provider.
+ static FilterFactory* CreateFilterFactory() {
+ return new FilterFactoryImpl0<FFmpegDemuxer>();
+ }
+
+ // Called by FFmpegDemuxerStreams to schedule a Demux() task.
+ void ScheduleDemux();
+
+ // MediaFilter implementation.
+ virtual void Stop();
+
+ // Demuxer implementation.
+ virtual bool Initialize(DataSource* data_source);
+ virtual size_t GetNumberOfStreams();
+ virtual DemuxerStream* GetStream(int stream_id);
+
+ private:
+ // Only allow a factory to create this class.
+ friend class FilterFactoryImpl0<FFmpegDemuxer>;
+ FFmpegDemuxer();
+ virtual ~FFmpegDemuxer();
+
+ // Demuxing task scheduled by streams.
+ void Demux();
+
+ // Returns true if any of the streams have pending reads.
+ bool StreamsHavePendingReads();
+
+ // Flag to prevent multiple Demux() tasks from being scheduled.
+ bool demuxing_;
+
+ // FFmpeg context handle.
+ AVFormatContext* format_context_;
+
+ // Vector of streams.
+ typedef std::vector<FFmpegDemuxerStream*> StreamVector;
+ StreamVector streams_;
+
+ DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxer);
+};
+
+} // namespace media
+
+#endif // MEDIA_FILTERS_FFMPEG_DEMUXER_H_
« no previous file with comments | « media/build/media_unittests.vcproj ('k') | media/filters/ffmpeg_demuxer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698