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) {