
#ifndef HEADER_GUARD_OSGFFMPEG_FFMPEG_PACKET_H
#define HEADER_GUARD_OSGFFMPEG_FFMPEG_PACKET_H

#include "FFmpegHeaders.hpp"



namespace osgFFmpeg
{

    struct FFmpegPacket
    {

        enum Type
        {
            PACKET_DATA,
            PACKET_END_OF_STREAM,
            PACKET_FLUSH
        };


        FFmpegPacket() :
            type(PACKET_DATA)
        {
            packet.data = 0;
        }

        explicit FFmpegPacket(const Type type) : 
            type(type)
        { 
            packet.data = 0;
        }

        explicit FFmpegPacket(const AVPacket & packet) : 
            packet(packet),
            type(PACKET_DATA)
        { 
            
        }

        void clear()
        {
            if (packet.data != 0)
                av_free_packet(&packet);

            release();
        }

        void release()
        {
            packet.data = 0;
            type = PACKET_DATA;
        }

        bool valid() const
        {
            return (type != PACKET_DATA) ^ (packet.data != 0);
        }

        bool operator ! () const
        {
            return ! valid();
        }

        AVPacket    packet;
        Type        type;
    };

    struct FFmpegPacketClear
    {
        void operator () (FFmpegPacket & packet) const
        {
            packet.clear();
        }
    };

}



#endif // HEADER_GUARD_OSGFFMPEG_FFMPEG_PACKET_H
