World of Might and Magic  0.2.0
Open reimplementation of Might and Magic 6 7 8 game engine
Класс Movie
+ Граф наследования:Movie:
+ Граф связей класса Movie:

Открытые члены

 Movie ()
 
virtual ~Movie ()
 
void Close ()
 
void ReleaseAVCodec ()
 
bool Load (const char *filename)
 
bool LoadFromLOD (FILE *f, size_t size, size_t offset)
 
virtual PMemBuffer GetFrame ()
 
virtual unsigned int GetWidth () const
 
virtual unsigned int GetHeight () const
 
virtual bool Play (bool loop=false)
 
virtual bool Stop ()
 
virtual bool IsPlaing () const
 
- Открытые члены унаследованные от IMovie
 IMovie ()
 
virtual ~IMovie ()
 

Защищенные члены

int read (void *opaque, uint8_t *buf, int buf_size)
 
int64_t seek (void *opaque, int64_t offset, int whence)
 

Защищенные статические члены

static int s_read (void *opaque, uint8_t *buf, int buf_size)
 
static int64_t s_seek (void *opaque, int64_t offset, int whence)
 

Защищенные данные

unsigned int width
 
unsigned int height
 
AVFormatContextformat_ctx
 
double playback_time
 
AVAudioStream audio
 
unsigned char * ioBuffer
 
AVIOContextavioContext
 
OpenALSoundProvider::StreamingTrackBufferaudio_data_in_device
 
AVVideoStream video
 
int last_resampled_frame_num
 
std::chrono::time_point< std::chrono::system_clock > start_time
 
bool looping
 
bool playing
 
FILE * hFile
 
size_t uFileSize
 
size_t uFileOffset
 
size_t uFilePos
 

Подробное описание

См. определение в файле MediaPlayer.cpp строка 267

Конструктор(ы)

◆ Movie()

Movie::Movie ( )
inline

См. определение в файле MediaPlayer.cpp строка 269

269  {
270  width = 0;
271  height = 0;
272  format_ctx = nullptr;
273  playback_time = 0.0;
274 
276 
277  audio_data_in_device = nullptr;
278  ioBuffer = nullptr;
279  format_ctx = nullptr;
280  avioContext = nullptr;
281 
282  looping = false;
283  playing = false;
284  }

Перекрестные ссылки audio_data_in_device, avioContext, format_ctx, ioBuffer, last_resampled_frame_num, looping, playback_time и playing.

◆ ~Movie()

virtual Movie::~Movie ( )
inlinevirtual

См. определение в файле MediaPlayer.cpp строка 286

286 { Close(); }

Перекрестные ссылки Close().

+ Граф вызовов:

Методы

◆ Close()

void Movie::Close ( )
inline

См. определение в файле MediaPlayer.cpp строка 288

288  {
289  ReleaseAVCodec();
290 
291  if (audio_data_in_device) {
293  }
294  }

Перекрестные ссылки audio_data_in_device, OpenALSoundProvider::DeleteStreamingTrack(), provider и ReleaseAVCodec().

Используется в GetFrame(), Load() и ~Movie().

+ Граф вызовов:
+ Граф вызова функции:

◆ ReleaseAVCodec()

void Movie::ReleaseAVCodec ( )
inline

См. определение в файле MediaPlayer.cpp строка 296

296  {
297  audio.close();
298  video.close();
299 
300  if (format_ctx) {
301  // Close the video file
303  logger->Warning(L"close video format context file\n");
304  format_ctx = nullptr;
305  }
306  if (avioContext) {
308  avioContext = nullptr;
309  }
310  if (ioBuffer) {
311  // av_free(ioBuffer);
312  ioBuffer = nullptr;
313  }
314  }

Перекрестные ссылки audio, av_free(), avformat_close_input(), avioContext, AVStreamWrapper::close(), format_ctx, ioBuffer, logger, video и Log::Warning().

Используется в Close().

+ Граф вызовов:
+ Граф вызова функции:

◆ Load()

bool Movie::Load ( const char *  filename)
inline

См. определение в файле MediaPlayer.cpp строка 316

316  { // Загрузка
317  // Open video file
318  if (avformat_open_input(&format_ctx, filename, nullptr, nullptr) < 0) {
319  logger->Warning(L"ffmpeg: Unable to open input file");
320  Close();
321  return false;
322  }
323 
324  // Retrieve stream information
325  if (avformat_find_stream_info(format_ctx, nullptr) < 0) {
326  fprintf(stderr, "ffmpeg: Unable to find stream info\n");
327  Close();
328  return false;
329  }
330 
331  // Dump information about file onto standard error
332  av_dump_format(format_ctx, 0, filename, 0);
333 
335 
336  if (!video.open(format_ctx)) {
337  Error("Cannot open video stream: %s", filename);
338  Close();
339  return false;
340  }
341 
342  width = video.width;
343  height = video.height;
344 
345  if (audio.stream_idx >= 0) {
347  }
348 
349  return true;
350  }

