static struct demuxer *demux_open_stream(struct MPOpts *opts, struct stream *stream, int file_format, bool force, int audio_id, int video_id, int sub_id, char *filename, struct demuxer_params *params) { struct demuxer *demuxer = NULL; const struct demuxer_desc *desc; // If somebody requested a demuxer check it if (file_format) { desc = get_demuxer_desc_from_type(file_format); if (!desc) // should only happen with obsolete -demuxer 99 numeric format return NULL; return open_given_type(opts, desc, stream, force, audio_id, video_id, sub_id, filename, params); } // Test demuxers with safe file checks for (int i = 0; (desc = demuxer_list[i]); i++) { if (desc->safe_check) { demuxer = open_given_type(opts, desc, stream, false, audio_id, video_id, sub_id, filename, params); if (demuxer) return demuxer; } } // Ok. We're over the stable detectable fileformats, the next ones are // a bit fuzzy. So by default (extension_parsing==1) try extension-based // detection first: if (filename && opts->extension_parsing == 1) { desc = get_demuxer_desc_from_type(demuxer_type_by_filename(filename)); if (desc) demuxer = open_given_type(opts, desc, stream, false, audio_id, video_id, sub_id, filename, params); if (demuxer) return demuxer; } // Finally try detection for demuxers with unsafe checks for (int i = 0; (desc = demuxer_list[i]); i++) { if (!desc->safe_check && desc->check_file) { demuxer = open_given_type(opts, desc, stream, false, audio_id, video_id, sub_id, filename, params); if (demuxer) return demuxer; } } return NULL; }
static struct demuxer *open_given_type(struct MPOpts *opts, const struct demuxer_desc *desc, struct stream *stream, bool force, int audio_id, int video_id, int sub_id, char *filename, struct demuxer_params *params) { struct demuxer *demuxer; int fformat; demuxer = new_demuxer(opts, stream, desc->type, audio_id, video_id, sub_id, filename); demuxer->params = params; if (desc->check_file) fformat = desc->check_file(demuxer); else fformat = desc->type; if (force) fformat = desc->type; if (fformat == 0) goto fail; if (fformat == desc->type) { if (demuxer->filetype) mp_tmsg(MSGT_DEMUXER, MSGL_INFO, "Detected file format: %s (%s)\n", demuxer->filetype, desc->shortdesc); else 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) { 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; return demuxer; } else { // demux_mov can return playlist instead of mov if (fformat == DEMUXER_TYPE_PLAYLIST) return demuxer; // handled in mplayer.c /* Internal MPEG PS demuxer check can return other MPEG subtypes * which don't have their own checks; recurse to try opening as * the returned type instead. */ free_demuxer(demuxer); desc = get_demuxer_desc_from_type(fformat); if (!desc) { mp_msg(MSGT_DEMUXER, MSGL_ERR, "BUG: recursion to nonexistent file format\n"); return NULL; } return open_given_type(opts, desc, stream, false, audio_id, video_id, sub_id, filename, params); } fail: free_demuxer(demuxer); return NULL; }
static struct demuxer *demux_open_stream(struct MPOpts *opts, struct stream *stream, int file_format, bool force, int audio_id, int video_id, int sub_id, char *filename, struct demuxer_params *params) { struct demuxer *demuxer = NULL; const struct demuxer_desc *desc; // If somebody requested a demuxer check it if (file_format) { desc = get_demuxer_desc_from_type(file_format); if (!desc) // should only happen with obsolete -demuxer 99 numeric format return NULL; demuxer = open_given_type(opts, desc, stream, force, audio_id, video_id, sub_id, filename, params); if (demuxer) goto dmx_open; return NULL; } // Test demuxers with safe file checks for (int i = 0; (desc = demuxer_list[i]); i++) { if (desc->safe_check) { demuxer = open_given_type(opts, desc, stream, false, audio_id, video_id, sub_id, filename, params); if (demuxer) goto dmx_open; } } // Ok. We're over the stable detectable fileformats, the next ones are // a bit fuzzy. So by default (extension_parsing==1) try extension-based // detection first: if (filename && opts->extension_parsing == 1) { desc = get_demuxer_desc_from_type(demuxer_type_by_filename(filename)); if (desc) demuxer = open_given_type(opts, desc, stream, false, audio_id, video_id, sub_id, filename, params); if (demuxer) goto dmx_open; } // Finally try detection for demuxers with unsafe checks for (int i = 0; (desc = demuxer_list[i]); i++) { if (!desc->safe_check && desc->check_file) { demuxer = open_given_type(opts, desc, stream, false, audio_id, video_id, sub_id, filename, params); if (demuxer) goto dmx_open; } } return NULL; dmx_open: if (demuxer->type == DEMUXER_TYPE_PLAYLIST) return demuxer; struct sh_video *sh_video = demuxer->video->sh; if (sh_video && sh_video->bih) { int biComp = le2me_32(sh_video->bih->biCompression); mp_msg(MSGT_DEMUX, MSGL_INFO, "VIDEO: [%.4s] %dx%d %dbpp %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n", (char *) &biComp, sh_video->bih->biWidth, sh_video->bih->biHeight, sh_video->bih->biBitCount, sh_video->fps, sh_video->i_bps * 0.008f, sh_video->i_bps / 1024.0f); } return demuxer; }