| 933 | } |
| 934 | |
| 935 | static int parse_feedback_units(AVCodecContext *avctx, |
| 936 | const uint8_t *data, size_t size) |
| 937 | { |
| 938 | int err; |
| 939 | VulkanEncodeAV1Context *enc = avctx->priv_data; |
| 940 | AV1RawOBU *seq_obu = &enc->seq_hdr_obu; |
| 941 | AV1RawSequenceHeader *seq = &seq_obu->obu.sequence_header; |
| 942 | |
| 943 | CodedBitstreamContext *cbs; |
| 944 | CodedBitstreamFragment obu = { 0 }; |
| 945 | |
| 946 | err = ff_cbs_init(&cbs, AV_CODEC_ID_AV1, avctx); |
| 947 | if (err < 0) |
| 948 | return err; |
| 949 | |
| 950 | err = ff_cbs_read(cbs, &obu, NULL, data, size); |
| 951 | if (err < 0) { |
| 952 | av_log(avctx, AV_LOG_ERROR, "Unable to parse feedback units, bad drivers: %s\n", |
| 953 | av_err2str(err)); |
| 954 | return err; |
| 955 | } |
| 956 | |
| 957 | /* If PPS has an override, just copy it entirely. */ |
| 958 | for (int i = 0; i < obu.nb_units; i++) { |
| 959 | if (obu.units[i].type == AV1_OBU_SEQUENCE_HEADER) { |
| 960 | AV1RawOBU *f_seq_obu = obu.units[i].content; |
| 961 | AV1RawSequenceHeader *f_seq = &f_seq_obu->obu.sequence_header; |
| 962 | seq->frame_width_bits_minus_1 = f_seq->frame_width_bits_minus_1; |
| 963 | seq->frame_height_bits_minus_1 = f_seq->frame_height_bits_minus_1; |
| 964 | seq->max_frame_width_minus_1 = f_seq->max_frame_width_minus_1; |
| 965 | seq->max_frame_height_minus_1 = f_seq->max_frame_height_minus_1; |
| 966 | seq->seq_choose_screen_content_tools = f_seq->seq_choose_screen_content_tools; |
| 967 | seq->seq_force_screen_content_tools = f_seq->seq_force_screen_content_tools; |
| 968 | seq->seq_choose_integer_mv = f_seq->seq_choose_integer_mv; |
| 969 | seq->seq_force_integer_mv = f_seq->seq_force_integer_mv; |
| 970 | } |
| 971 | } |
| 972 | |
| 973 | ff_cbs_fragment_free(&obu); |
| 974 | ff_cbs_close(&cbs); |
| 975 | |
| 976 | return 0; |
| 977 | } |
| 978 | |
| 979 | static int init_base_units(AVCodecContext *avctx) |
| 980 | { |
no test coverage detected