Перекрестные ссылки audio, audio_data_in_device, av_dump_format(), avformat_find_stream_info(), avformat_open_input(), Close(), OpenALSoundProvider::CreateStreamingTrack16(), AVStreamWrapper::dec_ctx, format_ctx, AVVideoStream::height, logger, AVAudioStream::open(), AVVideoStream::open(), provider, AVCodecContext::sample_rate, AVStreamWrapper::stream_idx, video, Log::Warning() и AVVideoStream::width.

Используется в LoadFromLOD().

+ Граф вызовов:
+ Граф вызова функции:

◆ LoadFromLOD()

bool Movie::LoadFromLOD ( FILE *  f,
size_t  size,
size_t  offset 
)
inline

См. определение в файле MediaPlayer.cpp строка 352

352  {
353  hFile = f;
354  uFileSize = size;
356  uFilePos = 0;
357 
358  if (!ioBuffer) {
359  ioBuffer = (unsigned char *)av_malloc(AV_INPUT_BUFFER_MIN_SIZE); // can get av_free()ed by libav
360  }
361 
362  if (!avioContext) {
363  avioContext = avio_alloc_context(ioBuffer, 0x4000, 0, this, s_read, NULL, s_seek);
364  }
365  if (!format_ctx) {
367  }
369  return Load("dummyFilename");
370  }

Перекрестные ссылки av_malloc(), avformat_alloc_context(), avio_alloc_context(), avioContext, format_ctx, hFile, ioBuffer, Load(), AVFormatContext::pb, s_read(), s_seek(), uFileOffset, uFilePos и uFileSize.

+ Граф вызовов:

◆ GetFrame()

virtual PMemBuffer Movie::GetFrame ( )
inlinevirtual

Замещает IMovie.

См. определение в файле MediaPlayer.cpp строка 372

372  {
373  if (!playing) {
374  return nullptr;
375  }
376 
377  auto current_time = std::chrono::system_clock::now();
378  std::chrono::duration<double, std::ratio<1>> diff = current_time - start_time;
379  std::chrono::milliseconds diff_ms = std::chrono::duration_cast<std::chrono::milliseconds>(diff);
380  playback_time += diff_ms.count();
381  start_time = std::chrono::system_clock::now();
382 
383  int desired_frame_number = (int)((playback_time / video.frame_len) + 0.5);
384  if (last_resampled_frame_num == desired_frame_number) {
385  return video.last_frame;
386  }
389  if (looping) {
390  video.reset();
391  audio.reset();
392  int err = av_seek_frame(format_ctx, -1, 0,
393  AVSEEK_FLAG_BACKWARD | AVSEEK_FLAG_ANY);
394  char err_buf[2048];
395  av_strerror(err, err_buf, 2048);
396  if (err < 0) {
397  Close();
398  return nullptr;
399  }
401  playback_time = 0;
402  desired_frame_number = 0;
403  } else {
404  playing = false;
405  return nullptr;
406  }
407  }
408 
409  AVPacket *avpacket = av_packet_alloc();
410 
411  // keep reading packets until we hit the end or find a video packet
412  do {
413  if (av_read_frame(format_ctx, avpacket) < 0) {
414  // probably movie is finished
415  playing = false;
416  av_packet_free(&avpacket);
417  return nullptr;
418  }
419 
420  // Is this a packet from the video stream?
421  // audio packet - queue into playing
422  if (avpacket->stream_index == audio.stream_idx) {
423  PMemBuffer buffer = audio.decode_frame(avpacket);
424  if (buffer) {
426  buffer->GetSize() / 2,
427  buffer->GetData());
428  }
429  } else if (avpacket->stream_index == video.stream_idx) {
430  // Decode video frame
431  // video packet - decode & maybe show
432  video.decode_frame(avpacket);
433  } else {
434  assert(false); // unknown stream
435  }
436  } while (avpacket->stream_index != video.stream_idx ||
437  avpacket->pts != desired_frame_number);
438 
439  av_packet_free(&avpacket);
440 
441  return video.last_frame;
442  }

