root/OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegImageStream.hpp @ 9816

Revision 9816, 2.5 kB (checked in by robert, 6 years ago)

From Tanguy Fautre (Aris Technologies), ffmpeg plugin

RevLine 
[9816]1
2#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_IMAGE_STREAM_H
3#define HEADER_GUARD_OSGFFMPEG_FFMPEG_IMAGE_STREAM_H
4
5#include <osg/ImageStream>
6
7#include <OpenThreads/Condition>
8#include <OpenThreads/Thread>
9
10#include "AudioSinkInterface.hpp"
11#include "FFmpegSampleFormat.hpp"
12
13
14
15#ifdef _WIN32
16    #if defined OSG_LIBRARY_STATIC
17    #define OSGFFMPEG_EXPORT_API
18    #elif defined OSG_LIBRARY || defined osgFFmpeg_EXPORTS
19    #define OSGFFMPEG_EXPORT_API  __declspec(dllexport)
20    #else
21    #define OSGFFMPEG_EXPORT_API  __declspec(dllimport)
22    #endif
23#else
24    #define OSGFFMPEG_EXPORT_API
25#endif
26
27
28
29namespace osgFFmpeg
30{
31
32    class FFmpegDecoder;
33    class FFmpegDecoderAudio;
34    class FFmpegDecoderVideo;
35
36    template <class T>
37    class MessageQueue;
38
39
40    class OSGFFMPEG_EXPORT_API FFmpegImageStream : public osg::ImageStream, public OpenThreads::Thread
41    {
42    public:
43
44        FFmpegImageStream();
45        FFmpegImageStream(const FFmpegImageStream & image, const osg::CopyOp & copyop = osg::CopyOp::SHALLOW_COPY);
46
47        META_Object(osgFFmpeg, FFmpegImageStream);
48
49        bool open(const std::string & filename);
50
51        virtual void play();
52        virtual void pause();
53        virtual void rewind();
54        virtual void quit(bool waitForThreadToExit = true);
55
56        void setAudioSink(osg::ref_ptr<AudioSinkInterface> audio_sink);
57        void fillAudioBuffer(void * const buffer, const size_t size);
58
59        double duration() const;
60
61        bool videoAlphaChannel() const;
62        double videoAspectRatio() const;
63        double videoFrameRate() const;
64
65        bool audioStream() const;
66        int audioFrequency() const;
67        int audioNbChannels() const;
68        FFmpegSampleFormat audioSampleFormat() const;
69
70    private:
71
72        enum Command
73        {
74            CMD_PLAY,
75            CMD_PAUSE,
76            CMD_STOP,
77            CMD_REWIND
78        };
79
80        typedef MessageQueue<Command> CommandQueue;
81        typedef OpenThreads::Mutex Mutex;
82        typedef OpenThreads::Condition Condition;
83
84        virtual ~FFmpegImageStream();
85        virtual void run();
86        virtual void applyLoopingMode();
87
88        bool handleCommand(Command cmd);
89
90        void cmdPlay();
91        void cmdPause();
92        void cmdRewind();
93
94        static void publishNewFrame(const FFmpegDecoderVideo &, void * user_data);
95
96        FFmpegDecoder *    m_decoder;
97        CommandQueue *    m_commands;
98
99        Mutex            m_mutex;
100        Condition        m_frame_published_cond;
101        bool            m_frame_published_flag;
102    };
103
104}
105
106
107
108#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_IMAGE_STREAM_H
Note: See TracBrowser for help on using the browser.