[FFmpeg-devel] [PATCH] avcodec/h264_mp4toannexb: Prepend SPS/PPS to buffering period SEI

Josh Allmann joshua.allmann at gmail.com
Wed Aug 7 19:13:31 EEST 2024


On Thu, 1 Aug 2024 at 14:37, Josh Allmann <joshua.allmann at gmail.com> wrote:
>
> Encoders may emit a buffering period SEI without a corresponding
> SPS/PPS if the SPS/PPS is carried out-of-band, eg with avcc.
>
> During Annex B conversion, this may result in the SPS/PPS being
> inserted *after* the buffering period SEI but before the IDR NAL.
>
> Since the buffering period SEI references the SPS, the SPS/PPS
> needs to come first.
> ---
>  libavcodec/bsf/h264_mp4toannexb.c          | 15 +++++++++++++++
>  tests/ref/fate/h264-bsf-mp4toannexb        |  2 +-
>  tests/ref/fate/h264_mp4toannexb_ticket2991 | 18 +++++++++---------
>  tests/ref/fate/segment-mp4-to-ts           | 12 ++++++------
>  4 files changed, 31 insertions(+), 16 deletions(-)
>

Ping for (re-)review on this patch which addresses comments from [1]

Explanation for the FATE changes here [2] - it turns out that several
of the FATE samples exhibit the same behavior that this patch fixes,
so it is a net improvement

[1] https://ffmpeg.org//pipermail/ffmpeg-devel/2024-August/331958.html
[2] https://ffmpeg.org//pipermail/ffmpeg-devel/2024-July/330912.html

Josh


