diff mbox series

[FFmpeg-devel] avcodec/h265_metadata_bsf: Setting vps/sps/pps id

Message ID CAOOJq0rd1qfXB7h_YHKtQR=hcKW92ggB3C2Fa4YviAxJTtWyPg@mail.gmail.com
State New
Headers show
Series [FFmpeg-devel] avcodec/h265_metadata_bsf: Setting vps/sps/pps id | expand

Checks

Context Check Description
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Eran Gonen Jan. 6, 2020, 9:14 p.m. UTC
Hi,

Resending because it didn't get the patch list. Just one file this time.

The attached patch allows setting vps/sps/pps id.

Usage:
/ffmpeg -i source -c:v libx265 -bsf:v
hevc_metadata=sps_id=8:pps_id=12:vps_id=3 output

Best,
Eran Gonen
From 03dcc5c9868ff07f9b9d9cf216d741f92e798669 Mon Sep 17 00:00:00 2001
From: Eran Gonen <eran.gonen@cloudinary.com>
Date: Mon, 6 Jan 2020 15:46:30 +0200
Subject: [PATCH] Add vps/sps/pps id set to hevc_metadata bsf

---
 libavcodec/h265_metadata_bsf.c | 147 +++++++++++++++++++++++++++++----
 1 file changed, 129 insertions(+), 18 deletions(-)

Comments

Andriy Gelman Jan. 6, 2020, 10:33 p.m. UTC | #1
Hello Eran,

On Mon, 06. Jan 23:14, Eran Gonen wrote:
> Hi,

> 
> Resending because it didn't get the patch list. Just one file this time.

I've added your patch to the list: 
https://patchwork.ffmpeg.org/project/ffmpeg/patch/CAOOJq0rd1qfXB7h_YHKtQR=hcKW92ggB3C2Fa4YviAxJTtWyPg@mail.gmail.com/

For some reason it was getting skipped because the Content-Type of the
attachment was set to application/octet-stream.

Also you'll see that your patch failed to apply because patchwork doesn't
properly work with attachments at the moment. 

In the future you are welcome to send patches via Git send-email with --compose
or --annotate flags if you want to add a message.

Thanks,
diff mbox series

Patch

diff --git a/libavcodec/h265_metadata_bsf.c b/libavcodec/h265_metadata_bsf.c
index b3a1fda144..66ea369e0b 100644
--- a/libavcodec/h265_metadata_bsf.c
+++ b/libavcodec/h265_metadata_bsf.c
@@ -68,6 +68,10 @@  typedef struct H265MetadataContext {
     int level;
     int level_guess;
     int level_warned;
+
+    int vps_id;
+    int sps_id;
+    int pps_id;
 } H265MetadataContext;
 
 
