From: Nuo Mi <nuomi2021@gmail.com> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Subject: Re: [FFmpeg-devel] [PATCH v2 1/2] avcodec/cbs_h2645: fix parsing and storing Picture Header references in the context Date: Sun, 2 Jul 2023 09:06:42 +0800 Message-ID: <CAFXK13eKvPOMUXjCpi06kC-BFbZ=RbuZhz+iqg+OLoXkagzzvA@mail.gmail.com> (raw) In-Reply-To: <e8e21566-2a0c-1cc4-242e-67ade1f04680@gmail.com> On Sun, Jul 2, 2023 at 7:32 AM James Almer <jamrial@gmail.com> wrote: > On 7/1/2023 8:51 AM, Nuo Mi wrote: > > On Fri, Jun 30, 2023 at 6:45 AM James Almer<jamrial@gmail.com> wrote: > > > >> Signed-off-by: James Almer<jamrial@gmail.com> > >> --- > >> libavcodec/cbs_h2645.c | 35 ++++++++++++++++----------- > >> libavcodec/cbs_h266.h | 17 +++++++------ > >> libavcodec/cbs_h266_syntax_template.c | 17 ++++++------- > >> libavcodec/h266_metadata_bsf.c | 13 +++++----- > >> libavcodec/vvc_parser.c | 10 ++++---- > >> 5 files changed, 50 insertions(+), 42 deletions(-) > >> > >> diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c > >> index cdd7901518..68ccf6a7eb 100644 > >> --- a/libavcodec/cbs_h2645.c > >> +++ b/libavcodec/cbs_h2645.c > >> @@ -525,12 +525,6 @@ static int > >> cbs_h2645_split_fragment(CodedBitstreamContext *ctx, > >> if (frag->data_size == 0) > >> return 0; > >> > >> - if (codec_id == AV_CODEC_ID_VVC) { > >> - //we deactive picture header here to avoid reuse previous au's > ph. > >> - CodedBitstreamH266Context *h266 = ctx->priv_data; > >> - h266->priv.ph = NULL; > >> - } > >> - > >> if (header && frag->data[0] && codec_id == AV_CODEC_ID_H264) { > >> // AVCC header. > >> size_t size, start, end; > >> @@ -793,19 +787,20 @@ cbs_h266_replace_ps(6, SPS, sps, > >> sps_seq_parameter_set_id) > >> cbs_h266_replace_ps(6, PPS, pps, pps_pic_parameter_set_id) > >> > >> static int cbs_h266_replace_ph(CodedBitstreamContext *ctx, > >> - CodedBitstreamUnit *unit) > >> + CodedBitstreamUnit *unit, > >> + H266RawPictureHeader *ph) > >> { > >> CodedBitstreamH266Context *h266 = ctx->priv_data; > >> int err; > >> > >> - h266->priv.ph = NULL; > >> err = ff_cbs_make_unit_refcounted(ctx, unit); > >> if (err < 0) > >> return err; > >> - err = av_buffer_replace(&h266->priv.ph_ref, unit->content_ref); > >> + av_assert0(unit->content_ref); > >> + err = av_buffer_replace(&h266->ph_ref, unit->content_ref); > >> if (err < 0) > >> return err; > >> - h266->priv.ph = (H266RawPH*)h266->priv.ph_ref->data; > >> + h266->ph = ph; > >> return 0; > >> } > >> > >> @@ -1111,7 +1106,7 @@ static int > >> cbs_h266_read_nal_unit(CodedBitstreamContext *ctx, > >> err = cbs_h266_read_ph(ctx, &gbc, ph); > >> if (err < 0) > >> return err; > >> - err = cbs_h266_replace_ph(ctx, unit); > >> + err = cbs_h266_replace_ph(ctx, unit, > &ph->ph_picture_header); > >> if (err < 0) > >> return err; > >> } > >> @@ -1139,6 +1134,12 @@ static int > >> cbs_h266_read_nal_unit(CodedBitstreamContext *ctx, > >> pos = get_bits_count(&gbc); > >> len = unit->data_size; > >> > >> + if (slice->header.sh_picture_header_in_slice_header_flag) { > >> + err = cbs_h266_replace_ph(ctx, unit, > >> &slice->header.sh_picture_header); > >> + if (err < 0) > >> + return err; > >> + } > >> + > >> slice->data_size = len - pos / 8; > >> slice->data_ref = av_buffer_ref(unit->data_ref); > >> if (!slice->data_ref) > >> @@ -1640,7 +1641,7 @@ static int > >> cbs_h266_write_nal_unit(CodedBitstreamContext *ctx, > >> if (err < 0) > >> return err; > >> > >> - err = cbs_h266_replace_ph(ctx, unit); > >> + err = cbs_h266_replace_ph(ctx, unit, > &ph->ph_picture_header); > >> if (err < 0) > >> return err; > >> } > >> @@ -1661,6 +1662,12 @@ static int > >> cbs_h266_write_nal_unit(CodedBitstreamContext *ctx, > >> if (err < 0) > >> return err; > >> > >> + if (slice->header.sh_picture_header_in_slice_header_flag) { > >> + err = cbs_h266_replace_ph(ctx, unit, > >> &slice->header.sh_picture_header); > >> + if (err < 0) > >> + return err; > >> + } > >> + > >> if (slice->data) { > >> err = cbs_h2645_write_slice_data(ctx, pbc, > slice->data, > >> slice->data_size, > >> @@ -1884,8 +1891,8 @@ static void cbs_h266_flush(CodedBitstreamContext > >> *ctx) > >> av_buffer_unref(&h266->pps_ref[i]); > >> h266->pps[i] = NULL; > >> } > >> - av_buffer_unref(&h266->priv.ph_ref); > >> - h266->priv.ph = NULL; > >> + av_buffer_unref(&h266->ph_ref); > >> + h266->ph = NULL; > >> } > >> > >> static void cbs_h266_close(CodedBitstreamContext *ctx) > >> diff --git a/libavcodec/cbs_h266.h b/libavcodec/cbs_h266.h > >> index 03dfd4a954..54590748c3 100644 > >> --- a/libavcodec/cbs_h266.h > >> +++ b/libavcodec/cbs_h266.h > >> @@ -581,8 +581,7 @@ typedef struct H266RawPredWeightTable { > >> int16_t delta_chroma_offset_l1[15][2]; > >> } H266RawPredWeightTable; > >> > >> -typedef struct H266RawPH { > >> - H266RawNALUnitHeader nal_unit_header; > >> +typedef struct H266RawPictureHeader { > >> uint8_t ph_gdr_or_irap_pic_flag; > >> uint8_t ph_non_ref_pic_flag; > >> uint8_t ph_gdr_pic_flag; > >> @@ -670,12 +669,17 @@ typedef struct H266RawPH { > >> > >> uint8_t ph_extension_length; > >> uint8_t ph_extension_data_byte[256]; > >> +} H266RawPictureHeader; > >> + > >> +typedef struct H266RawPH { > >> + H266RawNALUnitHeader nal_unit_header; > >> + H266RawPictureHeader ph_picture_header; > >> } H266RawPH; > >> > >> typedef struct H266RawSliceHeader { > >> H266RawNALUnitHeader nal_unit_header; > >> uint8_t sh_picture_header_in_slice_header_flag; > >> - H266RawPH sh_picture_header; > >> + H266RawPictureHeader sh_picture_header; > >> > >> uint16_t sh_subpic_id; > >> uint16_t sh_slice_address; > >> @@ -770,14 +774,11 @@ typedef struct CodedBitstreamH266Context { > >> AVBufferRef *vps_ref[VVC_MAX_VPS_COUNT]; > >> AVBufferRef *sps_ref[VVC_MAX_SPS_COUNT]; > >> AVBufferRef *pps_ref[VVC_MAX_PPS_COUNT]; > >> + AVBufferRef *ph_ref; > >> H266RawVPS *vps[VVC_MAX_SPS_COUNT]; > >> H266RawSPS *sps[VVC_MAX_SPS_COUNT]; > >> H266RawPPS *pps[VVC_MAX_PPS_COUNT]; > >> - > >> - struct { > >> - AVBufferRef *ph_ref; > >> - H266RawPH *ph; > >> - } priv; > >> + H266RawPictureHeader *ph; > >> } CodedBitstreamH266Context; > >> > >> #endif /* AVCODEC_CBS_H266_H */ > >> diff --git a/libavcodec/cbs_h266_syntax_template.c > >> b/libavcodec/cbs_h266_syntax_template.c > >> index 06f9f29e08..6d826eba49 100644 > >> --- a/libavcodec/cbs_h266_syntax_template.c > >> +++ b/libavcodec/cbs_h266_syntax_template.c > >> @@ -2231,8 +2231,8 @@ static int FUNC(pred_weight_table) > >> (CodedBitstreamContext *ctx, RWContext *rw, > >> return 0; > >> } > >> > >> -static int FUNC(picture_header) (CodedBitstreamContext *ctx, RWContext > >> *rw, > >> - H266RawPH *current){ > >> +static int FUNC(picture_header_structure)(CodedBitstreamContext *ctx, > >> RWContext *rw, > >> + H266RawPictureHeader > *current) { > >> CodedBitstreamH266Context *h266 = ctx->priv_data; > >> const H266RawVPS *vps; > >> const H266RawSPS *sps; > >> @@ -2651,7 +2651,7 @@ static int FUNC(ph) (CodedBitstreamContext *ctx, > >> RWContext *rw, > >> HEADER("Picture Header"); > >> > >> CHECK(FUNC(nal_unit_header) (ctx, rw, ¤t->nal_unit_header, > >> VVC_PH_NUT)); > >> - CHECK(FUNC(picture_header) (ctx, rw, current)); > >> + CHECK(FUNC(picture_header_structure) (ctx, rw, > >> ¤t->ph_picture_header)); > >> CHECK(FUNC(rbsp_trailing_bits) (ctx, rw)); > >> return 0; > >> } > >> @@ -2662,7 +2662,7 @@ static int FUNC(slice_header) > (CodedBitstreamContext > >> *ctx, RWContext *rw, > >> CodedBitstreamH266Context *h266 = ctx->priv_data; > >> const H266RawSPS *sps; > >> const H266RawPPS *pps; > >> - const H266RawPH *ph; > >> + const H266RawPictureHeader *ph; > >> const H266RefPicLists *ref_pic_lists; > >> int err, i; > >> uint8_t nal_unit_type, qp_bd_offset; > >> @@ -2675,12 +2675,11 @@ static int FUNC(slice_header) > >> (CodedBitstreamContext *ctx, RWContext *rw, > >> > >> flag(sh_picture_header_in_slice_header_flag); > >> if (current->sh_picture_header_in_slice_header_flag) { > >> - CHECK(FUNC(picture_header) (ctx, rw, > >> ¤t->sh_picture_header)); > >> + //7.4.8 if sh_picture_header_in_slice_header_flag is true, we > do > >> not have a PH NAL unit > >> + CHECK(FUNC(picture_header_structure) (ctx, rw, > >> ¤t->sh_picture_header)); > >> ph = ¤t->sh_picture_header; > >> - //7.4.8 if sh_picture_header_in_slice_header_flag is true, we > do > >> not have PH NAL unit > >> - h266->priv.ph = NULL; > >> } else { > >> - ph = h266->priv.ph; > >> + ph = h266->ph; > >> > > Based on the following items in the spec, all slices will have the same > > picture header. Maybe we can remove sh_picture_header and just keep > > h266->ph. > > > > 1. The PH syntax structure contains information that is common for all > > slices of the current picture. > > 2. It is a requirement of bitstream conformance that the value of > > sh_picture_header_in_slice_header_flag shall be the same in all coded > > slices in a CLVS. > > 3. When sh_picture_header_in_slice_header_flag is equal to 1 for a coded > > slice, it is a requirement of bitstream conformance that no NAL unit with > > nal_unit_type equal to PH_NUT shall be present in the CLVS. > > CodedBitstreamH266Context holds the state of an hypothetical decoder > after the last unit fed to CBS was parsed. If you were to feed it two > PUs in a row, h266->ph will be a pointer to the H266RawPictureHeader > relevant to the second PU (Either picture_header from the last PH NALU, > or picture_header from the last Slice NALU). > > We can't store values read from the bitstream there, since if they are > overwritten, then they will be unavailable to callers. It's only meant > to store pointers and references to values and structs stored in units > within the fragment, or derived values. > All slices in one picture will have the same picture header content. if sh_picture_header_in_slice_header_flag == 0, we only have one PH NAL. so we will not overwrite. if sh_picture_header_in_slice_header_flag == 1, we only need to parse the PH in the first slice, then use memcpy to do a sanity check for later slices. BTW, do we need constify the raw vps, sps, pps and ph in CodedBitstreamH266Context _______________________________________________ > 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". > _______________________________________________ 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".
next prev parent reply other threads:[~2023-07-02 1:07 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-06-29 22:45 James Almer 2023-06-29 22:45 ` [FFmpeg-devel] [PATCH v3 2/2] fate/cbs: add VVC tests James Almer 2023-07-01 11:51 ` [FFmpeg-devel] [PATCH v2 1/2] avcodec/cbs_h2645: fix parsing and storing Picture Header references in the context Nuo Mi 2023-07-01 23:32 ` James Almer 2023-07-02 1:06 ` Nuo Mi [this message] 2023-07-02 13:01 ` James Almer
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='CAFXK13eKvPOMUXjCpi06kC-BFbZ=RbuZhz+iqg+OLoXkagzzvA@mail.gmail.com' \ --to=nuomi2021@gmail.com \ --cc=ffmpeg-devel@ffmpeg.org \ /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