Skip to content

Commit

Permalink
ff_ffplay: merge: a07934d51b40b0f48be531a359d39c091c414643
Browse files Browse the repository at this point in the history
    ffplay: fix silence insertion on error or pause

    Insertion of silence was a bit broken since
    df34b700981de606ca4847e1ed0bfdf9ac3e9104 because the info whether or not the
    source buffer supposed to be silence must be kept between callbacks. Failing
 to
    do so causes rogue samples from the last buffer to be presented, I guess eve
n a
    crash can occur under some circumstances.

    This patch uses a NULL audio_buf to keep the silence state across audio
    callbacks.

    Reviewed-by: Lukasz Marek <lukasz.m.luki2 at gmail.com>
    Signed-off-by: Marton Balint <cus@passwd.hu>
  • Loading branch information
bbcallen committed Jul 14, 2016
1 parent e48d502 commit ea7f6dc
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions ijkmedia/ijkplayer/ff_ffplay.c
Original file line number Diff line number Diff line change
Expand Up @@ -2039,7 +2039,7 @@ static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
{
FFPlayer *ffp = opaque;
VideoState *is = ffp->is;
int audio_size, len1, silence = 0;
int audio_size, len1;
if (!ffp || !is) {
memset(stream, 0, len);
return;
Expand All @@ -2057,7 +2057,7 @@ static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
audio_size = audio_decode_frame(ffp);
if (audio_size < 0) {
/* if error, just output silence */
silence = 1;
is->audio_buf = NULL;
is->audio_buf_size = SDL_AUDIO_MIN_BUFFER_SIZE / is->audio_tgt.frame_size * is->audio_tgt.frame_size;
} else {
if (is->show_mode != SHOW_MODE_VIDEO)
Expand All @@ -2077,11 +2077,11 @@ static void sdl_audio_callback(void *opaque, Uint8 *stream, int len)
len1 = is->audio_buf_size - is->audio_buf_index;
if (len1 > len)
len1 = len;
if (!is->muted && !silence && is->audio_volume == SDL_MIX_MAXVOLUME)
if (!is->muted && is->audio_buf && is->audio_volume == SDL_MIX_MAXVOLUME)
memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
else {
memset(stream, 0, len1);
if (!is->muted && !silence)
if (!is->muted && is->audio_buf)
SDL_MixAudio(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1, is->audio_volume);
}
len -= len1;
Expand Down

0 comments on commit ea7f6dc

Please sign in to comment.