mirror of
https://code.videolan.org/videolan/vlc
synced 2024-10-15 08:37:59 +02:00
avcodec: factor CPU detection code
In retrospect, I should have done that first. Oh well...
This commit is contained in:
parent
b1a0789432
commit
0fbbb451f8
@ -5,6 +5,7 @@ libavcodec_plugin_la_SOURCES = \
|
|||||||
video.c \
|
video.c \
|
||||||
subtitle.c \
|
subtitle.c \
|
||||||
audio.c \
|
audio.c \
|
||||||
|
cpu.c \
|
||||||
deinterlace.c \
|
deinterlace.c \
|
||||||
fourcc.c \
|
fourcc.c \
|
||||||
chroma.h \
|
chroma.h \
|
||||||
|
@ -327,37 +327,7 @@ static int OpenDecoder( vlc_object_t *p_this )
|
|||||||
return VLC_ENOMEM;
|
return VLC_ENOMEM;
|
||||||
p_context->debug = var_InheritInteger( p_dec, "avcodec-debug" );
|
p_context->debug = var_InheritInteger( p_dec, "avcodec-debug" );
|
||||||
p_context->opaque = (void *)p_this;
|
p_context->opaque = (void *)p_this;
|
||||||
|
p_context->dsp_mask = GetVlcDspMask(); /* set CPU capabilities */
|
||||||
/* Set CPU capabilities */
|
|
||||||
p_context->dsp_mask = 0;
|
|
||||||
#if defined (__i386__) || defined (__x86_64__)
|
|
||||||
if( !vlc_CPU_MMX() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_MMX;
|
|
||||||
if( !vlc_CPU_MMXEXT() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_MMX2;
|
|
||||||
if( !vlc_CPU_3dNOW() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_3DNOW;
|
|
||||||
if( !vlc_CPU_SSE() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE;
|
|
||||||
if( !vlc_CPU_SSE2() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE2;
|
|
||||||
# ifdef AV_CPU_FLAG_SSE3
|
|
||||||
if( !vlc_CPU_SSE3() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE3;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSSE3
|
|
||||||
if( !vlc_CPU_SSE3() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSSE3;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSE4
|
|
||||||
if( !vlc_CPU_SSE4_1() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE4;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSE42
|
|
||||||
if( !vlc_CPU_SSE4_2() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE42;
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
p_dec->b_need_packetized = true;
|
p_dec->b_need_packetized = true;
|
||||||
switch( i_cat )
|
switch( i_cat )
|
||||||
|
@ -29,6 +29,8 @@ int GetVlcFourcc( int i_ffmpeg_codec, int *pi_cat,
|
|||||||
vlc_fourcc_t *pi_fourcc, const char **ppsz_name );
|
vlc_fourcc_t *pi_fourcc, const char **ppsz_name );
|
||||||
void GetVlcAudioFormat( vlc_fourcc_t *, unsigned *pi_bits, int i_sample_fmt );
|
void GetVlcAudioFormat( vlc_fourcc_t *, unsigned *pi_bits, int i_sample_fmt );
|
||||||
|
|
||||||
|
unsigned GetVlcDspMask( void );
|
||||||
|
|
||||||
picture_t * DecodeVideo( decoder_t *, block_t ** );
|
picture_t * DecodeVideo( decoder_t *, block_t ** );
|
||||||
block_t * DecodeAudio( decoder_t *, block_t ** );
|
block_t * DecodeAudio( decoder_t *, block_t ** );
|
||||||
subpicture_t *DecodeSubtitle( decoder_t *p_dec, block_t ** );
|
subpicture_t *DecodeSubtitle( decoder_t *p_dec, block_t ** );
|
||||||
|
79
modules/codec/avcodec/cpu.c
Normal file
79
modules/codec/avcodec/cpu.c
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* cpu.c: CPU capabilities for libavcodec
|
||||||
|
*****************************************************************************
|
||||||
|
* Copyright (C) 1999-2012 the VideoLAN team
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <vlc_common.h>
|
||||||
|
#include <vlc_cpu.h>
|
||||||
|
|
||||||
|
#define HAVE_MMX 1
|
||||||
|
#ifdef HAVE_LIBAVCODEC_AVCODEC_H
|
||||||
|
# include <libavcodec/avcodec.h>
|
||||||
|
#else
|
||||||
|
# include <avcodec.h>
|
||||||
|
#endif
|
||||||
|
#include "avcodec.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Maps CPU capabilities computed by VLC to libav DSP mask.
|
||||||
|
*/
|
||||||
|
unsigned GetVlcDspMask( void )
|
||||||
|
{
|
||||||
|
unsigned mask = 0;
|
||||||
|
|
||||||
|
#if defined (__i386__) || defined (__x86_64__)
|
||||||
|
if( !vlc_CPU_MMX() )
|
||||||
|
mask |= AV_CPU_FLAG_MMX;
|
||||||
|
if( !vlc_CPU_MMXEXT() )
|
||||||
|
mask |= AV_CPU_FLAG_MMX2;
|
||||||
|
if( !vlc_CPU_3dNOW() )
|
||||||
|
mask |= AV_CPU_FLAG_3DNOW;
|
||||||
|
if( !vlc_CPU_SSE() )
|
||||||
|
mask |= AV_CPU_FLAG_SSE;
|
||||||
|
if( !vlc_CPU_SSE2() )
|
||||||
|
mask |= AV_CPU_FLAG_SSE2;
|
||||||
|
# ifdef AV_CPU_FLAG_SSE3
|
||||||
|
if( !vlc_CPU_SSE3() )
|
||||||
|
mask |= AV_CPU_FLAG_SSE3;
|
||||||
|
# endif
|
||||||
|
# ifdef AV_CPU_FLAG_SSSE3
|
||||||
|
if( !vlc_CPU_SSE3() )
|
||||||
|
mask |= AV_CPU_FLAG_SSSE3;
|
||||||
|
# endif
|
||||||
|
# ifdef AV_CPU_FLAG_SSE4
|
||||||
|
if( !vlc_CPU_SSE4_1() )
|
||||||
|
mask |= AV_CPU_FLAG_SSE4;
|
||||||
|
# endif
|
||||||
|
# ifdef AV_CPU_FLAG_SSE42
|
||||||
|
if( !vlc_CPU_SSE4_2() )
|
||||||
|
mask |= AV_CPU_FLAG_SSE42;
|
||||||
|
# endif
|
||||||
|
// TODO: AVX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined (__ppc__) || defined (__ppc64__) || defined (__powerpc__)
|
||||||
|
if( !vlc_CPU_ALTIVEC() )
|
||||||
|
mask |= AV_CPU_FLAG_ALTIVEC;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return mask;
|
||||||
|
}
|
@ -321,37 +321,7 @@ int OpenEncoder( vlc_object_t *p_this )
|
|||||||
p_sys->p_context->codec_id = p_sys->p_codec->id;
|
p_sys->p_context->codec_id = p_sys->p_codec->id;
|
||||||
p_context->debug = var_InheritInteger( p_enc, "avcodec-debug" );
|
p_context->debug = var_InheritInteger( p_enc, "avcodec-debug" );
|
||||||
p_context->opaque = (void *)p_this;
|
p_context->opaque = (void *)p_this;
|
||||||
|
p_context->dsp_mask = GetVlcDspMask(); /* set CPU capabilities */
|
||||||
/* Set CPU capabilities */
|
|
||||||
p_context->dsp_mask = 0;
|
|
||||||
#if defined (__i386__) || defined (__x86_64__)
|
|
||||||
if( !vlc_CPU_MMX() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_MMX;
|
|
||||||
if( !vlc_CPU_MMXEXT() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_MMX2;
|
|
||||||
if( !vlc_CPU_3dNOW() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_3DNOW;
|
|
||||||
if( !vlc_CPU_SSE() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE;
|
|
||||||
if( !vlc_CPU_SSE2() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE2;
|
|
||||||
# ifdef AV_CPU_FLAG_SSE3
|
|
||||||
if( !vlc_CPU_SSE3() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE3;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSSE3
|
|
||||||
if( !vlc_CPU_SSSE3() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSSE3;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSE4
|
|
||||||
if( !vlc_CPU_SSE4_1() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE4;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSE42
|
|
||||||
if( !vlc_CPU_SSE4_2() )
|
|
||||||
p_context->dsp_mask |= AV_CPU_FLAG_SSE42;
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
p_sys->i_key_int = var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" );
|
p_sys->i_key_int = var_GetInteger( p_enc, ENC_CFG_PREFIX "keyint" );
|
||||||
p_sys->i_b_frames = var_GetInteger( p_enc, ENC_CFG_PREFIX "bframes" );
|
p_sys->i_b_frames = var_GetInteger( p_enc, ENC_CFG_PREFIX "bframes" );
|
||||||
|
@ -8,7 +8,7 @@ SOURCES_stream_out_duplicate = duplicate.c
|
|||||||
SOURCES_stream_out_es = es.c
|
SOURCES_stream_out_es = es.c
|
||||||
SOURCES_stream_out_display = display.c
|
SOURCES_stream_out_display = display.c
|
||||||
SOURCES_stream_out_gather = gather.c
|
SOURCES_stream_out_gather = gather.c
|
||||||
SOURCES_stream_out_switcher = switcher.c
|
SOURCES_stream_out_switcher = switcher.c ../codec/avcodec/cpu.c
|
||||||
SOURCES_stream_out_bridge = bridge.c
|
SOURCES_stream_out_bridge = bridge.c
|
||||||
SOURCES_stream_out_mosaic_bridge = mosaic_bridge.c
|
SOURCES_stream_out_mosaic_bridge = mosaic_bridge.c
|
||||||
SOURCES_stream_out_autodel = autodel.c
|
SOURCES_stream_out_autodel = autodel.c
|
||||||
|
@ -376,38 +376,7 @@ static sout_stream_id_t *Add( sout_stream_t *p_stream, es_format_t *p_fmt )
|
|||||||
#else
|
#else
|
||||||
id->ff_enc_c = avcodec_alloc_context3( id->ff_enc );
|
id->ff_enc_c = avcodec_alloc_context3( id->ff_enc );
|
||||||
#endif
|
#endif
|
||||||
|
id->ff_enc_c->dsp_mask = GetVlcDspMask();
|
||||||
/* Set CPU capabilities */
|
|
||||||
id->ff_enc_c->dsp_mask = 0;
|
|
||||||
#if defined (__i386__) || defined (__x86_64__)
|
|
||||||
if( !vlc_CPU_MMX() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_MMX;
|
|
||||||
if( !vlc_CPU_MMXEXT() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_MMX2;
|
|
||||||
if( !vlc_CPU_3dNOW() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_3DNOW;
|
|
||||||
if( !vlc_CPU_SSE() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE;
|
|
||||||
if( !vlc_cpu_SSE2() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE2;
|
|
||||||
# ifdef AV_CPU_FLAG_SSE3
|
|
||||||
if( !vlc_CPU_SSE3() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE3;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSSE3
|
|
||||||
if( !vlc_CPU_SSSE3() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSSE3;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSE4
|
|
||||||
if( !vlc_CPU_SSE4_1() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE4;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSE42
|
|
||||||
if( !vlc_CPU_SSE4_2() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE42;
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
id->ff_enc_c->sample_rate = p_fmt->audio.i_rate;
|
id->ff_enc_c->sample_rate = p_fmt->audio.i_rate;
|
||||||
id->ff_enc_c->time_base.num = 1;
|
id->ff_enc_c->time_base.num = 1;
|
||||||
id->ff_enc_c->time_base.den = p_fmt->audio.i_rate;
|
id->ff_enc_c->time_base.den = p_fmt->audio.i_rate;
|
||||||
@ -796,38 +765,7 @@ static mtime_t VideoCommand( sout_stream_t *p_stream, sout_stream_id_t *id )
|
|||||||
#else
|
#else
|
||||||
id->ff_enc_c = avcodec_alloc_context3( id->ff_enc );
|
id->ff_enc_c = avcodec_alloc_context3( id->ff_enc );
|
||||||
#endif
|
#endif
|
||||||
|
id->ff_enc_c->dsp_mask = GetVlcDspMask();
|
||||||
/* Set CPU capabilities */
|
|
||||||
id->ff_enc_c->dsp_mask = 0;
|
|
||||||
#if defined (__i386__) || defined (__x86_64__)
|
|
||||||
if( !vlc_CPU_MMX() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_MMX;
|
|
||||||
if( !vlc_CPU_MMXEXT() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_MMX2;
|
|
||||||
if( !vlc_CPU_3dNOW() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_3DNOW;
|
|
||||||
if( !vlc_CPU_SSE() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE;
|
|
||||||
if( !vlc_CPU_SSE2() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE2;
|
|
||||||
# ifdef AV_CPU_FLAG_SSE3
|
|
||||||
if( !vlc_CPU_SSE3() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE3;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSSE3
|
|
||||||
if( !vlc_CPU_SSSE3() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSSE3;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSE4
|
|
||||||
if( !vlc_CPU_SSE4_1() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE4;
|
|
||||||
# endif
|
|
||||||
# ifdef AV_CPU_FLAG_SSE42
|
|
||||||
if( !vlc_CPU_SSE4_2() )
|
|
||||||
id->ff_enc_c->dsp_mask |= AV_CPU_FLAG_SSE42;
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
id->ff_enc_c->width = p_sys->p_pictures[p_sys->i_cmd-1].format.i_width;
|
id->ff_enc_c->width = p_sys->p_pictures[p_sys->i_cmd-1].format.i_width;
|
||||||
id->ff_enc_c->height = p_sys->p_pictures[p_sys->i_cmd-1].format.i_height;
|
id->ff_enc_c->height = p_sys->p_pictures[p_sys->i_cmd-1].format.i_height;
|
||||||
av_reduce( &i_aspect_num, &i_aspect_den,
|
av_reduce( &i_aspect_num, &i_aspect_den,
|
||||||
|
Loading…
Reference in New Issue
Block a user