Перекрестные ссылки audio, audio_data_in_device, av_packet_alloc(), av_packet_free(), av_read_frame(), av_seek_frame(), av_strerror(), Close(), AVAudioStream::decode_frame(), AVVideoStream::decode_frame(), AVStream::duration, format_ctx, AVVideoStream::frame_len, AVVideoStream::last_frame, last_resampled_frame_num, looping, playback_time, playing, provider, AVPacket::pts, AVStreamWrapper::reset(), start_time, AVStreamWrapper::stream, OpenALSoundProvider::Stream16(), AVStreamWrapper::stream_idx, AVPacket::stream_index и video.

+ Граф вызовов:

◆ GetWidth()

virtual unsigned int Movie::GetWidth ( ) const
inlinevirtual

Замещает IMovie.

См. определение в файле MediaPlayer.cpp строка 444

444 { return width; }

Перекрестные ссылки width.

◆ GetHeight()

virtual unsigned int Movie::GetHeight ( ) const
inlinevirtual

Замещает IMovie.

См. определение в файле MediaPlayer.cpp строка 446

446 { return height; }

Перекрестные ссылки height.

◆ Play()

virtual bool Movie::Play ( bool  loop = false)
inlinevirtual

Замещает IMovie.

См. определение в файле MediaPlayer.cpp строка 448

448  {
449  start_time = std::chrono::system_clock::now();
450  looping = loop;
451  playing = true;
452  return false;
453  }

Перекрестные ссылки looping, playing и start_time.

◆ Stop()

virtual bool Movie::Stop ( )
inlinevirtual

Замещает IMovie.

См. определение в файле MediaPlayer.cpp строка 455

455  {
456  playing = false;
457  return false;
458  }

Перекрестные ссылки playing.

◆ IsPlaing()

virtual bool Movie::IsPlaing ( ) const
inlinevirtual

Замещает IMovie.

См. определение в файле MediaPlayer.cpp строка 460

460 { return playing; }

Перекрестные ссылки playing.

◆ s_read()

static int Movie::s_read ( void opaque,
uint8_t buf,
int  buf_size 
)
inlinestaticprotected

См. определение в файле MediaPlayer.cpp строка 463

463  {
464  Movie *_this = (Movie *)opaque;
465  return _this->read(opaque, buf, buf_size);
466  }

Перекрестные ссылки read().

Используется в LoadFromLOD().

+ Граф вызовов:
+ Граф вызова функции:

◆ s_seek()

static int64_t Movie::s_seek ( void opaque,
int64_t  offset,
int  whence 
)
inlinestaticprotected

См. определение в файле MediaPlayer.cpp строка 468

468  {
469  Movie *_this = (Movie *)opaque;
470  return _this->seek(opaque, offset, whence);
471  }

Перекрестные ссылки seek().

Используется в LoadFromLOD().

+ Граф вызовов:
+ Граф вызова функции:

◆ read()

int Movie::read ( void opaque,
uint8_t buf,
int  buf_size 
)
inlineprotected

См. определение в файле MediaPlayer.cpp строка 473

473  {
474  fseek(hFile, uFileOffset + uFilePos, SEEK_SET);
475  buf_size = std::min(buf_size, (int)uFileSize - (int)uFilePos);
476  buf_size = fread(buf, 1, buf_size, hFile);
477  uFilePos += buf_size;
478  return buf_size;
479  }

Перекрестные ссылки hFile, uFileOffset, uFilePos и uFileSize.

Используется в s_read().

+ Граф вызова функции:

◆ seek()

int64_t Movie::seek ( void opaque,
int64_t  offset,
int  whence 
)
inlineprotected

См. определение в файле MediaPlayer.cpp строка 481

481  {
482  if (whence == AVSEEK_SIZE) {
483  return uFileSize;
484  }
485 
486  switch (whence) {
487  case SEEK_SET:
489  break;
490  case SEEK_CUR:
491  uFilePos += (size_t)offset;
492  break;
493  case SEEK_END:
495  break;
496  default:
497  assert(false);
498  break;
499  }
500  fseek(hFile, uFileOffset + uFilePos, SEEK_SET);
501  return uFilePos;
502  }

Перекрестные ссылки hFile, uFileOffset, uFilePos и uFileSize.

Используется в s_seek().

+ Граф вызова функции:

Данные класса

◆ width

unsigned int Movie::width
protected

См. определение в файле MediaPlayer.cpp строка 505

Используется в GetWidth().

◆ height

unsigned int Movie::height
protected

См. определение в файле MediaPlayer.cpp строка 506

Используется в GetHeight().

◆ format_ctx

AVFormatContext* Movie::format_ctx
protected

См. определение в файле MediaPlayer.cpp строка 507

Используется в GetFrame(), Load(), LoadFromLOD(), Movie() и ReleaseAVCodec().

◆ playback_time

double Movie::playback_time
protected

