Browse Source

mediacodec: flush if SPS/PPS change but not the video size

pull/29/head
Thomas Guillem 11 years ago
parent
commit
adc305b6e6
  1. 58
      modules/codec/omxil/android_mediacodec.c

58
modules/codec/omxil/android_mediacodec.c

@ -1382,6 +1382,35 @@ static void HEVCProcessBlock(decoder_t *p_dec, block_t *p_block,
VLC_UNUSED(p_size_changed);
}
static int DecodeFlush(decoder_t *p_dec, JNIEnv *env)
{
decoder_sys_t *p_sys = p_dec->p_sys;
if (p_sys->decoded)
{
p_sys->i_preroll_end = 0;
timestamp_FifoEmpty(p_sys->timestamp_fifo);
/* Invalidate all pictures that are currently in flight
* since flushing make all previous indices returned by
* MediaCodec invalid. */
if (p_sys->direct_rendering)
InvalidateAllPictures(p_dec);
}
if (p_sys->decoded || p_sys->i_csd_send > 0)
{
(*env)->CallVoidMethod(env, p_sys->codec, jfields.flush);
if (CHECK_EXCEPTION()) {
msg_Warn(p_dec, "Exception occurred in MediaCodec.flush");
return VLC_EGENERIC;
}
/* resend CODEC_CONFIG buffer after a flush */
p_sys->i_csd_send = 0;
}
p_sys->decoded = false;
return VLC_SUCCESS;
}
static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
{
decoder_sys_t *p_sys = p_dec->p_sys;
@ -1414,28 +1443,8 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
}
if (p_block && p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
if (p_sys->decoded)
{
p_sys->i_preroll_end = 0;
timestamp_FifoEmpty(p_sys->timestamp_fifo);
/* Invalidate all pictures that are currently in flight
* since flushing make all previous indices returned by
* MediaCodec invalid. */
if (p_sys->direct_rendering)
InvalidateAllPictures(p_dec);
}
if (p_sys->decoded || p_sys->i_csd_send > 0)
{
(*env)->CallVoidMethod(env, p_sys->codec, jfields.flush);
if (CHECK_EXCEPTION()) {
msg_Warn(p_dec, "Exception occurred in MediaCodec.flush");
b_error = true;
}
/* resend CODEC_CONFIG buffer after a flush */
p_sys->i_csd_send = 0;
}
p_sys->decoded = false;
if (DecodeFlush(p_dec, env) != VLC_SUCCESS)
b_error = true;
goto endclean;
}
@ -1456,6 +1465,11 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
msg_Err(p_dec, "SPS/PPS changed during playback and "
"video size are different. Restart it !");
CloseMediaCodec(p_dec, env);
} else
{
msg_Err(p_dec, "SPS/PPS changed during playback. Flush it");
if (DecodeFlush(p_dec, env) != VLC_SUCCESS)
b_error = true;
}
}
if (!p_sys->codec)

Loading…
Cancel
Save