annotate libmpdemux/demux_mf.c @ 4564:5e1221d4655e

completely reworked FILM demuxer to support both audio and video...neither of which work yet (CVID video and uncompressed audio)...but the demuxer is working well now
author melanson
date Thu, 07 Feb 2002 05:55:29 +0000
parents 90a535d87e7b
children be1562b2c2d0
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
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
18 typedef struct
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
19 {
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
20 int nr_of_frames;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
21 int curr_frame;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
22 } demuxer_mf_t;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
23
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
24 void demux_seek_mf(demuxer_t *demuxer,float rel_seek_secs,int flags){
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
25 }
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
26
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
27 // return value:
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
28 // 0 = EOF or no stream found
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
29 // 1 = successfully read a packet
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
30 int demux_mf_fill_buffer(demuxer_t *demuxer){
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
31 mf_t * mf;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
32 demuxer_mf_t * dmf;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
33 struct stat fs;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
34 FILE * f;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
35
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
36 dmf=(demuxer_mf_t*)demuxer->priv;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
37 if ( dmf->curr_frame >= dmf->nr_of_frames ) return 0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
38 mf=(mf_t*)demuxer->stream->priv;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
39
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
40 stat( mf->names[dmf->curr_frame],&fs );
4556
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
41 printf( "[demux_mf] frame: %d (%s,%d)\n",dmf->curr_frame,mf->names[dmf->curr_frame],fs.st_size );
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
42
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
43 if ( !( f=fopen( mf->names[dmf->curr_frame],"r" ) ) ) return 0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
44 {
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
45 sh_video_t * sh_video = demuxer->video->sh;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
46 demux_packet_t * dp = new_demux_packet( fs.st_size );
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
47 // stream_read(stream,dp->buffer,len);
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
48 if ( !fread( dp->buffer,1,fs.st_size,f ) ) return 0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
49 dp->pts=dmf->curr_frame / sh_video->fps;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
50 dp->pos=dmf->curr_frame;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
51 dp->flags=0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
52 // append packet to DS stream:
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
53 ds_add_packet( demuxer->video,dp );
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
54 }
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
55 fclose( f );
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
56
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
57 dmf->curr_frame++;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
58 return 1;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
59 }
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
60
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
61 demuxer_t* demux_open_mf(demuxer_t* demuxer){
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
62 sh_video_t *sh_video = NULL;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
63 mf_t *mf = NULL;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
64 demuxer_mf_t *dmf = NULL;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
65
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
66 mp_msg( MSGT_DEMUX,MSGL_V,"[demux_mf] mf demuxer opened.\n" );
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
67 mf=(mf_t*)demuxer->stream->priv;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
68 dmf=calloc( 1,sizeof( demuxer_mf_t ) );
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
69
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
70 // go back to the beginning
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
71 stream_reset(demuxer->stream);
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
72 stream_seek(demuxer->stream, 0);
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
73 demuxer->movi_start = 0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
74 demuxer->movi_end = mf->nr_of_files - 1;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
75 dmf->nr_of_frames= mf->nr_of_files;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
76 dmf->curr_frame=0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
77
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
78 // create a new video stream header
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
79 sh_video = new_sh_video(demuxer, 0);
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
80 // make sure the demuxer knows about the new video stream header
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
81 // (even though new_sh_video() ought to take care of it)
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
82 demuxer->video->sh = sh_video;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
83
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
84 // make sure that the video demuxer stream header knows about its
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
85 // parent video demuxer stream (this is getting wacky), or else
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
86 // video_read_properties() will choke
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
87 sh_video->ds = demuxer->video;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
88
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
89 if ( !strcmp( mf_type,"jpg" ) ) sh_video->format = mmioFOURCC('M', 'J', 'P', 'G');
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
90 else { mp_msg(MSGT_DEMUX, MSGL_INFO, "[demux_mf] unknow input file type.\n" ); free( dmf ); return NULL; }
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
91
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
92 sh_video->disp_w = mf_w;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
93 sh_video->disp_h = mf_h;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
94 sh_video->fps = mf_fps;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
95 sh_video->frametime = 1 / sh_video->fps;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
96
4556
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
97 // emulate BITMAPINFOHEADER:
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
98 sh_video->bih=malloc(sizeof(BITMAPINFOHEADER));
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
99 memset(sh_video->bih,0,sizeof(BITMAPINFOHEADER));
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
100 sh_video->bih->biSize=40;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
101 sh_video->bih->biWidth = mf_w;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
102 sh_video->bih->biHeight = mf_h;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
103 sh_video->bih->biPlanes=1;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
104 sh_video->bih->biBitCount=24;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
105 sh_video->bih->biCompression=sh_video->format;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
106 sh_video->bih->biSizeImage=sh_video->bih->biWidth*sh_video->bih->biHeight*3;
90a535d87e7b emulating BITMAPINFOHDR (for win32 codecs)
arpi
parents: 4550
diff changeset
107
4550
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
108 /* disable seeking */
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
109 demuxer->seekable = 0;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
110
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
111 demuxer->priv=(void*)dmf;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
112
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
113 return demuxer;
ff9f62e4bdd8 add mfi demuxer
pontscho
parents:
diff changeset
114 }