diff options
Diffstat (limited to 'libmpdemux/demux_avi.c')
-rw-r--r-- | libmpdemux/demux_avi.c | 62 |
1 files changed, 31 insertions, 31 deletions
diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index 197076adbe..7ceffb33c1 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -124,7 +124,7 @@ static int demux_avi_read_packet(demuxer_t *demux,demux_stream_t *ds,unsigned in avi_priv_t *priv=demux->priv; int skip; float pts=0; - + mp_dbg(MSGT_DEMUX,MSGL_DBG3,"demux_avi.read_packet: %X\n",id); if(ds==demux->audio){ @@ -152,7 +152,7 @@ static int demux_avi_read_packet(demuxer_t *demux,demux_stream_t *ds,unsigned in // update blockcount: priv->audio_block_no+=priv->audio_block_size ? ((len+priv->audio_block_size-1)/priv->audio_block_size) : 1; - } else + } else if(ds==demux->video){ // video if(priv->skip_video_frames>0){ @@ -171,9 +171,9 @@ static int demux_avi_read_packet(demuxer_t *demux,demux_stream_t *ds,unsigned in if(ds) ++priv->video_pack_no; } - + skip=(len+1)&(~1); // total bytes in this chunk - + if(ds){ mp_dbg(MSGT_DEMUX,MSGL_DBG2,"DEMUX_AVI: Read %d data bytes from packet %04X\n",len,id); ds_read_packet(ds,demux->stream,len,pts,idxpos,flags); @@ -216,9 +216,9 @@ do{ AVIINDEXENTRY *idx=NULL; if(priv->idx_size>0 && priv->idx_pos<priv->idx_size){ off_t pos; - + idx=&((AVIINDEXENTRY *)priv->idx)[priv->idx_pos++]; - + if(idx->dwFlags&AVIIF_LIST){ // LIST continue; @@ -237,7 +237,7 @@ do{ demux->filepos=stream_tell(demux->stream); id=stream_read_dword_le(demux->stream); if(stream_eof(demux->stream)) return 0; // EOF! - + if(id!=idx->ckid){ mp_msg(MSGT_DEMUX,MSGL_V,"ChunkID mismatch! raw=%.4s idx=%.4s \n",(char *)&id,(char *)&idx->ckid); if(valid_fourcc(idx->ckid)) @@ -261,7 +261,7 @@ do{ id=avi_find_id(demux->stream); len=stream_read_dword_le(demux->stream); if(stream_eof(demux->stream)) return 0; // EOF! - + if(id==mmioFOURCC('L','I','S','T') || id==mmioFOURCC('R', 'I', 'F', 'F')){ id=stream_read_dword_le(demux->stream); // list or RIFF type continue; @@ -288,7 +288,7 @@ do{ // quit now, we can't even (no enough buffer memory) read this packet :( return -1; } - + ret=demux_avi_read_packet(demux,ds,id,len,priv->idx_pos-1,flags); } while(ret!=1); return 1; @@ -309,15 +309,15 @@ do{ AVIINDEXENTRY *idx=NULL; int idx_pos=0; demux->filepos=stream_tell(demux->stream); - + if(ds==demux->video) idx_pos=priv->idx_pos_v++; else if(ds==demux->audio) idx_pos=priv->idx_pos_a++; else idx_pos=priv->idx_pos++; - + if(priv->idx_size>0 && idx_pos<priv->idx_size){ off_t pos; idx=&((AVIINDEXENTRY *)priv->idx)[idx_pos]; - + if(idx->dwFlags&AVIIF_LIST){ // LIST continue; @@ -387,18 +387,18 @@ do{ len=stream_read_dword_le(demux->stream); if(stream_eof(demux->stream)) return 0; - + if(id==mmioFOURCC('L','I','S','T')){ id=stream_read_dword_le(demux->stream); // list type continue; } - + if(id==mmioFOURCC('R','I','F','F')){ mp_msg(MSGT_DEMUX,MSGL_V,"additional RIFF header...\n"); id=stream_read_dword_le(demux->stream); // "AVIX" continue; } - + if(ds==demux_avi_select_stream(demux,id)){ // read it! ret=demux_avi_read_packet(demux,ds,id,len,priv->idx_pos-1,0); @@ -407,7 +407,7 @@ do{ int skip=(len+1)&(~1); // total bytes in this chunk stream_skip(demux->stream,skip); } - + } while(ret!=1); fpos[0]=stream_tell(demux->stream); return 1; @@ -444,7 +444,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ //---- AVI header: read_avi_header(demuxer,(demuxer->stream->flags & STREAM_SEEK_BW)?index_mode:-2); - + if(demuxer->audio->id>=0 && !demuxer->a_streams[demuxer->audio->id]){ mp_tmsg(MSGT_DEMUX,MSGL_WARN,"AVI: invalid audio stream ID: %d - ignoring (nosound)\n",demuxer->audio->id); demuxer->audio->id=-2; // disabled @@ -453,7 +453,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ mp_tmsg(MSGT_DEMUX,MSGL_WARN,"AVI: invalid video stream ID: %d - ignoring (using default)\n",demuxer->video->id); demuxer->video->id=-1; // autodetect } - + stream_reset(demuxer->stream); stream_seek(demuxer->stream,demuxer->movi_start); priv->idx_pos=0; @@ -478,7 +478,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ (int)((AVIINDEXENTRY *)priv->idx)[0].dwChunkOffset, (int)((AVIINDEXENTRY *)priv->idx)[1].dwChunkOffset); } - + if(priv->idx_size>0){ // check that file is non-interleaved: int i; @@ -546,7 +546,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ size_t vsamples=0; size_t asamples=0; int i; - for(i=0;i<priv->idx_size;i++){ + for(i=0;i<priv->idx_size;i++){ int id=avi_stream_id(((AVIINDEXENTRY *)priv->idx)[i].ckid); int len=((AVIINDEXENTRY *)priv->idx)[i].dwChunkLength; if(sh_video->ds->id == id) { @@ -573,7 +573,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ if(priv->numberofframes<=1){ mp_tmsg(MSGT_SEEK,MSGL_WARN,"Could not determine number of frames (for absolute seek).\n"); priv->numberofframes=0; - } + } if(sh_audio){ if(sh_audio->wf->nAvgBytesPerSec && sh_audio->audio.dwSampleSize!=1){ @@ -589,7 +589,7 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ } return demuxer; - + } @@ -611,11 +611,11 @@ static void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,float audio_de // seek absolute video_chunk_pos=0; } - + if(flags&SEEK_FACTOR){ rel_seek_frames=rel_seek_secs*priv->numberofframes; } - + priv->skip_video_frames=0; priv->avi_audio_pts=0; @@ -652,7 +652,7 @@ static void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,float audio_de sh_video->num_frames=sh_video->num_frames_decoded=d_video->pack_no; priv->avi_video_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; d_video->pos=video_chunk_pos; - + mp_msg(MSGT_SEEK,MSGL_DBG2,"V_SEEK: pack=%d pts=%5.3f chunk=%d \n",d_video->pack_no,priv->avi_video_pts,video_chunk_pos); // ------------ STEP 2: seek audio, find the right chunk & pos ------------ @@ -668,7 +668,7 @@ static void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,float audio_de int curr_audio_pos=-1; int audio_chunk_pos=-1; int chunk_max=(demuxer->type==DEMUXER_TYPE_AVI)?video_chunk_pos:priv->idx_size; - + if(sh_audio->audio.dwSampleSize){ // constant rate audio stream /* immediate seeking to audio position, including when streams are delayed */ @@ -694,13 +694,13 @@ static void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,float audio_de mp_msg(MSGT_SEEK,MSGL_V,"SEEK: i=%d (max:%d) dpos=%d (wanted:%d) \n", i,chunk_max,(int)d_audio->dpos,curr_audio_pos); - + } else { // VBR audio /* immediate seeking to audio position, including when streams are delayed */ int chunks=(priv->avi_video_pts + audio_delay)*(float)sh_audio->audio.dwRate/(float)sh_audio->audio.dwScale; audio_chunk_pos=0; - + // find audio chunk pos: for(i=0;i<priv->idx_size && chunks>0;i++){ int id=((AVIINDEXENTRY *)priv->idx)[i].ckid; @@ -720,17 +720,17 @@ static void demux_seek_avi(demuxer_t *demuxer,float rel_seek_secs,float audio_de } } } - + // Now we have: // audio_chunk_pos = chunk no in index table (it's <=chunk_max) // skip_audio_bytes = bytes to be skipped after chunk seek // d-audio->pack_no = chunk_no in stream at audio_chunk_pos // d_audio->dpos = bytepos in stream at audio_chunk_pos // let's seek! - + // update stream position: d_audio->pos=audio_chunk_pos; - + if(demuxer->type==DEMUXER_TYPE_AVI){ // interleaved stream: if(audio_chunk_pos<video_chunk_pos){ |