Mercurial > mplayer.hg
comparison libmpdemux/demux_nut.c @ 21022:fbf3f8cd0bf6
Add disabled EAGAIN testing code for libnut
author | ods15 |
---|---|
date | Sat, 18 Nov 2006 20:13:18 +0000 |
parents | b3fbda23e570 |
children | f5180197d7ad |
comparison
equal
deleted
inserted
replaced
21021:bc0afb5afa98 | 21022:fbf3f8cd0bf6 |
---|---|
21 | 21 |
22 static size_t mp_read(void * h, size_t len, uint8_t * buf) { | 22 static size_t mp_read(void * h, size_t len, uint8_t * buf) { |
23 stream_t * stream = (stream_t*)h; | 23 stream_t * stream = (stream_t*)h; |
24 | 24 |
25 if(stream_eof(stream)) return 0; | 25 if(stream_eof(stream)) return 0; |
26 //len = MIN(len, 5); | |
26 | 27 |
27 return stream_read(stream, buf, len); | 28 return stream_read(stream, buf, len); |
29 } | |
30 | |
31 static int mp_eof(void * h) { | |
32 stream_t * stream = (stream_t*)h; | |
33 if(stream_eof(stream)) return 1; | |
34 return 0; | |
28 } | 35 } |
29 | 36 |
30 static off_t mp_seek(void * h, long long pos, int whence) { | 37 static off_t mp_seek(void * h, long long pos, int whence) { |
31 stream_t * stream = (stream_t*)h; | 38 stream_t * stream = (stream_t*)h; |
32 | 39 |
62 nut_demuxer_opts_t dopts = { | 69 nut_demuxer_opts_t dopts = { |
63 .input = { | 70 .input = { |
64 .priv = demuxer->stream, | 71 .priv = demuxer->stream, |
65 .seek = mp_seek, | 72 .seek = mp_seek, |
66 .read = mp_read, | 73 .read = mp_read, |
67 .eof = NULL, | 74 .eof = mp_eof, |
68 .file_pos = stream_tell(demuxer->stream), | 75 .file_pos = stream_tell(demuxer->stream), |
69 }, | 76 }, |
70 .alloc = { .malloc = NULL }, | 77 .alloc = { .malloc = NULL }, |
71 .read_index = index_mode, | 78 .read_index = index_mode, |
72 .cache_syncpoints = 1, | 79 .cache_syncpoints = 1, |
75 nut_context_t * nut = priv->nut = nut_demuxer_init(&dopts); | 82 nut_context_t * nut = priv->nut = nut_demuxer_init(&dopts); |
76 nut_stream_header_t * s; | 83 nut_stream_header_t * s; |
77 int ret; | 84 int ret; |
78 int i; | 85 int i; |
79 | 86 |
80 if ((ret = nut_read_headers(nut, &s, NULL))) { | 87 while ((ret = nut_read_headers(nut, &s, NULL)) == NUT_ERR_EAGAIN); |
88 if (ret) { | |
81 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", nut_error(ret)); | 89 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", nut_error(ret)); |
82 nut_demuxer_uninit(nut); | 90 nut_demuxer_uninit(nut); |
83 free(priv); | 91 free(priv); |
84 return NULL; | 92 return NULL; |
85 } | 93 } |
178 double pts; | 186 double pts; |
179 | 187 |
180 demuxer->filepos = stream_tell(demuxer->stream); | 188 demuxer->filepos = stream_tell(demuxer->stream); |
181 if (stream_eof(demuxer->stream)) return 0; | 189 if (stream_eof(demuxer->stream)) return 0; |
182 | 190 |
183 ret = nut_read_next_packet(nut, &pd); | 191 while ((ret = nut_read_next_packet(nut, &pd)) == NUT_ERR_EAGAIN); |
184 if (ret) { | 192 if (ret) { |
185 if (ret != NUT_ERR_EOF) | 193 if (ret != NUT_ERR_EOF) |
186 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", | 194 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", |
187 nut_error(ret)); | 195 nut_error(ret)); |
188 return 0; // fatal error | 196 return 0; // fatal error |
200 else if (pd.stream == demuxer->video->id) { | 208 else if (pd.stream == demuxer->video->id) { |
201 ds = demuxer->video; | 209 ds = demuxer->video; |
202 } | 210 } |
203 else { | 211 else { |
204 uint8_t buf[pd.len]; | 212 uint8_t buf[pd.len]; |
205 ret = nut_read_frame(nut, &pd.len, buf); | 213 while ((ret = nut_read_frame(nut, &pd.len, buf)) == NUT_ERR_EAGAIN); |
206 if (ret) { | 214 if (ret) { |
207 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", | 215 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", |
208 nut_error(ret)); | 216 nut_error(ret)); |
209 return 0; // fatal error | 217 return 0; // fatal error |
210 } | 218 } |
218 dp->pts = pts; | 226 dp->pts = pts; |
219 | 227 |
220 dp->pos = demuxer->filepos; | 228 dp->pos = demuxer->filepos; |
221 dp->flags= (pd.flags & NUT_FLAG_KEY) ? 0x10 : 0; | 229 dp->flags= (pd.flags & NUT_FLAG_KEY) ? 0x10 : 0; |
222 | 230 |
223 ret = nut_read_frame(nut, &pd.len, dp->buffer); | 231 {int len = pd.len; |
232 while ((ret = nut_read_frame(nut, &len, dp->buffer + pd.len-len)) == NUT_ERR_EAGAIN); | |
233 } | |
224 if (ret) { | 234 if (ret) { |
225 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", | 235 mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", |
226 nut_error(ret)); | 236 nut_error(ret)); |
227 return 0; // fatal error | 237 return 0; // fatal error |
228 } | 238 } |
247 if (flags & 2) // percent | 257 if (flags & 2) // percent |
248 time_pos *= priv->s[0].max_pts * | 258 time_pos *= priv->s[0].max_pts * |
249 (double)priv->s[0].time_base.nom / | 259 (double)priv->s[0].time_base.nom / |
250 priv->s[0].time_base.den; | 260 priv->s[0].time_base.den; |
251 | 261 |
252 ret = nut_seek(nut, time_pos, nutflags, tmp); | 262 while ((ret = nut_seek(nut, time_pos, nutflags, tmp)) == NUT_ERR_EAGAIN); |
253 if (ret) mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", nut_error(ret)); | 263 if (ret) mp_msg(MSGT_HEADER, MSGL_ERR, "NUT error: %s\n", nut_error(ret)); |
254 if (sh_audio) resync_audio_stream(sh_audio); | 264 if (sh_audio) resync_audio_stream(sh_audio); |
255 } | 265 } |
256 | 266 |
257 static int demux_control_nut(demuxer_t * demuxer, int cmd, void * arg) { | 267 static int demux_control_nut(demuxer_t * demuxer, int cmd, void * arg) { |