[MPlayer-dev-eng] init_audio codec loop failure

Adam Chasen adam at chasen.name
Mon Oct 10 06:01:41 CEST 2011


Under further investigation, it appears that the conditional on line
200 after "if (!sh_audio->dec_handle)" is buggy, causing an incorrect
break.

(gdb) print sh_audio->dec_handle
$61 = (void *) 0x0

This is a bit beyond my understanding. Any suggestions?

Thanks,
Adam

On Sun, Oct 9, 2011 at 11:47 PM, Adam Chasen <adam at chasen.name> wrote:
> I compiled mplayer without mp3lib, which means the first two codecs
> for 0x55 format are mp3lib and mpg123 according to the default
> codecs.conf.
>
> I have neither mp3lib nor mpg123 on my system. An strace of mplayer
> showed an attempt to access the ad_<lib>.so files for those codecs and
> then gave up with "Cannot find codec for audio format 0x55."
>
> I noticed that if I only had 1 of these (possibly) shared libraries
> before a known working codec in my codecs.conf file, mplayer would
> discover the codec without issue. If I had > 1 possibly shared library
> codecs before a known working one, then mplayer would never get to it.
>
> I recompiled with gdb support and traced through to find that
> init_audio is called 3 times by init_best_audio_codec. Once for each
> level of CODEC_STATUS. I am not sure how the CODEC_STATUS maps to the
> status in codecs.conf, but it seems most of the codecs have a status
> of 1.
>
> 1st run init_audio:
> * status=2 which no codec afaik has
> * iterates through all of the codecs and does nothing because none are
> high enough status
>
> 2nd run init_audio:
> * status=1 This should hit nearly every available codec
> * finds mp3lib
> * mp3lib is high enough status to continue
> * mp3lib added to "selected" variable
> * gets all the way to line 231: "            continue;           // try next..."
> * gdb prompt read:
> 200                 if (!sh_audio->dec_handle)
> (gdb)
> 231                 continue;           // try next...
> (gdb)
> 237     }
> * LOOP EXITS (this is unexpected)
>
> 3rd run init_audio:
> * status=0 This should hit nearly every available codec
> * finds mp3lib
> * "selected" variable already include mp3lib which means it was tried
> and failed, move on to next
> * finds mpg123
> * mpg123 is high enough status to continue
> * mpg123 added to "selected" variable
> * gets all the way to line 231: "            continue;           // try next..."
> * gdb prompt read:
> 200                 if (!sh_audio->dec_handle)
> (gdb)
> 231                 continue;           // try next...
> (gdb)
> 237     }
> * LOOP EXITS (this is unexpected)
>
> This explains why <1 of the shared library codecs works, we have two
> tries, status=1 and status=0, but we should be iterating though all
> available codecs each run.
>
> Expected behavior:
> * after failing to find the shared library, the loop continues
>
> I may be mis-interpreting gdb, but this is my first time doing
> anything of substance in gdb.
>
> As for why we are enabling shared libraries, I do not have the answer
> to that question. Same goes for our --disable-mp3lib.
>
> Thanks,
> Adam
>


More information about the MPlayer-dev-eng mailing list