diff options
author | melanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-11-24 23:58:12 +0000 |
---|---|---|
committer | melanson <melanson@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2001-11-24 23:58:12 +0000 |
commit | 021e4560ce92a3d07e9796dd1db90512d409e687 (patch) | |
tree | c39999b54c538435a3dd13cab89961e9e60b626e /libmpdemux/demux_fli.c | |
parent | 9fcf817cd7f724b25212e8faa3aaa914e06cb2d1 (diff) | |
download | mpv-021e4560ce92a3d07e9796dd1db90512d409e687.tar.bz2 mpv-021e4560ce92a3d07e9796dd1db90512d409e687.tar.xz |
mostly complete support for loading and decoding FLI/FLC animations
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@3102 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demux_fli.c')
-rw-r--r-- | libmpdemux/demux_fli.c | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/libmpdemux/demux_fli.c b/libmpdemux/demux_fli.c new file mode 100644 index 0000000000..1f6d851e78 --- /dev/null +++ b/libmpdemux/demux_fli.c @@ -0,0 +1,114 @@ +/* + FLI file parser for the MPlayer program + by Mike Melanson +*/ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "config.h" +#include "mp_msg.h" +#include "help_mp.h" + +#include "stream.h" +#include "demuxer.h" +#include "stheader.h" + +typedef struct _fli_frames_t { + int num_frames; + int current_frame; + off_t *filepos; + unsigned int *frame_size; +} fli_frames_t; + +// return value: +// 0 = EOF or no stream found +// 1 = successfully read a packet +int demux_fli_fill_buffer(demuxer_t *demuxer){ + fli_frames_t *frames = (fli_frames_t *)demuxer->priv; + + // see if the end has been reached + if (frames->current_frame == frames->num_frames) + return 0; + + // fetch the frame from the file + // first, position the file properly since ds_read_packet() doesn't + // seem to do it, even though it takes a file offset as a parameter + stream_seek(demuxer->stream, frames->filepos[frames->current_frame]); + ds_read_packet(demuxer->video, + demuxer->stream, + frames->frame_size[frames->current_frame], + 0, /* not sure what pts is for */ + frames->filepos[frames->current_frame], + 0 /* what flags? */ + ); + + // get the next frame ready + frames->current_frame++; + + return 1; +} + +demuxer_t* demux_open_fli(demuxer_t* demuxer){ + sh_video_t *sh_video = NULL; + fli_frames_t *frames = (fli_frames_t *)malloc(sizeof(fli_frames_t)); + int frame_number; + + // go back to the beginning + stream_reset(demuxer->stream); + stream_seek(demuxer->stream, 0); + demuxer->movi_start = 128; + demuxer->movi_end = stream_read_dword_le(demuxer->stream); + + // skip the magic number + stream_skip(demuxer->stream, 2); + + // fetch the number of frames + frames->num_frames = stream_read_word_le(demuxer->stream); + frames->current_frame = 0; + + // allocate enough entries for the indices + frames->filepos = (off_t *)malloc(frames->num_frames * sizeof(off_t)); + frames->frame_size = (int *)malloc(frames->num_frames * sizeof(int)); + + // create a new video stream header + sh_video = new_sh_video(demuxer, 0); + + // make sure the demuxer knows about the new video stream header + // (even though new_sh_video() ought to take care of it) + demuxer->video->sh = sh_video; + + // make sure that the video demuxer stream header knows about its + // parent video demuxer stream (this is getting wacky), or else + // video_read_properties() will choke + sh_video->ds = demuxer->video; + + // custom fourcc for internal MPlayer use + sh_video->format = mmioFOURCC('F', 'L', 'I', 'C'); + + sh_video->disp_w = stream_read_word_le(demuxer->stream); + sh_video->disp_h = stream_read_word_le(demuxer->stream); + + // skip the video depth and flags + stream_skip(demuxer->stream, 4); + + // get the speed + sh_video->fps = 1000 / stream_read_word_le(demuxer->stream); + sh_video->frametime = 1/sh_video->fps; + + // build the frame index + stream_seek(demuxer->stream, demuxer->movi_start); + frame_number = 0; + while ((!stream_eof(demuxer->stream)) && (frame_number < frames->num_frames)) + { + frames->filepos[frame_number] = stream_tell(demuxer->stream); + frames->frame_size[frame_number] = stream_read_dword_le(demuxer->stream); + stream_skip(demuxer->stream, frames->frame_size[frame_number] - 4); + frame_number++; + } + + demuxer->priv = frames; + + return demuxer; +} |