static int filter_units_filter(AVBSFContext *bsf, AVPacket *out) { FilterUnitsContext *ctx = bsf->priv_data; CodedBitstreamFragment *frag = &ctx->fragment; AVPacket *in = NULL; int err, i, j; while (1) { err = ff_bsf_get_packet(bsf, &in); if (err < 0) return err; if (ctx->mode == NOOP) { av_packet_move_ref(out, in); av_packet_free(&in); return 0; } err = ff_cbs_read_packet(ctx->cbc, frag, in); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n"); goto fail; } for (i = 0; i < frag->nb_units; i++) { for (j = 0; j < ctx->nb_types; j++) { if (frag->units[i].type == ctx->type_list[j]) break; } if (ctx->mode == REMOVE ? j < ctx->nb_types : j >= ctx->nb_types) { ff_cbs_delete_unit(ctx->cbc, frag, i); --i; } } if (frag->nb_units > 0) break; // Don't return packets with nothing in them. av_packet_free(&in); ff_cbs_fragment_uninit(ctx->cbc, frag); } err = ff_cbs_write_packet(ctx->cbc, out, frag); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n"); goto fail; } err = av_packet_copy_props(out, in); if (err < 0) goto fail; fail: ff_cbs_fragment_uninit(ctx->cbc, frag); av_packet_free(&in); return err; }
static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *out) { H264RedundantPPSContext *ctx = bsf->priv_data; AVPacket *in; CodedBitstreamFragment *au = &ctx->access_unit; int au_has_sps; int err, i; err = ff_bsf_get_packet(bsf, &in); if (err < 0) return err; err = ff_cbs_read_packet(ctx->input, au, in); if (err < 0) goto fail; au_has_sps = 0; for (i = 0; i < au->nb_units; i++) { CodedBitstreamUnit *nal = &au->units[i]; if (nal->type == H264_NAL_SPS) au_has_sps = 1; if (nal->type == H264_NAL_PPS) { err = h264_redundant_pps_fixup_pps(ctx, nal->content); if (err < 0) goto fail; if (!au_has_sps) { av_log(bsf, AV_LOG_VERBOSE, "Deleting redundant PPS " "at %"PRId64".\n", in->pts); err = ff_cbs_delete_unit(ctx->input, au, i); if (err < 0) goto fail; } } if (nal->type == H264_NAL_SLICE || nal->type == H264_NAL_IDR_SLICE) { H264RawSlice *slice = nal->content; h264_redundant_pps_fixup_slice(ctx, &slice->header); } } err = ff_cbs_write_packet(ctx->output, out, au); if (err < 0) goto fail; err = av_packet_copy_props(out, in); if (err < 0) goto fail; err = 0; fail: ff_cbs_fragment_uninit(ctx->output, au); av_packet_free(&in); if (err < 0) av_packet_unref(out); return err; }
static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *out) { H265MetadataContext *ctx = bsf->priv_data; AVPacket *in = NULL; CodedBitstreamFragment *au = &ctx->access_unit; int err, i; err = ff_bsf_get_packet(bsf, &in); if (err < 0) goto fail; err = ff_cbs_read_packet(ctx->cbc, au, in); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to read packet.\n"); goto fail; } if (au->nb_units == 0) { av_log(bsf, AV_LOG_ERROR, "No NAL units in packet.\n"); err = AVERROR_INVALIDDATA; goto fail; } // If an AUD is present, it must be the first NAL unit. if (au->units[0].type == HEVC_NAL_AUD) { if (ctx->aud == REMOVE) ff_cbs_delete_unit(ctx->cbc, au, 0); } else { if (ctx->aud == INSERT) { H265RawAUD *aud = &ctx->aud_nal; int pic_type = 0, temporal_id = 8, layer_id = 0; for (i = 0; i < au->nb_units; i++) { const H265RawNALUnitHeader *nal = au->units[i].content; if (!nal) continue; if (nal->nuh_temporal_id_plus1 < temporal_id + 1) temporal_id = nal->nuh_temporal_id_plus1 - 1; if (au->units[i].type <= HEVC_NAL_RSV_VCL31) { const H265RawSlice *slice = au->units[i].content; layer_id = nal->nuh_layer_id; if (slice->header.slice_type == HEVC_SLICE_B && pic_type < 2) pic_type = 2; if (slice->header.slice_type == HEVC_SLICE_P && pic_type < 1) pic_type = 1; } } aud->nal_unit_header = (H265RawNALUnitHeader) { .nal_unit_type = HEVC_NAL_AUD, .nuh_layer_id = layer_id, .nuh_temporal_id_plus1 = temporal_id + 1, }; aud->pic_type = pic_type; err = ff_cbs_insert_unit_content(ctx->cbc, au, 0, HEVC_NAL_AUD, aud, NULL); if (err) { av_log(bsf, AV_LOG_ERROR, "Failed to insert AUD.\n"); goto fail; } } } 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) goto fail; } if (au->units[i].type == HEVC_NAL_SPS) { err = h265_metadata_update_sps(bsf, au->units[i].content); if (err < 0) goto fail; } } err = ff_cbs_write_packet(ctx->cbc, out, au); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n"); goto fail; } err = av_packet_copy_props(out, in); if (err < 0) goto fail; err = 0; fail: ff_cbs_fragment_uninit(ctx->cbc, au); av_packet_free(&in); return err; }
} } if (write) { disp->display_orientation_repetition_period = 1; err = ff_cbs_h264_add_sei_message(ctx->cbc, au, &payload); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to add display orientation " "SEI message to access unit.\n"); goto fail; } } } err = ff_cbs_write_packet(ctx->cbc, out, au); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n"); goto fail; } err = av_packet_copy_props(out, in); if (err < 0) goto fail; if (displaymatrix_side_data) { err = av_packet_add_side_data(out, AV_PKT_DATA_DISPLAYMATRIX, displaymatrix_side_data, displaymatrix_side_data_size); if (err) { av_log(bsf, AV_LOG_ERROR, "Failed to attach extracted "