diff options
author | Indrajit Das <[email protected]> | 2016-09-15 10:31:15 +0530 |
---|---|---|
committer | Leo Liu <[email protected]> | 2016-09-20 15:58:56 -0400 |
commit | f9311265bfa2d716490a89be09bec9c5e253a56a (patch) | |
tree | 3e70aed1a6ae2b8337c94ebdb9f5cd5cd069ba3f /src/gallium | |
parent | 792d77165be40691d0c3b6dc025a792cb076109e (diff) |
st/omx/dec/h265: Correct the timestamping
(derived from commit 3b6bda665a5a890f2c98e19d2939d7de92b8cb4c)
v2: fix the tabs(Leo)
Reviewed-by: Christian König <[email protected]>
Reviewed-by: Nishanth Peethambaran <[email protected]>
Signed-off-by: Indrajit Das <[email protected]>
Signed-off-by: Leo Liu <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/state_trackers/omx/vid_dec_h265.c | 13 |
1 files changed, 12 insertions, 1 deletions
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; } |