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

Revision 10851, 4.0 kB (checked in by robert, 5 years ago)

From Julen Garcia,"I've been lately working also with the ffmpeg plugin and I implemented pause(), seek() and getReferenceTime(). I think that I have solved the internal clock issues (maybe not in the most elegant way :?"

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);
[10851]68    void pause(bool pause);
[9869]69    void close(bool waitForThreadToExit);
70
[9816]71    virtual void run();
72
73    void setUserData(void * user_data);
74    void setPublishCallback(PublishFunc function);
75
76    int width() const;
77    int height() const;
[9910]78    float pixelAspectRatio() const;
[9816]79    bool alphaChannel() const;
80    double frameRate() const;
81    const uint8_t * image() const;
82
83private:
84
85    typedef std::vector<uint8_t> Buffer;
86
87    void decodeLoop();
88    void findAspectRatio();
[10161]89    void publishFrame(double delay, bool audio_disabled);
[9816]90    double synchronizeVideo(double pts);
[9960]91    void yuva420pToRgba(AVPicture *dst, AVPicture *src, int width, int height);
[9816]92
[9960]93    int convert(AVPicture *dst, int dst_pix_fmt, AVPicture *src,
[9854]94                int src_pix_fmt, int src_width, int src_height);
95
96
[9816]97    static int getBuffer(AVCodecContext * context, AVFrame * picture);
98    static void releaseBuffer(AVCodecContext * context, AVFrame * picture);
99
[9854]100    PacketQueue &           m_packets;
101    FFmpegClocks &          m_clocks;
102    AVStream *              m_stream;
103    AVCodecContext *        m_context;
104    AVCodec *               m_codec;
105    const uint8_t *         m_packet_data;
106    int                     m_bytes_remaining;
107    int64_t                 m_packet_pts;
[9816]108   
[9854]109    FramePtr                m_frame;
110    FramePtr                m_frame_rgba;
[9860]111    Buffer                  m_buffer_rgba[2];
112    int                     m_writeBuffer;
[9816]113
[9854]114    void *                  m_user_data;
115    PublishFunc             m_publish_func;
[9816]116
[9854]117    double                  m_frame_rate;
[9910]118    float                   m_pixel_aspect_ratio;
[9854]119    int                     m_width;
120    int                     m_height;
121    size_t                  m_next_frame_index;
122    bool                    m_alpha_channel;
[9816]123
[10851]124    bool                    m_paused;
[9854]125    volatile bool           m_exit;
126   
[9856]127#ifdef USE_SWSCALE   
[9854]128    struct SwsContext *     m_swscale_ctx;
129#endif
[9816]130};
131
132
133
134
135
136inline void FFmpegDecoderVideo::setUserData(void * const user_data)
137{
138    m_user_data = user_data;
139}
140
141
142inline void FFmpegDecoderVideo::setPublishCallback(const PublishFunc function)
143{
144    m_publish_func = function;
145}
146
147
148inline int FFmpegDecoderVideo::width() const
149{
150    return m_width;
151}
152
153
154inline int FFmpegDecoderVideo::height() const
155{
156    return m_height;
157}
158
159
[9910]160inline float FFmpegDecoderVideo::pixelAspectRatio() const
[9816]161{
[9910]162    return m_pixel_aspect_ratio;
[9816]163}
164
165
166inline bool FFmpegDecoderVideo::alphaChannel() const
167{
168    return m_alpha_channel;
169}
170
171
172inline double FFmpegDecoderVideo::frameRate() const
173{
174    return m_frame_rate;
175}
176
177
178inline const uint8_t * FFmpegDecoderVideo::image() const
179{
[9860]180    return &((m_buffer_rgba[1-m_writeBuffer])[0]);
[9816]181}
182
183
184
185} // namespace osgFFmpeg
186
187
188
189#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_DECODER_VIDEO_H
Note: See TracBrowser for help on using the browser.