| 1048 | } |
| 1049 | |
| 1050 | static int parse_feedback_units(AVCodecContext *avctx, |
| 1051 | const uint8_t *data, size_t size, |
| 1052 | int sps_override, int pps_override) |
| 1053 | { |
| 1054 | int err; |
| 1055 | VulkanEncodeH264Context *enc = avctx->priv_data; |
| 1056 | |
| 1057 | CodedBitstreamContext *cbs; |
| 1058 | CodedBitstreamFragment au = { 0 }; |
| 1059 | |
| 1060 | err = ff_cbs_init(&cbs, AV_CODEC_ID_H264, avctx); |
| 1061 | if (err < 0) |
| 1062 | return err; |
| 1063 | |
| 1064 | err = ff_cbs_read(cbs, &au, NULL, data, size); |
| 1065 | if (err < 0) { |
| 1066 | av_log(avctx, AV_LOG_ERROR, "Unable to parse feedback units, bad drivers: %s\n", |
| 1067 | av_err2str(err)); |
| 1068 | goto fail; |
| 1069 | } |
| 1070 | |
| 1071 | /* If PPS has an override, just copy it entirely. */ |
| 1072 | if (pps_override) { |
| 1073 | for (int i = 0; i < au.nb_units; i++) { |
| 1074 | if (au.units[i].type == H264_NAL_PPS) { |
| 1075 | H264RawPPS *pps = au.units[i].content; |
| 1076 | memcpy(&enc->units.raw_pps, pps, sizeof(*pps)); |
| 1077 | break; |
| 1078 | } |
| 1079 | } |
| 1080 | } |
| 1081 | |
| 1082 | err = 0; |
| 1083 | fail: |
| 1084 | ff_cbs_fragment_free(&au); |
| 1085 | ff_cbs_close(&cbs); |
| 1086 | |
| 1087 | return err; |
| 1088 | } |
| 1089 | |
| 1090 | static int init_base_units(AVCodecContext *avctx) |
| 1091 | { |
no test coverage detected