summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-11-23 01:56:21 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-11-23 01:56:21 +0200
commit5995bc175aea0417ce7ff7285c1c8fc84ebb5704 (patch)
tree7fa0b90e03fc5b3a6447b79754b654bc279f5237 /libmpdemux
parent4c552b2e420ba4cb6d888b12360c7bf63e7cd03a (diff)
parentaf2988cbcef1b057772d44b9f9752be3f15960b0 (diff)
downloadmpv-5995bc175aea0417ce7ff7285c1c8fc84ebb5704.tar.bz2
mpv-5995bc175aea0417ce7ff7285c1c8fc84ebb5704.tar.xz
Merge svn changes up to r29962
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/aviheader.h1
-rw-r--r--libmpdemux/demux_audio.c2
-rw-r--r--libmpdemux/demux_avi.c42
-rw-r--r--libmpdemux/demux_lavf.c11
-rw-r--r--libmpdemux/demux_rawdv.c3
-rw-r--r--libmpdemux/demux_rtp_codec.cpp4
-rw-r--r--libmpdemux/demux_ty.c3
-rw-r--r--libmpdemux/muxer_lavf.c2
-rw-r--r--libmpdemux/video.c2
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);