10l: comparison of char* ptrs with string literals
[mplayer.git] / libmpdemux / demux_mf.c
blob6c706b1f2979c058de50c6e141a7ca2b73b23a49
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <unistd.h>
9 #include "config.h"
10 #include "mp_msg.h"
11 #include "help_mp.h"
13 #include "stream.h"
14 #include "demuxer.h"
15 #include "stheader.h"
16 #include "mf.h"
18 static void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){
19 mf_t * mf = (mf_t *)demuxer->priv;
20 sh_video_t * sh_video = demuxer->video->sh;
21 int newpos = (flags & 1)?0:mf->curr_frame - 1;
23 if ( flags & 2 ) newpos+=rel_seek_secs*(mf->nr_of_files - 1);
24 else newpos+=rel_seek_secs * sh_video->fps;
25 if ( newpos < 0 ) newpos=0;
26 if( newpos >= mf->nr_of_files) newpos=mf->nr_of_files - 1;
27 mf->curr_frame=newpos;
30 // return value:
31 // 0 = EOF or no stream found
32 // 1 = successfully read a packet
33 static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){
34 mf_t * mf;
35 struct stat fs;
36 FILE * f;
38 mf=(mf_t*)demuxer->priv;
39 if ( mf->curr_frame >= mf->nr_of_files ) return 0;
41 stat( mf->names[mf->curr_frame],&fs );
42 // printf( "[demux_mf] frame: %d (%s,%d)\n",mf->curr_frame,mf->names[mf->curr_frame],fs.st_size );
44 #ifdef WIN32
45 if ( !( f=fopen( mf->names[mf->curr_frame],"rb" ) ) ) return 0;
46 #else
47 if ( !( f=fopen( mf->names[mf->curr_frame],"r" ) ) ) return 0;
48 #endif
50 sh_video_t * sh_video = demuxer->video->sh;
51 demux_packet_t * dp = new_demux_packet( fs.st_size );
52 if ( !fread( dp->buffer,fs.st_size,1,f ) ) return 0;
53 dp->pts=mf->curr_frame / sh_video->fps;
54 dp->pos=mf->curr_frame;
55 dp->flags=0;
56 // append packet to DS stream:
57 ds_add_packet( demuxer->video,dp );
59 fclose( f );
61 mf->curr_frame++;
62 return 1;
65 static demuxer_t* demux_open_mf(demuxer_t* demuxer){
66 sh_video_t *sh_video = NULL;
67 mf_t *mf = NULL;
69 if(!demuxer->stream->url) return NULL;
70 if(strncmp(demuxer->stream->url, "mf://", 5)) return NULL;
73 mf=open_mf(demuxer->stream->url + 5);
74 if(!mf) return NULL;
76 if(!mf_type){
77 char* p=strrchr(mf->names[0],'.');
78 if(!p){
79 mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] file type was not set! (try -mf type=xxx)\n" );
80 free( mf ); return NULL;
82 mf_type=strdup(p+1);
83 mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] file type was not set! trying 'type=%s'...\n", mf_type);
86 mf->curr_frame=0;
88 demuxer->movi_start = 0;
89 demuxer->movi_end = mf->nr_of_files - 1;
91 // create a new video stream header
92 sh_video = new_sh_video(demuxer, 0);
93 // make sure the demuxer knows about the new video stream header
94 // (even though new_sh_video() ought to take care of it)
95 demuxer->video->sh = sh_video;
97 // make sure that the video demuxer stream header knows about its
98 // parent video demuxer stream (this is getting wacky), or else
99 // video_read_properties() will choke
100 sh_video->ds = demuxer->video;
102 if ( !strcasecmp( mf_type,"jpg" ) ||
103 !(strcasecmp(mf_type, "jpeg"))) sh_video->format = mmioFOURCC('I', 'J', 'P', 'G');
104 else
105 if ( !strcasecmp( mf_type,"png" )) sh_video->format = mmioFOURCC('M', 'P', 'N', 'G' );
106 else
107 if ( !strcasecmp( mf_type,"tga" )) sh_video->format = mmioFOURCC('M', 'T', 'G', 'A' );
108 else
109 if (!strcasecmp( mf_type,"sgi" )) sh_video->format = mmioFOURCC('S', 'G', 'I', '1');
110 else { mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] unknown input file type.\n" ); free( mf ); return NULL; }
112 sh_video->disp_w = mf_w;
113 sh_video->disp_h = mf_h;
114 sh_video->fps = mf_fps;
115 sh_video->frametime = 1 / sh_video->fps;
117 // emulate BITMAPINFOHEADER:
118 sh_video->bih=malloc(sizeof(BITMAPINFOHEADER));
119 memset(sh_video->bih,0,sizeof(BITMAPINFOHEADER));
120 sh_video->bih->biSize=40;
121 sh_video->bih->biWidth = mf_w;
122 sh_video->bih->biHeight = mf_h;
123 sh_video->bih->biPlanes=1;
124 sh_video->bih->biBitCount=24;
125 sh_video->bih->biCompression=sh_video->format;
126 sh_video->bih->biSizeImage=sh_video->bih->biWidth*sh_video->bih->biHeight*3;
128 /* disable seeking */
129 // demuxer->seekable = 0;
131 demuxer->priv=(void*)mf;
133 return demuxer;
136 static void demux_close_mf(demuxer_t* demuxer) {
137 mf_t *mf = demuxer->priv;
139 if(!mf)
140 return;
141 free(mf);
144 static int demux_control_mf(demuxer_t *demuxer, int cmd, void *arg) {
145 mf_t *mf = (mf_t *)demuxer->priv;
146 sh_video_t *sh_video = demuxer->video->sh;
148 switch(cmd) {
149 case DEMUXER_CTRL_GET_TIME_LENGTH:
150 *((double *)arg) = (double)mf->nr_of_files / sh_video->fps;
151 return DEMUXER_CTRL_OK;
153 case DEMUXER_CTRL_GET_PERCENT_POS:
154 if (mf->nr_of_files <= 1)
155 return DEMUXER_CTRL_DONTKNOW;
156 *((int *)arg) = 100 * mf->curr_frame / (mf->nr_of_files - 1);
157 return DEMUXER_CTRL_OK;
159 default:
160 return DEMUXER_CTRL_NOTIMPL;
164 demuxer_desc_t demuxer_desc_mf = {
165 "mf demuxer",
166 "mf",
167 "MF",
168 "?",
169 "multiframe?, pictures demuxer",
170 DEMUXER_TYPE_MF,
171 0, // no autodetect
172 NULL,
173 demux_mf_fill_buffer,
174 demux_open_mf,
175 demux_close_mf,
176 demux_seek_mf,
177 demux_control_mf