Mercurial > mplayer.hg
annotate libmpdemux/demux_mf.c @ 18971:ec2f6323fda3
Change SRC_PATH for ffmpeg back to '..' to avoid hardcoding current
directory at configure time. This should work again now that libpostproc
is no longer under libavcodec and all Makefiles included from ffmpeg are
at the same directory level.
The hardcoded paths caused breakage if the build directory was moved or
copied after configure and prevented ccache from sharing compilation
results between directories (different absolute include paths count as
different compiler options).
author | uau |
---|---|
date | Sun, 09 Jul 2006 14:06:13 +0000 |
parents | b849a99cdc3c |
children | c5ee8c9808ef |
rev | line source |
---|---|
4550 | 1 |
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> | |
8 | |
9 #include "config.h" | |
10 #include "mp_msg.h" | |
11 #include "help_mp.h" | |
12 | |
13 #include "stream.h" | |
14 #include "demuxer.h" | |
15 #include "stheader.h" | |
16 #include "mf.h" | |
17 | |
17636 | 18 static void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ |
7407 | 19 mf_t * mf = (mf_t *)demuxer->priv; |
4565 | 20 sh_video_t * sh_video = demuxer->video->sh; |
21 int newpos = (flags & 1)?0:mf->curr_frame; | |
22 | |
7407 | 23 if ( flags & 2 ) newpos+=rel_seek_secs*mf->nr_of_files; |
4565 | 24 else newpos+=rel_seek_secs * sh_video->fps; |
25 if ( newpos < 0 ) newpos=0; | |
7407 | 26 if( newpos > mf->nr_of_files) newpos=mf->nr_of_files; |
4565 | 27 mf->curr_frame=newpos; |
4550 | 28 } |
29 | |
30 // return value: | |
31 // 0 = EOF or no stream found | |
32 // 1 = successfully read a packet | |
16175 | 33 static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){ |
4550 | 34 mf_t * mf; |
35 struct stat fs; | |
36 FILE * f; | |
37 | |
7407 | 38 mf=(mf_t*)demuxer->priv; |
39 if ( mf->curr_frame >= mf->nr_of_files ) return 0; | |
4550 | 40 |
7407 | 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 ); | |
4550 | 43 |
9992 | 44 #ifdef WIN32 |
45 if ( !( f=fopen( mf->names[mf->curr_frame],"rb" ) ) ) return 0; | |
46 #else | |
7407 | 47 if ( !( f=fopen( mf->names[mf->curr_frame],"r" ) ) ) return 0; |
9992 | 48 #endif |
4550 | 49 { |
50 sh_video_t * sh_video = demuxer->video->sh; | |
51 demux_packet_t * dp = new_demux_packet( fs.st_size ); | |
4565 | 52 if ( !fread( dp->buffer,fs.st_size,1,f ) ) return 0; |
7407 | 53 dp->pts=mf->curr_frame / sh_video->fps; |
54 dp->pos=mf->curr_frame; | |
4550 | 55 dp->flags=0; |
56 // append packet to DS stream: | |
57 ds_add_packet( demuxer->video,dp ); | |
58 } | |
59 fclose( f ); | |
60 | |
7407 | 61 mf->curr_frame++; |
4550 | 62 return 1; |
63 } | |
64 | |
16175 | 65 static demuxer_t* demux_open_mf(demuxer_t* demuxer){ |
4550 | 66 sh_video_t *sh_video = NULL; |
67 mf_t *mf = NULL; | |
7407 | 68 |
69 if(!demuxer->stream->url) return NULL; | |
9148
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
70 |
17624
7b30bef00830
allow autodetection of pictures type when using mf://@file.list syntax
iive
parents:
17569
diff
changeset
|
71 |
7b30bef00830
allow autodetection of pictures type when using mf://@file.list syntax
iive
parents:
17569
diff
changeset
|
72 mf=open_mf(demuxer->stream->url + 5); |
7b30bef00830
allow autodetection of pictures type when using mf://@file.list syntax
iive
parents:
17569
diff
changeset
|
73 if(!mf) return NULL; |
7b30bef00830
allow autodetection of pictures type when using mf://@file.list syntax
iive
parents:
17569
diff
changeset
|
74 |
9148
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
75 if(!mf_type){ |
17624
7b30bef00830
allow autodetection of pictures type when using mf://@file.list syntax
iive
parents:
17569
diff
changeset
|
76 char* p=strrchr(mf->names[0],'.'); |
9148
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
77 if(!p){ |
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
78 mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] file type was not set! (try -mf type=xxx)\n" ); |
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
79 free( mf ); return NULL; |
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
80 } |
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
81 mf_type=strdup(p+1); |
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
82 mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] file type was not set! trying 'type=%s'...\n", mf_type); |
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
83 } |
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
84 |
7407 | 85 mf->curr_frame=0; |
4550 | 86 |
87 demuxer->movi_start = 0; | |
88 demuxer->movi_end = mf->nr_of_files - 1; | |
89 | |
90 // create a new video stream header | |
91 sh_video = new_sh_video(demuxer, 0); | |
92 // make sure the demuxer knows about the new video stream header | |
93 // (even though new_sh_video() ought to take care of it) | |
94 demuxer->video->sh = sh_video; | |
95 | |
96 // make sure that the video demuxer stream header knows about its | |
97 // parent video demuxer stream (this is getting wacky), or else | |
98 // video_read_properties() will choke | |
99 sh_video->ds = demuxer->video; | |
9148
946b14a9e743
type autodetection (from filemask/filelist extension)
arpi
parents:
7407
diff
changeset
|
100 |
4656 | 101 if ( !strcasecmp( mf_type,"jpg" ) || |
5029 | 102 !(strcasecmp(mf_type, "jpeg"))) sh_video->format = mmioFOURCC('I', 'J', 'P', 'G'); |
7362 | 103 else |
4656 | 104 if ( !strcasecmp( mf_type,"png" )) sh_video->format = mmioFOURCC('M', 'P', 'N', 'G' ); |
7362 | 105 else |
106 if ( !strcasecmp( mf_type,"tga" )) sh_video->format = mmioFOURCC('M', 'T', 'G', 'A' ); | |
9534
87e03d96a4cd
add support for sgi files to mencoder patch by (Todd Kirby <slapcat at pacbell dot net>)
michael
parents:
9148
diff
changeset
|
107 else |
87e03d96a4cd
add support for sgi files to mencoder patch by (Todd Kirby <slapcat at pacbell dot net>)
michael
parents:
9148
diff
changeset
|
108 if (!strcasecmp( mf_type,"sgi" )) sh_video->format = mmioFOURCC('S', 'G', 'I', '1'); |
87e03d96a4cd
add support for sgi files to mencoder patch by (Todd Kirby <slapcat at pacbell dot net>)
michael
parents:
9148
diff
changeset
|
109 else { mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] unknown input file type.\n" ); free( mf ); return NULL; } |
4550 | 110 |
111 sh_video->disp_w = mf_w; | |
112 sh_video->disp_h = mf_h; | |
113 sh_video->fps = mf_fps; | |
114 sh_video->frametime = 1 / sh_video->fps; | |
115 | |
4556 | 116 // emulate BITMAPINFOHEADER: |
117 sh_video->bih=malloc(sizeof(BITMAPINFOHEADER)); | |
118 memset(sh_video->bih,0,sizeof(BITMAPINFOHEADER)); | |
119 sh_video->bih->biSize=40; | |
120 sh_video->bih->biWidth = mf_w; | |
121 sh_video->bih->biHeight = mf_h; | |
122 sh_video->bih->biPlanes=1; | |
123 sh_video->bih->biBitCount=24; | |
124 sh_video->bih->biCompression=sh_video->format; | |
125 sh_video->bih->biSizeImage=sh_video->bih->biWidth*sh_video->bih->biHeight*3; | |
126 | |
4550 | 127 /* disable seeking */ |
4565 | 128 // demuxer->seekable = 0; |
4550 | 129 |
7407 | 130 demuxer->priv=(void*)mf; |
4550 | 131 |
132 return demuxer; | |
133 } | |
5810 | 134 |
16175 | 135 static void demux_close_mf(demuxer_t* demuxer) { |
7407 | 136 mf_t *mf = demuxer->priv; |
5810 | 137 |
7407 | 138 if(!mf) |
5810 | 139 return; |
7407 | 140 free(mf); |
5810 | 141 } |
16175 | 142 |
143 | |
144 demuxer_desc_t demuxer_desc_mf = { | |
145 "mf demuxer", | |
146 "mf", | |
147 "MF", | |
148 "?", | |
149 "multiframe?, pictures demuxer", | |
150 DEMUXER_TYPE_MF, | |
151 0, // no autodetect | |
152 NULL, | |
153 demux_mf_fill_buffer, | |
154 demux_open_mf, | |
155 demux_close_mf, | |
156 demux_seek_mf, | |
157 NULL | |
158 }; |