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

Revision 9861, 3.8 kB (checked in by robert, 5 years ago)

Removed boost reference and cleaned up debug output

RevLine 
[9816]1
2#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_VIDEO_H
3#define HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_VIDEO_H
4
5
[9840]6#include "FFmpegHeaders.hpp"
[9816]7#include "BoundedMessageQueue.hpp"
8#include "FFmpegClocks.hpp"
9#include "FFmpegPacket.hpp"
10
[9818]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    double synchronizeVideo(double pts);
88    void yuva420pToRgba(AVPicture *dst, const AVPicture *src, int width, int height);
89
[9854]90    int convert(AVPicture *dst, int dst_pix_fmt, const AVPicture *src,
91                int src_pix_fmt, int src_width, int src_height);
92
93
[9816]94    static int getBuffer(AVCodecContext * context, AVFrame * picture);
95    static void releaseBuffer(AVCodecContext * context, AVFrame * picture);
96
[9854]97    PacketQueue &           m_packets;
98    FFmpegClocks &          m_clocks;
99    AVStream *              m_stream;
100    AVCodecContext *        m_context;
101    AVCodec *               m_codec;
102    const uint8_t *         m_packet_data;
103    int                     m_bytes_remaining;
104    int64_t                 m_packet_pts;
[9816]105   
[9854]106    FramePtr                m_frame;
107    FramePtr                m_frame_rgba;
[9860]108    Buffer                  m_buffer_rgba[2];
109    int                     m_writeBuffer;
[9816]110
[9854]111    void *                  m_user_data;
112    PublishFunc             m_publish_func;
[9816]113
[9854]114    double                  m_frame_rate;
115    double                  m_aspect_ratio;
116    int                     m_width;
117    int                     m_height;
118    size_t                  m_next_frame_index;
119    bool                    m_alpha_channel;
[9816]120
[9854]121    volatile bool           m_exit;
122   
[9856]123#ifdef USE_SWSCALE   
[9854]124    struct SwsContext *     m_swscale_ctx;
125#endif
[9816]126};
127
128
129
130
131
132inline void FFmpegDecoderVideo::setUserData(void * const user_data)
133{
134    m_user_data = user_data;
135}
136
137
138inline void FFmpegDecoderVideo::setPublishCallback(const PublishFunc function)
139{
140    m_publish_func = function;
141}
142
143
144inline int FFmpegDecoderVideo::width() const
145{
146    return m_width;
147}
148
149
150inline int FFmpegDecoderVideo::height() const
151{
152    return m_height;
153}
154
155
156inline double FFmpegDecoderVideo::aspectRatio() const
157{
158    return m_aspect_ratio;
159}
160
161
162inline bool FFmpegDecoderVideo::alphaChannel() const
163{
164    return m_alpha_channel;
165}
166
167
168inline double FFmpegDecoderVideo::frameRate() const
169{
170    return m_frame_rate;
171}
172
173
174inline const uint8_t * FFmpegDecoderVideo::image() const
175{
[9860]176    return &((m_buffer_rgba[1-m_writeBuffer])[0]);
[9816]177}
178
179
180
181} // namespace osgFFmpeg
182
183
184
185#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_VIDEO_H
Note: See TracBrowser for help on using the browser.