Mercurial > mplayer.hg
annotate libmpdemux/demux_nuv.c @ 12022:293141b57c01
Use MultiplyElement to control volume.
Works with multiple videos at the same time and even
when NAS does not control the mixer or it is unavailable.
Show buffer underrun hint only once and add missing linebreaks.
author | ranma |
---|---|
date | Sat, 13 Mar 2004 21:54:35 +0000 |
parents | ab5984ab6af0 |
children | 9ddae5897422 |
rev | line source |
---|---|
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
1 /* |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
2 * NuppelVideo 0.05 file parser |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
3 * for MPlayer |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
4 * by Panagiotis Issaris <takis@lumumba.luc.ac.be> |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
5 * |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
6 * Reworked by alex |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
7 */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
8 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
9 #include <stdio.h> |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
10 #include <stdlib.h> |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
11 #include <unistd.h> |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
12 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
13 #include "config.h" |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
14 #include "mp_msg.h" |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
15 #include "help_mp.h" |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
16 #include "stream.h" |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
17 #include "demuxer.h" |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
18 #include "stheader.h" |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
19 #include "nuppelvideo.h" |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
20 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
21 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
22 struct nuv_signature |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
23 { |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
24 char finfo[12]; /* "NuppelVideo" + \0 */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
25 char version[5]; /* "0.05" + \0 */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
26 }; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
27 |
4065 | 28 typedef struct _nuv_position_t nuv_position_t; |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
29 |
4065 | 30 struct _nuv_position_t |
31 { | |
32 off_t offset; | |
33 float time; | |
34 int frame; | |
35 nuv_position_t* next; | |
36 }; | |
37 | |
38 typedef struct _nuv_info_t | |
39 { | |
40 int current_audio_frame; | |
41 int current_video_frame; | |
42 nuv_position_t *index_list; | |
43 nuv_position_t *current_position; | |
44 } nuv_priv_t; | |
45 | |
46 | |
47 /** | |
48 * Seek to a position relative to the current position, indicated in time. | |
49 */ | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
50 void demux_seek_nuv ( demuxer_t *demuxer, float rel_seek_secs, int flags ) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
51 { |
4065 | 52 #define MAX_TIME 1000000 |
53 nuv_priv_t* priv = demuxer->priv; | |
54 struct rtframeheader rtjpeg_frameheader; | |
7361 | 55 off_t orig_pos; |
56 off_t curr_pos; | |
4065 | 57 float current_time = 0; |
58 float start_time = MAX_TIME; | |
59 float target_time = start_time + rel_seek_secs * 1000; /* target_time, start_time are ms, rel_seek_secs s */ | |
60 | |
61 orig_pos = stream_tell ( demuxer->stream ); | |
62 | |
63 if ( rel_seek_secs > 0 ) | |
64 { | |
65 /* Seeking forward */ | |
66 | |
67 | |
68 while(current_time < target_time ) | |
69 { | |
70 if (stream_read ( demuxer->stream, (char*)& rtjpeg_frameheader, sizeof ( rtjpeg_frameheader ) ) < sizeof(rtjpeg_frameheader)) | |
71 return; /* EOF */ | |
72 | |
73 if ( rtjpeg_frameheader.frametype == 'V' ) | |
74 { | |
75 priv->current_position->next = (nuv_position_t*) malloc ( sizeof ( nuv_position_t ) ); | |
76 priv->current_position = priv->current_position->next; | |
77 priv->current_position->frame = priv->current_video_frame++; | |
78 priv->current_position->time = rtjpeg_frameheader.timecode; | |
79 priv->current_position->offset = orig_pos; | |
80 priv->current_position->next = NULL; | |
81 | |
82 if ( start_time == MAX_TIME ) | |
83 { | |
84 start_time = rtjpeg_frameheader.timecode; | |
85 /* Recalculate target time with real start time */ | |
86 target_time = start_time + rel_seek_secs*1000; | |
87 } | |
88 | |
89 current_time = rtjpeg_frameheader.timecode; | |
90 | |
91 curr_pos = stream_tell ( demuxer->stream ); | |
92 stream_seek ( demuxer->stream, curr_pos + rtjpeg_frameheader.packetlength ); | |
93 | |
94 /* Adjust current sequence pointer */ | |
95 } | |
96 else if ( rtjpeg_frameheader.frametype == 'A' ) | |
97 { | |
98 if ( start_time == MAX_TIME ) | |
99 { | |
100 start_time = rtjpeg_frameheader.timecode; | |
101 /* Recalculate target time with real start time */ | |
102 target_time = start_time + rel_seek_secs * 1000; | |
103 } | |
104 current_time = rtjpeg_frameheader.timecode; | |
105 | |
106 | |
107 curr_pos = stream_tell ( demuxer->stream ); | |
108 stream_seek ( demuxer->stream, curr_pos + rtjpeg_frameheader.packetlength ); | |
109 } | |
110 } | |
111 } | |
112 else | |
113 { | |
114 /* Seeking backward */ | |
115 nuv_position_t* p; | |
116 start_time = priv->current_position->time; | |
117 | |
118 /* Recalculate target time with real start time */ | |
119 target_time = start_time + rel_seek_secs * 1000; | |
120 | |
121 | |
122 if(target_time < 0) | |
123 target_time = 0; | |
124 | |
125 // Search the target time in the index list, get the offset | |
126 // and go to that offset. | |
127 p = priv->index_list; | |
128 while ( ( p->next != NULL ) && ( p->time < target_time ) ) | |
129 { | |
130 p = p->next; | |
131 } | |
132 stream_seek ( demuxer->stream, p->offset ); | |
133 priv->current_video_frame = p->frame; | |
134 } | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
135 } |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
136 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
137 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
138 int demux_nuv_fill_buffer ( demuxer_t *demuxer ) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
139 { |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
140 struct rtframeheader rtjpeg_frameheader; |
7361 | 141 off_t orig_pos; |
4065 | 142 nuv_priv_t* priv = demuxer->priv; |
7566
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
143 int want_audio = (demuxer->audio)&&(demuxer->audio->id!=-2); |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
144 |
7566
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
145 demuxer->filepos = orig_pos = stream_tell ( demuxer->stream ); |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
146 if (stream_read ( demuxer->stream, (char*)& rtjpeg_frameheader, sizeof ( rtjpeg_frameheader ) ) < sizeof(rtjpeg_frameheader)) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
147 return 0; /* EOF */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
148 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
149 #if 0 |
3811 | 150 printf("NUV frame: frametype: %c, comptype: %c, packetlength: %d\n", |
151 rtjpeg_frameheader.frametype, rtjpeg_frameheader.comptype, | |
152 rtjpeg_frameheader.packetlength); | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
153 #endif |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
154 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
155 /* Skip Seekpoint, Text and Sync for now */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
156 if ((rtjpeg_frameheader.frametype == 'R') || |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
157 (rtjpeg_frameheader.frametype == 'T') || |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
158 (rtjpeg_frameheader.frametype == 'S')) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
159 return 1; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
160 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
161 if (((rtjpeg_frameheader.frametype == 'D') && |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
162 (rtjpeg_frameheader.comptype == 'R')) || |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
163 (rtjpeg_frameheader.frametype == 'V')) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
164 { |
4065 | 165 if ( rtjpeg_frameheader.frametype == 'V' ) |
166 { | |
167 priv->current_video_frame++; | |
168 priv->current_position->next = (nuv_position_t*) malloc(sizeof(nuv_position_t)); | |
169 priv->current_position = priv->current_position->next; | |
170 priv->current_position->frame = priv->current_video_frame; | |
171 priv->current_position->time = rtjpeg_frameheader.timecode; | |
172 priv->current_position->offset = orig_pos; | |
173 priv->current_position->next = NULL; | |
174 } | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
175 /* put RTjpeg tables, Video info to video buffer */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
176 stream_seek ( demuxer->stream, orig_pos ); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
177 ds_read_packet ( demuxer->video, demuxer->stream, rtjpeg_frameheader.packetlength + 12, |
5435
508a4e7df349
10l... int/1000 will be int while we want float, so let's do int*0.001
arpi
parents:
4065
diff
changeset
|
178 rtjpeg_frameheader.timecode*0.001, orig_pos, 0 ); |
4065 | 179 |
180 | |
181 } else | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
182 /* copy PCM only */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
183 if (demuxer->audio && (rtjpeg_frameheader.frametype == 'A') && |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
184 (rtjpeg_frameheader.comptype == '0')) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
185 { |
4065 | 186 priv->current_audio_frame++; |
7566
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
187 if (want_audio) { |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
188 /* put Audio to audio buffer */ |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
189 ds_read_packet ( demuxer->audio, demuxer->stream, |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
190 rtjpeg_frameheader.packetlength, |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
191 rtjpeg_frameheader.timecode*0.001, |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
192 orig_pos + 12, 0 ); |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
193 } else { |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
194 /* skip audio block */ |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
195 stream_seek ( demuxer->stream, |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
196 stream_tell ( demuxer->stream ) |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
197 + rtjpeg_frameheader.packetlength ); |
ab5984ab6af0
- demuxer->audio->id is set to -2 when using 'frameno.avi', so
arpi
parents:
7472
diff
changeset
|
198 } |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
199 } |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
200 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
201 return 1; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
202 } |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
203 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
204 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
205 demuxer_t* demux_open_nuv ( demuxer_t* demuxer ) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
206 { |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
207 sh_video_t *sh_video = NULL; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
208 sh_audio_t *sh_audio = NULL; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
209 struct rtfileheader rtjpeg_fileheader; |
4065 | 210 nuv_priv_t* priv = (nuv_priv_t*) malloc ( sizeof ( nuv_priv_t) ); |
211 demuxer->priv = priv; | |
212 priv->current_audio_frame = 0; | |
213 priv->current_video_frame = 0; | |
214 | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
215 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
216 /* Go to the start */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
217 stream_reset(demuxer->stream); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
218 stream_seek(demuxer->stream, 0); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
219 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
220 stream_read ( demuxer->stream, (char*)& rtjpeg_fileheader, sizeof(rtjpeg_fileheader) ); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
221 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
222 /* no video */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
223 if (rtjpeg_fileheader.videoblocks == 0) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
224 { |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
225 printf("No video blocks in file\n"); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
226 return NULL; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
227 } |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
228 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
229 /* Create a new video stream header */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
230 sh_video = new_sh_video ( demuxer, 0 ); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
231 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
232 /* Make sure the demuxer knows about the new video stream header |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
233 * (even though new_sh_video() ought to take care of it) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
234 */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
235 demuxer->video->sh = sh_video; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
236 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
237 /* Make sure that the video demuxer stream header knows about its |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
238 * parent video demuxer stream (this is getting wacky), or else |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
239 * video_read_properties() will choke |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
240 */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
241 sh_video->ds = demuxer->video; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
242 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
243 /* Custom fourcc for internal MPlayer use */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
244 sh_video->format = mmioFOURCC('N', 'U', 'V', '1'); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
245 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
246 sh_video->disp_w = rtjpeg_fileheader.width; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
247 sh_video->disp_h = rtjpeg_fileheader.height; |
3811 | 248 |
3958
5e61815deced
last minute aspect patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
3811
diff
changeset
|
249 /* NuppelVideo uses pixel aspect ratio |
5e61815deced
last minute aspect patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
3811
diff
changeset
|
250 here display aspect ratio is used. |
5e61815deced
last minute aspect patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
3811
diff
changeset
|
251 For the moment NuppelVideo only supports 1.0 thus |
5e61815deced
last minute aspect patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
3811
diff
changeset
|
252 1.33 == 4:3 aspect ratio. |
5e61815deced
last minute aspect patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
3811
diff
changeset
|
253 */ |
5e61815deced
last minute aspect patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
3811
diff
changeset
|
254 if(rtjpeg_fileheader.aspect == 1.0) |
6660 | 255 sh_video->aspect = (float) 4.0f/3.0f; |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
256 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
257 /* Get the FPS */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
258 sh_video->fps = rtjpeg_fileheader.fps; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
259 sh_video->frametime = 1 / sh_video->fps; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
260 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
261 if (rtjpeg_fileheader.audioblocks != 0) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
262 { |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
263 sh_audio = new_sh_audio(demuxer, 0); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
264 demuxer->audio->sh = sh_audio; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
265 sh_audio->ds = demuxer->audio; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
266 sh_audio->format = 0x1; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
267 sh_audio->channels = 2; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
268 sh_audio->samplerate = 44100; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
269 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
270 sh_audio->wf = malloc(sizeof(WAVEFORMATEX)); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
271 memset(sh_audio->wf, 0, sizeof(WAVEFORMATEX)); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
272 sh_audio->wf->wFormatTag = sh_audio->format; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
273 sh_audio->wf->nChannels = sh_audio->channels; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
274 sh_audio->wf->wBitsPerSample = 16; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
275 sh_audio->wf->nSamplesPerSec = sh_audio->samplerate; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
276 sh_audio->wf->nAvgBytesPerSec = sh_audio->wf->nChannels* |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
277 sh_audio->wf->wBitsPerSample*sh_audio->wf->nSamplesPerSec/8; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
278 sh_audio->wf->nBlockAlign = sh_audio->channels * 2; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
279 sh_audio->wf->cbSize = 0; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
280 } |
4065 | 281 |
282 priv->index_list = (nuv_position_t*) malloc(sizeof(nuv_position_t)); | |
283 priv->index_list->frame = 0; | |
284 priv->index_list->time = 0; | |
285 priv->index_list->offset = stream_tell ( demuxer->stream ); | |
286 priv->index_list->next = NULL; | |
287 priv->current_position = priv->index_list; | |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
288 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
289 return demuxer; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
290 } |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
291 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
292 int nuv_check_file ( demuxer_t* demuxer ) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
293 { |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
294 struct nuv_signature ns; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
295 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
296 /* Store original position */ |
7361 | 297 off_t orig_pos = stream_tell(demuxer->stream); |
3801
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
298 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
299 mp_msg ( MSGT_DEMUX, MSGL_V, "Checking for NuppelVideo\n" ); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
300 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
301 stream_read(demuxer->stream,(char*)&ns,sizeof(ns)); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
302 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
303 if ( strncmp ( ns.finfo, "NuppelVideo", 12 ) ) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
304 return 0; /* Not a NuppelVideo file */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
305 if ( strncmp ( ns.version, "0.05", 5 ) ) |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
306 return 0; /* Wrong version NuppelVideo file */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
307 |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
308 /* Return to original position */ |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
309 stream_seek ( demuxer->stream, orig_pos ); |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
310 return 1; |
3cea69dda1b3
added NuppelVideo demuxer, based on Panagiotis Issaris' patch
alex
parents:
diff
changeset
|
311 } |
5810 | 312 |
313 void demux_close_nuv(demuxer_t* demuxer) { | |
314 nuv_priv_t* priv = demuxer->priv; | |
315 nuv_position_t* pos; | |
316 if(!priv) | |
317 return; | |
318 for(pos = priv->index_list ; pos != NULL ; ) { | |
319 nuv_position_t* p = pos; | |
320 pos = pos->next; | |
321 free(p); | |
322 } | |
323 free(priv); | |
324 } |