Commit d2041623 authored by Thomas Guillem's avatar Thomas Guillem Committed by Jean-Baptiste Kempf

mediacodec: skip prerolled frames

Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent 85766391
...@@ -174,6 +174,8 @@ struct decoder_sys_t ...@@ -174,6 +174,8 @@ struct decoder_sys_t
unsigned int i_inflight_pictures; unsigned int i_inflight_pictures;
timestamp_fifo_t *timestamp_fifo; timestamp_fifo_t *timestamp_fifo;
int64_t i_preroll_end;
}; };
enum Types enum Types
...@@ -832,6 +834,8 @@ static int PutInput(decoder_t *p_dec, JNIEnv *env, block_t **pp_block, jlong tim ...@@ -832,6 +834,8 @@ static int PutInput(decoder_t *p_dec, JNIEnv *env, block_t **pp_block, jlong tim
int64_t ts = p_block->i_pts; int64_t ts = p_block->i_pts;
if (!ts && p_block->i_dts) if (!ts && p_block->i_dts)
ts = p_block->i_dts; ts = p_block->i_dts;
if (p_block->i_flags & BLOCK_FLAG_PREROLL )
p_sys->i_preroll_end = ts;
timestamp_FifoPut(p_sys->timestamp_fifo, p_block->i_pts ? VLC_TS_INVALID : p_block->i_dts); timestamp_FifoPut(p_sys->timestamp_fifo, p_block->i_pts ? VLC_TS_INVALID : p_block->i_dts);
(*env)->CallVoidMethod(env, p_sys->codec, p_sys->queue_input_buffer, index, 0, size, ts, 0); (*env)->CallVoidMethod(env, p_sys->codec, p_sys->queue_input_buffer, index, 0, size, ts, 0);
(*env)->DeleteLocalRef(env, buf); (*env)->DeleteLocalRef(env, buf);
...@@ -857,11 +861,17 @@ static int GetOutput(decoder_t *p_dec, JNIEnv *env, picture_t **pp_pic, jlong ti ...@@ -857,11 +861,17 @@ static int GetOutput(decoder_t *p_dec, JNIEnv *env, picture_t **pp_pic, jlong ti
} }
if (index >= 0) { if (index >= 0) {
int64_t i_buffer_pts;
if (!p_sys->pixel_format) { if (!p_sys->pixel_format) {
msg_Warn(p_dec, "Buffers returned before output format is set, dropping frame"); msg_Warn(p_dec, "Buffers returned before output format is set, dropping frame");
return ReleaseOutputBuffer(p_dec, env, index, false); return ReleaseOutputBuffer(p_dec, env, index, false);
} }
i_buffer_pts = (*env)->GetLongField(env, p_sys->buffer_info, p_sys->pts_field);
if (i_buffer_pts <= p_sys->i_preroll_end)
return ReleaseOutputBuffer(p_dec, env, index, false);
*pp_pic = decoder_NewPicture(p_dec); *pp_pic = decoder_NewPicture(p_dec);
if (!*pp_pic) { if (!*pp_pic) {
msg_Warn(p_dec, "NewPicture failed"); msg_Warn(p_dec, "NewPicture failed");
...@@ -873,7 +883,7 @@ static int GetOutput(decoder_t *p_dec, JNIEnv *env, picture_t **pp_pic, jlong ti ...@@ -873,7 +883,7 @@ static int GetOutput(decoder_t *p_dec, JNIEnv *env, picture_t **pp_pic, jlong ti
* so we overwrite it with the corresponding dts. */ * so we overwrite it with the corresponding dts. */
int64_t forced_ts = timestamp_FifoGet(p_sys->timestamp_fifo); int64_t forced_ts = timestamp_FifoGet(p_sys->timestamp_fifo);
if (forced_ts == VLC_TS_INVALID) if (forced_ts == VLC_TS_INVALID)
p_pic->date = (*env)->GetLongField(env, p_sys->buffer_info, p_sys->pts_field); p_pic->date = i_buffer_pts;
else else
p_pic->date = forced_ts; p_pic->date = forced_ts;
...@@ -1023,6 +1033,7 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block) ...@@ -1023,6 +1033,7 @@ static picture_t *DecodeVideo(decoder_t *p_dec, block_t **pp_block)
if ((*pp_block)->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) { if ((*pp_block)->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) {
block_Release(*pp_block); block_Release(*pp_block);
*pp_block = NULL; *pp_block = NULL;
p_sys->i_preroll_end = 0;
timestamp_FifoEmpty(p_sys->timestamp_fifo); timestamp_FifoEmpty(p_sys->timestamp_fifo);
if (p_sys->decoded) { if (p_sys->decoded) {
/* Invalidate all pictures that are currently in flight /* Invalidate all pictures that are currently in flight
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment