From: Thibaut M. <tma...@us...> - 2003-07-11 20:32:37
|
Update of /cvsroot/xine/xine-lib/src/demuxers In directory sc8-pr-cvs1:/tmp/cvs-serv15095 Modified Files: demux_avi.c Log Message: - check only the 2 first bytes of video/audio chunk RIFF header (only the stream id), the last two bytes are not reliable Index: demux_avi.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_avi.c,v retrieving revision 1.160 retrieving revision 1.161 diff -u -r1.160 -r1.161 --- demux_avi.c 29 Jun 2003 00:14:05 -0000 1.160 +++ demux_avi.c 11 Jul 2003 20:32:34 -0000 1.161 @@ -462,8 +462,8 @@ /* Check if we got a tag ##db, ##dc or ##wb */ - if (strncasecmp(data, this->avi->video_tag, 3) == 0 && - (data[3]=='b' || data[3]=='B' || data[3]=='c' || data[3]=='C') ) { + if ((data[0] == this->avi->video_tag[0]) && + (data[1] == this->avi->video_tag[1])) { long flags = AVIIF_KEYFRAME; off_t pos = curtagoffset + ioff; long len = n; @@ -502,7 +502,8 @@ } } for(i=0; i < this->avi->n_audio; ++i) { - if (strncasecmp(data, this->avi->audio[i]->audio_tag, 4) == 0) { + if ((data[0] == this->avi->audio[i]->audio_tag[0]) && + (data[1] == this->avi->audio[i]->audio_tag[1])) { off_t pos = curtagoffset + ioff; long len = n; if (audio_index_append(this->avi, i, pos, len, @@ -1214,16 +1215,18 @@ long i; char data[256]; -#ifdef LOG - printf("demux_avi: get_chunk_header, pos=%lld\n", - this->input->get_current_pos(this->input)); -#endif - while (1) { if (this->input->read(this->input, data,8) != 8) break; *len = str2ulong(data+4); +#ifdef LOG + printf("demux_avi: get_chunk_header, %c%c%c%c, pos=%lld, len=%u\n", + data[0], data[1], data[2], data[3], + this->input->get_current_pos(this->input), + *len); +#endif + /* Dive into RIFF and LIST entries */ if(strncasecmp(data, "LIST", 4) == 0 || strncasecmp(data, "RIFF", 4) == 0) { @@ -1232,20 +1235,30 @@ continue; } - /* Check if we got a tag ##db, ##dc or ##wb */ - if (strncasecmp(data, this->avi->video_tag, 3) == 0 && - (data[3]=='b' || data[3]=='B' || data[3]=='c' || data[3]=='C') ) { + /* + * Check if we got a tag ##db, ##dc or ##wb + * only the 2 first bytes are reliable + */ + if ((data[0] == this->avi->video_tag[0]) && + (data[1] == this->avi->video_tag[1])) { return AVI_HEADER_VIDEO; } for(i=0; i < this->avi->n_audio; ++i) { - if (strncasecmp(data, this->avi->audio[i]->audio_tag, 4) == 0) { + /* + * only the 2 first bytes are reliable + */ + if ((data[0] == this->avi->audio[i]->audio_tag[0]) && + (data[1] == this->avi->audio[i]->audio_tag[1])) { *audio_stream = i; this->avi->audio[i]->audio_tot += *len; return AVI_HEADER_AUDIO; } } +#ifdef LOG + printf("demux_avi: unknown header: %c %c %c %c\n", data[0], data[1], data[2], data[3]); +#endif return AVI_HEADER_UNKNOWN; } return AVI_HEADER_UNKNOWN; @@ -1360,7 +1373,13 @@ break; case AVI_HEADER_UNKNOWN: - return 0; +#ifdef LOG + printf("demux_avi: demux_avi_next_streaming, AVI_HEADER_UNKNOWN\n"); +#endif + current_pos = this->input->get_current_pos(this->input); + if (this->input->seek(this->input, chunk_len, SEEK_CUR) != (current_pos + chunk_len)) { + return 0; + } break; } |