// Filename: ffmpegTexture.h // Created by: zacpavlov (19Aug05) // //////////////////////////////////////////////////////////////////// // // PANDA 3D SOFTWARE // Copyright (c) Carnegie Mellon University. All rights reserved. // // All use of this software is subject to the terms of the revised BSD // license. You should have received a copy of this license along // with this source code in a file named "LICENSE." // //////////////////////////////////////////////////////////////////// #ifndef FFMPEGTEXTURE_H #define FFMPEGTEXTURE_H #include "pandabase.h" #ifdef HAVE_FFMPEG #include "videoTexture.h" #include "ffmpegVirtualFile.h" extern "C" { #include "libavcodec/avcodec.h" #include "libavformat/avformat.h" #ifdef HAVE_SWSCALE #include "libswscale/swscale.h" #endif } //////////////////////////////////////////////////////////////////// // Class : FFMpegTexture // Description : //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_GRUTIL FFMpegTexture : public VideoTexture { PUBLISHED: FFMpegTexture(const string &name = string()); protected: FFMpegTexture(const FFMpegTexture ©); PUBLISHED: virtual ~FFMpegTexture(); public: static PT(Texture) make_texture(); protected: virtual PT(Texture) do_make_copy(); void do_assign(const FFMpegTexture ©); virtual void update_frame(int frame); virtual bool do_read_one(const Filename &fullpath, const Filename &alpha_fullpath, int z, int n, int primary_file_num_channels, int alpha_file_channel, const LoaderOptions &options, bool header_only, BamCacheRecord *record); virtual bool do_load_one(const PNMImage &pnmimage, const string &name, int z, int n, const LoaderOptions &options); virtual bool do_has_bam_rawdata() const; virtual void do_get_bam_rawdata(); private: class VideoPage; class VideoStream; VideoPage &modify_page(int z); bool do_reconsider_video_properties(const VideoStream &stream, int num_components, int z, const LoaderOptions &options); void do_update(); class VideoStream { public: VideoStream(); VideoStream(const VideoStream ©); ~VideoStream(); void operator = (const VideoStream ©); bool read(const Filename &filename); bool read(const SubfileInfo &info); void clear(); INLINE bool is_valid() const; INLINE bool is_from_file() const; bool get_frame_data(int frame); void write_datagram_rawdata(BamWriter *manager, Datagram &me); void fillin_rawdata(DatagramIterator &scan, BamReader *manager); private: bool continue_read(); int read_video_frame(AVPacket *packet); public: AVCodecContext *_codec_context; AVFormatContext *_format_context; FfmpegVirtualFile _ffvfile; int _stream_number; AVFrame *_frame; AVFrame *_frame_out; Filename _filename; SubfileInfo _file_info; int _next_frame_number; int _image_size_bytes; private: unsigned char * _raw_data; AVCodec *_codec; }; class VideoPage { public: INLINE VideoPage(); INLINE VideoPage(const VideoPage ©); INLINE ~VideoPage(); INLINE void operator = (const VideoPage ©); void write_datagram_rawdata(BamWriter *manager, Datagram &me); void fillin_rawdata(DatagramIterator &scan, BamReader *manager); VideoStream _color, _alpha; }; typedef pvector Pages; Pages _pages; public: static void register_with_read_factory(); static TypedWritable *make_from_bam(const FactoryParams ¶ms); virtual void do_write_datagram_rawdata(BamWriter *manager, Datagram &me); virtual void do_fillin_rawdata(DatagramIterator &scan, BamReader *manager); public: static TypeHandle get_class_type() { return _type_handle; } static void init_type() { VideoTexture::init_type(); register_type(_type_handle, "FFMpegTexture", VideoTexture::get_class_type()); } virtual TypeHandle get_type() const { return get_class_type(); } virtual TypeHandle force_init_type() {init_type(); return get_class_type();} private: static TypeHandle _type_handle; }; #include "ffmpegTexture.I" #endif // HAVE_OPENCV #endif