Panda3D

Loading...
Searching...
No Matches
ffmpegVideoCursor.h
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file ffmpegVideoCursor.h
10 * @author jyelon
11 * @date 2007-08-01
12 */
13
14#ifndef FFMPEGVIDEOCURSOR_H
15#define FFMPEGVIDEOCURSOR_H
16
17#include "pandabase.h"
18#include "movieVideoCursor.h"
19#include "texture.h"
20#include "pointerTo.h"
21#include "ffmpegVirtualFile.h"
22#include "genericThread.h"
23#include "threadPriority.h"
24#include "pmutex.h"
25#include "reMutex.h"
26#include "conditionVar.h"
27#include "pdeque.h"
28
29 class FfmpegVideo;
30 struct AVFormatContext;
31 struct AVCodecContext;
32 struct AVStream;
33 struct AVPacket;
34 struct AVFrame;
35 struct SwsContext;
36
37/**
38 *
39 */
40 class EXPCL_FFMPEG FfmpegVideoCursor : public MovieVideoCursor {
41 private:
42 FfmpegVideoCursor();
43 void init_from(FfmpegVideo *src);
44
45PUBLISHED:
46 FfmpegVideoCursor(FfmpegVideo *src);
47 virtual ~FfmpegVideoCursor();
48
49 void set_max_readahead_frames(int max_readahead_frames);
50 int get_max_readahead_frames() const;
51
52 void set_thread_priority(ThreadPriority thread_priority);
53 ThreadPriority get_thread_priority() const;
54
55 void start_thread();
56 BLOCKING void stop_thread();
57 bool is_thread_started() const;
58
59 public:
60 virtual bool set_time(double timestamp, int loop_count);
61 virtual PT(Buffer) fetch_buffer();
62
63 public:
64 // Nested class must be public for PT(FfmpegBuffer) to work correctly.
65 class EXPCL_FFMPEG FfmpegBuffer : public Buffer {
66 public:
67 ALLOC_DELETED_CHAIN(FfmpegBuffer);
68 INLINE FfmpegBuffer(size_t block_size, double video_timebase);
69 virtual int compare_timestamp(const Buffer *other) const;
70 virtual double get_timestamp() const;
71
72 int _begin_frame;
73 int _end_frame;
74 double _video_timebase;
75
76 public:
77 static TypeHandle get_class_type() {
78 return _type_handle;
79 }
80 static void init_type() {
81 Buffer::init_type();
82 register_type(_type_handle, "FfmpegVideoCursor::FfmpegBuffer",
83 Buffer::get_class_type());
84 }
85 virtual TypeHandle get_type() const {
86 return get_class_type();
87 }
88 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
89
90 private:
91 static TypeHandle _type_handle;
92 };
93
94 protected:
95 virtual PT(Buffer) make_new_buffer();
96
97 private:
98 bool open_stream();
99 void close_stream();
100 void cleanup();
101
102 Filename _filename;
103 std::string _sync_name;
104 int _max_readahead_frames;
105 ThreadPriority _thread_priority;
106 PT(GenericThread) _thread;
107
108 int _pixel_format;
109
110 // This global Mutex protects calls to avcodec_opencloseetc.
111 static ReMutex _av_lock;
112
113 // Protects _readahead_frames and all the immediately following members.
114 Mutex _lock;
115
116 // Condition: the thread has something to do.
117 ConditionVar _action_cvar;
118
119 typedef pdeque<PT(FfmpegBuffer) > Buffers;
120 Buffers _readahead_frames;
121 enum ThreadStatus {
122 TS_stopped,
123 TS_wait,
124 TS_readahead,
125 TS_seek,
126 TS_seeking,
127 TS_shutdown,
128 };
129 ThreadStatus _thread_status;
130 int _seek_frame;
131
132 int _current_frame;
133 PT(FfmpegBuffer) _current_frame_buffer;
134
135 private:
136 // The following functions will be called in the sub-thread.
137 static void st_thread_main(void *self);
138 void thread_main();
139 bool do_poll();
140
141 PT(FfmpegBuffer) do_alloc_frame();
142 void do_clear_all_frames();
143
144 bool fetch_packet(int default_frame);
145 bool do_fetch_packet(int default_frame);
146 void fetch_frame(int frame);
147 void decode_frame(int &finished);
148 void do_decode_frame(int &finished);
149 void seek(int frame, bool backward);
150 void do_seek(int frame, bool backward);
151 int binary_seek(int min_frame, int max_frame, int target_frame, int num_iterations);
152 void advance_to_frame(int frame);
153 void reset_stream();
154 void export_frame(FfmpegBuffer *buffer);
155
156 // The following data members will be accessed by the sub-thread.
157 AVPacket *_packet;
158 int _packet_frame;
159 AVFormatContext *_format_ctx;
160 AVCodecContext *_video_ctx;
161 SwsContext *_convert_ctx;
162
163 FfmpegVirtualFile _ffvfile;
164 int _video_index;
165 double _video_timebase;
166 AVFrame *_frame;
167 AVFrame *_frame_out;
168 int _initial_dts;
169 double _min_fseek;
170 int _begin_frame;
171 int _end_frame;
172 bool _frame_ready;
173 bool _eof_known;
174 int _eof_frame;
175
176 // PStat collectors.
177 static PStatCollector _fetch_buffer_pcollector;
178 static PStatCollector _seek_pcollector;
179 static PStatCollector _export_frame_pcollector;
180
181 public:
182 static void register_with_read_factory();
183 virtual void write_datagram(BamWriter *manager, Datagram &dg);
184
185 virtual void finalize(BamReader *manager);
186
187 protected:
188 static TypedWritable *make_from_bam(const FactoryParams &params);
189 void fillin(DatagramIterator &scan, BamReader *manager);
190
191 public:
192 static TypeHandle get_class_type() {
193 return _type_handle;
194 }
195 static void init_type() {
196 MovieVideoCursor::init_type();
197 register_type(_type_handle, "FfmpegVideoCursor",
198 MovieVideoCursor::get_class_type());
199 FfmpegBuffer::init_type();
200 }
201 virtual TypeHandle get_type() const {
202 return get_class_type();
203 }
204 virtual TypeHandle force_init_type() {init_type(); return get_class_type();}
205
206 private:
207 static TypeHandle _type_handle;
208
209 friend class FfmpegVideo;
210};
211
212#include "ffmpegVideoCursor.I"
213
214#endif // FFMPEGVIDEO_H
BamReader
This is the fundamental interface for extracting binary objects from a Bam file, as generated by a Ba...
Definition bamReader.h:110
BamWriter
This is the fundamental interface for writing binary objects to a Bam file, to be extracted later by ...
Definition bamWriter.h:63
ConditionVar
A condition variable, usually used to communicate information about changing state to a thread that i...
Definition conditionVar.h:43
DatagramIterator
A class to retrieve the individual data elements previously stored in a Datagram.
Definition datagramIterator.h:30
Datagram
An ordered list of data elements, formatted in memory for transmission over a socket or writing to a ...
Definition datagram.h:38
FactoryParams
An instance of this class is passed to the Factory when requesting it to do its business and construc...
Definition factoryParams.h:36
FfmpegVideoCursor::FfmpegBuffer
Definition ffmpegVideoCursor.h:65
FfmpegVideoCursor::FfmpegBuffer::compare_timestamp
virtual int compare_timestamp(const Buffer *other) const
Used to sort different buffers to ensure they correspond to the same source frame,...
Definition ffmpegVideoCursor.cxx:1261
FfmpegVideoCursor::FfmpegBuffer::get_timestamp
virtual double get_timestamp() const
Returns the nearest timestamp value of this particular buffer.
Definition ffmpegVideoCursor.cxx:1278
FfmpegVideoCursor::set_max_readahead_frames
void set_max_readahead_frames(int max_readahead_frames)
Specifies the maximum number of frames that a sub-thread will attempt to read ahead of the current fr...
Definition ffmpegVideoCursor.cxx:191
FfmpegVideoCursor::get_max_readahead_frames
int get_max_readahead_frames() const
Returns the maximum number of frames that a sub-thread will attempt to read ahead of the current fram...
Definition ffmpegVideoCursor.cxx:218
FfmpegVideoCursor::is_thread_started
bool is_thread_started() const
Returns true if the thread has been started, false if not.
Definition ffmpegVideoCursor.cxx:315
FfmpegVideoCursor::start_thread
void start_thread()
Explicitly starts the ffmpeg decoding thread after it has been stopped by a call to stop_thread().
Definition ffmpegVideoCursor.cxx:257
FfmpegVideoCursor::stop_thread
void stop_thread()
Explicitly stops the ffmpeg decoding thread.
Definition ffmpegVideoCursor.cxx:285
FfmpegVideoCursor::get_thread_priority
ThreadPriority get_thread_priority() const
Returns the current thread priority of the thread that decodes the ffmpeg video stream (if max_readah...
Definition ffmpegVideoCursor.cxx:246
FfmpegVideoCursor::set_thread_priority
void set_thread_priority(ThreadPriority thread_priority)
Changes the thread priority of the thread that decodes the ffmpeg video stream (if max_readahead_fram...
Definition ffmpegVideoCursor.cxx:230
FfmpegVideo
Definition ffmpegVideo.h:29
FfmpegVirtualFile
Enables ffmpeg to access panda's VFS.
Definition ffmpegVirtualFile.h:34
Filename
The name of a file, such as a texture file or an Egg file.
Definition filename.h:44
GenericThread
A generic thread type that allows calling a C-style thread function without having to subclass.
Definition genericThread.h:24
MovieVideoCursor::Buffer
Definition movieVideoCursor.h:62
MovieVideoCursor::set_time
virtual bool set_time(double timestamp, int loop_count)
Updates the cursor to the indicated time.
Definition movieVideoCursor.cxx:100
MovieVideoCursor::write_datagram
virtual void write_datagram(BamWriter *manager, Datagram &dg)
Writes the contents of this object to the datagram for shipping out to a Bam file.
Definition movieVideoCursor.cxx:329
Mutex
A standard mutex, or mutual exclusion lock.
Definition pmutex.h:40
PStatCollector
A lightweight class that represents a single element that may be timed and/or counted via stats.
Definition pStatCollector.h:43
ReMutex
A reentrant mutex.
Definition reMutex.h:34
TypeHandle
TypeHandle is the identifier used to differentiate C++ class types.
Definition typeHandle.h:81
TypedWritable
Base class for objects that can be written to and read from Bam files.
Definition typedWritable.h:35
TypedWritable::finalize
virtual void finalize(BamReader *manager)
Called by the BamReader to perform any final actions needed for setting up the object after all objec...
Definition typedWritable.cxx:113
pdeque
This is our own Panda specialization on the default STL deque.
Definition pdeque.h:36
conditionVar.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ffmpegVideoCursor.I
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
ffmpegVirtualFile.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
genericThread.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
movieVideoCursor.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pandabase.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pdeque.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pmutex.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
pointerTo.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
reMutex.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
register_type
void register_type(TypeHandle &type_handle, const std::string &name)
This inline function is just a convenient way to call TypeRegistry::register_type(),...
Definition register_type.I:22
texture.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
threadPriority.h
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.