diff options
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/demux_lavf.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_ty.c | 1 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 78 | ||||
-rw-r--r-- | libmpdemux/demuxer.h | 65 |
4 files changed, 84 insertions, 62 deletions
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 904cd1434b..6a32240ebd 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -201,7 +201,7 @@ static int lavf_check_file(demuxer_t *demuxer){ read_size > 0 && probe_data_size < PROBE_BUF_SIZE); av_free(avpd.buf); - if(!priv->avif){ + if (!priv->avif || score <= AVPROBE_SCORE_MAX / 4) { mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: no clue about this gibberish!\n"); return 0; }else diff --git a/libmpdemux/demux_ty.c b/libmpdemux/demux_ty.c index df4c6c34fd..4309ad1387 100644 --- a/libmpdemux/demux_ty.c +++ b/libmpdemux/demux_ty.c @@ -851,6 +851,7 @@ static void demux_close_ty( demuxer_t *demux ) static int ty_check_file(demuxer_t* demuxer) { + demuxer->filepos = 0; TiVoInfo *tivo = calloc(1, sizeof(TiVoInfo)); demuxer->priv = tivo; return ds_fill_buffer(demuxer->video) ? DEMUXER_TYPE_MPEG_TY : 0; diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 098c631631..6607f2399f 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -175,6 +175,84 @@ const demuxer_desc_t *const demuxer_list[] = { NULL }; +struct demux_packet *new_demux_packet(size_t len) +{ + if (len > 1000000000) { + mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Attempt to allocate demux packet " + "over 1 GB!\n"); + abort(); + } + struct demux_packet *dp = malloc(sizeof(struct demux_packet)); + dp->len = len; + dp->next = NULL; + dp->pts = MP_NOPTS_VALUE; + dp->duration = -1; + dp->stream_pts = MP_NOPTS_VALUE; + dp->pos = 0; + dp->flags = 0; + dp->refcount = 1; + dp->master = NULL; + dp->buffer = NULL; + if (len > 0) { + dp->buffer = malloc(len + MP_INPUT_BUFFER_PADDING_SIZE); + if (!dp->buffer) { + mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Memory allocation failure!\n"); + abort(); + } + memset(dp->buffer + len, 0, 8); + } + return dp; +} + +void resize_demux_packet(struct demux_packet *dp, size_t len) +{ + if (len > 1000000000) { + mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Attempt to realloc demux packet " + "over 1 GB!\n"); + abort(); + } + if (len > 0) { + dp->buffer = realloc(dp->buffer, len + 8); + if (!dp->buffer) { + mp_msg(MSGT_DEMUXER, MSGL_FATAL, "Memory allocation failure!\n"); + abort(); + } + memset(dp->buffer + len, 0, 8); + } else { + free(dp->buffer); + dp->buffer = NULL; + } + dp->len = len; +} + +struct demux_packet *clone_demux_packet(struct demux_packet *pack) +{ + struct demux_packet *dp = malloc(sizeof(struct demux_packet)); + while (pack->master) + pack = pack->master; // find the master + memcpy(dp, pack, sizeof(struct demux_packet)); + dp->next = NULL; + dp->refcount = 0; + dp->master = pack; + pack->refcount++; + return dp; +} + +void free_demux_packet(struct demux_packet *dp) +{ + if (dp->master == NULL) { //dp is a master packet + dp->refcount--; + if (dp->refcount == 0) { + free(dp->buffer); + free(dp); + } + return; + } + // dp is a clone: + free_demux_packet(dp->master); + free(dp); +} + void free_demuxer_stream(demux_stream_t *ds) { ds_free_packs(ds); diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index ece4b74af8..e66b8f8a12 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -284,67 +284,10 @@ typedef struct { int aid, vid, sid; //audio, video and subtitle id } demux_program_t; -static inline demux_packet_t* new_demux_packet(int len){ - demux_packet_t* dp=(demux_packet_t*)malloc(sizeof(demux_packet_t)); - dp->len=len; - dp->next=NULL; - dp->pts=MP_NOPTS_VALUE; - dp->duration = -1; - dp->stream_pts = MP_NOPTS_VALUE; - dp->pos=0; - dp->flags=0; - dp->refcount=1; - dp->master=NULL; - dp->buffer=NULL; - if (len > 0 && (dp->buffer = (unsigned char *)malloc(len + MP_INPUT_BUFFER_PADDING_SIZE))) - memset(dp->buffer + len, 0, 8); - else - dp->len = 0; - return dp; -} - -static inline void resize_demux_packet(demux_packet_t* dp, int len) -{ - if(len > 0) - { - dp->buffer=(unsigned char *)realloc(dp->buffer,len+8); - } - else - { - free(dp->buffer); - dp->buffer=NULL; - } - dp->len=len; - if (dp->buffer) - memset(dp->buffer + len, 0, 8); - else - dp->len = 0; -} - -static inline demux_packet_t* clone_demux_packet(demux_packet_t* pack){ - demux_packet_t* dp=(demux_packet_t*)malloc(sizeof(demux_packet_t)); - while(pack->master) pack=pack->master; // find the master - memcpy(dp,pack,sizeof(demux_packet_t)); - dp->next=NULL; - dp->refcount=0; - dp->master=pack; - pack->refcount++; - return dp; -} - -static inline void free_demux_packet(demux_packet_t* dp){ - if (dp->master==NULL){ //dp is a master packet - dp->refcount--; - if (dp->refcount==0){ - free(dp->buffer); - free(dp); - } - return; - } - // dp is a clone: - free_demux_packet(dp->master); - free(dp); -} +struct demux_packet *new_demux_packet(size_t len); +void resize_demux_packet(struct demux_packet *dp, size_t len); +struct demux_packet *clone_demux_packet(struct demux_packet *pack); +void free_demux_packet(struct demux_packet *dp); #ifndef SIZE_MAX #define SIZE_MAX ((size_t)-1) |