Lines Matching refs:p_Dpb
265 static void mm_unmark_short_term_for_reference(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p, RK_S32 dif… in mm_unmark_short_term_for_reference() argument
272 for (i = 0; i < p_Dpb->ref_frames_in_buffer; i++) { in mm_unmark_short_term_for_reference()
274 if ((p_Dpb->fs_ref[i]->is_reference == 3) && (p_Dpb->fs_ref[i]->is_long_term == 0)) { in mm_unmark_short_term_for_reference()
275 if (p_Dpb->fs_ref[i]->frame->pic_num == picNumX) { in mm_unmark_short_term_for_reference()
276 unmark_for_reference(p_Dpb->p_Vid->p_Dec, p_Dpb->fs_ref[i]); in mm_unmark_short_term_for_reference()
281 if ((p_Dpb->fs_ref[i]->is_reference & 1) && (!(p_Dpb->fs_ref[i]->is_long_term & 1))) { in mm_unmark_short_term_for_reference()
282 if (p_Dpb->fs_ref[i]->top_field->pic_num == picNumX) { in mm_unmark_short_term_for_reference()
283 p_Dpb->fs_ref[i]->top_field->used_for_reference = 0; in mm_unmark_short_term_for_reference()
284 p_Dpb->fs_ref[i]->is_reference &= 2; in mm_unmark_short_term_for_reference()
285 if (p_Dpb->fs_ref[i]->is_used == 3) { in mm_unmark_short_term_for_reference()
286 p_Dpb->fs_ref[i]->frame->used_for_reference = 0; in mm_unmark_short_term_for_reference()
291 if ((p_Dpb->fs_ref[i]->is_reference & 2) && (!(p_Dpb->fs_ref[i]->is_long_term & 2))) { in mm_unmark_short_term_for_reference()
292 if (p_Dpb->fs_ref[i]->bottom_field->pic_num == picNumX) { in mm_unmark_short_term_for_reference()
293 p_Dpb->fs_ref[i]->bottom_field->used_for_reference = 0; in mm_unmark_short_term_for_reference()
294 p_Dpb->fs_ref[i]->is_reference &= 1; in mm_unmark_short_term_for_reference()
295 if (p_Dpb->fs_ref[i]->is_used == 3) { in mm_unmark_short_term_for_reference()
296 p_Dpb->fs_ref[i]->frame->used_for_reference = 0; in mm_unmark_short_term_for_reference()
305 static void mm_unmark_long_term_for_reference(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p, RK_S32 long… in mm_unmark_long_term_for_reference() argument
309 for (i = 0; i < p_Dpb->ltref_frames_in_buffer; i++) { in mm_unmark_long_term_for_reference()
311 … if ((p_Dpb->fs_ltref[i]->is_reference == 3) && (p_Dpb->fs_ltref[i]->is_long_term == 3)) { in mm_unmark_long_term_for_reference()
312 if (p_Dpb->fs_ltref[i]->frame->long_term_pic_num == long_term_pic_num) { in mm_unmark_long_term_for_reference()
313 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in mm_unmark_long_term_for_reference()
317 … if ((p_Dpb->fs_ltref[i]->is_reference & 1) && ((p_Dpb->fs_ltref[i]->is_long_term & 1))) { in mm_unmark_long_term_for_reference()
318 if (p_Dpb->fs_ltref[i]->top_field->long_term_pic_num == long_term_pic_num) { in mm_unmark_long_term_for_reference()
319 p_Dpb->fs_ltref[i]->top_field->used_for_reference = 0; in mm_unmark_long_term_for_reference()
320 p_Dpb->fs_ltref[i]->top_field->is_long_term = 0; in mm_unmark_long_term_for_reference()
321 p_Dpb->fs_ltref[i]->is_reference &= 2; in mm_unmark_long_term_for_reference()
322 p_Dpb->fs_ltref[i]->is_long_term &= 2; in mm_unmark_long_term_for_reference()
323 if (p_Dpb->fs_ltref[i]->is_used == 3) { in mm_unmark_long_term_for_reference()
324 p_Dpb->fs_ltref[i]->frame->used_for_reference = 0; in mm_unmark_long_term_for_reference()
325 p_Dpb->fs_ltref[i]->frame->is_long_term = 0; in mm_unmark_long_term_for_reference()
330 … if ((p_Dpb->fs_ltref[i]->is_reference & 2) && ((p_Dpb->fs_ltref[i]->is_long_term & 2))) { in mm_unmark_long_term_for_reference()
331 if (p_Dpb->fs_ltref[i]->bottom_field->long_term_pic_num == long_term_pic_num) { in mm_unmark_long_term_for_reference()
332 p_Dpb->fs_ltref[i]->bottom_field->used_for_reference = 0; in mm_unmark_long_term_for_reference()
333 p_Dpb->fs_ltref[i]->bottom_field->is_long_term = 0; in mm_unmark_long_term_for_reference()
334 p_Dpb->fs_ltref[i]->is_reference &= 1; in mm_unmark_long_term_for_reference()
335 p_Dpb->fs_ltref[i]->is_long_term &= 1; in mm_unmark_long_term_for_reference()
336 if (p_Dpb->fs_ltref[i]->is_used == 3) { in mm_unmark_long_term_for_reference()
337 p_Dpb->fs_ltref[i]->frame->used_for_reference = 0; in mm_unmark_long_term_for_reference()
338 p_Dpb->fs_ltref[i]->frame->is_long_term = 0; in mm_unmark_long_term_for_reference()
347 static void unmark_long_term_frame_for_reference_by_frame_idx(H264_DpbBuf_t *p_Dpb, RK_S32 long_ter… in unmark_long_term_frame_for_reference_by_frame_idx() argument
350 for (i = 0; i < p_Dpb->ltref_frames_in_buffer; i++) { in unmark_long_term_frame_for_reference_by_frame_idx()
351 if (p_Dpb->fs_ltref[i]->long_term_frame_idx == long_term_frame_idx) { in unmark_long_term_frame_for_reference_by_frame_idx()
352 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_frame_for_reference_by_frame_idx()
357 static MPP_RET unmark_long_term_field_for_reference_by_frame_idx(H264_DpbBuf_t *p_Dpb, RK_S32 struc… in unmark_long_term_field_for_reference_by_frame_idx() argument
362 H264dVideoCtx_t *p_Vid = p_Dpb->p_Vid; in unmark_long_term_field_for_reference_by_frame_idx()
368 for (i = 0; i < p_Dpb->ltref_frames_in_buffer; i++) { in unmark_long_term_field_for_reference_by_frame_idx()
369 if (p_Dpb->fs_ltref[i]->long_term_frame_idx == long_term_frame_idx) { in unmark_long_term_field_for_reference_by_frame_idx()
371 if (p_Dpb->fs_ltref[i]->is_long_term == 3) { in unmark_long_term_field_for_reference_by_frame_idx()
372 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
374 if (p_Dpb->fs_ltref[i]->is_long_term == 1) { in unmark_long_term_field_for_reference_by_frame_idx()
375 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
378 if (p_Dpb->last_picture) { in unmark_long_term_field_for_reference_by_frame_idx()
379 …if ((p_Dpb->last_picture != p_Dpb->fs_ltref[i]) || p_Dpb->last_picture->frame_num != curr_frame_nu… in unmark_long_term_field_for_reference_by_frame_idx()
380 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
382 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
385 if ((p_Dpb->fs_ltref[i]->frame_num) != (unsigned)(curr_pic_num >> 1)) { in unmark_long_term_field_for_reference_by_frame_idx()
386 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
393 if (p_Dpb->fs_ltref[i]->is_long_term == 3) { in unmark_long_term_field_for_reference_by_frame_idx()
394 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
396 if (p_Dpb->fs_ltref[i]->is_long_term == 2) { in unmark_long_term_field_for_reference_by_frame_idx()
397 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
400 if (p_Dpb->last_picture) { in unmark_long_term_field_for_reference_by_frame_idx()
401 …if ((p_Dpb->last_picture != p_Dpb->fs_ltref[i]) || p_Dpb->last_picture->frame_num != curr_frame_nu… in unmark_long_term_field_for_reference_by_frame_idx()
402 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
404 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
407 if ((p_Dpb->fs_ltref[i]->frame_num) != (unsigned)(curr_pic_num >> 1)) { in unmark_long_term_field_for_reference_by_frame_idx()
408 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in unmark_long_term_field_for_reference_by_frame_idx()
421 static void mark_pic_long_term(H264_DpbBuf_t *p_Dpb, H264_StorePic_t* p, RK_S32 long_term_frame_idx… in mark_pic_long_term() argument
427 for (i = 0; i < p_Dpb->ref_frames_in_buffer; i++) { in mark_pic_long_term()
428 if (p_Dpb->fs_ref[i]->is_reference == 3) { in mark_pic_long_term()
429 … if ((!p_Dpb->fs_ref[i]->frame->is_long_term) && (p_Dpb->fs_ref[i]->frame->pic_num == picNumX)) { in mark_pic_long_term()
430 …p_Dpb->fs_ref[i]->long_term_frame_idx = p_Dpb->fs_ref[i]->frame->long_term_frame_idx = long_term_f… in mark_pic_long_term()
431 p_Dpb->fs_ref[i]->frame->long_term_pic_num = long_term_frame_idx; in mark_pic_long_term()
432 p_Dpb->fs_ref[i]->frame->is_long_term = 1; in mark_pic_long_term()
434 if (p_Dpb->fs_ref[i]->top_field && p_Dpb->fs_ref[i]->bottom_field) { in mark_pic_long_term()
435 …p_Dpb->fs_ref[i]->top_field->long_term_frame_idx = p_Dpb->fs_ref[i]->bottom_field->long_term_frame… in mark_pic_long_term()
436 p_Dpb->fs_ref[i]->top_field->long_term_pic_num = long_term_frame_idx; in mark_pic_long_term()
437 p_Dpb->fs_ref[i]->bottom_field->long_term_pic_num = long_term_frame_idx; in mark_pic_long_term()
438 … p_Dpb->fs_ref[i]->top_field->is_long_term = p_Dpb->fs_ref[i]->bottom_field->is_long_term = 1; in mark_pic_long_term()
440 p_Dpb->fs_ref[i]->is_long_term = 3; in mark_pic_long_term()
454 for (i = 0; i < p_Dpb->ref_frames_in_buffer; i++) { in mark_pic_long_term()
455 if (p_Dpb->fs_ref[i]->is_reference & 1) { in mark_pic_long_term()
456 …if ((!p_Dpb->fs_ref[i]->top_field->is_long_term) && (p_Dpb->fs_ref[i]->top_field->pic_num == picNu… in mark_pic_long_term()
457 …if ((p_Dpb->fs_ref[i]->is_long_term) && (p_Dpb->fs_ref[i]->long_term_frame_idx != long_term_frame_… in mark_pic_long_term()
460 …p_Dpb->fs_ref[i]->long_term_frame_idx = p_Dpb->fs_ref[i]->top_field->long_term_frame_idx = long_te… in mark_pic_long_term()
461 … p_Dpb->fs_ref[i]->top_field->long_term_pic_num = 2 * long_term_frame_idx + add_top; in mark_pic_long_term()
462 p_Dpb->fs_ref[i]->top_field->is_long_term = 1; in mark_pic_long_term()
463 p_Dpb->fs_ref[i]->is_long_term |= 1; in mark_pic_long_term()
464 if (p_Dpb->fs_ref[i]->is_long_term == 3) { in mark_pic_long_term()
465 p_Dpb->fs_ref[i]->frame->is_long_term = 1; in mark_pic_long_term()
466 …p_Dpb->fs_ref[i]->frame->long_term_frame_idx = p_Dpb->fs_ref[i]->frame->long_term_pic_num = long_t… in mark_pic_long_term()
471 if (p_Dpb->fs_ref[i]->is_reference & 2) { in mark_pic_long_term()
472 …if ((!p_Dpb->fs_ref[i]->bottom_field->is_long_term) && (p_Dpb->fs_ref[i]->bottom_field->pic_num ==… in mark_pic_long_term()
473 …if ((p_Dpb->fs_ref[i]->is_long_term) && (p_Dpb->fs_ref[i]->long_term_frame_idx != long_term_frame_… in mark_pic_long_term()
477 … p_Dpb->fs_ref[i]->long_term_frame_idx = p_Dpb->fs_ref[i]->bottom_field->long_term_frame_idx in mark_pic_long_term()
479 … p_Dpb->fs_ref[i]->bottom_field->long_term_pic_num = 2 * long_term_frame_idx + add_bottom; in mark_pic_long_term()
480 p_Dpb->fs_ref[i]->bottom_field->is_long_term = 1; in mark_pic_long_term()
481 p_Dpb->fs_ref[i]->is_long_term |= 2; in mark_pic_long_term()
482 if (p_Dpb->fs_ref[i]->is_long_term == 3) { in mark_pic_long_term()
483 p_Dpb->fs_ref[i]->frame->is_long_term = 1; in mark_pic_long_term()
484 …p_Dpb->fs_ref[i]->frame->long_term_frame_idx = p_Dpb->fs_ref[i]->frame->long_term_pic_num = long_t… in mark_pic_long_term()
494 static MPP_RET mm_assign_long_term_frame_idx(H264_DpbBuf_t *p_Dpb, H264_StorePic_t* p, RK_S32 diffe… in mm_assign_long_term_frame_idx() argument
503 unmark_long_term_frame_for_reference_by_frame_idx(p_Dpb, long_term_frame_idx); in mm_assign_long_term_frame_idx()
507 for (i = 0; i < p_Dpb->ref_frames_in_buffer; i++) { in mm_assign_long_term_frame_idx()
508 if (p_Dpb->fs_ref[i]->is_reference & 1) { in mm_assign_long_term_frame_idx()
509 if (p_Dpb->fs_ref[i]->top_field->pic_num == picNumX) { in mm_assign_long_term_frame_idx()
514 if (p_Dpb->fs_ref[i]->is_reference & 2) { in mm_assign_long_term_frame_idx()
515 if (p_Dpb->fs_ref[i]->bottom_field->pic_num == picNumX) { in mm_assign_long_term_frame_idx()
522 …FUN_CHECK(ret = unmark_long_term_field_for_reference_by_frame_idx(p_Dpb, structure, long_term_fram… in mm_assign_long_term_frame_idx()
524 mark_pic_long_term(p_Dpb, p, long_term_frame_idx, picNumX); in mm_assign_long_term_frame_idx()
531 static void mm_update_max_long_term_frame_idx(H264_DpbBuf_t *p_Dpb, RK_S32 max_long_term_frame_idx_… in mm_update_max_long_term_frame_idx() argument
535 p_Dpb->max_long_term_pic_idx = max_long_term_frame_idx_plus1 - 1; in mm_update_max_long_term_frame_idx()
538 for (i = 0; i < p_Dpb->ltref_frames_in_buffer; i++) { in mm_update_max_long_term_frame_idx()
539 if (p_Dpb->fs_ltref[i]->long_term_frame_idx > p_Dpb->max_long_term_pic_idx) { in mm_update_max_long_term_frame_idx()
540 unmark_for_long_term_reference(p_Dpb->fs_ltref[i]); in mm_update_max_long_term_frame_idx()
545 static void mm_unmark_all_short_term_for_reference(H264_DpbBuf_t *p_Dpb) in mm_unmark_all_short_term_for_reference() argument
548 for (i = 0; i < p_Dpb->ref_frames_in_buffer; i++) { in mm_unmark_all_short_term_for_reference()
549 unmark_for_reference(p_Dpb->p_Vid->p_Dec, p_Dpb->fs_ref[i]); in mm_unmark_all_short_term_for_reference()
551 update_ref_list(p_Dpb); in mm_unmark_all_short_term_for_reference()
554 static void mm_unmark_all_long_term_for_reference(H264_DpbBuf_t *p_Dpb) in mm_unmark_all_long_term_for_reference() argument
556 mm_update_max_long_term_frame_idx(p_Dpb, 0); in mm_unmark_all_long_term_for_reference()
559 static void mm_mark_current_picture_long_term(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p, RK_S32 long… in mm_mark_current_picture_long_term() argument
563 unmark_long_term_frame_for_reference_by_frame_idx(p_Dpb, long_term_frame_idx); in mm_mark_current_picture_long_term()
565 …unmark_long_term_field_for_reference_by_frame_idx(p_Dpb, p->structure, long_term_frame_idx, 1, p->… in mm_mark_current_picture_long_term()
572 static void sliding_window_memory_management(H264_DpbBuf_t *p_Dpb) in sliding_window_memory_management() argument
577 …if (p_Dpb->ref_frames_in_buffer == MPP_MAX(1, p_Dpb->num_ref_frames) - p_Dpb->ltref_frames_in_buff… in sliding_window_memory_management()
578 for (i = 0; i < p_Dpb->used_size; i++) { in sliding_window_memory_management()
579 if (p_Dpb->fs[i]->is_reference && (!(p_Dpb->fs[i]->is_long_term))) { in sliding_window_memory_management()
580 unmark_for_reference(p_Dpb->p_Vid->p_Dec, p_Dpb->fs[i]); in sliding_window_memory_management()
581 update_ref_list(p_Dpb); in sliding_window_memory_management()
588 static void check_num_ref(H264_DpbBuf_t *p_Dpb) in check_num_ref() argument
591 …if ((RK_S32)(p_Dpb->ltref_frames_in_buffer + p_Dpb->ref_frames_in_buffer) > MPP_MAX(1, p_Dpb->num_… in check_num_ref()
592 sliding_window_memory_management(p_Dpb); in check_num_ref()
649 static MPP_RET remove_frame_from_dpb(H264_DpbBuf_t *p_Dpb, RK_S32 pos) in remove_frame_from_dpb() argument
657 INP_CHECK(ret, !p_Dpb); in remove_frame_from_dpb()
658 fs = p_Dpb->fs[pos]; in remove_frame_from_dpb()
660 INP_CHECK(ret, !p_Dpb->p_Vid); in remove_frame_from_dpb()
661 p_Dec = p_Dpb->p_Vid->p_Dec; in remove_frame_from_dpb()
694 tmp = p_Dpb->fs[pos]; in remove_frame_from_dpb()
696 for (i = pos; i < p_Dpb->used_size - 1; i++) { in remove_frame_from_dpb()
697 p_Dpb->fs[i] = p_Dpb->fs[i + 1]; in remove_frame_from_dpb()
699 p_Dpb->fs[p_Dpb->used_size - 1] = tmp; in remove_frame_from_dpb()
700 p_Dpb->used_size--; in remove_frame_from_dpb()
711 static MPP_RET remove_unused_frame_from_dpb(H264_DpbBuf_t *p_Dpb) in remove_unused_frame_from_dpb() argument
715 INP_CHECK(ret, !p_Dpb); in remove_unused_frame_from_dpb()
717 for (i = 0; i < p_Dpb->used_size; i++) { in remove_unused_frame_from_dpb()
718 if (p_Dpb->fs[i]) { in remove_unused_frame_from_dpb()
719 if (p_Dpb->fs[i]->is_output && (!is_used_for_reference(p_Dpb->fs[i]))) { in remove_unused_frame_from_dpb()
720 FUN_CHECK(ret = remove_frame_from_dpb(p_Dpb, i)); in remove_unused_frame_from_dpb()
731 static RK_S32 get_smallest_poc(H264_DpbBuf_t *p_Dpb, RK_S32 *poc, RK_S32 *pos) in get_smallest_poc() argument
740 for (i = 0; i < p_Dpb->used_size; i++) { in get_smallest_poc()
741 if (min_poc > p_Dpb->fs[i]->poc) { in get_smallest_poc()
742 min_poc = p_Dpb->fs[i]->poc; in get_smallest_poc()
745 if ((*poc > p_Dpb->fs[i]->poc) && (!p_Dpb->fs[i]->is_output)) { in get_smallest_poc()
746 *poc = p_Dpb->fs[i]->poc; in get_smallest_poc()
1008 static MPP_RET write_stored_frame(H264dVideoCtx_t *p_Vid, H264_DpbBuf_t *p_Dpb, H264_FrameStore_t *… in write_stored_frame() argument
1026 p_Dpb->last_output_poc = fs->poc; in write_stored_frame()
1036 static MPP_RET output_one_frame_from_dpb(H264_DpbBuf_t *p_Dpb) in output_one_frame_from_dpb() argument
1040 H264dVideoCtx_t *p_Vid = p_Dpb->p_Vid; in output_one_frame_from_dpb()
1043 if (get_smallest_poc(p_Dpb, &poc, &pos)) { in output_one_frame_from_dpb()
1046 FUN_CHECK(ret = write_stored_frame(p_Vid, p_Dpb, p_Dpb->fs[pos])); in output_one_frame_from_dpb()
1048 if (!is_used_for_reference(p_Dpb->fs[pos])) { in output_one_frame_from_dpb()
1049 FUN_CHECK(ret = remove_frame_from_dpb(p_Dpb, pos)); in output_one_frame_from_dpb()
1057 static MPP_RET adaptive_memory_management(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p) in adaptive_memory_management() argument
1061 H264dVideoCtx_t *p_Vid = p_Dpb->p_Vid; in adaptive_memory_management()
1072 mm_unmark_short_term_for_reference(p_Dpb, p, tmp_drpm->difference_of_pic_nums_minus1); in adaptive_memory_management()
1073 update_ref_list(p_Dpb); in adaptive_memory_management()
1076 mm_unmark_long_term_for_reference(p_Dpb, p, tmp_drpm->long_term_pic_num); in adaptive_memory_management()
1077 update_ltref_list(p_Dpb); in adaptive_memory_management()
1080 …mm_assign_long_term_frame_idx(p_Dpb, p, tmp_drpm->difference_of_pic_nums_minus1, tmp_drpm->long_te… in adaptive_memory_management()
1081 update_ref_list(p_Dpb); in adaptive_memory_management()
1082 update_ltref_list(p_Dpb); in adaptive_memory_management()
1085 mm_update_max_long_term_frame_idx(p_Dpb, tmp_drpm->max_long_term_frame_idx_plus1); in adaptive_memory_management()
1086 update_ltref_list(p_Dpb); in adaptive_memory_management()
1089 mm_unmark_all_short_term_for_reference(p_Dpb); in adaptive_memory_management()
1090 mm_unmark_all_long_term_for_reference(p_Dpb); in adaptive_memory_management()
1096 tmp_drpm->max_long_term_frame_idx_plus1 = p_Dpb->num_ref_frames; in adaptive_memory_management()
1098 mm_mark_current_picture_long_term(p_Dpb, p, tmp_drpm->long_term_frame_idx); in adaptive_memory_management()
1099 check_num_ref(p_Dpb); in adaptive_memory_management()
1243 static MPP_RET direct_output(H264dVideoCtx_t *p_Vid, H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p) in direct_output() argument
1254 p_Dpb->last_output_poc = p->poc; in direct_output()
1256 p_Dpb->last_picture = NULL; in direct_output()
1270 p_Dpb->last_picture = &p_Vid->out_buffer; in direct_output()
1281 p_Dpb->last_picture = &p_Vid->out_buffer; in direct_output()
1298 p_Dpb->last_output_poc = p->poc; in direct_output()
1299 p_Dpb->last_picture = NULL; in direct_output()
1308 static MPP_RET output_dpb_normal(H264_DpbBuf_t *p_Dpb) in output_dpb_normal() argument
1315 while ((p_Dpb->last_output_poc > INT_MIN) in output_dpb_normal()
1316 && (get_smallest_poc(p_Dpb, &min_poc, &min_pos))) { in output_dpb_normal()
1317 poc_inc = min_poc - p_Dpb->last_output_poc; in output_dpb_normal()
1318 if ((p_Dpb->last_output_poc > INT_MIN) && (abs(poc_inc) & 0x1)) in output_dpb_normal()
1319 p_Dpb->poc_interval = 1; in output_dpb_normal()
1320 if ((min_poc - p_Dpb->last_output_poc) <= p_Dpb->poc_interval) { in output_dpb_normal()
1321 FUN_CHECK(ret = write_stored_frame(p_Dpb->p_Vid, p_Dpb, p_Dpb->fs[min_pos])); in output_dpb_normal()
1326 while (!remove_unused_frame_from_dpb(p_Dpb)); in output_dpb_normal()
1332 static MPP_RET output_dpb_fastplay(H264_DpbBuf_t *p_Dpb, H264_FrameStore_t *fs, RK_U32 is_i_frm) in output_dpb_fastplay() argument
1336 if ((p_Dpb->p_Vid->dpb_fast_out && is_i_frm)) { in output_dpb_fastplay()
1337 FUN_CHECK(ret = write_stored_frame(p_Dpb->p_Vid, p_Dpb, fs)); in output_dpb_fastplay()
1339 output_dpb_normal(p_Dpb); in output_dpb_fastplay()
1345 static MPP_RET output_dpb_fastplay_once(H264_DpbBuf_t *p_Dpb, H264_FrameStore_t *fs, RK_U32 is_i_fr… in output_dpb_fastplay_once() argument
1349 if (p_Dpb->p_Vid->dpb_fast_out && is_i_frm && !p_Dpb->p_Vid->dpb_first_fast_played) { in output_dpb_fastplay_once()
1350 FUN_CHECK(ret = write_stored_frame(p_Dpb->p_Vid, p_Dpb, fs)); in output_dpb_fastplay_once()
1351 p_Dpb->p_Vid->dpb_first_fast_played = 1; in output_dpb_fastplay_once()
1354 if (p_Dpb->p_Vid->dpb_fast_out && is_i_frm && p_Dpb->p_Vid->dpb_first_fast_played) { in output_dpb_fastplay_once()
1355 p_Dpb->p_Vid->dpb_fast_out = MPP_DISABLE_FAST_PLAY; in output_dpb_fastplay_once()
1357 output_dpb_normal(p_Dpb); in output_dpb_fastplay_once()
1365 static MPP_RET scan_dpb_output(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p) in scan_dpb_output() argument
1368 H264_FrameStore_t *fs = p_Dpb->fs[p_Dpb->used_size - 1]; in scan_dpb_output()
1371 H264dErrCtx_t *p_err = &p_Dpb->p_Vid->p_Dec->errctx; in scan_dpb_output()
1372 RK_U32 is_i_frm = p_err->i_slice_no < 2 && p_Dpb->last_output_poc == INT_MIN; in scan_dpb_output()
1374 if (p_Dpb->p_Vid->p_Dec->cfg->base.fast_out) in scan_dpb_output()
1375 FUN_CHECK(ret = write_stored_frame(p_Dpb->p_Vid, p_Dpb, fs)); in scan_dpb_output()
1377 switch (p_Dpb->p_Vid->p_Dec->cfg->base.enable_fast_play) { in scan_dpb_output()
1379 FUN_CHECK(ret = output_dpb_normal(p_Dpb)); in scan_dpb_output()
1382 FUN_CHECK(ret = output_dpb_fastplay(p_Dpb, fs, is_i_frm)); in scan_dpb_output()
1385 FUN_CHECK(ret = output_dpb_fastplay_once(p_Dpb, fs, is_i_frm)); in scan_dpb_output()
1431 MPP_RET store_picture_in_dpb(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p) in store_picture_in_dpb() argument
1434 H264dVideoCtx_t *p_Vid = p_Dpb->p_Vid; in store_picture_in_dpb()
1448 FUN_CHECK(ret = idr_memory_management(p_Dpb, p)); in store_picture_in_dpb()
1451 FUN_CHECK(ret = adaptive_memory_management(p_Dpb, p)); in store_picture_in_dpb()
1455 if (get_field_dpb_combine_flag(p_Dpb->last_picture, p)) { in store_picture_in_dpb()
1456 if (p_Dpb->last_picture->is_directout) { in store_picture_in_dpb()
1457 FUN_CHECK(ret = direct_output(p_Vid, p_Dpb, p)); //!< output frame in store_picture_in_dpb()
1459 … FUN_CHECK(ret = insert_picture_in_dpb(p_Vid, p_Dpb->last_picture, p, 1)); //!< field_dpb_combine in store_picture_in_dpb()
1460 scan_dpb_output(p_Dpb, p); in store_picture_in_dpb()
1464 p_Dpb->last_picture = NULL; in store_picture_in_dpb()
1470 sliding_window_memory_management(p_Dpb); in store_picture_in_dpb()
1473 while (!remove_unused_frame_from_dpb(p_Dpb)); in store_picture_in_dpb()
1475 p_Dpb->layer_id, p_Dpb->used_size, p_Dpb->size); in store_picture_in_dpb()
1480 while (p_Dpb->used_size >= p_Dpb->size || in store_picture_in_dpb()
1481 (max_buf_size && p_Dpb->used_size >= max_buf_size)) { in store_picture_in_dpb()
1485 remove_unused_frame_from_dpb(p_Dpb); in store_picture_in_dpb()
1486 find_flag = get_smallest_poc(p_Dpb, &min_poc, &min_pos); in store_picture_in_dpb()
1489 FUN_CHECK(ret = direct_output(p_Vid, p_Dpb, p)); //!< output frame in store_picture_in_dpb()
1496 unmark_for_reference(p_Vid->p_Dec, p_Dpb->fs[min_pos]); in store_picture_in_dpb()
1497 if (!p_Dpb->fs[min_pos]->is_output) { in store_picture_in_dpb()
1499 FUN_CHECK(ret = write_stored_frame(p_Vid, p_Dpb, p_Dpb->fs[min_pos])); in store_picture_in_dpb()
1501 FUN_CHECK(ret = remove_frame_from_dpb(p_Dpb, min_pos)); in store_picture_in_dpb()
1504 FUN_CHECK(ret = output_one_frame_from_dpb(p_Dpb)); in store_picture_in_dpb()
1508 p_Dpb->layer_id, p_Dpb->used_size, p_Dpb->size); in store_picture_in_dpb()
1510 FUN_CHECK(ret = insert_picture_in_dpb(p_Vid, p_Dpb->fs[p_Dpb->used_size], p, 0)); in store_picture_in_dpb()
1512 p_Dpb->last_picture = p_Dpb->fs[p_Dpb->used_size]; in store_picture_in_dpb()
1514 p_Dpb->last_picture = NULL; in store_picture_in_dpb()
1519 p_Dpb->used_size++; in store_picture_in_dpb()
1520 H264D_DBG(H264D_DBG_DPB_INFO, "[DPB_size] p_Dpb->used_size=%d", p_Dpb->used_size); in store_picture_in_dpb()
1522 scan_dpb_output(p_Dpb, p); in store_picture_in_dpb()
1523 update_ref_list(p_Dpb); in store_picture_in_dpb()
1524 update_ltref_list(p_Dpb); in store_picture_in_dpb()
1566 void free_dpb(H264_DpbBuf_t *p_Dpb) in free_dpb() argument
1569 H264dVideoCtx_t *p_Vid = p_Dpb->p_Vid; in free_dpb()
1571 if (p_Dpb->fs) { in free_dpb()
1572 for (i = 0; i < p_Dpb->allocated_size; i++) { in free_dpb()
1573 free_frame_store(p_Vid->p_Dec, p_Dpb->fs[i]); in free_dpb()
1574 p_Dpb->fs[i] = NULL; in free_dpb()
1576 MPP_FREE(p_Dpb->fs); in free_dpb()
1578 MPP_FREE(p_Dpb->fs_ref); in free_dpb()
1579 MPP_FREE(p_Dpb->fs_ltref); in free_dpb()
1580 if (p_Dpb->fs_ilref) { in free_dpb()
1582 free_frame_store(p_Vid->p_Dec, p_Dpb->fs_ilref[i]); in free_dpb()
1583 p_Dpb->fs_ilref[i] = NULL; in free_dpb()
1585 MPP_FREE(p_Dpb->fs_ilref); in free_dpb()
1587 p_Dpb->last_output_view_id = -1; in free_dpb()
1588 p_Dpb->last_output_poc = INT_MIN; in free_dpb()
1589 p_Dpb->init_done = 0; in free_dpb()
1603 void update_ref_list(H264_DpbBuf_t *p_Dpb) in update_ref_list() argument
1606 for (i = 0, j = 0; i < p_Dpb->used_size; i++) { in update_ref_list()
1607 if (is_short_term_reference(p_Dpb->fs[i])) { in update_ref_list()
1608 p_Dpb->fs_ref[j++] = p_Dpb->fs[i]; in update_ref_list()
1612 p_Dpb->ref_frames_in_buffer = j; in update_ref_list()
1614 while (j < p_Dpb->size) { in update_ref_list()
1615 p_Dpb->fs_ref[j++] = NULL; in update_ref_list()
1625 void update_ltref_list(H264_DpbBuf_t *p_Dpb) in update_ltref_list() argument
1628 for (i = 0, j = 0; i < p_Dpb->used_size; i++) { in update_ltref_list()
1629 if (is_long_term_reference(p_Dpb->fs[i])) { in update_ltref_list()
1630 p_Dpb->fs_ltref[j++] = p_Dpb->fs[i]; in update_ltref_list()
1634 p_Dpb->ltref_frames_in_buffer = j; in update_ltref_list()
1636 while (j < p_Dpb->size) { in update_ltref_list()
1637 p_Dpb->fs_ltref[j++] = NULL; in update_ltref_list()
1648 MPP_RET idr_memory_management(H264_DpbBuf_t *p_Dpb, H264_StorePic_t *p) in idr_memory_management() argument
1653 H264dErrCtx_t *p_err = &p_Dpb->p_Vid->p_Dec->errctx; in idr_memory_management()
1657 for (i = 0; i < p_Dpb->used_size; i++) { in idr_memory_management()
1662 p_Dpb->fs[i]->is_output = 1; in idr_memory_management()
1667 FUN_CHECK(ret = flush_dpb(p_Dpb, type)); in idr_memory_management()
1669 p_Dpb->last_picture = NULL; in idr_memory_management()
1671 update_ref_list(p_Dpb); in idr_memory_management()
1672 update_ltref_list(p_Dpb); in idr_memory_management()
1673 p_Dpb->last_output_poc = INT_MIN; in idr_memory_management()
1677 p_Dpb->max_long_term_pic_idx = 0; in idr_memory_management()
1681 p_Dpb->max_long_term_pic_idx = -1; in idr_memory_management()
1684 p_Dpb->last_output_view_id = -1; in idr_memory_management()
1689 for (i = 0; i < p_Dpb->used_size; i++) { // when error and free malloc buf in idr_memory_management()
1690 free_frame_store(p_Dpb->p_Vid->p_Dec, p_Dpb->fs[i]); in idr_memory_management()
1866 static MPP_RET enlarge_dpb(H264_DpbBuf_t *p_Dpb, RK_U32 size) in enlarge_dpb() argument
1872 if (!p_Dpb || !size || !p_Dpb->init_done) in enlarge_dpb()
1875 if (p_Dpb->size >= size) { in enlarge_dpb()
1881 memcpy(tmp, p_Dpb->fs, sizeof(H264_FrameStore_t*) * p_Dpb->size); in enlarge_dpb()
1882 mpp_free(p_Dpb->fs); in enlarge_dpb()
1883 p_Dpb->fs = tmp; in enlarge_dpb()
1886 memcpy(tmp, p_Dpb->fs_ref, sizeof(H264_FrameStore_t*) * p_Dpb->size); in enlarge_dpb()
1887 mpp_free(p_Dpb->fs_ref); in enlarge_dpb()
1888 p_Dpb->fs_ref = tmp; in enlarge_dpb()
1891 memcpy(tmp, p_Dpb->fs_ltref, sizeof(H264_FrameStore_t*) * p_Dpb->size); in enlarge_dpb()
1892 mpp_free(p_Dpb->fs_ltref); in enlarge_dpb()
1893 p_Dpb->fs_ltref = tmp; in enlarge_dpb()
1896 memcpy(tmp, p_Dpb->fs_ilref, sizeof(H264_FrameStore_t*) * p_Dpb->size); in enlarge_dpb()
1897 mpp_free(p_Dpb->fs_ilref); in enlarge_dpb()
1898 p_Dpb->fs_ilref = tmp; in enlarge_dpb()
1900 for (i = p_Dpb->size; i < size; i++) { in enlarge_dpb()
1901 p_Dpb->fs[i] = alloc_frame_store(); in enlarge_dpb()
1902 MEM_CHECK(ret, p_Dpb->fs[i]); in enlarge_dpb()
1903 p_Dpb->fs_ref[i] = NULL; in enlarge_dpb()
1904 p_Dpb->fs_ltref[i] = NULL; in enlarge_dpb()
1905 p_Dpb->fs[i]->layer_id = -1; in enlarge_dpb()
1906 p_Dpb->fs[i]->view_id = -1; in enlarge_dpb()
1907 p_Dpb->fs[i]->inter_view_flag[0] = p_Dpb->fs[i]->inter_view_flag[1] = 0; in enlarge_dpb()
1908 p_Dpb->fs[i]->anchor_pic_flag[0] = p_Dpb->fs[i]->anchor_pic_flag[1] = 0; in enlarge_dpb()
1911 p_Dpb->size = size; in enlarge_dpb()
1912 p_Dpb->allocated_size = size; in enlarge_dpb()
1956 MPP_RET init_dpb(H264dVideoCtx_t *p_Vid, H264_DpbBuf_t *p_Dpb, RK_S32 type) // type=1 AVC type=2 M… in init_dpb() argument
1967 p_Dpb->p_Vid = p_Vid; in init_dpb()
1968 if (p_Dpb->init_done) { in init_dpb()
1969 free_dpb(p_Dpb); in init_dpb()
1972 p_Dpb->size = MPP_MAX(1, dpb_size); in init_dpb()
1973 p_Dpb->allocated_size = p_Dpb->size; in init_dpb()
1974 p_Dpb->num_ref_frames = active_sps->max_num_ref_frames; in init_dpb()
1978 p_Dpb->used_size = 0; in init_dpb()
1979 p_Dpb->last_picture = NULL; in init_dpb()
1980 p_Dpb->ref_frames_in_buffer = 0; in init_dpb()
1981 p_Dpb->ltref_frames_in_buffer = 0; in init_dpb()
1983 p_Dpb->fs = mpp_calloc(H264_FrameStore_t*, p_Dpb->size); in init_dpb()
1984 p_Dpb->fs_ref = mpp_calloc(H264_FrameStore_t*, p_Dpb->size); in init_dpb()
1985 p_Dpb->fs_ltref = mpp_calloc(H264_FrameStore_t*, p_Dpb->size); in init_dpb()
1986 …p_Dpb->fs_ilref = mpp_calloc(H264_FrameStore_t*, 1); //!< inter-layer reference (for multi-layere… in init_dpb()
1987 MEM_CHECK(ret, p_Dpb->fs && p_Dpb->fs_ref && p_Dpb->fs_ltref && p_Dpb->fs_ilref); in init_dpb()
1988 for (i = 0; i < p_Dpb->size; i++) { in init_dpb()
1989 p_Dpb->fs[i] = alloc_frame_store(); in init_dpb()
1990 MEM_CHECK(ret, p_Dpb->fs[i]); in init_dpb()
1991 p_Dpb->fs_ref[i] = NULL; in init_dpb()
1992 p_Dpb->fs_ltref[i] = NULL; in init_dpb()
1993 p_Dpb->fs[i]->layer_id = -1; in init_dpb()
1994 p_Dpb->fs[i]->view_id = -1; in init_dpb()
1995 p_Dpb->fs[i]->inter_view_flag[0] = p_Dpb->fs[i]->inter_view_flag[1] = 0; in init_dpb()
1996 p_Dpb->fs[i]->anchor_pic_flag[0] = p_Dpb->fs[i]->anchor_pic_flag[1] = 0; in init_dpb()
1999 p_Dpb->fs_ilref[0] = alloc_frame_store(); in init_dpb()
2000 MEM_CHECK(ret, p_Dpb->fs_ilref[0]); in init_dpb()
2002 p_Dpb->fs_ilref[0]->view_id = -1; in init_dpb()
2003 p_Dpb->fs_ilref[0]->inter_view_flag[0] = p_Dpb->fs_ilref[0]->inter_view_flag[1] = 0; in init_dpb()
2004 p_Dpb->fs_ilref[0]->anchor_pic_flag[0] = p_Dpb->fs_ilref[0]->anchor_pic_flag[1] = 0; in init_dpb()
2007 p_Dpb->fs_ilref[0] = NULL; in init_dpb()
2017 p_Dpb->last_output_poc = INT_MIN; in init_dpb()
2018 p_Dpb->last_output_view_id = -1; in init_dpb()
2020 p_Dpb->init_done = 1; in init_dpb()
2033 MPP_RET flush_dpb(H264_DpbBuf_t *p_Dpb, RK_S32 type) in flush_dpb() argument
2038 INP_CHECK(ret, !p_Dpb); in flush_dpb()
2040 if (!p_Dpb->init_done) { in flush_dpb()
2044 p_Dpb->layer_id, p_Dpb->used_size); in flush_dpb()
2046 for (i = 0; i < p_Dpb->used_size; i++) { in flush_dpb()
2047 if (p_Dpb->fs[i] && p_Dpb->p_Vid) { in flush_dpb()
2048 VAL_CHECK(ret, p_Dpb->fs[i]->layer_id == p_Dpb->layer_id); in flush_dpb()
2049 unmark_for_reference(p_Dpb->p_Vid->p_Dec, p_Dpb->fs[i]); in flush_dpb()
2052 while (!remove_unused_frame_from_dpb(p_Dpb)); in flush_dpb()
2054 while (p_Dpb->used_size) { in flush_dpb()
2055 FUN_CHECK(ret = output_one_frame_from_dpb(p_Dpb)); in flush_dpb()
2057 p_Dpb->last_output_poc = INT_MIN; in flush_dpb()
2071 MPP_RET output_dpb(H264_DecCtx_t *p_Dec, H264_DpbBuf_t *p_Dpb) in output_dpb() argument
2075 while (!remove_unused_frame_from_dpb(p_Dpb)); in output_dpb()