@@ -168,6 +172,10 @@  static int h265_metadata_update_vps(AVBSFContext *bsf,
 {
     H265MetadataContext *ctx = bsf->priv_data;
 
+    if(ctx->vps_id > -1) {
+        vps->vps_video_parameter_set_id = ctx->vps_id;
+    }
+
     if (ctx->tick_rate.num && ctx->tick_rate.den) {
         int num, den;
 
@@ -200,6 +208,13 @@  static int h265_metadata_update_sps(AVBSFContext *bsf,
     int need_vui = 0;
     int crop_unit_x, crop_unit_y;
 
+    if(ctx->vps_id > -1) {
+        sps->sps_video_parameter_set_id = ctx->vps_id;
+    }
+    if(ctx->sps_id > -1) {
+        sps->sps_seq_parameter_set_id = ctx->sps_id;
+    }
+
     if (ctx->sample_aspect_ratio.num && ctx->sample_aspect_ratio.den) {
         // Table E-1.
         static const AVRational sar_idc[] = {
@@ -336,6 +351,32 @@  static int h265_metadata_update_sps(AVBSFContext *bsf,
     return 0;
 }
 
+static int h265_metadata_update_pps(AVBSFContext *bsf,
+                                    H265RawPPS *pps)
+{
+    H265MetadataContext *ctx = bsf->priv_data;
+
+    if(ctx->sps_id > -1) {
+        pps->pps_seq_parameter_set_id = ctx->sps_id;
+    }
+    if(ctx->pps_id > -1) {
+        pps->pps_pic_parameter_set_id = ctx->pps_id;
+    }
+
+    return 0;
+}
+
+static int h265_metadata_update_slice_header(AVBSFContext *bsf,
+                                             H265RawSliceHeader *slice)
+{
+    H265MetadataContext *ctx = bsf->priv_data;
+
+    if(ctx->pps_id > -1) {
+        slice->slice_pic_parameter_set_id = ctx->pps_id;
+    }
+    return 0;
+}
+
 static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
 {
     H265MetadataContext *ctx = bsf->priv_data;
@@ -406,15 +447,45 @@  static int h265_metadata_filter(AVBSFContext *bsf, AVPacket *pkt)
         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)
-                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;
+        switch (au->units[i].type) {
+            case HEVC_NAL_VPS:
+                err = h265_metadata_update_vps(bsf, au->units[i].content);
+                if (err < 0)
+                    goto fail;
+                    break;
+            case HEVC_NAL_SPS:
+                err = h265_metadata_update_sps(bsf, au->units[i].content);
+                if (err < 0)
+                    goto fail;
+                    break;
+            case HEVC_NAL_PPS:
+                err = h265_metadata_update_pps(bsf, au->units[i].content);
+                if (err < 0)
+                    goto fail;
+                    break;
+            case HEVC_NAL_SEI_PREFIX:
+            case HEVC_NAL_SEI_SUFFIX:
+                break;
+            case HEVC_NAL_TRAIL_N:
+            case HEVC_NAL_TRAIL_R:
+            case HEVC_NAL_TSA_N:
+            case HEVC_NAL_TSA_R:
+            case HEVC_NAL_STSA_N:
+            case HEVC_NAL_STSA_R:
+            case HEVC_NAL_BLA_W_LP:
+            case HEVC_NAL_BLA_W_RADL:
+            case HEVC_NAL_BLA_N_LP:
+            case HEVC_NAL_IDR_W_RADL:
+            case HEVC_NAL_IDR_N_LP:
+            case HEVC_NAL_CRA_NUT:
+            case HEVC_NAL_RADL_N:
+            case HEVC_NAL_RADL_R:
+            case HEVC_NAL_RASL_N:
+            case HEVC_NAL_RASL_R:
+                err = h265_metadata_update_slice_header(bsf, au->units[i].content);
+                if (err < 0)
+                    goto fail;
+                    break;
         }
     }
 
@@ -455,15 +526,45 @@  static int h265_metadata_init(AVBSFContext *bsf)
             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)
-                    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;
+            switch (au->units[i].type) {
+                    case HEVC_NAL_VPS:
+                        err = h265_metadata_update_vps(bsf, au->units[i].content);
+                        if (err < 0)
+                            goto fail;
+                            break;
+                    case HEVC_NAL_SPS:
+                        err = h265_metadata_update_sps(bsf, au->units[i].content);
+                        if (err < 0)
+                            goto fail;
+                            break;
+                    case HEVC_NAL_PPS:
+                        err = h265_metadata_update_pps(bsf, au->units[i].content);
+                        if (err < 0)
+                            goto fail;
+                            break;
+                    case HEVC_NAL_SEI_PREFIX:
+                    case HEVC_NAL_SEI_SUFFIX:
+                        break;
+                    case HEVC_NAL_TRAIL_N:
+                    case HEVC_NAL_TRAIL_R:
+                    case HEVC_NAL_TSA_N:
+                    case HEVC_NAL_TSA_R:
+                    case HEVC_NAL_STSA_N:
+                    case HEVC_NAL_STSA_R:
+                    case HEVC_NAL_BLA_W_LP:
+                    case HEVC_NAL_BLA_W_RADL:
+                    case HEVC_NAL_BLA_N_LP:
+                    case HEVC_NAL_IDR_W_RADL:
+                    case HEVC_NAL_IDR_N_LP:
+                    case HEVC_NAL_CRA_NUT:
+                    case HEVC_NAL_RADL_N:
+                    case HEVC_NAL_RADL_R:
+                    case HEVC_NAL_RASL_N:
+                    case HEVC_NAL_RASL_R:
+                        err = h265_metadata_update_slice_header(bsf, au->units[i].content);
+                        if (err < 0)
+                            goto fail;
+                            break;
             }
         }
 
@@ -547,6 +648,16 @@  static const AVOption h265_metadata_options[] = {
         OFFSET(crop_bottom), AV_OPT_TYPE_INT,
         { .i64 = -1 }, -1, HEVC_MAX_HEIGHT, FLAGS },
 
+    { "vps_id", "Set vps id",
+        OFFSET(vps_id), AV_OPT_TYPE_INT,
+        { .i64 = -1 }, -1, HEVC_MAX_VPS_COUNT, FLAGS },
+    { "sps_id", "Set sps id",
+        OFFSET(sps_id), AV_OPT_TYPE_INT,
+        { .i64 = -1 }, -1, HEVC_MAX_SPS_COUNT, FLAGS },
+    { "pps_id", "Set pps id",
+        OFFSET(pps_id), AV_OPT_TYPE_INT,
+        { .i64 = -1 }, -1, HEVC_MAX_PPS_COUNT, FLAGS },
+
     { "level", "Set level (tables A.6 and A.7)",
         OFFSET(level), AV_OPT_TYPE_INT,
         { .i64 = LEVEL_UNSET }, LEVEL_UNSET, 0xff, FLAGS, "level" },