From 7039bc090a250f8102ca2c719181dbbc5a74ae79 Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Wed, 16 Apr 2008 04:23:38 +0300 Subject: Add option pointer to demuxers and stheader.h structs --- libmpdemux/demux_avi.c | 3 ++- libmpdemux/demux_mov.c | 3 ++- libmpdemux/demux_ogg.c | 3 ++- libmpdemux/demux_rtp.cpp | 3 ++- libmpdemux/demuxer.c | 63 +++++++++++++++++++++++++++++------------------- libmpdemux/demuxer.h | 7 ++++-- libmpdemux/stheader.h | 4 +++ 7 files changed, 55 insertions(+), 31 deletions(-) (limited to 'libmpdemux') diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index afd20d6e02..2ce2822c4f 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -822,6 +822,7 @@ static int avi_check_file(demuxer_t *demuxer) static demuxer_t* demux_open_hack_avi(demuxer_t *demuxer) { + struct MPOpts *opts = demuxer->opts; sh_audio_t* sh_a; demuxer = demux_open_avi(demuxer); @@ -836,7 +837,7 @@ static demuxer_t* demux_open_hack_avi(demuxer_t *demuxer) stream_t* s; demuxer_t *od; s = new_ds_stream(demuxer->audio); - od = new_demuxer(s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL); + od = new_demuxer(opts, s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL); if(!demux_ogg_open(od)) { mp_msg( MSGT_DEMUXER,MSGL_ERR,MSGTR_ErrorOpeningOGGDemuxer); free_stream(s); diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c index 974f11d1ad..edfe7cd221 100644 --- a/libmpdemux/demux_mov.c +++ b/libmpdemux/demux_mov.c @@ -1908,6 +1908,7 @@ static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, } static demuxer_t* mov_read_header(demuxer_t* demuxer){ + struct MPOpts *opts = demuxer->opts; mov_priv_t* priv=demuxer->priv; int t_no; int best_a_id=-1, best_a_len=0; @@ -1983,7 +1984,7 @@ static demuxer_t* mov_read_header(demuxer_t* demuxer){ demuxer->video->id = t_no; s = new_ds_stream(demuxer->video); - od = demux_open(s, DEMUXER_TYPE_MPEG_PS, -1, -1, -1, NULL); + od = demux_open(opts, s, DEMUXER_TYPE_MPEG_PS, -1, -1, -1, NULL); if(od) return new_demuxers_demuxer(od, od, od); demuxer->video->id = -2; //new linked demuxer couldn't be allocated break; diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c index 4b906c3da9..6b8eddf41f 100644 --- a/libmpdemux/demux_ogg.c +++ b/libmpdemux/demux_ogg.c @@ -1226,6 +1226,7 @@ static int demux_ogg_fill_buffer(demuxer_t *d, demux_stream_t *dsds) { /// For avi with Ogg audio stream we have to create an ogg demuxer for this // stream, then we join the avi and ogg demuxer with a demuxers demuxer demuxer_t* init_avi_with_ogg(demuxer_t* demuxer) { + struct MPOpts *opts = demuxer->opts; demuxer_t *od; ogg_demuxer_t *ogg_d; stream_t* s; @@ -1287,7 +1288,7 @@ demuxer_t* init_avi_with_ogg(demuxer_t* demuxer) { // Create the ds_stream and the ogg demuxer s = new_ds_stream(demuxer->audio); - od = new_demuxer(s,DEMUXER_TYPE_OGG,0,-2,-2,NULL); + od = new_demuxer(opts, s,DEMUXER_TYPE_OGG,0,-2,-2,NULL); /// Add the header packets in the ogg demuxer audio stream for (i = 0; i < 3; i++) { diff --git a/libmpdemux/demux_rtp.cpp b/libmpdemux/demux_rtp.cpp index e622922822..fc4967f911 100644 --- a/libmpdemux/demux_rtp.cpp +++ b/libmpdemux/demux_rtp.cpp @@ -97,6 +97,7 @@ extern int rtsp_port; extern "C" int audio_id, video_id, dvdsub_id; extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) { + struct MPOpts *opts = demuxer->opts; Boolean success = False; do { TaskScheduler* scheduler = BasicTaskScheduler::createNew(); @@ -256,7 +257,7 @@ extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) { // code to recognize this: if (demux_is_multiplexed_rtp_stream(demuxer)) { stream_t* s = new_ds_stream(demuxer->video); - demuxer_t* od = demux_open(s, DEMUXER_TYPE_UNKNOWN, + demuxer_t* od = demux_open(opts, s, DEMUXER_TYPE_UNKNOWN, audio_id, video_id, dvdsub_id, NULL); demuxer = new_demuxers_demuxer(od, od, od); } diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 71fa7332c0..c11c8a035a 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -9,6 +9,7 @@ #include #include "config.h" +#include "options.h" #include "mp_msg.h" #include "help_mp.h" #include "m_config.h" @@ -203,8 +204,8 @@ static const demuxer_desc_t *get_demuxer_desc_from_type(int file_format) } -demuxer_t *new_demuxer(stream_t *stream, int type, int a_id, int v_id, - int s_id, char *filename) +demuxer_t *new_demuxer(struct MPOpts *opts, stream_t *stream, int type, + int a_id, int v_id, int s_id, char *filename) { demuxer_t *d = malloc(sizeof(demuxer_t)); memset(d, 0, sizeof(demuxer_t)); @@ -220,6 +221,7 @@ demuxer_t *new_demuxer(stream_t *stream, int type, int a_id, int v_id, d->video = new_demuxer_stream(d, v_id); d->sub = new_demuxer_stream(d, s_id); d->type = type; + d->opts = opts; if (type) if (!(d->desc = get_demuxer_desc_from_type(type))) mp_msg(MSGT_DEMUXER, MSGL_ERR, @@ -248,6 +250,7 @@ sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) sh_sub_t *sh = calloc(1, sizeof(sh_sub_t)); demuxer->s_streams[id] = sh; sh->sid = sid; + sh->opts = demuxer->opts; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid); } return demuxer->s_streams[id]; @@ -285,6 +288,7 @@ sh_audio_t *new_sh_audio_aid(demuxer_t *demuxer, int id, int aid) sh->sample_format = AF_FORMAT_S16_NE; sh->audio_out_minsize = 8192; /* default size, maybe not enough for Win32/ACM */ sh->pts = MP_NOPTS_VALUE; + sh->opts = demuxer->opts; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", aid); } ((sh_audio_t *) demuxer->a_streams[id])->aid = aid; @@ -314,7 +318,9 @@ sh_video_t *new_sh_video_vid(demuxer_t *demuxer, int id, int vid) mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_VideoStreamRedefined, id); else { mp_msg(MSGT_DEMUXER, MSGL_V, MSGTR_FoundVideoStream, id); - demuxer->v_streams[id] = calloc(1, sizeof(sh_video_t)); + sh_video_t *sh = calloc(1, sizeof *sh); + demuxer->v_streams[id] = sh; + sh->opts = demuxer->opts; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ID=%d\n", vid); } ((sh_video_t *) demuxer->v_streams[id])->vid = vid; @@ -748,9 +754,10 @@ int user_correct_pts = -1; (ex: tv,mf). */ -static demuxer_t *demux_open_stream(stream_t *stream, int file_format, - int force, int audio_id, int video_id, - int dvdsub_id, char *filename) +static demuxer_t *demux_open_stream(struct MPOpts *opts, stream_t *stream, + int file_format, int force, int audio_id, + int video_id, int dvdsub_id, + char *filename) { demuxer_t *demuxer = NULL; @@ -764,8 +771,8 @@ static demuxer_t *demux_open_stream(stream_t *stream, int file_format, if (file_format) { if ((demuxer_desc = get_demuxer_desc_from_type(file_format))) { demuxer = - new_demuxer(stream, demuxer_desc->type, audio_id, video_id, - dvdsub_id, filename); + new_demuxer(opts, stream, demuxer_desc->type, audio_id, + video_id, dvdsub_id, filename); if (demuxer_desc->check_file) fformat = demuxer_desc->check_file(demuxer); if (force || !demuxer_desc->check_file) @@ -786,8 +793,9 @@ static demuxer_t *demux_open_stream(stream_t *stream, int file_format, } else { // Format changed after check, recurse free_demuxer(demuxer); - return demux_open_stream(stream, fformat, force, audio_id, - video_id, dvdsub_id, filename); + return demux_open_stream(opts, stream, fformat, force, + audio_id, video_id, dvdsub_id, + filename); } } // Check failed for forced demuxer, quit @@ -799,8 +807,8 @@ static demuxer_t *demux_open_stream(stream_t *stream, int file_format, for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { if (demuxer_desc->safe_check) { demuxer = - new_demuxer(stream, demuxer_desc->type, audio_id, video_id, - dvdsub_id, filename); + new_demuxer(opts, stream, demuxer_desc->type, audio_id, + video_id, dvdsub_id, filename); if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { if (fformat == demuxer_desc->type) { demuxer_t *demux2 = demuxer; @@ -819,8 +827,9 @@ static demuxer_t *demux_open_stream(stream_t *stream, int file_format, // Format changed after check, recurse free_demuxer(demuxer); demuxer = - demux_open_stream(stream, fformat, force, audio_id, - video_id, dvdsub_id, filename); + demux_open_stream(opts, stream, fformat, force, + audio_id, video_id, dvdsub_id, + filename); if (demuxer) return demuxer; // done! file_format = DEMUXER_TYPE_UNKNOWN; @@ -840,8 +849,9 @@ static demuxer_t *demux_open_stream(stream_t *stream, int file_format, file_format = demuxer_type_by_filename(filename); if (file_format != DEMUXER_TYPE_UNKNOWN) { // we like recursion :) - demuxer = demux_open_stream(stream, file_format, force, audio_id, - video_id, dvdsub_id, filename); + demuxer = demux_open_stream(opts, stream, file_format, force, + audio_id, video_id, dvdsub_id, + filename); if (demuxer) return demuxer; // done! file_format = DEMUXER_TYPE_UNKNOWN; // continue fuzzy guessing... @@ -853,8 +863,8 @@ static demuxer_t *demux_open_stream(stream_t *stream, int file_format, for (i = 0; (demuxer_desc = demuxer_list[i]); i++) { if (!demuxer_desc->safe_check && demuxer_desc->check_file) { demuxer = - new_demuxer(stream, demuxer_desc->type, audio_id, video_id, - dvdsub_id, filename); + new_demuxer(opts, stream, demuxer_desc->type, audio_id, + video_id, dvdsub_id, filename); if ((fformat = demuxer_desc->check_file(demuxer)) != 0) { if (fformat == demuxer_desc->type) { demuxer_t *demux2 = demuxer; @@ -873,8 +883,9 @@ static demuxer_t *demux_open_stream(stream_t *stream, int file_format, // Format changed after check, recurse free_demuxer(demuxer); demuxer = - demux_open_stream(stream, fformat, force, audio_id, - video_id, dvdsub_id, filename); + demux_open_stream(opts, stream, fformat, force, + audio_id, video_id, dvdsub_id, + filename); if (demuxer) return demuxer; // done! file_format = DEMUXER_TYPE_UNKNOWN; @@ -930,8 +941,9 @@ extern int hr_mp3_seek; extern float stream_cache_min_percent; extern float stream_cache_seek_min_percent; -demuxer_t *demux_open(stream_t *vs, int file_format, int audio_id, - int video_id, int dvdsub_id, char *filename) +demuxer_t *demux_open(struct MPOpts *opts, stream_t *vs, int file_format, + int audio_id, int video_id, int dvdsub_id, + char *filename) { stream_t *as = NULL, *ss = NULL; demuxer_t *vd, *ad = NULL, *sd = NULL; @@ -989,7 +1001,7 @@ demuxer_t *demux_open(stream_t *vs, int file_format, int audio_id, } } - vd = demux_open_stream(vs, demuxer_type ? demuxer_type : file_format, + vd = demux_open_stream(opts, vs, demuxer_type ? demuxer_type : file_format, demuxer_force, audio_stream ? -2 : audio_id, video_id, sub_stream ? -2 : dvdsub_id, filename); if (!vd) { @@ -1000,7 +1012,7 @@ demuxer_t *demux_open(stream_t *vs, int file_format, int audio_id, return NULL; } if (as) { - ad = demux_open_stream(as, + ad = demux_open_stream(opts, as, audio_demuxer_type ? audio_demuxer_type : afmt, audio_demuxer_force, audio_id, -2, -2, audio_stream); @@ -1013,7 +1025,8 @@ demuxer_t *demux_open(stream_t *vs, int file_format, int audio_id, hr_mp3_seek = 1; // Enable high res seeking } if (ss) { - sd = demux_open_stream(ss, sub_demuxer_type ? sub_demuxer_type : sfmt, + sd = demux_open_stream(opts, ss, + sub_demuxer_type ? sub_demuxer_type : sfmt, sub_demuxer_force, -2, -2, dvdsub_id, sub_stream); if (!sd) { diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index a72e3f8a45..e01e95e612 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -10,6 +10,8 @@ #include "libass/ass_types.h" #endif +struct MPOpts; + #define MAX_PACKS 4096 #ifdef HAVE_TV_BSDBT848 #define MAX_PACK_BYTES 0x2000000 @@ -223,6 +225,7 @@ typedef struct demuxer_st { void* priv; // fileformat-dependent data char** info; + struct MPOpts *opts; } demuxer_t; typedef struct { @@ -305,7 +308,7 @@ static inline void *realloc_struct(void *ptr, size_t nmemb, size_t size) { } demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id); -demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id,char *filename); +demuxer_t* new_demuxer(struct MPOpts *opts, stream_t *stream,int type,int a_id,int v_id,int s_id,char *filename); void free_demuxer_stream(demux_stream_t *ds); void free_demuxer(demuxer_t *demuxer); @@ -368,7 +371,7 @@ static inline int avi_stream_id(unsigned int id){ return a*10+b; } -demuxer_t* demux_open(stream_t *stream,int file_format,int aid,int vid,int sid,char* filename); +demuxer_t* demux_open(struct MPOpts *opts, stream_t *stream,int file_format,int aid,int vid,int sid,char* filename); int demux_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags); demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd); diff --git a/libmpdemux/stheader.h b/libmpdemux/stheader.h index 2ccd7fa4d0..a81f349c02 100644 --- a/libmpdemux/stheader.h +++ b/libmpdemux/stheader.h @@ -4,10 +4,12 @@ #include "demuxer.h" #include "aviheader.h" #include "ms_hdr.h" +struct MPOpts; // Stream headers: typedef struct sh_audio { + struct MPOpts *opts; int aid; demux_stream_t *ds; struct codecs_st *codec; @@ -55,6 +57,7 @@ typedef struct sh_audio { } sh_audio_t; typedef struct sh_video { + struct MPOpts *opts; int vid; demux_stream_t *ds; struct codecs_st *codec; @@ -95,6 +98,7 @@ typedef struct sh_video { } sh_video_t; typedef struct sh_sub { + struct MPOpts *opts; int sid; char type; // t = text, v = VobSub, a = SSA/ASS int has_palette; // If we have a valid palette -- cgit v1.2.3