diff --git a/msm/vidc/msm_vidc.c b/msm/vidc/msm_vidc.c index 9d7d8d27257a..8243a1a88737 100644 --- a/msm/vidc/msm_vidc.c +++ b/msm/vidc/msm_vidc.c @@ -438,7 +438,8 @@ int msm_vidc_qbuf(void *instance, struct media_device *mdev, inst->flush_timestamps = false; if (!(b->flags & V4L2_BUF_FLAG_CODECCONFIG)) - rc = msm_comm_store_timestamp(inst, timestamp_us); + rc = msm_comm_store_timestamp(inst, timestamp_us, + b->flags & V4L2_BUF_FLAG_EOS); if (rc) goto unlock; diff --git a/msm/vidc/msm_vidc_common.c b/msm/vidc/msm_vidc_common.c index 90a6605ac539..f92584b6a485 100644 --- a/msm/vidc/msm_vidc_common.c +++ b/msm/vidc/msm_vidc_common.c @@ -7600,7 +7600,8 @@ void msm_comm_release_timestamps(struct msm_vidc_inst *inst) mutex_unlock(&inst->timestamps.lock); } -int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) +int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us, + bool is_eos) { struct msm_vidc_timestamps *entry, *node, *prev = NULL; struct msm_vidc_timestamps *duplicate; @@ -7618,7 +7619,8 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) duplicate = NULL; list_for_each_entry(node, &inst->timestamps.list, list) { count++; - if (node->is_valid && node->timestamp_us == timestamp_us) + if (node->is_valid && node->timestamp_us == timestamp_us && + !node->is_eos) duplicate = node; } @@ -7649,6 +7651,7 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) entry->timestamp_us = duplicate->timestamp_us; entry->framerate = duplicate->framerate; entry->is_valid = true; + entry->is_eos = is_eos; /* add entry next to duplicate */ list_add(&entry->list, &duplicate->list); goto unlock; @@ -7661,7 +7664,8 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) prev = NULL; inserted = false; list_for_each_entry(node, &inst->timestamps.list, list) { - if (entry->timestamp_us < node->timestamp_us) { + if (entry->timestamp_us < node->timestamp_us && + !node->is_eos) { /* * if prev available add entry next to prev else * entry is first so add it at head. @@ -7688,7 +7692,8 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) node->timestamp_us, prev->timestamp_us); break; } - if (node->timestamp_us == entry->timestamp_us) { + if (node->timestamp_us == entry->timestamp_us && + !node->is_eos) { if (prev) node->framerate = msm_comm_calc_framerate(inst, node->timestamp_us, prev->timestamp_us); @@ -7697,6 +7702,12 @@ int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us) prev = node; } + /* mark all entries as eos if is_eos is queued */ + if (is_eos) + list_for_each_entry(node, &inst->timestamps.list, list) { + node->is_eos = true; + } + unlock: mutex_unlock(&inst->timestamps.lock); return rc; diff --git a/msm/vidc/msm_vidc_common.h b/msm/vidc/msm_vidc_common.h index 57f30be43c1a..7880f6d7a5d7 100644 --- a/msm/vidc/msm_vidc_common.h +++ b/msm/vidc/msm_vidc_common.h @@ -400,7 +400,8 @@ int msm_comm_set_cvp_skip_ratio(struct msm_vidc_inst *inst, uint32_t capture_rate, uint32_t cvp_rate); int msm_comm_fetch_ts_framerate(struct msm_vidc_inst *inst, struct v4l2_buffer *b); -int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us); +int msm_comm_store_timestamp(struct msm_vidc_inst *inst, u64 timestamp_us, + bool is_eos); void msm_comm_release_timestamps(struct msm_vidc_inst *inst); u32 msm_comm_get_max_framerate(struct msm_vidc_inst *inst); u32 msm_comm_calc_framerate(struct msm_vidc_inst *inst, u64 timestamp_us, diff --git a/msm/vidc/msm_vidc_internal.h b/msm/vidc/msm_vidc_internal.h index cd2f35c46852..f57f36e455c9 100644 --- a/msm/vidc/msm_vidc_internal.h +++ b/msm/vidc/msm_vidc_internal.h @@ -239,6 +239,7 @@ struct msm_vidc_timestamps { u64 timestamp_us; u32 framerate; bool is_valid; + bool is_eos; }; enum efuse_purpose {