From fed0c2fb71bdaed366ba5118dcbd487f22fa44c9 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 27 Nov 2009 13:37:53 +0000 Subject: Replace very odd and completely broken oss read_packet() by the obvious way to read. Fixes issue348. Originally committed as revision 20629 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavdevice/oss_audio.c | 29 +++++------------------------ 1 file changed, 5 insertions(+), 24 deletions(-) (limited to 'libavdevice') diff --git a/libavdevice/oss_audio.c b/libavdevice/oss_audio.c index ed1a7a14a8..8876bd2d24 100644 --- a/libavdevice/oss_audio.c +++ b/libavdevice/oss_audio.c @@ -250,32 +250,13 @@ static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt) if (av_new_packet(pkt, s->frame_size) < 0) return AVERROR(EIO); - for(;;) { - struct timeval tv; - fd_set fds; - - tv.tv_sec = 0; - tv.tv_usec = 30 * 1000; /* 30 msecs -- a bit shorter than 1 frame at 30fps */ - - FD_ZERO(&fds); - FD_SET(s->fd, &fds); - - /* This will block until data is available or we get a timeout */ - (void) select(s->fd + 1, &fds, 0, 0, &tv); ret = read(s->fd, pkt->data, pkt->size); - if (ret > 0) - break; - if (ret == -1 && (errno == EAGAIN || errno == EINTR)) { - av_free_packet(pkt); - pkt->size = 0; - pkt->pts = av_gettime(); - return 0; - } - if (!(ret == 0 || (ret == -1 && (errno == EAGAIN || errno == EINTR)))) { - av_free_packet(pkt); - return AVERROR(EIO); - } + if (ret <= 0){ + av_free_packet(pkt); + pkt->size = 0; + if (ret<0) return AVERROR(errno); + else return AVERROR(EOF); } pkt->size = ret; -- cgit v1.2.3