diff options
author | Mark Thompson <sw@jkqxz.net> | 2017-12-11 03:30:54 +0300 |
---|---|---|
committer | Mark Thompson <sw@jkqxz.net> | 2018-02-21 01:04:12 +0300 |
commit | 6d5a6dde5301c81e221a37b3f39bb03149492b98 (patch) | |
tree | 791aabffdbdc46d2ca664361479115085d06ebad /libavcodec/h264_metadata_bsf.c | |
parent | eccc03c8fbc603a0a3257df66f0705f74fe2581a (diff) |
h264_metadata: Add option to delete filler data
Deletes both filler NAL units and filler SEI messages. (Annex B zero_bytes
between NAL units are already discarded by the read/write process.)
Diffstat (limited to 'libavcodec/h264_metadata_bsf.c')
-rw-r--r-- | libavcodec/h264_metadata_bsf.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c index d8d5487c99..7b51e8ee8b 100644 --- a/libavcodec/h264_metadata_bsf.c +++ b/libavcodec/h264_metadata_bsf.c @@ -63,6 +63,8 @@ typedef struct H264MetadataContext { const char *sei_user_data; int sei_first_au; + + int delete_filler; } H264MetadataContext; @@ -346,6 +348,44 @@ static int h264_metadata_filter(AVBSFContext *bsf, AVPacket *out) } } + if (ctx->delete_filler) { + for (i = 0; i < au->nb_units; i++) { + if (au->units[i].type == H264_NAL_FILLER_DATA) { + // Filler NAL units. + err = ff_cbs_delete_unit(ctx->cbc, au, i); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to delete " + "filler NAL.\n"); + goto fail; + } + --i; + continue; + } + + if (au->units[i].type == H264_NAL_SEI) { + // Filler SEI messages. + H264RawSEI *sei = au->units[i].content; + + for (j = 0; j < sei->payload_count; j++) { + if (sei->payload[j].payload_type == + H264_SEI_TYPE_FILLER_PAYLOAD) { + err = ff_cbs_h264_delete_sei_message(ctx->cbc, au, + &au->units[i], j); + if (err < 0) { + av_log(bsf, AV_LOG_ERROR, "Failed to delete " + "filler SEI message.\n"); + goto fail; + } + // Renumbering might have happened, start again at + // the same NAL unit position. + --i; + break; + } + } + } + } + } + err = ff_cbs_write_packet(ctx->cbc, out, au); if (err < 0) { av_log(bsf, AV_LOG_ERROR, "Failed to write packet.\n"); @@ -465,6 +505,9 @@ static const AVOption h264_metadata_options[] = { { "sei_user_data", "Insert SEI user data (UUID+string)", OFFSET(sei_user_data), AV_OPT_TYPE_STRING, { .str = NULL } }, + { "delete_filler", "Delete all filler (both NAL and SEI)", + OFFSET(delete_filler), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1 }, + { NULL } }; |