From d17d2fdc7c536821b3fea8c4a37c0ad09fc487db Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 11 Jul 2013 20:08:12 +0200 Subject: demux: change signature of open functions, cleanups Preparation for redoing the open functions. --- demux/demux.c | 21 ++++++++------------- demux/demux.h | 16 ++++++---------- demux/demux_cue.c | 10 +++++----- demux/demux_edl.c | 8 ++++---- demux/demux_lavf.c | 48 ++++++++++++++++++++++++------------------------ demux/demux_libass.c | 10 +++++----- demux/demux_mf.c | 37 +++++++++++++++++++------------------ demux/demux_mkv.c | 33 ++++++++++++++++----------------- demux/demux_mng.c | 49 ++++++++++++++++++++++--------------------------- demux/demux_rawaudio.c | 27 ++++++++++++--------------- demux/demux_rawvideo.c | 30 +++++++++++++----------------- demux/demux_subreader.c | 6 +++--- 12 files changed, 137 insertions(+), 158 deletions(-) (limited to 'demux') diff --git a/demux/demux.c b/demux/demux.c index 3cd23a4b42..64fee955ed 100644 --- a/demux/demux.c +++ b/demux/demux.c @@ -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)) { diff --git a/demux/demux.h b/demux/demux.h index 3b0d6d5956..c43f0282fb 100644 --- a/demux/demux.h +++ b/demux/demux.h @@ -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; diff --git a/demux/demux_cue.c b/demux/demux_cue.c index 073fa9d336..43ef910868 100644 --- a/demux/demux_cue.c +++ b/demux/demux_cue.c @@ -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 = { diff --git a/demux/demux_edl.c b/demux/demux_edl.c index c35137ffb2..44fa824193 100644 --- a/demux/demux_edl.c +++ b/demux/demux_edl.c @@ -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 = { diff --git a/demux/demux_lavf.c b/demux/demux_lavf.c index 3f330332e3..0e7690f606 100644 --- a/demux/demux_lavf.c +++ b/demux/demux_lavf.c @@ -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, }; diff --git a/demux/demux_libass.c b/demux/demux_libass.c index cbc85b3abe..4dadb42b89 100644 --- a/demux/demux_libass.c +++ b/demux/demux_libass.c @@ -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) diff --git a/demux/demux_mf.c b/demux/demux_mf.c index 7465ddeae8..3a72558208 100644 --- a/demux/demux_mf.c +++ b/demux/demux_mf.c @@ -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, }; diff --git a/demux/demux_mkv.c b/demux/demux_mkv.c index 0d174639c7..a60172cce9 100644 --- a/demux/demux_mkv.c +++ b/demux/demux_mkv.c @@ -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 }; diff --git a/demux/demux_mng.c b/demux/demux_mng.c index 34fdf521b5..824a668868 100644 --- a/demux/demux_mng.c +++ b/demux/demux_mng.c @@ -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 ", - "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 ", + .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, }; diff --git a/demux/demux_rawaudio.c b/demux/demux_rawaudio.c index 74134743a0..13bbbb341a 100644 --- a/demux/demux_rawaudio.c +++ b/demux/demux_rawaudio.c @@ -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, }; diff --git a/demux/demux_rawvideo.c b/demux/demux_rawvideo.c index 4340362192..488c13bdec 100644 --- a/demux/demux_rawvideo.c +++ b/demux/demux_rawvideo.c @@ -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, }; diff --git a/demux/demux_subreader.c b/demux/demux_subreader.c index ce69218e50..7758aa968c 100644 --- a/demux/demux_subreader.c +++ b/demux/demux_subreader.c @@ -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) -- cgit v1.2.3