См. определение в файле MediaPlayer.cpp строка 508

Используется в GetFrame() и Movie().

◆ audio

AVAudioStream Movie::audio
protected

См. определение в файле MediaPlayer.cpp строка 510

Используется в GetFrame(), Load() и ReleaseAVCodec().

◆ ioBuffer

unsigned char* Movie::ioBuffer
protected

См. определение в файле MediaPlayer.cpp строка 511

Используется в LoadFromLOD(), Movie() и ReleaseAVCodec().

◆ avioContext

AVIOContext* Movie::avioContext
protected

См. определение в файле MediaPlayer.cpp строка 512

Используется в LoadFromLOD(), Movie() и ReleaseAVCodec().

◆ audio_data_in_device

OpenALSoundProvider::StreamingTrackBuffer* Movie::audio_data_in_device
protected

См. определение в файле MediaPlayer.cpp строка 513

Используется в Close(), GetFrame(), Load() и Movie().

◆ video

AVVideoStream Movie::video
protected

См. определение в файле MediaPlayer.cpp строка 515

Используется в GetFrame(), Load() и ReleaseAVCodec().

◆ last_resampled_frame_num

int Movie::last_resampled_frame_num
protected

См. определение в файле MediaPlayer.cpp строка 516

Используется в GetFrame() и Movie().

◆ start_time

std::chrono::time_point<std::chrono::system_clock> Movie::start_time
protected

См. определение в файле MediaPlayer.cpp строка 518

Используется в GetFrame() и Play().

◆ looping

bool Movie::looping
protected

См. определение в файле MediaPlayer.cpp строка 519

Используется в GetFrame(), Movie() и Play().

◆ playing

bool Movie::playing
protected

См. определение в файле MediaPlayer.cpp строка 520

Используется в GetFrame(), IsPlaing(), Movie(), Play() и Stop().

◆ hFile

FILE* Movie::hFile
protected

См. определение в файле MediaPlayer.cpp строка 522

Используется в LoadFromLOD(), read() и seek().

◆ uFileSize

size_t Movie::uFileSize
protected

См. определение в файле MediaPlayer.cpp строка 523

Используется в LoadFromLOD(), read() и seek().

◆ uFileOffset

size_t Movie::uFileOffset
protected

См. определение в файле MediaPlayer.cpp строка 524

Используется в LoadFromLOD(), read() и seek().

◆ uFilePos

size_t Movie::uFilePos
protected

См. определение в файле MediaPlayer.cpp строка 525

Используется в LoadFromLOD(), read() и seek().


