1 // Copyright (c) 2012 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 // FFmpegGlue is an interface between FFmpeg and Chrome used to proxy FFmpeg's 6 // read and seek requests to Chrome's internal data structures. The glue works 7 // through the AVIO interface provided by FFmpeg. 8 // 9 // AVIO works through a special AVIOContext created through avio_alloc_context() 10 // which is attached to the AVFormatContext used for demuxing. The AVIO context 11 // is initialized with read and seek methods which FFmpeg calls when necessary. 12 // 13 // During OpenContext() FFmpegGlue will tell FFmpeg to use Chrome's AVIO context 14 // by passing NULL in for the filename parameter to avformat_open_input(). All 15 // FFmpeg operations using the configured AVFormatContext will then redirect 16 // reads and seeks through the glue. 17 // 18 // The glue in turn processes those read and seek requests using the 19 // FFmpegURLProtocol provided during construction. 20 // 21 // FFmpegGlue is also responsible for initializing FFmpeg, which is done once 22 // per process. Initialization includes: turning off log messages, registering 23 // a lock manager, and finally registering all demuxers and codecs. 24 25 #ifndef MEDIA_FILTERS_FFMPEG_GLUE_H_ 26 #define MEDIA_FILTERS_FFMPEG_GLUE_H_ 27 28 #include "base/basictypes.h" 29 #include "base/memory/scoped_ptr.h" 30 #include "media/base/media_export.h" 31 #include "media/ffmpeg/ffmpeg_deleters.h" 32 33 struct AVFormatContext; 34 struct AVIOContext; 35 36 namespace media { 37 38 class MEDIA_EXPORT FFmpegURLProtocol { 39 public: 40 // Read the given amount of bytes into data, returns the number of bytes read 41 // if successful, kReadError otherwise. 42 virtual int Read(int size, uint8* data) = 0; 43 44 // Returns true and the current file position for this file, false if the 45 // file position could not be retrieved. 46 virtual bool GetPosition(int64* position_out) = 0; 47 48 // Returns true if the file position could be set, false otherwise. 49 virtual bool SetPosition(int64 position) = 0; 50 51 // Returns true and the file size, false if the file size could not be 52 // retrieved. 53 virtual bool GetSize(int64* size_out) = 0; 54 55 // Returns false if this protocol supports random seeking. 56 virtual bool IsStreaming() = 0; 57 }; 58 59 class MEDIA_EXPORT FFmpegGlue { 60 public: 61 static void InitializeFFmpeg(); 62 63 // See file documentation for usage. |protocol| must outlive FFmpegGlue. 64 explicit FFmpegGlue(FFmpegURLProtocol* protocol); 65 ~FFmpegGlue(); 66 67 // Opens an AVFormatContext specially prepared to process reads and seeks 68 // through the FFmpegURLProtocol provided during construction. 69 bool OpenContext(); format_context()70 AVFormatContext* format_context() { return format_context_; } 71 72 private: 73 bool open_called_; 74 AVFormatContext* format_context_; 75 scoped_ptr<AVIOContext, ScopedPtrAVFree> avio_context_; 76 77 DISALLOW_COPY_AND_ASSIGN(FFmpegGlue); 78 }; 79 80 } // namespace media 81 82 #endif // MEDIA_FILTERS_FFMPEG_GLUE_H_ 83