root/OpenSceneGraph/trunk/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.hpp @ 9826

Revision 9826, 3.6 kB (checked in by robert, 5 years ago)

Ported across from using boost pointers, and prepped for integration of audio interface into core OSG

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