Объявления и описания членов класса находятся в файле:
Movie::video
AVVideoStream video
Definition: MediaPlayer.cpp:515
AVStreamWrapper::reset
virtual void reset()
Definition: MediaPlayer.cpp:60
Movie::uFileSize
size_t uFileSize
Definition: MediaPlayer.cpp:523
AVStreamWrapper::close
virtual void close()
Definition: MediaPlayer.cpp:66
av_malloc
void * av_malloc(size_t size) av_malloc_attrib av_alloc_size(1)
AVVideoStream::decode_frame
PMemBuffer decode_frame(AVPacket *avpacket)
Definition: MediaPlayer.cpp:211
height
EGLSurface EGLint EGLint EGLint EGLint height
Definition: SDL_egl.h:1596
AVVideoStream::last_frame
PMemBuffer last_frame
Definition: MediaPlayer.cpp:259
Movie::s_read
static int s_read(void *opaque, uint8_t *buf, int buf_size)
Definition: MediaPlayer.cpp:463
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Movie
Definition: MediaPlayer.cpp:267
av_packet_free
void av_packet_free(AVPacket **pkt)
Movie::hFile
FILE * hFile
Definition: MediaPlayer.cpp:522
avformat_close_input
void avformat_close_input(AVFormatContext **s)
Movie::Close
void Close()
Definition: MediaPlayer.cpp:288
av_strerror
int av_strerror(int errnum, char *errbuf, size_t errbuf_size)
AVVideoStream::frame_len
double frame_len
Definition: MediaPlayer.cpp:261
AVStreamWrapper::dec_ctx
AVCodecContext * dec_ctx
Definition: MediaPlayer.cpp:112
size_t
unsigned int size_t
Definition: SDL_config.h:68
AVPacket::stream_index
int stream_index
Definition: avcodec.h:1479
av_dump_format
void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)
Movie::ioBuffer
unsigned char * ioBuffer
Definition: MediaPlayer.cpp:511
av_seek_frame
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
buffer
EGLContext EGLenum EGLClientBuffer buffer
Definition: SDL_egl.h:952
Movie::start_time
std::chrono::time_point< std::chrono::system_clock > start_time
Definition: MediaPlayer.cpp:518
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: SDL_opengl_glext.h:2483
AVPacket::pts
int64_t pts
Definition: avcodec.h:1470
OpenALSoundProvider::CreateStreamingTrack16
StreamingTrackBuffer * CreateStreamingTrack16(int num_channels, int sample_rate, int bytes_per_sample)
Definition: OpenALSoundProvider.cpp:173
AVVideoStream::open
virtual bool open(AVFormatContext *format_ctx)
Definition: MediaPlayer.cpp:193
AVVideoStream::width
int width
Definition: MediaPlayer.cpp:263
Movie::playing
bool playing
Definition: MediaPlayer.cpp:520
Movie::last_resampled_frame_num
int last_resampled_frame_num
Definition: MediaPlayer.cpp:516
OpenALSoundProvider::DeleteStreamingTrack
void DeleteStreamingTrack(StreamingTrackBuffer **buffer)
Definition: OpenALSoundProvider.cpp:116
width
EGLSurface EGLint EGLint EGLint width
Definition: SDL_egl.h:1596
Log::Warning
void Warning(const wchar_t *pFormat,...)
Definition: Log.cpp:28
Movie::uFileOffset
size_t uFileOffset
Definition: MediaPlayer.cpp:524
Movie::uFilePos
size_t uFilePos
Definition: MediaPlayer.cpp:525
Movie::Load
bool Load(const char *filename)
Definition: MediaPlayer.cpp:316
avformat_find_stream_info
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
f
GLfloat f
Definition: SDL_opengl_glext.h:1873
avformat_alloc_context
AVFormatContext * avformat_alloc_context(void)
Movie::format_ctx
AVFormatContext * format_ctx
Definition: MediaPlayer.cpp:507
AVStream::duration
int64_t duration
Definition: avformat.h:921
provider
OpenALSoundProvider * provider
Definition: MediaPlayer.cpp:41
av_packet_alloc
AVPacket * av_packet_alloc(void)
AVVideoStream::height
int height
Definition: MediaPlayer.cpp:264
OpenALSoundProvider::Stream16
void Stream16(StreamingTrackBuffer *buffer, int num_samples, const void *samples, bool wait=false)
Definition: OpenALSoundProvider.cpp:226
avformat_open_input
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options)
Movie::height
unsigned int height
Definition: MediaPlayer.cpp:506
AVStreamWrapper::stream
AVStream * stream
Definition: MediaPlayer.cpp:110
avio_alloc_context
AVIOContext * avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
Movie::seek
int64_t seek(void *opaque, int64_t offset, int whence)
Definition: MediaPlayer.cpp:481
Movie::read
int read(void *opaque, uint8_t *buf, int buf_size)
Definition: MediaPlayer.cpp:473
av_free
void av_free(void *ptr)
Movie::avioContext
AVIOContext * avioContext
Definition: MediaPlayer.cpp:512
Movie::ReleaseAVCodec
void ReleaseAVCodec()
Definition: MediaPlayer.cpp:296
AVFormatContext::pb
AVIOContext * pb
Definition: avformat.h:1386
AVPacket
Definition: avcodec.h:1454
AVAudioStream::open
virtual bool open(AVFormatContext *format_ctx)
Definition: MediaPlayer.cpp:120
Movie::looping
bool looping
Definition: MediaPlayer.cpp:519
Movie::playback_time
double playback_time
Definition: MediaPlayer.cpp:508
Movie::width
unsigned int width
Definition: MediaPlayer.cpp:505
Movie::s_seek
static int64_t s_seek(void *opaque, int64_t offset, int whence)
Definition: MediaPlayer.cpp:468
size
GLsizeiptr size
Definition: SDL_opengl_glext.h:540
Movie::audio
AVAudioStream audio
Definition: MediaPlayer.cpp:510
offset
GLintptr offset
Definition: SDL_opengl_glext.h:541
logger
Log * logger
Definition: IocContainer.cpp:47
Movie::audio_data_in_device
OpenALSoundProvider::StreamingTrackBuffer * audio_data_in_device
Definition: MediaPlayer.cpp:513
AVAudioStream::decode_frame
PMemBuffer decode_frame(AVPacket *avpacket)
Definition: MediaPlayer.cpp:139
PMemBuffer
std::shared_ptr< IMemBuffer > PMemBuffer
Definition: MemBuffer.h:13
AVStreamWrapper::stream_idx
int stream_idx
Definition: MediaPlayer.cpp:109
AVCodecContext::sample_rate
int sample_rate
samples per second
Definition: avcodec.h:2225