diff options
author | Mark Thompson <sw@jkqxz.net> | 2018-02-21 22:54:07 +0000 |
---|---|---|
committer | Mark Thompson <sw@jkqxz.net> | 2018-02-21 22:54:07 +0000 |
commit | ecb3d6edc3b756cc1d40b1073f244b581ef5bcfb (patch) | |
tree | 5049e4fee41101a5e3f0cc38e5e1efa427d3eb81 | |
parent | fbeac5356c692b6f681a21749dee3a3e414f1230 (diff) | |
parent | 6d5a6dde5301c81e221a37b3f39bb03149492b98 (diff) | |
download | ffmpeg-ecb3d6edc3b756cc1d40b1073f244b581ef5bcfb.tar.gz |
Merge commit '6d5a6dde5301c81e221a37b3f39bb03149492b98'
* commit '6d5a6dde5301c81e221a37b3f39bb03149492b98':
h264_metadata: Add option to delete filler data
Fixes #6899.
Merged-by: Mark Thompson <sw@jkqxz.net>
-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 81cdcac5cf..89bdedfc69 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 } }; |