| 660 | } |
| 661 | |
| 662 | int ff_hw_base_init_gop_structure(FFHWBaseEncodeContext *ctx, AVCodecContext *avctx, |
| 663 | uint32_t ref_l0, uint32_t ref_l1, |
| 664 | int flags, int prediction_pre_only) |
| 665 | { |
| 666 | ctx->ref_l0 = FFMIN(ref_l0, MAX_PICTURE_REFERENCES); |
| 667 | ctx->ref_l1 = FFMIN(ref_l1, MAX_PICTURE_REFERENCES); |
| 668 | |
| 669 | if (avctx->refs > 0) { |
| 670 | ctx->ref_l0 = FFMIN(ctx->ref_l0, avctx->refs); |
| 671 | ctx->ref_l1 = FFMIN(ctx->ref_l1, avctx->refs); |
| 672 | } |
| 673 | |
| 674 | if (flags & FF_HW_FLAG_INTRA_ONLY || avctx->gop_size <= 1) { |
| 675 | av_log(avctx, AV_LOG_VERBOSE, "Using intra frames only.\n"); |
| 676 | ctx->gop_size = 1; |
| 677 | } else if (ref_l0 < 1) { |
| 678 | av_log(avctx, AV_LOG_ERROR, "Driver does not support any " |
| 679 | "reference frames.\n"); |
| 680 | return AVERROR(EINVAL); |
| 681 | } else if (!(flags & FF_HW_FLAG_B_PICTURES) || ref_l1 < 1 || |
| 682 | avctx->max_b_frames < 1 || prediction_pre_only) { |
| 683 | if (ctx->p_to_gpb) |
| 684 | av_log(avctx, AV_LOG_VERBOSE, "Using intra and B-frames " |
| 685 | "(supported references: %d / %d).\n", |
| 686 | ref_l0, ref_l1); |
| 687 | else |
| 688 | av_log(avctx, AV_LOG_VERBOSE, "Using intra and P-frames " |
| 689 | "(supported references: %d / %d).\n", ref_l0, ref_l1); |
| 690 | ctx->gop_size = avctx->gop_size; |
| 691 | ctx->p_per_i = INT_MAX; |
| 692 | ctx->b_per_p = 0; |
| 693 | } else { |
| 694 | if (ctx->p_to_gpb) |
| 695 | av_log(avctx, AV_LOG_VERBOSE, "Using intra and B-frames " |
| 696 | "(supported references: %d / %d).\n", |
| 697 | ref_l0, ref_l1); |
| 698 | else |
| 699 | av_log(avctx, AV_LOG_VERBOSE, "Using intra, P- and B-frames " |
| 700 | "(supported references: %d / %d).\n", ref_l0, ref_l1); |
| 701 | ctx->gop_size = avctx->gop_size; |
| 702 | ctx->p_per_i = INT_MAX; |
| 703 | ctx->b_per_p = avctx->max_b_frames; |
| 704 | if (flags & FF_HW_FLAG_B_PICTURE_REFERENCES) { |
| 705 | ctx->max_b_depth = FFMIN(ctx->desired_b_depth, |
| 706 | av_log2(ctx->b_per_p) + 1); |
| 707 | } else { |
| 708 | ctx->max_b_depth = 1; |
| 709 | } |
| 710 | } |
| 711 | |
| 712 | if (flags & FF_HW_FLAG_NON_IDR_KEY_PICTURES) { |
| 713 | ctx->closed_gop = !!(avctx->flags & AV_CODEC_FLAG_CLOSED_GOP); |
| 714 | ctx->gop_per_idr = ctx->idr_interval + 1; |
| 715 | } else { |
| 716 | ctx->closed_gop = 1; |
| 717 | ctx->gop_per_idr = 1; |
| 718 | } |
| 719 |
no test coverage detected