Add option pointer to demuxers and stheader.h structs

This commit is contained in:
Uoti Urpala 2008-04-16 04:23:38 +03:00
parent d3d12332d6
commit 7039bc090a
9 changed files with 58 additions and 34 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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++) {

View File

@ -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);
}

View File

@ -9,6 +9,7 @@
#include <sys/stat.h>
#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) {

View File

@ -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);

View File

@ -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

View File

@ -519,7 +519,7 @@ if(!codecs_file || !parse_codec_cfg(codecs_file)){
if (frameno_filename) {
stream2=open_stream(frameno_filename,0,&i);
if(stream2){
demuxer2=demux_open(stream2,DEMUXER_TYPE_AVI,-1,-1,-2,NULL);
demuxer2=demux_open(&opts, stream2,DEMUXER_TYPE_AVI,-1,-1,-2,NULL);
if(demuxer2) mp_msg(MSGT_MENCODER, MSGL_INFO, MSGTR_UsingPass3ControlFile, frameno_filename);
else mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_FormatNotRecognized);
}
@ -605,7 +605,7 @@ if(stream->type==STREAMTYPE_DVDNAV){
if(demuxer2) audio_id=-2; /* do NOT read audio packets... */
//demuxer=demux_open(stream,file_format,video_id,audio_id,dvdsub_id);
demuxer=demux_open(stream,file_format,audio_id,video_id,dvdsub_id,filename);
demuxer=demux_open(&opts, stream,file_format,audio_id,video_id,dvdsub_id,filename);
if(!demuxer){
mp_msg(MSGT_DEMUXER, MSGL_FATAL, MSGTR_FormatNotRecognized);
mp_msg(MSGT_DEMUXER, MSGL_FATAL, MSGTR_CannotOpenDemuxer);

View File

@ -3231,7 +3231,7 @@ if(stream_cache_size>0){
//============ Open DEMUXERS --- DETECT file type =======================
current_module="demux_open";
mpctx->demuxer=demux_open(mpctx->stream,mpctx->file_format,audio_id,video_id,dvdsub_id,filename);
mpctx->demuxer=demux_open(opts, mpctx->stream,mpctx->file_format,audio_id,video_id,dvdsub_id,filename);
// HACK to get MOV Reference Files working