From: Michael R. <mr...@us...> - 2005-01-15 17:52:21
|
Update of /cvsroot/xine/xine-lib/src/demuxers In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2716/src/demuxers Modified Files: Tag: xine-1_0 asfheader.h demux_asf.c demux_avi.c Log Message: cumulative fixes: * specfile convenience * ASF/AVI/DVB/MMS/VCD fixes * WMA Voice support * http_no_proxy config fix Index: asfheader.h =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/asfheader.h,v retrieving revision 1.3 retrieving revision 1.3.2.1 diff -u -r1.3 -r1.3.2.1 --- asfheader.h 6 Oct 2003 15:46:20 -0000 1.3 +++ asfheader.h 15 Jan 2005 17:51:39 -0000 1.3.2.1 @@ -41,60 +41,71 @@ #define GUID_ASF_HEADER 1 #define GUID_ASF_DATA 2 #define GUID_ASF_SIMPLE_INDEX 3 +#define GUID_INDEX 4 +#define GUID_MEDIA_OBJECT_INDEX 5 +#define GUID_TIMECODE_INDEX 6 /* header ASF objects */ -#define GUID_ASF_FILE_PROPERTIES 4 -#define GUID_ASF_STREAM_PROPERTIES 5 -#define GUID_ASF_STREAM_BITRATE_PROPERTIES 6 -#define GUID_ASF_CONTENT_DESCRIPTION 7 -#define GUID_ASF_EXTENDED_CONTENT_ENCRYPTION 8 -#define GUID_ASF_SCRIPT_COMMAND 9 -#define GUID_ASF_MARKER 10 -#define GUID_ASF_HEADER_EXTENSION 11 -#define GUID_ASF_BITRATE_MUTUAL_EXCLUSION 12 -#define GUID_ASF_CODEC_LIST 13 -#define GUID_ASF_EXTENDED_CONTENT_DESCRIPTION 14 -#define GUID_ASF_ERROR_CORRECTION 15 -#define GUID_ASF_PADDING 16 +#define GUID_ASF_FILE_PROPERTIES 7 +#define GUID_ASF_STREAM_PROPERTIES 8 +#define GUID_ASF_HEADER_EXTENSION 9 +#define GUID_ASF_CODEC_LIST 10 +#define GUID_ASF_SCRIPT_COMMAND 11 +#define GUID_ASF_MARKER 12 +#define GUID_ASF_BITRATE_MUTUAL_EXCLUSION 13 +#define GUID_ASF_ERROR_CORRECTION 14 +#define GUID_ASF_CONTENT_DESCRIPTION 15 +#define GUID_ASF_EXTENDED_CONTENT_DESCRIPTION 16 +#define GUID_ASF_STREAM_BITRATE_PROPERTIES 17 +#define GUID_ASF_EXTENDED_CONTENT_ENCRYPTION 18 +#define GUID_ASF_PADDING 19 /* stream properties object stream type */ -#define GUID_ASF_AUDIO_MEDIA 17 -#define GUID_ASF_VIDEO_MEDIA 18 -#define GUID_ASF_COMMAND_MEDIA 19 +#define GUID_ASF_AUDIO_MEDIA 20 +#define GUID_ASF_VIDEO_MEDIA 21 +#define GUID_ASF_COMMAND_MEDIA 22 +#define GUID_ASF_JFIF_MEDIA 23 +#define GUID_ASF_DEGRADABLE_JPEG_MEDIA 24 +#define GUID_ASF_FILE_TRANSFER_MEDIA 25 +#define GUID_ASF_BINARY_MEDIA 26 /* stream properties object error correction type */ -#define GUID_ASF_NO_ERROR_CORRECTION 20 -#define GUID_ASF_AUDIO_SPREAD 21 +#define GUID_ASF_NO_ERROR_CORRECTION 27 +#define GUID_ASF_AUDIO_SPREAD 28 /* mutual exclusion object exlusion type */ -#define GUID_ASF_MUTEX_BITRATE 22 -#define GUID_ASF_MUTEX_UKNOWN 23 +#define GUID_ASF_MUTEX_BITRATE 29 +#define GUID_ASF_MUTEX_UKNOWN 30 /* header extension */ -#define GUID_ASF_RESERVED_1 24 +#define GUID_ASF_RESERVED_1 31 /* script command */ -#define GUID_ASF_RESERVED_SCRIPT_COMMNAND 25 +#define GUID_ASF_RESERVED_SCRIPT_COMMNAND 32 /* marker object */ -#define GUID_ASF_RESERVED_MARKER 26 +#define GUID_ASF_RESERVED_MARKER 33 /* various */ /* #define GUID_ASF_HEAD2 27 */ -#define GUID_ASF_AUDIO_CONCEAL_NONE 27 -#define GUID_ASF_CODEC_COMMENT1_HEADER 28 -#define GUID_ASF_2_0_HEADER 29 +#define GUID_ASF_AUDIO_CONCEAL_NONE 34 +#define GUID_ASF_CODEC_COMMENT1_HEADER 35 +#define GUID_ASF_2_0_HEADER 36 -#define GUID_END 30 +#define GUID_END 37 /* asf stream types */ -#define ASF_STREAM_TYPE_UNKNOWN 0 -#define ASF_STREAM_TYPE_AUDIO 1 -#define ASF_STREAM_TYPE_VIDEO 2 -#define ASF_STREAM_TYPE_CONTROL 3 +#define ASF_STREAM_TYPE_UNKNOWN 0 +#define ASF_STREAM_TYPE_AUDIO 1 +#define ASF_STREAM_TYPE_VIDEO 2 +#define ASF_STREAM_TYPE_CONTROL 3 +#define ASF_STREAM_TYPE_JFIF 4 +#define ASF_STREAM_TYPE_DEGRADABLE_JPEG 5 +#define ASF_STREAM_TYPE_FILE_TRANSFER 6 +#define ASF_STREAM_TYPE_BINARY 7 #define ASF_MAX_NUM_STREAMS 23 @@ -130,6 +141,14 @@ { "simple index", { 0x33000890, 0xe5b1, 0x11cf, { 0x89, 0xf4, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xcb }} }, + { "index", + { 0xd6e229d3, 0x35da, 0x11d1, { 0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe }} }, + + { "media object index", + { 0xfeb103f8, 0x12ad, 0x4c64, { 0x84, 0x0f, 0x2a, 0x1d, 0x2f, 0x7a, 0xd4, 0x8c }} }, + + { "timecode index", + { 0x3cb73fd0, 0x0c4a, 0x4803, { 0x95, 0x3d, 0xed, 0xf7, 0xb6, 0x22, 0x8f, 0x0c }} }, /* header ASF objects */ { "file properties", @@ -138,14 +157,11 @@ { "stream header", { 0xb7dc0791, 0xa9b7, 0x11cf, { 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 }} }, - { "stream bitrate properties", /* (http://get.to/sdp) */ - { 0x7bf875ce, 0x468d, 0x11d1, { 0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2 }} }, - - { "content description", - { 0x75b22633, 0x668e, 0x11cf, { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c }} }, + { "header extension", + { 0x5fbf03b5, 0xa92e, 0x11cf, { 0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 }} }, - { "extended content encryption", - { 0x298ae614, 0x2622, 0x4c17, { 0xb9, 0x35, 0xda, 0xe0, 0x7e, 0xe9, 0x28, 0x9c }} }, + { "codec list", + { 0x86d15240, 0x311d, 0x11d0, { 0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6 }} }, { "script command", { 0x1efb1a30, 0x0b62, 0x11d0, { 0xa3, 0x9b, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6 }} }, @@ -153,20 +169,23 @@ { "marker", { 0xf487cd01, 0xa951, 0x11cf, { 0x8e, 0xe6, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 }} }, - { "header extension", - { 0x5fbf03b5, 0xa92e, 0x11cf, { 0x8e, 0xe3, 0x00, 0xc0, 0x0c, 0x20, 0x53, 0x65 }} }, - { "bitrate mutual exclusion", { 0xd6e229dc, 0x35da, 0x11d1, { 0x90, 0x34, 0x00, 0xa0, 0xc9, 0x03, 0x49, 0xbe }} }, - { "codec list", - { 0x86d15240, 0x311d, 0x11d0, { 0xa3, 0xa4, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6 }} }, + { "error correction", + { 0x75b22635, 0x668e, 0x11cf, { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c }} }, + + { "content description", + { 0x75b22633, 0x668e, 0x11cf, { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c }} }, { "extended content description", { 0xd2d0a440, 0xe307, 0x11d2, { 0x97, 0xf0, 0x00, 0xa0, 0xc9, 0x5e, 0xa8, 0x50 }} }, - { "error correction", - { 0x75b22635, 0x668e, 0x11cf, { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c }} }, + { "stream bitrate properties", /* (http://get.to/sdp) */ + { 0x7bf875ce, 0x468d, 0x11d1, { 0x8d, 0x82, 0x00, 0x60, 0x97, 0xc9, 0xa2, 0xb2 }} }, + + { "extended content encryption", + { 0x298ae614, 0x2622, 0x4c17, { 0xb9, 0x35, 0xda, 0xe0, 0x7e, 0xe9, 0x28, 0x9c }} }, { "padding", { 0x1806d474, 0xcadf, 0x4509, { 0xa4, 0xba, 0x9a, 0xab, 0xcb, 0x96, 0xaa, 0xe8 }} }, @@ -182,6 +201,17 @@ { "command media", { 0x59dacfc0, 0x59e6, 0x11d0, { 0xa3, 0xac, 0x00, 0xa0, 0xc9, 0x03, 0x48, 0xf6 }} }, + { "JFIF media (JPEG)", + { 0xb61be100, 0x5b4e, 0x11cf, { 0xa8, 0xfd, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b }} }, + + { "Degradable JPEG media", + { 0x35907de0, 0xe415, 0x11cf, { 0xa9, 0x17, 0x00, 0x80, 0x5f, 0x5c, 0x44, 0x2b }} }, + + { "File Transfer media", + { 0x91bd222c, 0xf21c, 0x497a, { 0x8b, 0x6d, 0x5a, 0xa8, 0x6b, 0xfc, 0x01, 0x85 }} }, + + { "Binary media", + { 0x3afb65e2, 0x47ef, 0x40f2, { 0xac, 0x2c, 0x70, 0xa9, 0x0d, 0x71, 0xd3, 0x43 }} }, /* stream properties object error correction */ { "no error correction", Index: demux_asf.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_asf.c,v retrieving revision 1.167 retrieving revision 1.167.2.1 diff -u -r1.167 -r1.167.2.1 --- demux_asf.c 24 Dec 2004 17:43:38 -0000 1.167 +++ demux_asf.c 15 Jan 2005 17:51:39 -0000 1.167.2.1 @@ -44,7 +44,6 @@ /* #define LOG */ - #include "xine_internal.h" #include "demux.h" #include "xineutils.h" @@ -246,11 +245,11 @@ return LE_64(buf); } -static int get_guid_id (demux_asf_t *this, GUID g) { +static int get_guid_id (demux_asf_t *this, GUID *g) { int i; for (i = 1; i < GUID_END; i++) { - if (!memcmp(&g, &guids[i].guid, sizeof(GUID))) { + if (!memcmp(g, &guids[i].guid, sizeof(GUID))) { lprintf ("GUID: %s\n", guids[i].name); return i; } @@ -259,8 +258,8 @@ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_asf: unknown GUID: 0x%" PRIx32 ", 0x%" PRIx16 ", 0x%" PRIx16 ", " "{ 0x%" PRIx8 ", 0x%" PRIx8 ", 0x%" PRIx8 ", 0x%" PRIx8 ", 0x%" PRIx8 ", 0x%" PRIx8 ", 0x%" PRIx8 ", 0x%" PRIx8 " }\n", - g.Data1, g.Data2, g.Data3, - g.Data4[0], g.Data4[1], g.Data4[2], g.Data4[3], g.Data4[4], g.Data4[5], g.Data4[6], g.Data4[7]); + g->Data1, g->Data2, g->Data3, + g->Data4[0], g->Data4[1], g->Data4[2], g->Data4[3], g->Data4[4], g->Data4[5], g->Data4[6], g->Data4[7]); return GUID_ERROR; } @@ -277,7 +276,7 @@ g.Data4[i] = get_byte(this); } - return get_guid_id(this, g); + return get_guid_id(this, &g); } static void get_str16_nolen(demux_asf_t *this, int len, @@ -396,7 +395,7 @@ guid = get_guid(this); file_size = get_le64(this); /* file size */ - + get_le64(this); /* creation time */ this->packet_count = get_le64(this); /* nb packets */ @@ -450,7 +449,10 @@ break; default: - goto fail; + lprintf("unexpected GUID\n"); + pos2 = this->input->get_current_pos (this->input); + this->input->seek (this->input, gsize - (pos2 - pos1 + 24), SEEK_CUR); + continue; } guid = get_guid(this); @@ -978,6 +980,7 @@ mod = (current_pos - this->first_packet_pos) % this->packet_size; this->packet_size_left = mod ? this->packet_size - mod : 0; packet_pos = current_pos + this->packet_size_left; + if (this->packet_size_left) { lprintf("last packet is not finished, %d bytes\n", this->packet_size_left); current_pos = this->input->seek (this->input, packet_pos, SEEK_SET); @@ -988,9 +991,9 @@ this->packet_size_left = 0; /* check packet_count */ - packet_num = (current_pos - this->first_packet_pos) / this->packet_size; + packet_num = (packet_pos - this->first_packet_pos) / this->packet_size; lprintf("packet_num=%lld, packet_count=%lld\n", packet_num, this->packet_count); - if (packet_num == this->packet_count) { + if (packet_num >= this->packet_count) { /* end of payload data */ current_pos = this->input->get_current_pos (this->input); lprintf("end of payload data, current_pos=%lld\n", current_pos); @@ -1046,10 +1049,29 @@ *p_hdr_size += read_size; } else { - - /* skip invalid packet */ - xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_asf: skip invalid packet: %2X\n", ecd_flags); - this->input->seek (this->input, this->packet_size - *p_hdr_size, SEEK_CUR); + GUID *guid = (GUID *)buf; + + /* check if it's a new stream */ + buf[0] = ecd_flags; + if (this->input->read (this->input, buf + 1, 15) != 15) { + this->status = DEMUX_FINISHED; + return 1; + } + *p_hdr_size += 15; + guid->Data1 = LE_32(buf); + guid->Data2 = LE_16(buf + 4); + guid->Data3 = LE_16(buf + 6); + if (get_guid_id(this, guid) == GUID_ASF_HEADER) { + lprintf("new asf header detected\n"); + _x_demux_control_end(this->stream, 0); + if (demux_asf_send_headers_common(this)) + return 1; + } else { + + /* skip invalid packet */ + xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_asf: skip invalid packet: %2X\n", ecd_flags); + this->input->seek (this->input, this->packet_size - *p_hdr_size, SEEK_CUR); + } invalid_packet = 1; } } Index: demux_avi.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/demuxers/demux_avi.c,v retrieving revision 1.214 retrieving revision 1.214.2.1 diff -u -r1.214 -r1.214.2.1 --- demux_avi.c 25 Dec 2004 17:52:10 -0000 1.214 +++ demux_avi.c 15 Jan 2005 17:51:39 -0000 1.214.2.1 @@ -485,7 +485,7 @@ maxframe--; } return -1; -} +} /* Use this one to ensure that a video frame with the given timestamp * is in the index. */ @@ -620,7 +620,7 @@ if ((data[0] == audio->audio_tag[0]) && (data[1] == audio->audio_tag[1])) { off_t pos = chunk_pos + AVI_HEADER_SIZE; - + valid_chunk = 1; /* VBR streams (hack from mplayer) */ if (audio->wavex && audio->wavex->nBlockAlign) { @@ -687,6 +687,7 @@ static audio_index_entry_t *audio_cur_index_entry(demux_avi_t *this, avi_audio_t *AVI_A) { + lprintf("posc: %d, chunks: %d\n", AVI_A->audio_posc, AVI_A->audio_idx.audio_chunks); if (AVI_A->audio_posc >= AVI_A->audio_idx.audio_chunks) { /* We don't have enough chunks; see if the file's bigger yet. */ if (idx_grow(this, audio_pos_stopper, AVI_A) < 0) { @@ -1056,6 +1057,7 @@ #endif } + this->has_index = 1; if (lasttag == 1) { /* V I D E O */ AVI->video_superindex = superindex; @@ -1192,6 +1194,7 @@ off_t pos = LE_32(AVI->idx[i] + 8) + ioff; uint32_t len = LE_32(AVI->idx[i] + 12); uint32_t flags = LE_32(AVI->idx[i] + 4); + if (video_index_append(AVI, pos, len, flags) == -1) { ERR_EXIT(AVI_ERR_NO_MEM) ; } @@ -1229,12 +1232,11 @@ int k = 0, audtr = 0; uint32_t nrEntries = 0; int nvi, nai[MAX_AUDIO_STREAMS]; - uint64_t totb, tot[MAX_AUDIO_STREAMS]; xprintf (this->stream->xine, XINE_VERBOSITY_LOG, "demux_avi: This is an OpenDML stream\n"); nvi = 0; - for(audtr=0; audtr<AVI->n_audio; ++audtr) nai[audtr] = tot[audtr] = 0; + for(audtr=0; audtr<AVI->n_audio; ++audtr) nai[audtr] = 0; /* ************************ */ /* VIDEO */ @@ -1305,27 +1307,28 @@ /* ************************ */ lprintf("audio tracks\n"); for(audtr=0; audtr<AVI->n_audio; ++audtr) { + avi_audio_t *audio = AVI->audio[audtr]; k = 0; - if (!AVI->audio[audtr]->audio_superindex) { + if (!audio->audio_superindex) { xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_avi: Warning: cannot read audio index for track %d\n", audtr); continue; } - for (j=0; j<AVI->audio[audtr]->audio_superindex->nEntriesInUse; j++) { + for (j=0; j<audio->audio_superindex->nEntriesInUse; j++) { /* read from file */ - chunk_start = en = malloc (AVI->audio[audtr]->audio_superindex->aIndex[j].dwSize+hdrl_len); + chunk_start = en = malloc (audio->audio_superindex->aIndex[j].dwSize+hdrl_len); - if (this->input->seek(this->input, AVI->audio[audtr]->audio_superindex->aIndex[j].qwOffset, SEEK_SET) == (off_t)-1) { - lprintf("cannot seek to 0x%" PRIx64 "\n", AVI->audio[audtr]->audio_superindex->aIndex[j].qwOffset); + if (this->input->seek(this->input, audio->audio_superindex->aIndex[j].qwOffset, SEEK_SET) == (off_t)-1) { + lprintf("cannot seek to 0x%" PRIx64 "\n", audio->audio_superindex->aIndex[j].qwOffset); free(chunk_start); continue; } - if (this->input->read(this->input, en, AVI->audio[audtr]->audio_superindex->aIndex[j].dwSize+hdrl_len) <= 0) { + if (this->input->read(this->input, en, audio->audio_superindex->aIndex[j].dwSize+hdrl_len) <= 0) { lprintf("cannot read from offset 0x%" PRIx64 "; broken (incomplete) file?\n", - AVI->audio[audtr]->audio_superindex->aIndex[j].qwOffset); + audio->audio_superindex->aIndex[j].qwOffset); free(chunk_start); continue; } @@ -1347,19 +1350,25 @@ pos = offset + LE_32(en); en += 4; len = odml_len(en); en += 4; - totb = tot[audtr]; - tot[audtr] += len; - audio_index_append(AVI, audtr, pos, len, totb, k); + + /* VBR streams (hack from mplayer) */ + if (audio->wavex && audio->wavex->nBlockAlign) { + audio->block_no += (len + audio->wavex->nBlockAlign - 1) / + audio->wavex->nBlockAlign; + } else { + audio->block_no += 1; + } + audio_index_append(AVI, audtr, pos, len, audio->audio_tot, audio->block_no); #ifdef DEBUG_ODML /* printf("[%d:%d] POS 0x%llX len=%d offset (%llx) (%ld)\n", k, audtr, pos, (int)len, - offset, (long)AVI->audio[audtr]->audio_superindex->aIndex[j].dwSize); + offset, (long)audio->audio_superindex->aIndex[j].dwSize); */ #endif - + audio->audio_tot += len; ++k; } free(chunk_start); @@ -1422,24 +1431,9 @@ /* lprintf ("avi audio package len: %d\n", AVI_A->audio_index[AVI_A->audio_posc].len); */ - - while(bytes > 0) { - left = aie->len - AVI_A->audio_posb; - if(left == 0) { - AVI_A->audio_posc++; - AVI_A->audio_posb = 0; - aie = audio_cur_index_entry(this, AVI_A); - if (!aie) { - this->AVI_errno = AVI_ERR_NO_IDX; - return -1; - } - if (nr > 0) { - *buf_flags = BUF_FLAG_FRAME_END; - return nr; - } - left = aie->len - AVI_A->audio_posb; - } - if(bytes < left) + left = aie->len - AVI_A->audio_posb; + while ((bytes > 0) && (left > 0)) { + if (bytes < left) todo = bytes; else todo = left; @@ -1455,13 +1449,16 @@ bytes -= todo; nr += todo; AVI_A->audio_posb += todo; + left = aie->len - AVI_A->audio_posb; } - left = aie->len - AVI_A->audio_posb; - if (left == 0) + if (left == 0) { + AVI_A->audio_posc++; + AVI_A->audio_posb = 0; *buf_flags = BUF_FLAG_FRAME_END; - else + } else { *buf_flags = 0; + } return nr; } @@ -1480,25 +1477,10 @@ nr = 0; /* total number of bytes read */ - while(bytes>0) { - - left = vie->len - AVI->video_posb; - - if(left==0) { - AVI->video_posf++; - AVI->video_posb = 0; - vie = video_cur_index_entry(this); - if (!vie) { - this->AVI_errno = AVI_ERR_NO_IDX; - return -1; - } - if (nr>0) { - *buf_flags = BUF_FLAG_FRAME_END; - return nr; - } - left = vie->len - AVI->video_posb; - } - if(bytes<left) + left = vie->len - AVI->video_posb; + + while ((bytes > 0) && (left > 0)) { + if (bytes < left) todo = bytes; else todo = left; @@ -1514,14 +1496,16 @@ bytes -= todo; nr += todo; AVI->video_posb += todo; + left = vie->len - AVI->video_posb; } - left = vie->len - AVI->video_posb; - if (left==0) + if (left == 0) { + AVI->video_posf++; + AVI->video_posb = 0; *buf_flags = BUF_FLAG_FRAME_END; - else + } else { *buf_flags = 0; - + } return nr; } @@ -1532,6 +1516,8 @@ buf_element_t *buf = NULL; int64_t audio_pts, video_pts; int do_read_video = (this->avi->n_audio == 0); + int video_sent = 0; + int audio_sent = 0; lprintf("begin\n"); @@ -1540,23 +1526,21 @@ * the end of the stream. */ if (this->avi->video_idx.video_frames <= this->avi->video_posf) { if (idx_grow(this, video_pos_stopper, NULL) < 0) { - lprintf("end: idx_grow video_pos_stopper\n"); - return 0; + lprintf("end of stream\n"); } } - + for (i = 0; i < this->avi->n_audio; i++) { avi_audio_t *audio = this->avi->audio[i]; if (!this->no_audio && (audio->audio_idx.audio_chunks <= audio->audio_posc)) { if (idx_grow(this, audio_pos_stopper, this->avi->audio[i]) < 0) { - lprintf("end: idx_grow audio_pos_stopper\n"); - return 0; + lprintf("end of stream\n"); } } } - + video_pts = get_video_pts (this, this->avi->video_posf); for (i=0; i < this->avi->n_audio; i++) { @@ -1566,8 +1550,8 @@ /* The tests above mean aie should never be NULL, but just to be * safe. */ if (!aie) { - lprintf("end: aie == NULL\n"); - return 0; + lprintf("aie == NULL\n"); + continue; } audio_pts = @@ -1588,22 +1572,28 @@ if (buf->size < 0) { buf->free_buffer (buf); - lprintf("end: audio buf->size < 0\n"); - return 0; - } - - buf->type = audio->audio_type | i; - buf->extra_info->input_time = audio_pts / 90; - if( this->input->get_length (this->input) ) - buf->extra_info->input_normpos = (int)( (double) this->input->get_current_pos (this->input) * - 65535 / this->input->get_length (this->input) ); + lprintf("audio buf->size < 0\n"); + } else { - check_newpts (this, buf->pts, PTS_AUDIO); - this->audio_fifo->put (this->audio_fifo, buf); + buf->type = audio->audio_type | i; + buf->extra_info->input_time = audio_pts / 90; + if( this->input->get_length (this->input) ) + buf->extra_info->input_normpos = (int)( (double) this->input->get_current_pos (this->input) * + 65535 / this->input->get_length (this->input) ); + + check_newpts (this, buf->pts, PTS_AUDIO); + this->audio_fifo->put (this->audio_fifo, buf); + + audio_sent++; + } } else do_read_video = 1; } + if (audio_sent == 0) { + do_read_video = 1; + } + if (do_read_video) { buf = this->video_fifo->buffer_pool_alloc (this->video_fifo); @@ -1632,19 +1622,25 @@ if (buf->size < 0) { buf->free_buffer (buf); - lprintf("end: video buf->size < 0\n"); - return 0; - } - - /* - lprintf ("adding buf %d to video fifo, decoder_info[0]: %d\n", - buf, buf->decoder_info[0]); - */ + lprintf("video buf->size < 0\n"); + } else { - check_newpts (this, buf->pts, PTS_VIDEO); - this->video_fifo->put (this->video_fifo, buf); + /* + lprintf ("adding buf %d to video fifo, decoder_info[0]: %d\n", + buf, buf->decoder_info[0]); + */ + + check_newpts (this, buf->pts, PTS_VIDEO); + this->video_fifo->put (this->video_fifo, buf); + video_sent++; + } } + if (!audio_sent && !video_sent) { + xprintf (this->stream->xine, XINE_VERBOSITY_LOG, + "demux_avi: video and audio streams are ended\n"); + return 0; + } return 1; } |