From: Indrajit Das Date: Thu, 15 Sep 2016 05:01:15 +0000 (+0530) Subject: st/omx/dec/h265: Correct the timestamping X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f9311265bfa2d716490a89be09bec9c5e253a56a;p=mesa.git st/omx/dec/h265: Correct the timestamping (derived from commit 3b6bda665a5a890f2c98e19d2939d7de92b8cb4c) v2: fix the tabs(Leo) Reviewed-by: Christian König Reviewed-by: Nishanth Peethambaran Signed-off-by: Indrajit Das Signed-off-by: Leo Liu --- diff --git a/src/gallium/state_trackers/omx/vid_dec_h265.c b/src/gallium/state_trackers/omx/vid_dec_h265.c index 7c0f75d8cea..0772b4d54eb 100644 --- a/src/gallium/state_trackers/omx/vid_dec_h265.c +++ b/src/gallium/state_trackers/omx/vid_dec_h265.c @@ -60,6 +60,7 @@ enum { struct dpb_list { struct list_head list; struct pipe_video_buffer *buffer; + OMX_TICKS timestamp; unsigned poc; }; @@ -518,6 +519,9 @@ static void vid_dec_h265_BeginFrame(vid_dec_PrivateType *priv) return; vid_dec_NeedTarget(priv); + if (priv->first_buf_in_frame) + priv->timestamp = priv->timestamps[0]; + priv->first_buf_in_frame = false; if (!priv->codec) { struct pipe_video_codec templat = {}; @@ -558,6 +562,8 @@ static struct pipe_video_buffer *vid_dec_h265_Flush(vid_dec_PrivateType *priv, return NULL; buf = result->buffer; + if (timestamp) + *timestamp = result->timestamp; --priv->codec_data.h265.dpb_num; LIST_DEL(&result->list); @@ -572,6 +578,7 @@ static void vid_dec_h265_EndFrame(vid_dec_PrivateType *priv) struct pipe_video_buffer *tmp; struct ref_pic_set *rps; int i; + OMX_TICKS timestamp; if (!priv->frame_started) return; @@ -621,7 +628,9 @@ static void vid_dec_h265_EndFrame(vid_dec_PrivateType *priv) if (!entry) return; + priv->first_buf_in_frame = true; entry->buffer = priv->target; + entry->timestamp = priv->timestamp; entry->poc = get_poc(priv); LIST_ADDTAIL(&entry->list, &priv->codec_data.h265.dpb_list); @@ -632,7 +641,8 @@ static void vid_dec_h265_EndFrame(vid_dec_PrivateType *priv) return; tmp = priv->in_buffers[0]->pInputPortPrivate; - priv->in_buffers[0]->pInputPortPrivate = vid_dec_h265_Flush(priv, NULL); + priv->in_buffers[0]->pInputPortPrivate = vid_dec_h265_Flush(priv, ×tamp); + priv->in_buffers[0]->nTimeStamp = timestamp; priv->target = tmp; priv->frame_finished = priv->in_buffers[0]->pInputPortPrivate != NULL; if (priv->frame_finished && @@ -894,4 +904,5 @@ void vid_dec_h265_Init(vid_dec_PrivateType *priv) priv->Decode = vid_dec_h265_Decode; priv->EndFrame = vid_dec_h265_EndFrame; priv->Flush = vid_dec_h265_Flush; + priv->first_buf_in_frame = true; }