summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_lavf.c2
-rw-r--r--libmpdemux/demux_ty.c1
-rw-r--r--libmpdemux/demuxer.c78
-rw-r--r--libmpdemux/demuxer.h65
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)