diff options
author | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-11-23 01:56:21 +0200 |
---|---|---|
committer | Uoti Urpala <uau@glyph.nonexistent.invalid> | 2009-11-23 01:56:21 +0200 |
commit | 5995bc175aea0417ce7ff7285c1c8fc84ebb5704 (patch) | |
tree | 7fa0b90e03fc5b3a6447b79754b654bc279f5237 /libmpdemux | |
parent | 4c552b2e420ba4cb6d888b12360c7bf63e7cd03a (diff) | |
parent | af2988cbcef1b057772d44b9f9752be3f15960b0 (diff) | |
download | mpv-5995bc175aea0417ce7ff7285c1c8fc84ebb5704.tar.bz2 mpv-5995bc175aea0417ce7ff7285c1c8fc84ebb5704.tar.xz |
Merge svn changes up to r29962
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/aviheader.h | 1 | ||||
-rw-r--r-- | libmpdemux/demux_audio.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_avi.c | 42 | ||||
-rw-r--r-- | libmpdemux/demux_lavf.c | 11 | ||||
-rw-r--r-- | libmpdemux/demux_rawdv.c | 3 | ||||
-rw-r--r-- | libmpdemux/demux_rtp_codec.cpp | 4 | ||||
-rw-r--r-- | libmpdemux/demux_ty.c | 3 | ||||
-rw-r--r-- | libmpdemux/muxer_lavf.c | 2 | ||||
-rw-r--r-- | libmpdemux/video.c | 2 |
9 files changed, 33 insertions, 37 deletions
diff --git a/libmpdemux/aviheader.h b/libmpdemux/aviheader.h index a06ef711ac..4074f6bb03 100644 --- a/libmpdemux/aviheader.h +++ b/libmpdemux/aviheader.h @@ -367,6 +367,7 @@ typedef struct { avisuperindex_chunk *suidx; int suidx_size; int isodml; + int warned_unaligned; } avi_priv_t; #define AVI_PRIV ((avi_priv_t*)(demuxer->priv)) diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c index f20c7d52f1..43ee3113ce 100644 --- a/libmpdemux/demux_audio.c +++ b/libmpdemux/demux_audio.c @@ -346,7 +346,7 @@ static int demux_audio_open(demuxer_t* demuxer) { sh_audio->i_bps = sh_audio->wf->nAvgBytesPerSec; free(mp3_found); mp3_found = NULL; - if(s->end_pos && (s->flags & STREAM_SEEK) == STREAM_SEEK) { + if(s->end_pos && (s->flags & MP_STREAM_SEEK) == MP_STREAM_SEEK) { char tag[4]; stream_seek(s,s->end_pos-128); stream_read(s,tag,3); diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index 7ceffb33c1..6671b0c322 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -108,6 +108,12 @@ static int valid_fourcc(unsigned int id){ strchr(valid, fcc[2]) && strchr(valid, fcc[3]); } +static int valid_stream_id(unsigned int id) { + unsigned char* fcc=(unsigned char*)(&id); + return fcc[0] >= '0' && fcc[0] <= '9' && fcc[1] >= '0' && fcc[1] <= '9' && + ((fcc[2] == 'w' && fcc[3] == 'b') || (fcc[2] == 'd' && fcc[3] == 'c')); +} + static int choose_chunk_len(unsigned int len1,unsigned int len2){ // len1 has a bit more priority than len2. len1!=len2 // Note: this is a first-idea-logic, may be wrong. comments welcomed. @@ -220,8 +226,12 @@ do{ idx=&((AVIINDEXENTRY *)priv->idx)[priv->idx_pos++]; if(idx->dwFlags&AVIIF_LIST){ + if (!valid_stream_id(idx->ckid)) // LIST continue; + if (!priv->warned_unaligned) + mp_msg(MSGT_DEMUX, MSGL_WARN, "Looks like unaligned chunk in index, broken AVI file!\n"); + priv->warned_unaligned = 1; } if(!demux_avi_select_stream(demux,idx->ckid)){ mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); @@ -229,7 +239,7 @@ do{ } pos = (off_t)priv->idx_offset+AVI_IDX_OFFSET(idx); - if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start) && (demux->stream->flags & STREAM_SEEK)){ + if((pos<demux->movi_start || pos>=demux->movi_end) && (demux->movi_end>demux->movi_start) && (demux->stream->flags & MP_STREAM_SEEK)){ mp_msg(MSGT_DEMUX,MSGL_V,"ChunkOffset out of range! idx=0x%"PRIX64" \n",(int64_t)pos); continue; } @@ -254,7 +264,7 @@ do{ if(!(idx->dwFlags&AVIIF_KEYFRAME)) flags=0; } else { demux->filepos=stream_tell(demux->stream); - if(demux->filepos>=demux->movi_end && demux->movi_end>demux->movi_start && (demux->stream->flags & STREAM_SEEK)){ + if(demux->filepos>=demux->movi_end && demux->movi_end>demux->movi_start && (demux->stream->flags & MP_STREAM_SEEK)){ demux->stream->eof=1; return 0; } @@ -319,8 +329,12 @@ do{ idx=&((AVIINDEXENTRY *)priv->idx)[idx_pos]; if(idx->dwFlags&AVIIF_LIST){ + if (!valid_stream_id(idx->ckid)) // LIST continue; + if (!priv->warned_unaligned) + mp_msg(MSGT_DEMUX, MSGL_WARN, "Looks like unaligned chunk in index, broken AVI file!\n"); + priv->warned_unaligned = 1; } if(ds && demux_avi_select_stream(demux,idx->ckid)!=ds){ mp_dbg(MSGT_DEMUX,MSGL_DBG3,"Skip chunk %.4s (0x%X) \n",(char *)&idx->ckid,(unsigned int)idx->ckid); @@ -425,25 +439,12 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ demux_stream_t *d_video=demuxer->video; sh_audio_t *sh_audio=NULL; sh_video_t *sh_video=NULL; - avi_priv_t* priv=malloc(sizeof(avi_priv_t)); - - // priv struct: - priv->avi_audio_pts=priv->avi_video_pts=0.0f; - priv->pts_correction=0.0f; - priv->skip_video_frames=0; - priv->pts_corr_bytes=0; - priv->pts_has_video=priv->pts_corrected=0; - priv->video_pack_no=0; - priv->audio_block_no=0; - priv->audio_block_size=0; - priv->isodml = 0; - priv->suidx_size = 0; - priv->suidx = NULL; + avi_priv_t* priv=calloc(1, sizeof(avi_priv_t)); demuxer->priv=(void*)priv; //---- AVI header: - read_avi_header(demuxer,(demuxer->stream->flags & STREAM_SEEK_BW)?index_mode:-2); + read_avi_header(demuxer,(demuxer->stream->flags & MP_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); @@ -456,22 +457,15 @@ static demuxer_t* demux_open_avi(demuxer_t* demuxer){ stream_reset(demuxer->stream); stream_seek(demuxer->stream,demuxer->movi_start); - priv->idx_pos=0; - priv->idx_pos_a=0; - priv->idx_pos_v=0; if(priv->idx_size>1){ // decide index format: #if 1 if((AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[0])<demuxer->movi_start || AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[1])<demuxer->movi_start )&& !priv->isodml) priv->idx_offset=demuxer->movi_start-4; - else - priv->idx_offset=0; #else if(AVI_IDX_OFFSET(&((AVIINDEXENTRY *)priv->idx)[0])<demuxer->movi_start) priv->idx_offset=demuxer->movi_start-4; - else - priv->idx_offset=0; #endif mp_msg(MSGT_DEMUX,MSGL_V,"AVI index offset: 0x%X (movi=0x%X idx0=0x%X idx1=0x%X)\n", (int)priv->idx_offset,(int)demuxer->movi_start, diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 0d44a0fc18..622b87d45a 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -66,7 +66,7 @@ typedef struct lavf_priv_t{ AVInputFormat *avif; AVFormatContext *avfc; ByteIOContext *pb; - uint8_t buffer[BIO_BUFFER_SIZE]; + uint8_t buffer[FFMAX(BIO_BUFFER_SIZE, PROBE_BUF_SIZE)]; int audio_streams; int video_streams; int sub_streams; @@ -130,7 +130,6 @@ static void list_formats(void) { static int lavf_check_file(demuxer_t *demuxer){ AVProbeData avpd; - uint8_t buf[PROBE_BUF_SIZE]; lavf_priv_t *priv; int probe_data_size; @@ -154,11 +153,11 @@ static int lavf_check_file(demuxer_t *demuxer){ return DEMUXER_TYPE_LAVF; } - probe_data_size = stream_read(demuxer->stream, buf, PROBE_BUF_SIZE); + probe_data_size = stream_read(demuxer->stream, priv->buffer, PROBE_BUF_SIZE); if(probe_data_size <= 0) return 0; avpd.filename= demuxer->stream->url; - avpd.buf= buf; + avpd.buf= priv->buffer; avpd.buf_size= probe_data_size; priv->avif= av_probe_input_format(&avpd, 1); @@ -433,7 +432,7 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ stream_seek(demuxer->stream, 0); - avfc = av_alloc_format_context(); + avfc = avformat_alloc_context(); if (opt_cryptokey) parse_cryptokey(avfc, opt_cryptokey); @@ -466,7 +465,7 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ priv->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 0, demuxer->stream, mp_read, NULL, mp_seek); - priv->pb->is_streamed = !demuxer->stream->end_pos || (demuxer->stream->flags & STREAM_SEEK) != STREAM_SEEK; + priv->pb->is_streamed = !demuxer->stream->end_pos || (demuxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK; if(av_open_input_stream(&avfc, priv->pb, mp_filename, priv->avif, &ap)<0){ mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_open_input_stream() failed\n"); diff --git a/libmpdemux/demux_rawdv.c b/libmpdemux/demux_rawdv.c index 69a99deca1..73068417c2 100644 --- a/libmpdemux/demux_rawdv.c +++ b/libmpdemux/demux_rawdv.c @@ -190,8 +190,7 @@ static demuxer_t* demux_open_rawdv(demuxer_t* demuxer) sh_video->frametime = 1.0/sh_video->fps; // emulate BITMAPINFOHEADER for win32 decoders: - sh_video->bih=malloc(sizeof(BITMAPINFOHEADER)); - memset(sh_video->bih,0,sizeof(BITMAPINFOHEADER)); + sh_video->bih=calloc(1, sizeof(BITMAPINFOHEADER)); sh_video->bih->biSize=40; sh_video->bih->biWidth = dv_decoder->width; sh_video->bih->biHeight = dv_decoder->height; diff --git a/libmpdemux/demux_rtp_codec.cpp b/libmpdemux/demux_rtp_codec.cpp index 32bfc43647..36d770fd0d 100644 --- a/libmpdemux/demux_rtp_codec.cpp +++ b/libmpdemux/demux_rtp_codec.cpp @@ -191,9 +191,9 @@ void rtpCodecInitialize_video(demuxer_t* demuxer, while (pos+8 < endpos) { unsigned atomLength = pos[0]<<24 | pos[1]<<16 | pos[2]<<8 | pos[3]; if (atomLength == 0 || atomLength > endpos-pos) break; - if ((!memcmp(pos+4, "avcC", 4) && fourcc==mmioFOURCC('a','v','c','1') || + if (((!memcmp(pos+4, "avcC", 4) && fourcc==mmioFOURCC('a','v','c','1')) || !memcmp(pos+4, "esds", 4) || - !memcmp(pos+4, "SMI ", 4) && fourcc==mmioFOURCC('S','V','Q','3')) && + (!memcmp(pos+4, "SMI ", 4) && fourcc==mmioFOURCC('S','V','Q','3'))) && atomLength > 8) { sh_video->bih = bih = insertVideoExtradata(bih, pos+8, atomLength-8); diff --git a/libmpdemux/demux_ty.c b/libmpdemux/demux_ty.c index 2cb38b4370..9515d0b893 100644 --- a/libmpdemux/demux_ty.c +++ b/libmpdemux/demux_ty.c @@ -86,6 +86,7 @@ typedef struct typedef struct { int whichChunk; + unsigned char chunk[ CHUNKSIZE ]; unsigned char lastAudio[ MAX_AUDIO_BUFFER ]; int lastAudioEnd; @@ -338,7 +339,6 @@ static int demux_ty_fill_buffer( demuxer_t *demux, demux_stream_t *dsds ) int errorHeader = 0; int recordsDecoded = 0; - unsigned char chunk[ CHUNKSIZE ]; int readSize; int numberRecs; @@ -350,6 +350,7 @@ static int demux_ty_fill_buffer( demuxer_t *demux, demux_stream_t *dsds ) int aid; TiVoInfo *tivo = demux->priv; + unsigned char *chunk = tivo->chunk; if ( demux->stream->type == STREAMTYPE_DVD ) return 0; diff --git a/libmpdemux/muxer_lavf.c b/libmpdemux/muxer_lavf.c index 9913399a87..ed6025317d 100644 --- a/libmpdemux/muxer_lavf.c +++ b/libmpdemux/muxer_lavf.c @@ -391,7 +391,7 @@ int muxer_init_muxer_lavf(muxer_t *muxer) } priv->oc->pb = av_alloc_put_byte(priv->buffer, BIO_BUFFER_SIZE, 1, muxer, NULL, mp_write, mp_seek); - if ((muxer->stream->flags & STREAM_SEEK) != STREAM_SEEK) + if ((muxer->stream->flags & MP_STREAM_SEEK) != MP_STREAM_SEEK) priv->oc->pb->is_streamed = 1; muxer->priv = (void *) priv; diff --git a/libmpdemux/video.c b/libmpdemux/video.c index b7e8aabb1b..ff6bbd0bc9 100644 --- a/libmpdemux/video.c +++ b/libmpdemux/video.c @@ -235,6 +235,8 @@ switch(video_codec){ return 0; } h264_parse_sps(&picture, &(videobuffer[pos]), videobuf_len - pos); + sh_video->disp_w=picture.display_picture_width; + sh_video->disp_h=picture.display_picture_height; mp_msg(MSGT_DECVIDEO,MSGL_V,"Searching for picture parameter set... "); while(1){ int i=sync_video_packet(d_video); |