summaryrefslogtreecommitdiff
path: root/libavcodec/h264_metadata_bsf.c
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2018-02-21 22:54:07 +0000
committerMark Thompson <sw@jkqxz.net>2018-02-21 22:54:07 +0000
commitecb3d6edc3b756cc1d40b1073f244b581ef5bcfb (patch)
tree5049e4fee41101a5e3f0cc38e5e1efa427d3eb81 /libavcodec/h264_metadata_bsf.c
parentfbeac5356c692b6f681a21749dee3a3e414f1230 (diff)
parent6d5a6dde5301c81e221a37b3f39bb03149492b98 (diff)
Merge commit '6d5a6dde5301c81e221a37b3f39bb03149492b98'
* commit '6d5a6dde5301c81e221a37b3f39bb03149492b98': h264_metadata: Add option to delete filler data Fixes #6899. Merged-by: Mark Thompson <sw@jkqxz.net>
Diffstat (limited to 'libavcodec/h264_metadata_bsf.c')
-rw-r--r--libavcodec/h264_metadata_bsf.c43
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 }
};