Mercurial > mplayer.hg
view libao2/audio_out.c @ 1306:7ce37211e454
yuv2rgb_mmx crashes with ffdivx codec, when we play back avi files that have
a frame width that is not an exact multiple of 8.
Testcase: 405.avi (356x240). Playing on an MMX capable x86 system using the
x11 video-out driver results in a segfault.
The MMX routines convert image data in quantities of 8 pixels in each loop,
and the inner loop was not terminated in case there are only 1-7 pixels left,
producing too much RGB output.
For now, just ignore the last few pixels on each row, to avoid the segfaults.
(Gives a black vertical border on the right, if you play a video with
width%8 != 0) A possible future enhancement would be, to add a second loop
to convert the last width%8 pixels to RGB using a byte loop.
author | jkeil |
---|---|
date | Thu, 12 Jul 2001 15:23:26 +0000 |
parents | e21c96e28062 |
children | a444bd456fcc |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include "../config.h" #include "audio_out.h" #include "afmt.h" // there are some globals: int ao_samplerate=0; int ao_channels=0; int ao_format=0; int ao_bps=0; int ao_outburst=OUTBURST; // config.h default int ao_buffersize=-1; char *ao_subdevice = NULL; #ifdef USE_OSS_AUDIO extern ao_functions_t audio_out_oss; #endif //extern ao_functions_t audio_out_ossold; extern ao_functions_t audio_out_null; #ifdef HAVE_ALSA5 extern ao_functions_t audio_out_alsa5; #endif #ifdef HAVE_ALSA9 extern ao_functions_t audio_out_alsa9; #endif #ifdef HAVE_ESD extern ao_functions_t audio_out_esd; #endif #ifdef HAVE_SDL extern ao_functions_t audio_out_sdl; #endif #ifdef USE_SUN_AUDIO extern ao_functions_t audio_out_sun; #endif extern ao_functions_t audio_out_pcm; extern ao_functions_t audio_out_pss; ao_functions_t* audio_out_drivers[] = { #ifdef USE_OSS_AUDIO &audio_out_oss, #endif &audio_out_null, #ifdef HAVE_ALSA5 &audio_out_alsa5, #endif #ifdef HAVE_ALSA9 &audio_out_alsa9, #endif #ifdef HAVE_ESD &audio_out_esd, #endif #ifdef HAVE_SDL &audio_out_sdl, #endif #ifdef USE_SUN_AUDIO &audio_out_sun, #endif &audio_out_pcm, // &audio_out_pss, NULL }; char *audio_out_format_name(int format) { switch (format) { case AFMT_MU_LAW: return("Mu-Law"); case AFMT_A_LAW: return("A-Law"); case AFMT_IMA_ADPCM: return("Ima-ADPCM"); case AFMT_S8: return("Signed 8-bit"); case AFMT_U8: return("Unsigned 8-bit"); case AFMT_U16_LE: return("Unsigned 16-bit (Little-Endian)"); case AFMT_U16_BE: return("Unsigned 16-bit (Big-Endian)"); case AFMT_S16_LE: return("Signed 16-bit (Little-Endian)"); case AFMT_S16_BE: return("Unsigned 16-bit (Big-Endian)"); case AFMT_MPEG: return("MPEG (2) audio"); /* the following two formats are not available with old linux kernel headers (e.g. in 2.2.16) */ #ifdef AFMT_S32_LE case AFMT_S32_LE: return("Signed 32-bit (Little-Endian)"); #endif #ifdef AFMT_S32_BE case AFMT_S32_BE: return("Signed 32-bit (Big-Endian)"); #endif } return("Unknown"); }