demux: change signature of open functions, cleanups

Preparation for redoing the open functions.
This commit is contained in:
wm4 2013-07-11 20:08:12 +02:00
parent 3a7fa5b186
commit d17d2fdc7c
13 changed files with 152 additions and 177 deletions

View File

@ -72,7 +72,7 @@ const demuxer_desc_t *const demuxer_list[] = {
#ifdef CONFIG_TV
&demuxer_desc_tv,
#endif
#ifdef CONFIG_LIBASS
#ifdef CONFIG_ASS
&demuxer_desc_libass,
#endif
&demuxer_desc_matroska,
@ -594,16 +594,14 @@ static struct demuxer *open_given_type(struct MPOpts *opts,
struct demuxer_params *params)
{
struct demuxer *demuxer;
int fformat;
int fformat = desc->type;
mp_msg(MSGT_DEMUXER, MSGL_V, "Trying demuxer: %s\n", desc->name);
demuxer = new_demuxer(opts, stream, desc->type, filename);
demuxer->params = params;
if (desc->check_file)
fformat = desc->check_file(demuxer);
else
fformat = desc->type;
if (force)
fformat = desc->type;
if (!force) {
if (desc->check_file)
fformat = desc->check_file(demuxer) >= 0 ? fformat : 0;
}
if (fformat == 0)
goto fail;
if (fformat == desc->type) {
@ -614,15 +612,12 @@ static struct demuxer *open_given_type(struct MPOpts *opts,
mp_tmsg(MSGT_DEMUXER, MSGL_INFO, "Detected file format: %s\n",
desc->shortdesc);
if (demuxer->desc->open) {
struct demuxer *demux2 = demuxer->desc->open(demuxer);
if (!demux2) {
int ret = demuxer->desc->open(demuxer);
if (ret < 0) {
mp_tmsg(MSGT_DEMUXER, MSGL_ERR, "Opening as detected format "
"\"%s\" failed.\n", desc->shortdesc);
goto fail;
}
/* At least demux_mov can return a demux_demuxers instance
* from open() instead of the original fed in. */
demuxer = demux2;
}
demuxer->file_format = fformat;
if (stream_manages_timeline(demuxer->stream)) {

View File

@ -105,19 +105,15 @@ typedef struct demuxer_desc {
// If 1 detection is safe and fast, do it before file extension check
int safe_check;
// Check if can demux the file, return DEMUXER_TYPE_xxx on success
// Mandatory if safe_check == 1, else optional
// Return 0 on success, otherwise -1
int (*check_file)(struct demuxer *demuxer);
/// Get packets from file, return 0 on eof. Mandatory
int (*fill_buffer)(struct demuxer *demuxer);
/// Open the demuxer, return demuxer on success, NULL on failure
struct demuxer *(*open)(struct demuxer *demuxer); // Optional
/// Close the demuxer
void (*close)(struct demuxer *demuxer); // Optional
// Seek. Optional
// Open the demuxer, return 0 on success, otherwise -1
int (*open)(struct demuxer *demuxer);
// The following functions are all optional
int (*fill_buffer)(struct demuxer *demuxer); // 0 on EOF, otherwise 1
void (*close)(struct demuxer *demuxer);
void (*seek)(struct demuxer *demuxer, float rel_seek_secs,
float audio_delay, int flags);
// Various control functions. Optional
int (*control)(struct demuxer *demuxer, int cmd, void *arg);
} demuxer_desc_t;

View File

@ -35,16 +35,16 @@ static int try_open_file(struct demuxer *demuxer)
char buf[PROBE_SIZE];
int len = stream_read(s, buf, sizeof(buf));
if (len <= 0)
return 0;
return -1;
if (!mp_probe_cue((struct bstr) { buf, len }))
return 0;
return -1;
stream_seek(s, 0);
demuxer->file_contents = stream_read_complete(s, demuxer, 1000000);
if (demuxer->file_contents.start == NULL)
return 0;
return -1;
if (!mp_probe_cue((struct bstr) { buf, len }))
return 0;
return DEMUXER_TYPE_CUE;
return -1;
return 0;
}
const struct demuxer_desc demuxer_desc_cue = {

View File

@ -30,14 +30,14 @@ static int try_open_file(struct demuxer *demuxer)
const int len = sizeof(header) - 1;
char buf[len];
if (stream_read(s, buf, len) < len)
return 0;
return -1;
if (strncmp(buf, header, len))
return 0;
return -1;
stream_seek(s, 0);
demuxer->file_contents = stream_read_complete(s, demuxer, 1000000);
if (demuxer->file_contents.start == NULL)
return 0;
return DEMUXER_TYPE_EDL;
return -1;
return 0;
}
const struct demuxer_desc demuxer_desc_edl = {

View File

@ -211,7 +211,7 @@ static int lavf_check_file(demuxer_t *demuxer)
if (!sep) {
mp_msg(MSGT_DEMUX, MSGL_FATAL,
"Must specify filename in 'format:filename' form\n");
return 0;
return -1;
}
avdevice_format = talloc_strndup(priv, priv->filename,
sep - priv->filename);
@ -238,12 +238,12 @@ static int lavf_check_file(demuxer_t *demuxer)
if (format) {
if (strcmp(format, "help") == 0) {
list_formats();
return 0;
return -1;
}
priv->avif = av_find_input_format(format);
if (!priv->avif) {
mp_msg(MSGT_DEMUX, MSGL_FATAL, "Unknown lavf format %s\n", format);
return 0;
return -1;
}
mp_msg(MSGT_DEMUX, MSGL_INFO, "Forced lavf %s demuxer\n",
priv->avif->long_name);
@ -297,7 +297,7 @@ static int lavf_check_file(demuxer_t *demuxer)
if (!priv->avif) {
mp_msg(MSGT_HEADER, MSGL_V,
"No format found, try lowering probescore.\n");
return 0;
return -1;
}
success:
@ -306,7 +306,7 @@ success:
if (!demuxer->filetype)
demuxer->filetype = priv->avif->name;
return DEMUXER_TYPE_LAVF;
return 0;
}
static bool matches_avinputformat_name(struct lavf_priv *priv,
@ -493,7 +493,7 @@ static void add_metadata(demuxer_t *demuxer, AVDictionary *metadata)
demux_info_add(demuxer, t->key, t->value);
}
static demuxer_t *demux_open_lavf(demuxer_t *demuxer)
static int demux_open_lavf(demuxer_t *demuxer)
{
struct MPOpts *opts = demuxer->opts;
struct lavfdopts *lavfdopts = &opts->lavfdopts;
@ -505,7 +505,7 @@ static demuxer_t *demux_open_lavf(demuxer_t *demuxer)
// do not allow forcing the demuxer
if (!priv->avif)
return NULL;
return -1;
stream_seek(demuxer->stream, 0);
@ -548,7 +548,7 @@ static demuxer_t *demux_open_lavf(demuxer_t *demuxer)
mp_msg(MSGT_HEADER, MSGL_ERR,
"Your options /%s/ look like gibberish to me pal\n",
lavfdopts->avopt);
return NULL;
return -1;
}
}
@ -567,14 +567,14 @@ static demuxer_t *demux_open_lavf(demuxer_t *demuxer)
if (avformat_open_input(&avfc, priv->filename, priv->avif, NULL) < 0) {
mp_msg(MSGT_HEADER, MSGL_ERR,
"LAVF_header: avformat_open_input() failed\n");
return NULL;
return -1;
}
priv->avfc = avfc;
if (avformat_find_stream_info(avfc, NULL) < 0) {
mp_msg(MSGT_HEADER, MSGL_ERR,
"LAVF_header: av_find_stream_info() failed\n");
return NULL;
return -1;
}
mp_msg(MSGT_HEADER, MSGL_V, "demux_lavf: avformat_find_stream_info() "
@ -640,7 +640,7 @@ static demuxer_t *demux_open_lavf(demuxer_t *demuxer)
#endif
demuxer->accurate_seek = !priv->seek_by_bytes;
return demuxer;
return 0;
}
static int destroy_avpacket(void *pkt)
@ -899,17 +899,17 @@ static void demux_close_lavf(demuxer_t *demuxer)
const demuxer_desc_t demuxer_desc_lavf = {
"libavformat demuxer",
"lavf",
"libavformat",
"Michael Niedermayer",
"supports many formats, requires libavformat",
DEMUXER_TYPE_LAVF,
1,
lavf_check_file,
demux_lavf_fill_buffer,
demux_open_lavf,
demux_close_lavf,
demux_seek_lavf,
demux_lavf_control
.info = "libavformat demuxer",
.name = "lavf",
.shortdesc = "libavformat",
.author = "Michael Niedermayer",
.comment = "supports many formats, requires libavformat",
.type = DEMUXER_TYPE_LAVF,
.safe_check = 1,
.check_file = lavf_check_file,
.fill_buffer = demux_lavf_fill_buffer,
.open = demux_open_lavf,
.close = demux_close_lavf,
.seek = demux_seek_lavf,
.control = demux_lavf_control,
};

View File

@ -41,7 +41,7 @@ static int d_check_file(struct demuxer *demuxer)
// library handles mismatch, so make sure everything uses a global handle.
ASS_Library *lib = demuxer->params ? demuxer->params->ass_library : NULL;
if (!lib)
return 0;
return -1;
// Probe by loading a part of the beginning of the file with libass.
// Incomplete scripts are usually ok, and we hope libass is not verbose
@ -64,7 +64,7 @@ static int d_check_file(struct demuxer *demuxer)
talloc_free(cbuf.start);
talloc_free(buf.start);
if (!track)
return 0;
return -1;
ass_free_track(track);
// Actually load the full thing.
@ -73,7 +73,7 @@ static int d_check_file(struct demuxer *demuxer)
if (!buf.start) {
mp_tmsg(MSGT_ASS, MSGL_ERR, "Refusing to load subtitle file "
"larger than 100 MB: %s\n", demuxer->filename);
return 0;
return -1;
}
cbuf = mp_charset_guess_and_conv_to_utf8(buf, user_cp, MP_ICONV_VERBOSE);
if (cbuf.start == NULL)
@ -83,7 +83,7 @@ static int d_check_file(struct demuxer *demuxer)
talloc_free(cbuf.start);
talloc_free(buf.start);
if (!track)
return 0;
return -1;
track->name = strdup(demuxer->filename);
@ -96,7 +96,7 @@ static int d_check_file(struct demuxer *demuxer)
sh->sub->track = track;
sh->codec = "ass";
return DEMUXER_TYPE_LIBASS;
return 0;
}
static void d_close(struct demuxer *demuxer)

View File

@ -187,14 +187,15 @@ static mf_t *open_mf(demuxer_t *demuxer)
static int demux_check_file(demuxer_t *demuxer)
{
if (demuxer->stream->type == STREAMTYPE_MF)
return DEMUXER_TYPE_MF;
return 0;
mf_t *mf = open_mf(demuxer);
bool ok = mf && probe_format(mf);
free_mf(mf);
return ok ? DEMUXER_TYPE_MF : 0;
return ok ? 0 : -1;
}
static demuxer_t* demux_open_mf(demuxer_t* demuxer){
static int demux_open_mf(demuxer_t* demuxer)
{
sh_video_t *sh_video = NULL;
mf_t *mf = open_mf(demuxer);
@ -223,11 +224,11 @@ static demuxer_t* demux_open_mf(demuxer_t* demuxer){
mf->sh = sh_video;
demuxer->priv=(void*)mf;
return demuxer;
return 0;
error:
free_mf(mf);
return NULL;
return -1;
}
static void demux_close_mf(demuxer_t* demuxer) {
@ -253,17 +254,17 @@ static int demux_control_mf(demuxer_t *demuxer, int cmd, void *arg) {
}
const demuxer_desc_t demuxer_desc_mf = {
"mf demuxer",
"mf",
"MF",
"?",
"multiframe?, pictures demuxer",
DEMUXER_TYPE_MF,
1,
demux_check_file,
demux_mf_fill_buffer,
demux_open_mf,
demux_close_mf,
demux_seek_mf,
demux_control_mf
.info = "mf demuxer",
.name = "mf",
.shortdesc = "MF",
.author = "?",
.comment = "multiframe?, pictures demuxer",
.type = DEMUXER_TYPE_MF,
.safe_check = 1,
.check_file = demux_check_file,
.fill_buffer = demux_mf_fill_buffer,
.open = demux_open_mf,
.close = demux_close_mf,
.seek = demux_seek_mf,
.control = demux_control_mf,
};

View File

@ -1759,11 +1759,11 @@ static int demux_mkv_open(demuxer_t *demuxer)
stream_seek(s, s->start_pos);
if (!read_ebml_header(demuxer))
return 0;
return -1;
mp_msg(MSGT_DEMUX, MSGL_V, "[mkv] Found the head...\n");
if (!read_mkv_segment_header(demuxer))
return 0;
return -1;
mkv_d = talloc_zero(demuxer, struct mkv_demuxer);
demuxer->priv = mkv_d;
@ -1788,7 +1788,7 @@ static int demux_mkv_open(demuxer_t *demuxer)
}
int res = read_header_element(demuxer, id, 0);
if (res <= -2)
return 0;
return -1;
if (res < 0)
break;
}
@ -1805,7 +1805,7 @@ static int demux_mkv_open(demuxer_t *demuxer)
demuxer->accurate_seek = true;
return DEMUXER_TYPE_MATROSKA;
return 0;
}
static bool bstr_read_u8(bstr *buffer, uint8_t *out_u8)
@ -2718,17 +2718,16 @@ static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
}
const demuxer_desc_t demuxer_desc_matroska = {
"Matroska demuxer",
"mkv",
"Matroska",
"Aurelien Jacobs",
"",
DEMUXER_TYPE_MATROSKA,
1, // safe autodetect
demux_mkv_open,
demux_mkv_fill_buffer,
NULL,
mkv_free,
demux_mkv_seek,
demux_mkv_control
.info = "Matroska demuxer",
.name = "mkv",
.shortdesc = "Matroska",
.author = "Aurelien Jacobs",
.comment = "",
.type = DEMUXER_TYPE_MATROSKA,
.safe_check = 1, // safe autodetect
.check_file = demux_mkv_open,
.fill_buffer = demux_mkv_fill_buffer,
.close = mkv_free,
.seek = demux_mkv_seek,
.control = demux_mkv_control
};

View File

@ -263,10 +263,10 @@ static int demux_mng_check_file(demuxer_t *demuxer)
{
char buf[4];
if (stream_read(demuxer->stream, buf, 4) != 4)
return 0;
return -1;
if (memcmp(buf, "\x8AMNG", 4))
return 0;
return DEMUXER_TYPE_MNG;
return -1;
return 0;
}
/**
@ -343,12 +343,7 @@ static int demux_mng_fill_buffer(demuxer_t * demuxer)
return 1;
}
/**
* \brief MPlayer callback: Open MNG stream.
* \param[in] demuxer demuxer structure
* \return demuxer structure on success, \p NULL on error
*/
static demuxer_t * demux_mng_open(demuxer_t * demuxer)
static int demux_mng_open(demuxer_t * demuxer)
{
mng_priv_t * mng_priv;
mng_handle h_mng;
@ -368,7 +363,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer)
mp_msg(MSGT_DEMUX, MSGL_ERR,
"demux_mng: could not initialize MNG image instance\n");
free(mng_priv);
return NULL;
return -1;
}
// MNG image handle into private data
@ -388,7 +383,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer)
"demux_mng: could not set MNG callbacks\n");
mng_cleanup(&h_mng);
free(mng_priv);
return NULL;
return -1;
}
// start reading MNG data
@ -399,7 +394,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer)
"mng_retcode %d\n", mng_ret);
mng_cleanup(&h_mng);
free(mng_priv);
return NULL;
return -1;
}
// check that MNG header is processed now
@ -408,7 +403,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer)
"demux_mng: internal error: header not processed\n");
mng_cleanup(&h_mng);
free(mng_priv);
return NULL;
return -1;
}
// create a new video stream header
@ -432,7 +427,7 @@ static demuxer_t * demux_mng_open(demuxer_t * demuxer)
// set private data in demuxer and return demuxer
demuxer->priv = mng_priv;
return demuxer;
return 0;
}
/**
@ -569,17 +564,17 @@ static int demux_mng_control(demuxer_t * demuxer, int cmd, void * arg)
}
const demuxer_desc_t demuxer_desc_mng = {
"MNG demuxer",
"mng",
"MNG",
"Stefan Schuermans <stefan@blinkenarea.org>",
"MNG files, using libmng",
DEMUXER_TYPE_MNG,
0, // unsafe autodetect (only checking magic at beginning of stream)
demux_mng_check_file,
demux_mng_fill_buffer,
demux_mng_open,
demux_mng_close,
demux_mng_seek,
demux_mng_control
.info = "MNG demuxer",
.name = "mng",
.shortdesc = "MNG",
.author = "Stefan Schuermans <stefan@blinkenarea.org>",
.comment = "MNG files, using libmng",
.type = DEMUXER_TYPE_MNG,
.safe_check = 0, // unsafe autodetect (only checking magic at beginning of stream)
.check_file = demux_mng_check_file,
.fill_buffer = demux_mng_fill_buffer,
.open = demux_mng_open,
.close = demux_mng_close,
.seek = demux_mng_seek,
.control = demux_mng_control,
};

View File

@ -43,13 +43,13 @@ const m_option_t demux_rawaudio_opts[] = {
};
static demuxer_t* demux_rawaudio_open(demuxer_t* demuxer) {
static int demux_rawaudio_open(demuxer_t* demuxer) {
struct sh_stream *sh;
sh_audio_t* sh_audio;
WAVEFORMATEX* w;
if ((format & AF_FORMAT_SPECIAL_MASK) != 0)
return NULL;
return -1;
sh = new_sh_stream(demuxer, STREAM_AUDIO);
sh_audio = sh->audio;
@ -69,7 +69,7 @@ static demuxer_t* demux_rawaudio_open(demuxer_t* demuxer) {
demuxer->movi_start = demuxer->stream->start_pos;
demuxer->movi_end = demuxer->stream->end_pos;
return demuxer;
return 0;
}
static int demux_rawaudio_fill_buffer(demuxer_t* demuxer)
@ -110,16 +110,13 @@ static void demux_rawaudio_seek(demuxer_t *demuxer,float rel_seek_secs,float aud
}
const demuxer_desc_t demuxer_desc_rawaudio = {
"Raw audio demuxer",
"rawaudio",
"rawaudio",
"?",
"",
DEMUXER_TYPE_RAWAUDIO,
0, // no autodetect
NULL,
demux_rawaudio_fill_buffer,
demux_rawaudio_open,
NULL,
demux_rawaudio_seek,
.info = "Raw audio demuxer",
.name = "rawaudio",
.shortdesc = "rawaudio",
.author = "?",
.comment = "",
.type = DEMUXER_TYPE_RAWAUDIO,
.fill_buffer = demux_rawaudio_fill_buffer,
.open = demux_rawaudio_open,
.seek = demux_rawaudio_seek,
};

View File

@ -56,13 +56,13 @@ const m_option_t demux_rawvideo_opts[] = {
};
static demuxer_t* demux_rawvideo_open(demuxer_t* demuxer) {
static int demux_rawvideo_open(demuxer_t* demuxer) {
struct sh_stream *sh;
sh_video_t* sh_video;
if(!width || !height){
mp_msg(MSGT_DEMUX,MSGL_ERR,"rawvideo: width or height not specified!\n");
return 0;
return -1;
}
const char *decoder = "rawvideo";
@ -109,7 +109,7 @@ static demuxer_t* demux_rawvideo_open(demuxer_t* demuxer) {
}
if (!bpp) {
mp_msg(MSGT_DEMUX,MSGL_ERR,"rawvideo: img size not specified and unknown format!\n");
return 0;
return -1;
}
imgsize = width * height * bpp / 8;
}
@ -126,7 +126,7 @@ static demuxer_t* demux_rawvideo_open(demuxer_t* demuxer) {
demuxer->movi_start = demuxer->stream->start_pos;
demuxer->movi_end = demuxer->stream->end_pos;
return demuxer;
return 0;
}
static int demux_rawvideo_fill_buffer(demuxer_t* demuxer)
@ -166,17 +166,13 @@ static void demux_rawvideo_seek(demuxer_t *demuxer,float rel_seek_secs,float aud
const demuxer_desc_t demuxer_desc_rawvideo = {
"Raw video demuxer",
"rawvideo",
"rawvideo",
"?",
"",
DEMUXER_TYPE_RAWVIDEO,
0, // no autodetect
NULL,
demux_rawvideo_fill_buffer,
demux_rawvideo_open,
NULL,
demux_rawvideo_seek,
NULL
.info = "Raw video demuxer",
.name = "rawvideo",
.shortdesc = "rawvideo",
.author = "?",
.comment = "",
.type = DEMUXER_TYPE_RAWVIDEO,
.fill_buffer = demux_rawvideo_fill_buffer,
.open = demux_rawvideo_open,
.seek = demux_rawvideo_seek,
};

View File

@ -1336,11 +1336,11 @@ static int d_check_file(struct demuxer *demuxer)
free_stream(ps);
if (!res)
return 0;
return -1;
sub_data *sd = sub_read_file(demuxer->stream, &sr);
if (!sd)
return 0;
return -1;
struct priv *p = talloc_zero(demuxer, struct priv);
demuxer->priv = p;
@ -1355,7 +1355,7 @@ static int d_check_file(struct demuxer *demuxer)
demuxer->accurate_seek = true;
return DEMUXER_TYPE_SUBREADER;
return 0;
}
static int d_fill_buffer(struct demuxer *demuxer)

View File

@ -701,7 +701,7 @@ static int tv_uninit(tvi_handle_t *tvh)
return res;
}
static demuxer_t* demux_open_tv(demuxer_t *demuxer)
static int demux_open_tv(demuxer_t *demuxer)
{
tvi_handle_t *tvh;
sh_video_t *sh_video;
@ -709,14 +709,14 @@ static demuxer_t* demux_open_tv(demuxer_t *demuxer)
const tvi_functions_t *funcs;
demuxer->priv=NULL;
if(!(tvh=tv_begin(demuxer->stream->priv))) return NULL;
if (!tvh->functions->init(tvh->priv)) return NULL;
if(!(tvh=tv_begin(demuxer->stream->priv))) return -1;
if (!tvh->functions->init(tvh->priv)) return -1;
tvh->demuxer = demuxer;
if (!open_tv(tvh)){
tv_uninit(tvh);
return NULL;
return -1;
}
funcs = tvh->functions;
demuxer->priv=tvh;
@ -827,7 +827,7 @@ no_audio:
if(!(funcs->start(tvh->priv))){
// start failed :(
tv_uninit(tvh);
return NULL;
return -1;
}
/* set color eq */
@ -840,7 +840,7 @@ no_audio:
if(funcs->control(tvh->priv,TVI_CONTROL_VID_SET_GAIN,&tvh->tv_param->gain)!=TVI_CONTROL_TRUE)
mp_msg(MSGT_TV,MSGL_WARN,"Unable to set gain control!\n");
return demuxer;
return 0;
}
static void demux_close_tv(demuxer_t *demuxer)
@ -1094,17 +1094,13 @@ int tv_step_chanlist(tvi_handle_t *tvh)
}
demuxer_desc_t demuxer_desc_tv = {
"Tv card demuxer",
"tv",
"TV",
"Alex Beregszaszi, Charles R. Henrich",
"?",
DEMUXER_TYPE_TV,
0, // no autodetect
NULL,
demux_tv_fill_buffer,
demux_open_tv,
demux_close_tv,
NULL,
NULL
.info = "Tv card demuxer",
.name = "tv",
.shortdesc = "TV",
.author = "Alex Beregszaszi, Charles R. Henrich",
.comment = "?",
.type = DEMUXER_TYPE_TV,
.fill_buffer = demux_tv_fill_buffer,
.open = demux_open_tv,
.close = demux_close_tv,
};