diff options
author | James Almer <jamrial@gmail.com> | 2020-04-22 12:09:47 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2020-05-03 11:40:39 -0300 |
commit | 1a9684c08a631b600353e946d67188a715243abe (patch) | |
tree | 784ee4a560f53ac7b7ba7c01d5b5d758e8995f0b | |
parent | 502dacdc50e204947f7a32bf5c31bc4fbcba80d6 (diff) | |
download | ffmpeg-1a9684c08a631b600353e946d67188a715243abe.tar.gz |
avcodec/h265_metadata: filter parameter sets in packet side data
Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | libavcodec/h265_metadata_bsf.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/libavcodec/h265_metadata_bsf.c b/libavcodec/h265_metadata_bsf.c index 730f7ac28f..0fe350e053 100644 --- a/libavcodec/h265_metadata_bsf.c +++ b/libavcodec/h265_metadata_bsf.c @@ -336,6 +336,57 @@ static int h265_metadata_update_sps(AVBSFContext *bsf, return 0; } +static int h265_metadata_update_side_data(AVBSFContext *bsf, AVPacket *pkt) +{ + H265MetadataContext *ctx = bsf->priv_data; + CodedBitstreamFragment *au = &ctx->access_unit; + uint8_t *side_data; + int side_data_size; + int err, i; + + side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, + &side_data_size); + if (!side_data_size) + return 0; + + err = ff_cbs_read(ctx->cbc, au, side_data, side_data_size); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to read extradata from packet side data.\n"); + return err; + } + + if (ctx->level == LEVEL_AUTO && !ctx->level_guess) + h265_metadata_guess_level(bsf, au); + + for (i = 0; i < au->nb_units; i++) { + if (au->units[i].type == HEVC_NAL_VPS) { + err = h265_metadata_update_vps(bsf, au->units[i].content); + if (err < 0) + return err; + } + if (au->units[i].type == HEVC_NAL_SPS) { + err = h265_metadata_update_sps(bsf, au->units[i].content); + if (err < 0) + return err; + } + } + + err = ff_cbs_write_fragment_data(ctx->cbc, au); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to write extradata into packet side data.\n"); + return err; + } + + side_data = av_packet_new_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, au->data_size); + if (!side_data) + return AVERROR(ENOMEM); + memcpy(side_data, au->data, au->data_size); + + ff_cbs_fragment_reset(ctx->cbc, au); + + return 0; +} + static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *pkt) { H265MetadataContext *ctx = bsf->priv_data; @@ -346,6 +397,10 @@ static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *pkt) if (err < 0) return err; + err = h265_metadata_update_side_data(bsf, pkt); + if (err < 0) + goto fail; + err = ff_cbs_read_packet(ctx->cbc, au, pkt); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n"); |