From: Benjamin Cheng via ffmpeg-devel <ffmpeg-devel@ffmpeg.org> To: ffmpeg-devel@ffmpeg.org Cc: Benjamin Cheng <ben@bcheng.me> Subject: [FFmpeg-devel] [PATCH] vulkan_hevc: handle non-contiguous SPS/PPS/VPS ids Date: Sat, 30 Sep 2023 12:42:30 -0400 Message-ID: <20230930164230.48519-1-ben@bcheng.me> (raw) Some clips (i.e. SLIST_B_Sony_9) will use PPS 0 and 8, before PPS 1-7. vulkan_hevc expects {sps,pps,vps}_list to be filled in order, which causes PPS 8 to not be added to the Vulkan session params when it is being used by a picture. This removes the expectation that these lists are filled in order. The indicies into vps_list are saved since there are multiple usages of it. This also fixes a bug with some clips (i.e. PPS_A_qualcomm_7) which use all 64 available PPS slots, causing the old loop to think there are more than 64 PPS-es. --- libavcodec/vulkan_hevc.c | 47 +++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/libavcodec/vulkan_hevc.c b/libavcodec/vulkan_hevc.c index 52f223ceb2..a8265acf32 100644 --- a/libavcodec/vulkan_hevc.c +++ b/libavcodec/vulkan_hevc.c @@ -70,6 +70,7 @@ typedef struct HEVCHeaderSet { static int alloc_hevc_header_structs(FFVulkanDecodeContext *s, int nb_vps, + const int vps_list_idx[HEVC_MAX_VPS_COUNT], AVBufferRef * const vps_list[HEVC_MAX_VPS_COUNT]) { uint8_t *data_ptr; @@ -77,7 +78,7 @@ static int alloc_hevc_header_structs(FFVulkanDecodeContext *s, size_t buf_size = sizeof(HEVCHeaderSet) + nb_vps*sizeof(HEVCHeaderVPS); for (int i = 0; i < nb_vps; i++) { - const HEVCVPS *vps = (const HEVCVPS *)vps_list[i]->data; + const HEVCVPS *vps = (const HEVCVPS *)vps_list[vps_list_idx[i]]->data; buf_size += sizeof(HEVCHeaderVPSSet)*vps->vps_num_hrd_parameters; } @@ -96,7 +97,7 @@ static int alloc_hevc_header_structs(FFVulkanDecodeContext *s, hdr->hvps = (HEVCHeaderVPS *)(data_ptr + sizeof(HEVCHeaderSet)); data_ptr += sizeof(HEVCHeaderSet) + nb_vps*sizeof(HEVCHeaderVPS); for (int i = 0; i < nb_vps; i++) { - const HEVCVPS *vps = (const HEVCVPS *)vps_list[i]->data; + const HEVCVPS *vps = (const HEVCVPS *)vps_list[vps_list_idx[i]]->data; hdr->hvps[i].sls = (HEVCHeaderVPSSet *)data_ptr; data_ptr += sizeof(HEVCHeaderVPSSet)*vps->vps_num_hrd_parameters; } @@ -655,13 +656,15 @@ static int vk_hevc_create_params(AVCodecContext *avctx, AVBufferRef **buf) .videoSessionParametersTemplate = NULL, }; - int nb_vps = 0; HEVCHeaderSet *hdr; + int nb_vps = 0; + int vps_list_idx[HEVC_MAX_VPS_COUNT]; - for (int i = 0; h->ps.vps_list[i]; i++) - nb_vps++; + for (int i = 0; i < HEVC_MAX_VPS_COUNT; i++) + if (h->ps.vps_list[i]) + vps_list_idx[nb_vps++] = i; - err = alloc_hevc_header_structs(dec, nb_vps, h->ps.vps_list); + err = alloc_hevc_header_structs(dec, nb_vps, vps_list_idx, h->ps.vps_list); if (err < 0) return err; @@ -672,29 +675,33 @@ static int vk_hevc_create_params(AVCodecContext *avctx, AVBufferRef **buf) h265_params_info.pStdVPSs = hdr->vps; /* SPS list */ - for (int i = 0; h->ps.sps_list[i]; i++) { - const HEVCSPS *sps_l = (const HEVCSPS *)h->ps.sps_list[i]->data; - set_sps(sps_l, i, &hdr->hsps[i].scaling, &hdr->hsps[i].vui_header, - &hdr->hsps[i].vui, &hdr->sps[i], hdr->hsps[i].nal_hdr, - hdr->hsps[i].vcl_hdr, &hdr->hsps[i].ptl, &hdr->hsps[i].dpbm, - &hdr->hsps[i].pal, hdr->hsps[i].str, &hdr->hsps[i].ltr); - h265_params_info.stdSPSCount++; + for (int i = 0; i < HEVC_MAX_SPS_COUNT; i++) { + if (h->ps.sps_list[i]) { + const HEVCSPS *sps_l = (const HEVCSPS *)h->ps.sps_list[i]->data; + int idx = h265_params_info.stdSPSCount++; + set_sps(sps_l, i, &hdr->hsps[idx].scaling, &hdr->hsps[idx].vui_header, + &hdr->hsps[idx].vui, &hdr->sps[idx], hdr->hsps[idx].nal_hdr, + hdr->hsps[idx].vcl_hdr, &hdr->hsps[idx].ptl, &hdr->hsps[idx].dpbm, + &hdr->hsps[idx].pal, hdr->hsps[idx].str, &hdr->hsps[idx].ltr); + } } /* PPS list */ - for (int i = 0; h->ps.pps_list[i]; i++) { - const HEVCPPS *pps_l = (const HEVCPPS *)h->ps.pps_list[i]->data; - const HEVCSPS *sps_l = (const HEVCSPS *)h->ps.sps_list[pps_l->sps_id]->data; - set_pps(pps_l, sps_l, &hdr->hpps[i].scaling, &hdr->pps[i], &hdr->hpps[i].pal); - h265_params_info.stdPPSCount++; + for (int i = 0; i < HEVC_MAX_PPS_COUNT; i++) { + if (h->ps.pps_list[i]) { + const HEVCPPS *pps_l = (const HEVCPPS *)h->ps.pps_list[i]->data; + const HEVCSPS *sps_l = (const HEVCSPS *)h->ps.sps_list[pps_l->sps_id]->data; + int idx = h265_params_info.stdPPSCount++; + set_pps(pps_l, sps_l, &hdr->hpps[idx].scaling, + &hdr->pps[idx], &hdr->hpps[idx].pal); + } } /* VPS list */ for (int i = 0; i < nb_vps; i++) { - const HEVCVPS *vps_l = (const HEVCVPS *)h->ps.vps_list[i]->data; + const HEVCVPS *vps_l = (const HEVCVPS *)h->ps.vps_list[vps_list_idx[i]]->data; set_vps(vps_l, &hdr->vps[i], &hdr->hvps[i].ptl, &hdr->hvps[i].dpbm, hdr->hvps[i].hdr, hdr->hvps[i].sls); - h265_params_info.stdVPSCount++; } h265_params.maxStdSPSCount = h265_params_info.stdSPSCount; -- 2.42.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
reply other threads:[~2023-09-30 16:42 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20230930164230.48519-1-ben@bcheng.me \ --to=ffmpeg-devel@ffmpeg.org \ --cc=ben@bcheng.me \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git