From: Daniel Caujolle-B. <f1...@us...> - 2003-10-10 22:17:23
|
Update of /cvsroot/xine/xine-lib/src/demuxers In directory sc8-pr-cvs1:/tmp/cvs-serv25869 Modified Files: demux_mpgaudio.c Log Message: avoid FPE error with 0 length files, use xine_demux_check_extension() Index: demux_mpgaudio.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_mpgaudio.c,v retrieving revision 1.114 retrieving revision 1.115 diff -u -r1.114 -r1.115 --- demux_mpgaudio.c 5 Oct 2003 16:15:49 -0000 1.114 +++ demux_mpgaudio.c 10 Oct 2003 22:17:18 -0000 1.115 @@ -708,7 +708,7 @@ } len = this->input->read(this->input, header_buf + 4 - bytes, bytes); - if (len != bytes) { + if (len != ((off_t) bytes)) { return 0; } return 1; @@ -838,8 +838,10 @@ /* check ID3 v1 at the end of the stream */ pos = this->input->get_length(this->input) - 128; - this->input->seek (this->input, pos, SEEK_SET); - read_id3_tags (this); + if(pos > 0) { + this->input->seek (this->input, pos, SEEK_SET); + read_id3_tags (this); + } } /* @@ -942,10 +944,16 @@ start_pos = xing_get_seek_point(this, start_time); lprintf("time seek: vbr: time=%d, pos=%lld\n", start_time, start_pos); } else { - /* cbr */ - start_pos = start_time * this->input->get_length(this->input) / - (1000 * this->stream_length); - lprintf("time seek: cbr: time=%d, pos=%lld\n", start_time, start_pos); + off_t input_length = this->input->get_length(this->input); + + if((input_length > 0) && (this->stream_length > 0)) { + /* cbr */ + start_pos = start_time * input_length / (1000 * this->stream_length); + lprintf("time seek: cbr: time=%d, pos=%lld\n", start_time, start_pos); + } + else + goto __done; + } } else { if (this->is_vbr && (this->xflags & (XING_TOC_FLAG | XING_BYTES_FLAG))) { @@ -953,15 +961,25 @@ start_time = xing_get_seek_time(this, start_pos); lprintf("pos seek: vbr: time=%d, pos=%lld\n", start_time, start_pos); } else { - /* cbr */ - start_time = (1000 * start_pos * this->stream_length) / this->input->get_length(this->input); - lprintf("pos seek: cbr: time=%d, pos=%lld\n", start_time, start_pos); + off_t input_length = this->input->get_length(this->input); + + if((input_length > 0) && (this->stream_length > 0)) { + /* cbr */ + start_time = (1000 * start_pos * this->stream_length) / input_length; + lprintf("pos seek: cbr\n"); + } + else + goto __done; + } } + this->cur_fpts = 90 * start_time; this->input->seek (this->input, start_pos, SEEK_SET); } + __done: + this->status = DEMUX_OK; this->send_newpts = 1; @@ -1102,25 +1120,16 @@ break; case METHOD_BY_EXTENSION: { - char *suffix; - char *MRL; - - MRL = input->get_mrl (input); - - lprintf("demux_mpgaudio: stage by extension %s\n", MRL); - - if (strncmp (MRL, "ice :/", 6)) { - - suffix = strrchr(MRL, '.'); + char *mrl = input->get_mrl(input); - if (!suffix) - return NULL; + lprintf ("demux_mpgaudio: stage by extension %s\n", mrl); - if ( strncasecmp ((suffix+1), "mp3", 3) - && strncasecmp ((suffix+1), "mp2", 3) - && strncasecmp ((suffix+1), "mpa", 3) - && strncasecmp ((suffix+1), "mpega", 5)) - return NULL; + if (strncmp (mrl, "ice :/", 6)) { + char *extensions = class_gen->get_extensions (class_gen); + + if (!xine_demux_check_extension (mrl, extensions)) + return NULL; + } } break; |