/***************************************************************************** * OpenDecoder: probe the decoder and return score *****************************************************************************/ static int OpenDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t*) p_this; unsigned i_codec_id; int i_cat, i_result; const char *psz_namecodec; AVCodecContext *p_context = NULL; AVCodec *p_codec = NULL; /* *** determine codec type *** */ if( !GetFfmpegCodec( p_dec->fmt_in.i_codec, &i_cat, &i_codec_id, &psz_namecodec ) ) { return VLC_EGENERIC; } /* Initialization must be done before avcodec_find_decoder() */ vlc_init_avcodec(p_this); /* *** ask ffmpeg for a decoder *** */ char *psz_decoder = var_CreateGetString( p_this, "avcodec-codec" ); if( psz_decoder && *psz_decoder ) { p_codec = avcodec_find_decoder_by_name( psz_decoder ); if( !p_codec ) msg_Err( p_this, "Decoder `%s' not found", psz_decoder ); else if( p_codec->id != i_codec_id ) { msg_Err( p_this, "Decoder `%s' can't handle %4.4s", psz_decoder, (char*)&p_dec->fmt_in.i_codec ); p_codec = NULL; } } free( psz_decoder ); if( !p_codec ) p_codec = avcodec_find_decoder( i_codec_id ); if( !p_codec ) { msg_Dbg( p_dec, "codec not found (%s)", psz_namecodec ); return VLC_EGENERIC; } /* *** get a p_context *** */ p_context = avcodec_alloc_context3(p_codec); if( !p_context ) return VLC_ENOMEM; p_context->debug = var_InheritInteger( p_dec, "avcodec-debug" ); p_context->opaque = (void *)p_this; p_dec->b_need_packetized = true; switch( i_cat ) { case VIDEO_ES: p_dec->pf_decode_video = DecodeVideo; i_result = InitVideoDec ( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; case AUDIO_ES: p_dec->pf_decode_audio = DecodeAudio; i_result = InitAudioDec ( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; case SPU_ES: p_dec->pf_decode_sub = DecodeSubtitle; i_result = InitSubtitleDec( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; default: i_result = VLC_EGENERIC; } if( i_result == VLC_SUCCESS ) { p_dec->p_sys->i_cat = i_cat; if( p_context->profile != FF_PROFILE_UNKNOWN) p_dec->fmt_in.i_profile = p_context->profile; if( p_context->level != FF_LEVEL_UNKNOWN) p_dec->fmt_in.i_level = p_context->level; } return i_result; }
/***************************************************************************** * OpenDecoder: probe the decoder and return score *****************************************************************************/ static int OpenDecoder( vlc_object_t *p_this ) { decoder_t *p_dec = (decoder_t*) p_this; int i_cat, i_codec_id, i_result; const char *psz_namecodec; AVCodecContext *p_context = NULL; AVCodec *p_codec = NULL; /* *** determine codec type *** */ if( !GetFfmpegCodec( p_dec->fmt_in.i_codec, &i_cat, &i_codec_id, &psz_namecodec ) ) { return VLC_EGENERIC; } /* Initialization must be done before avcodec_find_decoder() */ InitLibavcodec(p_this); /* *** ask ffmpeg for a decoder *** */ p_codec = avcodec_find_decoder( i_codec_id ); if( !p_codec ) { msg_Dbg( p_dec, "codec not found (%s)", psz_namecodec ); return VLC_EGENERIC; } /* *** get a p_context *** */ p_context = avcodec_alloc_context(); if( !p_context ) return VLC_ENOMEM; p_context->debug = var_InheritInteger( p_dec, "ffmpeg-debug" ); p_context->opaque = (void *)p_this; /* Set CPU capabilities */ unsigned i_cpu = vlc_CPU(); p_context->dsp_mask = 0; if( !(i_cpu & CPU_CAPABILITY_MMX) ) { p_context->dsp_mask |= AV_CPU_FLAG_MMX; } if( !(i_cpu & CPU_CAPABILITY_MMXEXT) ) { p_context->dsp_mask |= AV_CPU_FLAG_MMX2; } if( !(i_cpu & CPU_CAPABILITY_3DNOW) ) { p_context->dsp_mask |= AV_CPU_FLAG_3DNOW; } if( !(i_cpu & CPU_CAPABILITY_SSE) ) { p_context->dsp_mask |= AV_CPU_FLAG_SSE; } if( !(i_cpu & CPU_CAPABILITY_SSE2) ) { p_context->dsp_mask |= AV_CPU_FLAG_SSE2; } #ifdef AV_CPU_FLAG_SSE3 if( !(i_cpu & CPU_CAPABILITY_SSE3) ) p_context->dsp_mask |= AV_CPU_FLAG_SSE3; #endif #ifdef AV_CPU_FLAG_SSSE3 if( !(i_cpu & CPU_CAPABILITY_SSSE3) ) p_context->dsp_mask |= AV_CPU_FLAG_SSSE3; #endif #ifdef AV_CPU_FLAG_SSE4 if( !(i_cpu & CPU_CAPABILITY_SSE4_1) ) p_context->dsp_mask |= AV_CPU_FLAG_SSE4; #endif #ifdef AV_CPU_FLAG_SSE42 if( !(i_cpu & CPU_CAPABILITY_SSE4_2) ) p_context->dsp_mask |= AV_CPU_FLAG_SSE42; #endif p_dec->b_need_packetized = true; switch( i_cat ) { case VIDEO_ES: p_dec->pf_decode_video = DecodeVideo; i_result = InitVideoDec ( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; case AUDIO_ES: p_dec->pf_decode_audio = DecodeAudio; i_result = InitAudioDec ( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; case SPU_ES: p_dec->pf_decode_sub = DecodeSubtitle; i_result = InitSubtitleDec( p_dec, p_context, p_codec, i_codec_id, psz_namecodec ); break; default: i_result = VLC_EGENERIC; } if( i_result == VLC_SUCCESS ) { p_dec->p_sys->i_cat = i_cat; if( p_context->profile != FF_PROFILE_UNKNOWN) p_dec->fmt_in.i_profile = p_context->profile; if( p_context->level != FF_LEVEL_UNKNOWN) p_dec->fmt_in.i_level = p_context->level; } return i_result; }