155 lines
4.1 KiB
C
155 lines
4.1 KiB
C
|
/**
|
||
|
* 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."
|
||
|
*
|
||
|
* @file movieVideoCursor.h
|
||
|
* @author jyelon
|
||
|
* @date 2007-07-02
|
||
|
*/
|
||
|
|
||
|
#ifndef MOVIEVIDEOCURSOR_H
|
||
|
#define MOVIEVIDEOCURSOR_H
|
||
|
|
||
|
#include "pandabase.h"
|
||
|
#include "texture.h"
|
||
|
#include "pointerTo.h"
|
||
|
#include "memoryBase.h"
|
||
|
#include "pStatCollector.h"
|
||
|
#include "deletedChain.h"
|
||
|
#include "typedReferenceCount.h"
|
||
|
|
||
|
class MovieVideo;
|
||
|
class FactoryParams;
|
||
|
class BamWriter;
|
||
|
class BamReader;
|
||
|
|
||
|
/**
|
||
|
* A MovieVideo is actually any source that provides a sequence of video
|
||
|
* frames. That could include an AVI file, a digital camera, or an internet
|
||
|
* TV station. A MovieVideoCursor is a handle that lets you read data
|
||
|
* sequentially from a MovieVideo.
|
||
|
*
|
||
|
* Thread safety: each individual MovieVideoCursor must be owned and accessed
|
||
|
* by a single thread. It is OK for two different threads to open the same
|
||
|
* file at the same time, as long as they use separate MovieVideoCursor
|
||
|
* objects.
|
||
|
*/
|
||
|
class EXPCL_PANDA_MOVIES MovieVideoCursor : public TypedWritableReferenceCount {
|
||
|
protected:
|
||
|
MovieVideoCursor(MovieVideo *src = nullptr);
|
||
|
|
||
|
PUBLISHED:
|
||
|
virtual ~MovieVideoCursor();
|
||
|
PT(MovieVideo) get_source() const;
|
||
|
INLINE int size_x() const;
|
||
|
INLINE int size_y() const;
|
||
|
INLINE int get_num_components() const;
|
||
|
INLINE double length() const;
|
||
|
INLINE bool can_seek() const;
|
||
|
INLINE bool can_seek_fast() const;
|
||
|
INLINE bool aborted() const;
|
||
|
|
||
|
INLINE bool ready() const;
|
||
|
INLINE bool streaming() const;
|
||
|
void setup_texture(Texture *tex) const;
|
||
|
|
||
|
virtual bool set_time(double timestamp, int loop_count);
|
||
|
|
||
|
class EXPCL_PANDA_MOVIES Buffer : public TypedReferenceCount {
|
||
|
public:
|
||
|
ALLOC_DELETED_CHAIN(Buffer);
|
||
|
Buffer(size_t block_size);
|
||
|
|
||
|
PUBLISHED:
|
||
|
virtual ~Buffer();
|
||
|
|
||
|
virtual int compare_timestamp(const Buffer *other) const;
|
||
|
virtual double get_timestamp() const;
|
||
|
|
||
|
public:
|
||
|
unsigned char *_block;
|
||
|
size_t _block_size;
|
||
|
|
||
|
private:
|
||
|
DeletedBufferChain *_deleted_chain;
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
TypedReferenceCount::init_type();
|
||
|
register_type(_type_handle, "MovieVideoCursor::Buffer",
|
||
|
TypedReferenceCount::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;
|
||
|
};
|
||
|
virtual PT(Buffer) fetch_buffer();
|
||
|
|
||
|
virtual void apply_to_texture(const Buffer *buffer, Texture *t, int page);
|
||
|
virtual void apply_to_texture_rgb(const Buffer *buffer, Texture *t, int page);
|
||
|
virtual void apply_to_texture_alpha(const Buffer *buffer, Texture *t, int page, int alpha_src);
|
||
|
|
||
|
protected:
|
||
|
Buffer *get_standard_buffer();
|
||
|
virtual PT(Buffer) make_new_buffer();
|
||
|
|
||
|
protected:
|
||
|
PT(MovieVideo) _source;
|
||
|
int _size_x;
|
||
|
int _size_y;
|
||
|
int _num_components;
|
||
|
double _length;
|
||
|
bool _can_seek;
|
||
|
bool _can_seek_fast;
|
||
|
bool _aborted;
|
||
|
bool _streaming;
|
||
|
bool _ready;
|
||
|
|
||
|
PT(Buffer) _standard_buffer;
|
||
|
|
||
|
static PStatCollector _copy_pcollector;
|
||
|
static PStatCollector _copy_pcollector_ram;
|
||
|
static PStatCollector _copy_pcollector_copy;
|
||
|
|
||
|
public:
|
||
|
virtual void write_datagram(BamWriter *manager, Datagram &dg);
|
||
|
virtual int complete_pointers(TypedWritable **plist, BamReader *manager);
|
||
|
|
||
|
protected:
|
||
|
void fillin(DatagramIterator &scan, BamReader *manager);
|
||
|
|
||
|
public:
|
||
|
static TypeHandle get_class_type() {
|
||
|
return _type_handle;
|
||
|
}
|
||
|
static void init_type() {
|
||
|
TypedWritableReferenceCount::init_type();
|
||
|
register_type(_type_handle, "MovieVideoCursor",
|
||
|
TypedWritableReferenceCount::get_class_type());
|
||
|
Buffer::init_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 "movieVideoCursor.I"
|
||
|
#include "movieVideo.h"
|
||
|
|
||
|
#endif
|