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); if(!demuxer) return NULL; // failed to open sh_a = demuxer->audio->sh; if(demuxer->audio->id != -2 && sh_a) { #ifdef CONFIG_OGGVORBIS // support for Ogg-in-AVI: if(sh_a->format == 0xFFFE) demuxer = init_avi_with_ogg(demuxer); else if(sh_a->format == 0x674F) { stream_t* s; demuxer_t *od; s = new_ds_stream(demuxer->audio); od = new_demuxer(opts, s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL); if(!demux_ogg_open(od)) { mp_tmsg( MSGT_DEMUXER,MSGL_ERR,"Unable to open the Ogg demuxer.\n"); free_stream(s); demuxer->audio->id = -2; } else demuxer = new_demuxers_demuxer(demuxer,od,demuxer); } #endif } return demuxer; }
static demuxer_t* demux_open_hack_avi(demuxer_t *demuxer) { sh_audio_t* sh_a; demuxer = demux_open_avi(demuxer); if(!demuxer) return NULL; // failed to open sh_a = demuxer->audio->sh; /*demux_avi no do parsing in for audio, then here will tell decodec to do paring before decodeced data*/ if(sh_a) sh_a->need_parsing = 1; //add by gysun if(demuxer->audio->id != -2 && sh_a) { #ifdef CONFIG_OGGVORBIS // support for Ogg-in-AVI: if(sh_a->format == 0xFFFE) demuxer = init_avi_with_ogg(demuxer); else if(sh_a->format == 0x674F) { stream_t* s; demuxer_t *od; s = new_ds_stream(demuxer->audio); od = new_demuxer(s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL); if(!demux_ogg_open(od)) { mp_msg( MSGT_DEMUXER,MSGL_ERR,MSGTR_ErrorOpeningOGGDemuxer); free_stream(s); demuxer->audio->id = -2; } else demuxer = new_demuxers_demuxer(demuxer,od,demuxer); } #endif } return demuxer; }
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; }