root/OpenSceneGraph/branches/osg-cocoa-dev/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp @ 9846

Revision 9846, 3.6 kB (checked in by shuber, 6 years ago)

merging from trunk using

svn merge -r 9837:9843 http://www.openscenegraph.org/svn/osg/OpenSceneGraph/trunk

Line 
1
2#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_VIDEO_H
3#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_VIDEO_H
4
5
6#include "FFmpegHeaders.hpp"
7#include "BoundedMessageQueue.hpp"
8#include "FFmpegClocks.hpp"
9#include "FFmpegPacket.hpp"
10
11#include <boost/shared_ptr.hpp>
12#include <OpenThreads/Thread>
13#include <vector>
14
15namespace osgFFmpeg {
16
17class FramePtr
18{
19    public:
20   
21        typedef AVFrame T;
22   
23        explicit FramePtr() : _ptr(0) {}
24        explicit FramePtr(T* ptr) : _ptr(ptr) {}
25       
26        ~FramePtr()
27        {
28            cleanup();
29        }
30       
31        T* get() { return _ptr; }
32
33        T * operator-> () const // never throws
34        {
35            return _ptr;
36        }
37
38        void reset(T* ptr)
39        {
40            if (ptr==_ptr) return;
41            cleanup();
42            _ptr = ptr;
43        }
44
45        void cleanup()
46        {
47            if (_ptr) av_free(_ptr);
48            _ptr = 0;
49        }
50       
51       
52
53    protected:
54   
55        T* _ptr;
56};
57
58class FFmpegDecoderVideo : public OpenThreads::Thread
59{
60public:
61
62    typedef BoundedMessageQueue<FFmpegPacket> PacketQueue;
63    typedef void (* PublishFunc) (const FFmpegDecoderVideo & decoder, void * user_data);
64
65    FFmpegDecoderVideo(PacketQueue & packets, FFmpegClocks & clocks);
66    ~FFmpegDecoderVideo();
67
68    void open(AVStream * stream);
69    virtual void run();
70
71    void setUserData(void * user_data);
72    void setPublishCallback(PublishFunc function);
73
74    int width() const;
75    int height() const;
76    double aspectRatio() const;
77    bool alphaChannel() const;
78    double frameRate() const;
79    const uint8_t * image() const;
80
81private:
82
83    typedef std::vector<uint8_t> Buffer;
84
85    void decodeLoop();
86    void findAspectRatio();
87    void publishFrame(double delay);
88    void swapBuffers();
89    double synchronizeVideo(double pts);
90    void yuva420pToRgba(AVPicture *dst, const AVPicture *src, int width, int height);
91
92    static int getBuffer(AVCodecContext * context, AVFrame * picture);
93    static void releaseBuffer(AVCodecContext * context, AVFrame * picture);
94
95    PacketQueue &        m_packets;
96    FFmpegClocks &        m_clocks;
97    AVStream *            m_stream;
98    AVCodecContext *    m_context;
99    AVCodec *            m_codec;
100    const uint8_t *        m_packet_data;
101    int                    m_bytes_remaining;
102    int64_t                m_packet_pts;
103   
104    FramePtr            m_frame;
105    FramePtr            m_frame_rgba;
106    Buffer                m_buffer_rgba;
107    Buffer                m_buffer_rgba_public;
108
109    void *                m_user_data;
110    PublishFunc            m_publish_func;
111
112    double                m_frame_rate;
113    double                m_aspect_ratio;
114    int                    m_width;
115    int                    m_height;
116    size_t                m_next_frame_index;
117    bool                m_alpha_channel;
118
119    volatile bool        m_exit;
120};
121
122
123
124
125
126inline void FFmpegDecoderVideo::setUserData(void * const user_data)
127{
128    m_user_data = user_data;
129}
130
131
132inline void FFmpegDecoderVideo::setPublishCallback(const PublishFunc function)
133{
134    m_publish_func = function;
135}
136
137
138inline int FFmpegDecoderVideo::width() const
139{
140    return m_width;
141}
142
143
144inline int FFmpegDecoderVideo::height() const
145{
146    return m_height;
147}
148
149
150inline double FFmpegDecoderVideo::aspectRatio() const
151{
152    return m_aspect_ratio;
153}
154
155
156inline bool FFmpegDecoderVideo::alphaChannel() const
157{
158    return m_alpha_channel;
159}
160
161
162inline double FFmpegDecoderVideo::frameRate() const
163{
164    return m_frame_rate;
165}
166
167
168inline const uint8_t * FFmpegDecoderVideo::image() const
169{
170    return &m_buffer_rgba_public[0];
171}
172
173
174
175} // namespace osgFFmpeg
176
177
178
179#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_VIDEO_H
Note: See TracBrowser for help on using the browser.