Simplify and optimize the update process of the reference frame store. Use less iterations to look up existing objects. Use a cache to store the free'd slots.
Signed-off-by: Gwenole Beauchesne <gwenole.beauche...@intel.com> --- src/i965_decoder_utils.c | 109 ++++++++++++++++++++--------------------------- 1 file changed, 46 insertions(+), 63 deletions(-) diff --git a/src/i965_decoder_utils.c b/src/i965_decoder_utils.c index 780d239..63de195 100644 --- a/src/i965_decoder_utils.c +++ b/src/i965_decoder_utils.c @@ -351,88 +351,71 @@ gen6_send_avc_ref_idx_state( } void -intel_update_avc_frame_store_index(VADriverContextP ctx, - struct decode_state *decode_state, - VAPictureParameterBufferH264 *pic_param, - GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES]) +intel_update_avc_frame_store_index( + VADriverContextP ctx, + struct decode_state *decode_state, + VAPictureParameterBufferH264 *pic_param, + GenFrameStore frame_store[MAX_GEN_REFERENCE_FRAMES] +) { - int i, j; - - assert(MAX_GEN_REFERENCE_FRAMES == ARRAY_ELEMS(pic_param->ReferenceFrames)); - - for (i = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) { - int found = 0; - - if (frame_store[i].surface_id == VA_INVALID_ID || - frame_store[i].obj_surface == NULL) + int free_slots[MAX_GEN_REFERENCE_FRAMES]; + int i, j, n, num_free_slots; + bool found; + + /* Remove obsolete entries from the internal DPB */ + for (i = 0, n = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) { + GenFrameStore * const fs = &frame_store[i]; + if (fs->surface_id == VA_INVALID_ID || !fs->obj_surface) { + free_slots[n++] = i; continue; + } - assert(frame_store[i].frame_store_id != -1); - - for (j = 0; j < MAX_GEN_REFERENCE_FRAMES; j++) { - VAPictureH264 *ref_pic = &pic_param->ReferenceFrames[j]; - if (ref_pic->flags & VA_PICTURE_H264_INVALID) - continue; - - if (frame_store[i].surface_id == ref_pic->picture_id) { - found = 1; + // Find whether the current entry is still a valid reference frame + found = false; + for (j = 0; j < ARRAY_ELEMS(decode_state->reference_objects); j++) { + struct object_surface * const obj_surface = + decode_state->reference_objects[j]; + if (!obj_surface || (found = obj_surface == fs->obj_surface)) break; - } } - /* remove it from the internal DPB */ + // ... or remove it if (!found) { - frame_store[i].surface_id = VA_INVALID_ID; - frame_store[i].frame_store_id = -1; - frame_store[i].obj_surface = NULL; + fs->surface_id = VA_INVALID_ID; + fs->obj_surface = NULL; + fs->frame_store_id = -1; + free_slots[n++] = i; } } + num_free_slots = n; - for (i = 0; i < MAX_GEN_REFERENCE_FRAMES; i++) { - VAPictureH264 *ref_pic = &pic_param->ReferenceFrames[i]; - int found = 0; - - if (ref_pic->flags & VA_PICTURE_H264_INVALID || - ref_pic->picture_id == VA_INVALID_SURFACE || - decode_state->reference_objects[i] == NULL) - continue; + /* Append the new reference frames */ + for (i = 0, n = 0; i < ARRAY_ELEMS(decode_state->reference_objects); i++) { + struct object_surface * const obj_surface = + decode_state->reference_objects[i]; + if (!obj_surface) + break; + // Find whether the current frame is not already in our frame store + found = false; for (j = 0; j < MAX_GEN_REFERENCE_FRAMES; j++) { - if (frame_store[j].surface_id == ref_pic->picture_id) { - found = 1; + if ((found = frame_store[j].obj_surface == obj_surface)) break; - } } - /* add the new reference frame into the internal DPB */ + // ... or add it if (!found) { - int frame_idx; - int slot_found; - struct object_surface *obj_surface = decode_state->reference_objects[i]; - - slot_found = 0; - frame_idx = -1; - /* Find a free frame store index */ - for (j = 0; j < MAX_GEN_REFERENCE_FRAMES; j++) { - if (frame_store[j].surface_id == VA_INVALID_ID || - frame_store[j].obj_surface == NULL) { - frame_idx = j; - slot_found = 1; - break; - } + if (n < num_free_slots) { + GenFrameStore * const fs = &frame_store[free_slots[n++]]; + fs->surface_id = obj_surface->base.id; + fs->obj_surface = obj_surface; + fs->frame_store_id = fs - frame_store; + } + else { + WARN_ONCE("No free slot found for DPB reference list!!!\n"); } - - - if (slot_found) { - frame_store[j].surface_id = ref_pic->picture_id; - frame_store[j].frame_store_id = frame_idx; - frame_store[j].obj_surface = obj_surface; - } else { - WARN_ONCE("Not free slot for DPB reference list!!!\n"); - } } } - } void -- 1.9.1 _______________________________________________ Libva mailing list Libva@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libva