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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
1
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
2 #include <stdio.h>
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
3 #include <stdlib.h>
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
4 #include <unistd.h>
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
5 #include <sys/types.h>
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
6 #include <sys/stat.h>
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
7 #include <unistd.h>
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
8
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
9 #include "config.h"
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
10 #include "mp_msg.h"
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
11 #include "help_mp.h"
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
12
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
13 #include "stream.h"
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
14 #include "demuxer.h"
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
15 #include "stheader.h"
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
16 #include "mf.h"
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
17
17636
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17624
diff changeset
18 static void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
19 mf_t * mf = (mf_t *)demuxer->priv;
4565
be1562b2c2d0 finalize mfi support.
pontscho
parents: 4556
diff changeset
20 sh_video_t * sh_video = demuxer->video->sh;
be1562b2c2d0 finalize mfi support.
pontscho
parents: 4556
diff changeset
21 int newpos = (flags & 1)?0:mf->curr_frame;
be1562b2c2d0 finalize mfi support.
pontscho
parents: 4556
diff changeset
22
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
23 if ( flags & 2 ) newpos+=rel_seek_secs*mf->nr_of_files;
4565
be1562b2c2d0 finalize mfi support.
pontscho
parents: 4556
diff changeset
24 else newpos+=rel_seek_secs * sh_video->fps;
be1562b2c2d0 finalize mfi support.
pontscho
parents: 4556
diff changeset
25 if ( newpos < 0 ) newpos=0;
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
26 if( newpos > mf->nr_of_files) newpos=mf->nr_of_files;
4565
be1562b2c2d0 finalize mfi support.
pontscho
parents: 4556
diff changeset
27 mf->curr_frame=newpos;
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
28 }
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
29
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
30 // return value:
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
31 // 0 = EOF or no stream found
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
32 // 1 = successfully read a packet
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
33 static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
34 mf_t * mf;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
35 struct stat fs;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
36 FILE * f;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
37
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
38 mf=(mf_t*)demuxer->priv;
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
39 if ( mf->curr_frame >= mf->nr_of_files ) return 0;
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
40
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
41 stat( mf->names[mf->curr_frame],&fs );
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
42 // printf( "[demux_mf] frame: %d (%s,%d)\n",mf->curr_frame,mf->names[mf->curr_frame],fs.st_size );
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
43
9992
e33317c4d9af fopen requires binary flag on windows, too
faust3
parents: 9945
diff changeset
44 #ifdef WIN32
e33317c4d9af fopen requires binary flag on windows, too
faust3
parents: 9945
diff changeset
45 if ( !( f=fopen( mf->names[mf->curr_frame],"rb" ) ) ) return 0;
e33317c4d9af fopen requires binary flag on windows, too
faust3
parents: 9945
diff changeset
46 #else
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
47 if ( !( f=fopen( mf->names[mf->curr_frame],"r" ) ) ) return 0;
9992
e33317c4d9af fopen requires binary flag on windows, too
faust3
parents: 9945
diff changeset
48 #endif
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
49 {
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
50 sh_video_t * sh_video = demuxer->video->sh;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
51 demux_packet_t * dp = new_demux_packet( fs.st_size );
4565
be1562b2c2d0 finalize mfi support.
pontscho
parents: 4556
diff changeset
52 if ( !fread( dp->buffer,fs.st_size,1,f ) ) return 0;
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
53 dp->pts=mf->curr_frame / sh_video->fps;
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
54 dp->pos=mf->curr_frame;
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
55 dp->flags=0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
56 // append packet to DS stream:
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
57 ds_add_packet( demuxer->video,dp );
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
58 }
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
59 fclose( f );
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
60
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
61 mf->curr_frame++;
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
62 return 1;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
63 }
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
64
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
65 static demuxer_t* demux_open_mf(demuxer_t* demuxer){
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
66 sh_video_t *sh_video = NULL;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
67 mf_t *mf = NULL;
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
68
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
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
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
85 mf->curr_frame=0;
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
86
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
87 demuxer->movi_start = 0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
88 demuxer->movi_end = mf->nr_of_files - 1;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
89
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
90 // create a new video stream header
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
91 sh_video = new_sh_video(demuxer, 0);
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
92 // make sure the demuxer knows about the new video stream header
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
93 // (even though new_sh_video() ought to take care of it)
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
94 demuxer->video->sh = sh_video;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
95
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
96 // make sure that the video demuxer stream header knows about its
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
97 // parent video demuxer stream (this is getting wacky), or else
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
98 // video_read_properties() will choke
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
99 sh_video->ds = demuxer->video;
9148
946b14a9e743 type autodetection (from filemask/filelist extension)
arpi
parents: 7407
diff changeset
100
4656
04880518728d add initial mPNG support
pontscho
parents: 4643
diff changeset
101 if ( !strcasecmp( mf_type,"jpg" ) ||
5029
ef8a43b74075 Add IJPG decoder.
pontscho
parents: 4656
diff changeset
102 !(strcasecmp(mf_type, "jpeg"))) sh_video->format = mmioFOURCC('I', 'J', 'P', 'G');
7362
8ae490fbf89d TGA images (-mf on:type=tga) support
arpi
parents: 5810
diff changeset
103 else
4656
04880518728d add initial mPNG support
pontscho
parents: 4643
diff changeset
104 if ( !strcasecmp( mf_type,"png" )) sh_video->format = mmioFOURCC('M', 'P', 'N', 'G' );
7362
8ae490fbf89d TGA images (-mf on:type=tga) support
arpi
parents: 5810
diff changeset
105 else
8ae490fbf89d TGA images (-mf on:type=tga) support
arpi
parents: 5810
diff changeset
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
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
110
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
111 sh_video->disp_w = mf_w;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
112 sh_video->disp_h = mf_h;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
113 sh_video->fps = mf_fps;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
114 sh_video->frametime = 1 / sh_video->fps;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
115
4556
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
116 // emulate BITMAPINFOHEADER:
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
117 sh_video->bih=malloc(sizeof(BITMAPINFOHEADER));
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
118 memset(sh_video->bih,0,sizeof(BITMAPINFOHEADER));
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
119 sh_video->bih->biSize=40;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
120 sh_video->bih->biWidth = mf_w;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
121 sh_video->bih->biHeight = mf_h;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
122 sh_video->bih->biPlanes=1;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
123 sh_video->bih->biBitCount=24;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
124 sh_video->bih->biCompression=sh_video->format;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
125 sh_video->bih->biSizeImage=sh_video->bih->biWidth*sh_video->bih->biHeight*3;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
126
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
127 /* disable seeking */
4565
be1562b2c2d0 finalize mfi support.
pontscho
parents: 4556
diff changeset
128 // demuxer->seekable = 0;
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
129
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
130 demuxer->priv=(void*)mf;
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
131
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
132 return demuxer;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
133 }
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5029
diff changeset
134
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
135 static void demux_close_mf(demuxer_t* demuxer) {
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
136 mf_t *mf = demuxer->priv;
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5029
diff changeset
137
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
138 if(!mf)
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5029
diff changeset
139 return;
7407
8780415baa87 stream layer cleanup - part 1
arpi
parents: 7362
diff changeset
140 free(mf);
5810
8a357300d0ec Added demuxer uninit
albeu
parents: 5029
diff changeset
141 }
16175
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
142
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
143
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
144 demuxer_desc_t demuxer_desc_mf = {
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
145 "mf demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
146 "mf",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
147 "MF",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
148 "?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
149 "multiframe?, pictures demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
150 DEMUXER_TYPE_MF,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
151 0, // no autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
152 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
153 demux_mf_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
154 demux_open_mf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
155 demux_close_mf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
156 demux_seek_mf,
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
157 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 9992
diff changeset
158 };