> diff --git a/libavcodec/bsf/h264_mp4toannexb.c b/libavcodec/bsf/h264_mp4toannexb.c
> index 92af6a6881..dda064287e 100644
> --- a/libavcodec/bsf/h264_mp4toannexb.c
> +++ b/libavcodec/bsf/h264_mp4toannexb.c
> @@ -30,6 +30,7 @@
>  #include "bytestream.h"
>  #include "defs.h"
>  #include "h264.h"
> +#include "sei.h"
>
>  typedef struct H264BSFContext {
>      uint8_t *sps;
> @@ -363,6 +364,20 @@ static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *opkt)
>              if (!new_idr && unit_type == H264_NAL_IDR_SLICE && (buf[1] & 0x80))
>                  new_idr = 1;
>
> +            /* If this is a buffering period SEI without a corresponding sps/pps
> +             * then prepend any existing sps/pps before the SEI */
> +            if (unit_type == H264_NAL_SEI && buf[1] == SEI_TYPE_BUFFERING_PERIOD &&
> +                !sps_seen && !pps_seen) {
> +                if (s->sps_size) {
> +                    count_or_copy(&out, &out_size, s->sps, s->sps_size, PS_OUT_OF_BAND, j);
> +                    sps_seen = 1;
> +                }
> +                if (s->pps_size) {
> +                    count_or_copy(&out, &out_size, s->pps, s->pps_size, PS_OUT_OF_BAND, j);
> +                    pps_seen = 1;
> +                }
> +            }
> +
>              /* prepend only to the first type 5 NAL unit of an IDR picture, if no sps/pps are already present */
>              if (new_idr && unit_type == H264_NAL_IDR_SLICE && !sps_seen && !pps_seen) {
>                  if (s->sps_size)
> diff --git a/tests/ref/fate/h264-bsf-mp4toannexb b/tests/ref/fate/h264-bsf-mp4toannexb
> index 2049f39701..81ff568f3d 100644
> --- a/tests/ref/fate/h264-bsf-mp4toannexb
> +++ b/tests/ref/fate/h264-bsf-mp4toannexb
> @@ -1 +1 @@
> -5f04c27cc6ee8625fe2405fb0f7da9a3
> +ff2551123909f54c382294baa1bb4364
> diff --git a/tests/ref/fate/h264_mp4toannexb_ticket2991 b/tests/ref/fate/h264_mp4toannexb_ticket2991
> index f8e3e920d4..9a1fbf2f8c 100644
> --- a/tests/ref/fate/h264_mp4toannexb_ticket2991
> +++ b/tests/ref/fate/h264_mp4toannexb_ticket2991
> @@ -1,4 +1,4 @@
> -05d66e60ab22ee004720e0051af0fe74 *tests/data/fate/h264_mp4toannexb_ticket2991.h264
> +b6ff5910928ad0b2a7eec481dcc41594 *tests/data/fate/h264_mp4toannexb_ticket2991.h264
>  1985815 tests/data/fate/h264_mp4toannexb_ticket2991.h264
>  #extradata 0:       47, 0x3a590d55
>  #tb 0: 1/1200000
> @@ -6,7 +6,7 @@
>  #codec_id 0: h264
>  #dimensions 0: 1280x720
>  #sar 0: 3/4
> -0,          0,          0,    40040,    37126, 0xb020184c
> +0,          0,          0,    40040,    37126, 0x515c184c
>  0,      40040,      40040,    40040,     6920, 0x8512361a, F=0x0
>  0,      80081,      80081,    40040,     7550, 0x1bc56ed4, F=0x0
>  0,     120121,     120121,    40040,     8752, 0xb8c6f0a1, F=0x0
> @@ -21,7 +21,7 @@
>  0,     480485,     480485,    40040,    11234, 0x83cbd9fd, F=0x0
>  0,     520525,     520525,    40040,    17616, 0xfdf95104, F=0x0
>  0,     560566,     560566,    40040,    10689, 0x9633d32b, F=0x0
> -0,     600606,     600606,    40040,    45291, 0x543c2cf6
> +0,     600606,     600606,    40040,    45291, 0xa8292cf6
>  0,     640646,     640646,    40040,    20837, 0x051abfab, F=0x0
>  0,     680687,     680687,    40040,    21418, 0xe2a59d70, F=0x0
>  0,     720727,     720727,    40040,    15643, 0x15cf2cec, F=0x0
> @@ -36,7 +36,7 @@
>  0,    1081091,    1081091,    40040,    13130, 0xcbb6bb8e, F=0x0
>  0,    1121131,    1121131,    40040,    16180, 0x5d188a7a, F=0x0
>  0,    1161172,    1161172,    40040,    14961, 0x9ff2f463, F=0x0
> -0,    1201212,    1201212,    40040,    54296, 0xe6ec30ed
> +0,    1201212,    1201212,    40040,    54296, 0x3ae830ed
>  0,    1241252,    1241252,    40040,    11500, 0x8c4852c9, F=0x0
>  0,    1281293,    1281293,    40040,    12065, 0xfb7954c3, F=0x0
>  0,    1321333,    1321333,    40040,    12532, 0xf0a935d3, F=0x0
> @@ -51,7 +51,7 @@
>  0,    1681697,    1681697,    40040,    13250, 0xfed0deb8, F=0x0
>  0,    1721737,    1721737,    40040,    13360, 0xbf92d476, F=0x0
>  0,    1761778,    1761778,    40040,    11749, 0x3041eaf1, F=0x0
> -0,    1801818,    1801818,    40040,    23997, 0xdbe6d5c4
> +0,    1801818,    1801818,    40040,    23997, 0x2fe2d5c4
>  0,    1841858,    1841858,    40040,    16065, 0xe8f715b7, F=0x0
>  0,    1881899,    1881899,    40040,    16441, 0x0a4e060f, F=0x0
>  0,    1921939,    1921939,    40040,    17395, 0xa8edecc2, F=0x0
> @@ -66,7 +66,7 @@
>  0,    2282303,    2282303,    40040,    13748, 0xed26aeb4, F=0x0
>  0,    2322343,    2322343,    40040,    15092, 0x3c983538, F=0x0
>  0,    2362384,    2362384,    40040,    14636, 0x9b278a6c, F=0x0
> -0,    2402424,    2402424,    40040,    29134, 0xf784be18
> +0,    2402424,    2402424,    40040,    29134, 0x4b80be18
>  0,    2442464,    2442464,    40040,    10232, 0x5408e15b, F=0x0
>  0,    2482505,    2482505,    40040,     9769, 0xc93cb7f9, F=0x0
>  0,    2522545,    2522545,    40040,    14454, 0x45230dbe, F=0x0
> @@ -81,7 +81,7 @@
>  0,    2882909,    2882909,    40040,    14801, 0x40bae016, F=0x0
>  0,    2922949,    2922949,    40040,    17303, 0x9ce1fd31, F=0x0
>  0,    2962990,    2962990,    40040,    17678, 0x9bd66141, F=0x0
> -0,    3003030,    3003030,    40040,    48672, 0x3215ce46
> +0,    3003030,    3003030,    40040,    48672, 0x8602ce46
>  0,    3043070,    3043070,    40040,    11894, 0x12e1fece, F=0x0
>  0,    3083111,    3083111,    40040,    16514, 0xc57aed05, F=0x0
>  0,    3123151,    3123151,    40040,    13044, 0x61914fa0, F=0x0
> @@ -96,7 +96,7 @@
>  0,    3483515,    3483515,    40040,    12208, 0x81a587c0, F=0x0
>  0,    3523555,    3523555,    40040,    14709, 0x5dffbe04, F=0x0
>  0,    3563596,    3563596,    40040,    14390, 0xbfd1e041, F=0x0
> -0,    3603636,    3603636,    40040,    37236, 0xe7f924b1
> +0,    3603636,    3603636,    40040,    37236, 0x3bf524b1
>  0,    3643676,    3643676,    40040,    14056, 0x24714c7c, F=0x0
>  0,    3683717,    3683717,    40040,    19438, 0x0c50dcd5, F=0x0
>  0,    3723757,    3723757,    40040,    21728, 0x7eea4a11, F=0x0
> @@ -111,7 +111,7 @@
>  0,    4084121,    4084121,    40040,    16878, 0x98efbae2, F=0x0
>  0,    4124161,    4124161,    40040,    14685, 0x1bf78d65, F=0x0
>  0,    4164202,    4164202,    40040,    13127, 0x0b91881d, F=0x0
> -0,    4204242,    4204242,    40040,    29390, 0xf6a5ed6b
> +0,    4204242,    4204242,    40040,    29390, 0x4aa1ed6b
>  0,    4244282,    4244282,    40040,    12576, 0xe9845ded, F=0x0
>  0,    4284323,    4284323,    40040,    12599, 0x96a79ab8, F=0x0
>  0,    4324363,    4324363,    40040,    16134, 0xb4c36d3f, F=0x0
> diff --git a/tests/ref/fate/segment-mp4-to-ts b/tests/ref/fate/segment-mp4-to-ts
> index 2994416270..54b59a09cc 100644
> --- a/tests/ref/fate/segment-mp4-to-ts
> +++ b/tests/ref/fate/segment-mp4-to-ts
> @@ -4,7 +4,7 @@
>  #codec_id 0: h264
>  #dimensions 0: 640x360
>  #sar 0: 1/1
> -0,      -7200,          0,     3600,    22630, 0x9b109541, S=1,        1
> +0,      -7200,          0,     3600,    22630, 0xee579541, S=1,        1
>  0,      -3600,      14400,     3600,     4021, 0xbf7cdb02, F=0x0, S=1,        1
>  0,          0,       7200,     3600,     1096, 0x4f162690, F=0x0, S=1,        1
>  0,       3600,       3600,     3600,      687, 0x00394b95, F=0x0, S=1,        1
> @@ -25,7 +25,7 @@
>  0,      57600,      64800,     3600,     1182, 0xbe1a4847, F=0x0, S=1,        1
>  0,      61200,      61200,     3600,      809, 0x8d948a4e, F=0x0, S=1,        1
>  0,      64800,      68400,     3600,      656, 0x4fa03c2b, F=0x0, S=1,        1
> -0,      68400,      86400,     3600,    26555, 0x5629b584, S=1,        1
> +0,      68400,      86400,     3600,    26606, 0x0f75c37d, S=1,        1
>  0,      72000,      79200,     3600,     1141, 0x761b31e8, F=0x0, S=1,        1
>  0,      75600,      75600,     3600,      717, 0x57746351, F=0x0, S=1,        1
>  0,      79200,      82800,     3600,      693, 0x78b24263, F=0x0, S=1,        1
> @@ -49,7 +49,7 @@
>  0,     144000,     151200,     3600,     1271, 0x46006870, F=0x0, S=1,        1
>  0,     147600,     147600,     3600,      849, 0x94dc99c7, F=0x2, S=1,        1
>  0,     151200,     154800,     3600,      753, 0xf4236cab, F=0x0, S=1,        1
> -0,     154800,     172800,     3600,    25825, 0xd5464dee, S=1,        1
> +0,     154800,     172800,     3600,    25876, 0xb4305be7, S=1,        1
>  0,     158400,     165600,     3600,     1206, 0x8ce84344, F=0x0, S=1,        1
>  0,     162000,     162000,     3600,      867, 0x312fa07d, F=0x0, S=1,        1
>  0,     165600,     169200,     3600,      719, 0x810666d1, F=0x0, S=1,        1
> @@ -73,7 +73,7 @@
>  0,     230400,     237600,     3600,     1545, 0x0099fc98, F=0x0, S=1,        1
>  0,     234000,     234000,     3600,      929, 0xfd72d049, F=0x2, S=1,        1
>  0,     237600,     241200,     3600,      829, 0xcfda9e96, F=0x0, S=1,        1
> -0,     241200,     259200,     3600,    24220, 0x5ca21d71, S=1,        1
> +0,     241200,     259200,     3600,    24271, 0x9c472b6a, S=1,        1
>  0,     244800,     252000,     3600,     1422, 0xcde6cc34, F=0x0, S=1,        1
>  0,     248400,     248400,     3600,      883, 0xedacbe25, F=0x0, S=1,        1
>  0,     252000,     255600,     3600,      768, 0x89d774bc, F=0x0, S=1,        1
> @@ -97,7 +97,7 @@
>  0,     316800,     324000,     3600,     1501, 0xb3b8f001, F=0x0, S=1,        1
>  0,     320400,     320400,     3600,      941, 0x92b0cb18, F=0x2, S=1,        1
>  0,     324000,     327600,     3600,      823, 0x3d548355, F=0x0, S=1,        1
> -0,     327600,     345600,     3600,    24042, 0x441e94fb, S=1,        1
> +0,     327600,     345600,     3600,    24093, 0xcc0ba2f4, S=1,        1
>  0,     331200,     338400,     3600,     1582, 0x4f5d1049, F=0x0, S=1,        1
>  0,     334800,     334800,     3600,      945, 0x4f3cc9e8, F=0x0, S=1,        1
>  0,     338400,     342000,     3600,      815, 0x0ca790a4, F=0x0, S=1,        1
> @@ -121,7 +121,7 @@
>  0,     403200,     410400,     3600,      359, 0x11bdae52, F=0x0, S=1,        1
>  0,     406800,     406800,     3600,      235, 0xbec26964, F=0x2, S=1,        1
>  0,     410400,     414000,     3600,      221, 0x8380682c, F=0x0, S=1,        1
> -0,     414000,     432000,     3600,    22588, 0xf0ecf072, S=1,        1
> +0,     414000,     432000,     3600,    22639, 0x1809fe6b, S=1,        1
>  0,     417600,     424800,     3600,      383, 0x4f3bb571, F=0x0, S=1,        1
>  0,     421200,     421200,     3600,      257, 0x22e87802, F=0x0, S=1,        1
>  0,     424800,     428400,     3600,      261, 0xdb988134, F=0x0, S=1,        1
> --
> 2.39.2
>


More information about the ffmpeg-devel mailing list