[x265] [PATCH] SEI: add CLI --recovery to enable generation of recovery point SEI messages

kavitha at multicorewareinc.com kavitha at multicorewareinc.com
Tue Apr 29 22:50:16 CEST 2014


# HG changeset patch
# User Kavitha Sampath <kavitha at multicorewareinc.com>
# Date 1398804202 -19800
#      Wed Apr 30 02:13:22 2014 +0530
# Branch stable
# Node ID 8bcbdbef4adfe94a79fa7aeffc00297040c13983
# Parent  c6ca14a4f2faff3d305f3ab2c4f7736693f54fbd
SEI: add CLI --recovery to enable generation of recovery point SEI messages

SEI recovery points are inserted at I-frames which tells the decoder an
identifier of the recovery point from which perfectly valid pictures can be
displayed no matter what the starting point of decoding is. The SEI specifies
recovery_poc_cnt that counts the number of frames after which perfect video can
be displayed to the user. Since the leading pictures are usually ignored by the
decoder and trailing pictures do not refer pictures preceding IRAP,
the recovery_poc_cnt is usually zero in h.265 which means "you can seek here".

diff -r c6ca14a4f2fa -r 8bcbdbef4adf source/common/param.cpp
--- a/source/common/param.cpp	Tue Apr 29 14:05:50 2014 -0500
+++ b/source/common/param.cpp	Wed Apr 30 02:13:22 2014 +0530
@@ -596,6 +596,7 @@
     OPT("ssim") p->bEnableSsim = atobool(value);
     OPT("psnr") p->bEnablePsnr = atobool(value);
     OPT("hash") p->decodedPictureHashSEI = atoi(value);
+    OPT("recovery") p->bEnableRecoveryPointSEI = atobool(value);
     OPT("aud") p->bEnableAccessUnitDelimiters = atobool(value);
     OPT("b-pyramid") p->bBPyramid = atobool(value);
     OPT("aq-mode") p->rc.aqMode = atoi(value);
diff -r c6ca14a4f2fa -r 8bcbdbef4adf source/encoder/encoder.cpp
--- a/source/encoder/encoder.cpp	Tue Apr 29 14:05:50 2014 -0500
+++ b/source/encoder/encoder.cpp	Wed Apr 30 02:13:22 2014 +0530
@@ -1408,7 +1408,6 @@
 
     m_nonPackedConstraintFlag = false;
     m_frameOnlyConstraintFlag = false;
-    m_recoveryPointSEIEnabled = 0;
     m_bufferingPeriodSEIEnabled = 0;
     m_displayOrientationSEIAngle = 0;
     m_gradualDecodingRefreshInfoEnabled = 0;
diff -r c6ca14a4f2fa -r 8bcbdbef4adf source/encoder/encoder.h
--- a/source/encoder/encoder.h	Tue Apr 29 14:05:50 2014 -0500
+++ b/source/encoder/encoder.h	Wed Apr 30 02:13:22 2014 +0530
@@ -157,7 +157,6 @@
     bool               m_loopFilterAcrossTilesEnabledFlag;
 
     int                m_bufferingPeriodSEIEnabled;
-    int                m_recoveryPointSEIEnabled;
     int                m_displayOrientationSEIAngle;
     int                m_gradualDecodingRefreshInfoEnabled;
     int                m_decodingUnitInfoSEIEnabled;
diff -r c6ca14a4f2fa -r 8bcbdbef4adf source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp	Tue Apr 29 14:05:50 2014 -0500
+++ b/source/encoder/frameencoder.cpp	Wed Apr 30 02:13:22 2014 +0530
@@ -473,7 +473,7 @@
         slice->setNextSlice(true);
     }
 
-    if ((m_cfg->m_recoveryPointSEIEnabled) && (slice->getSliceType() == I_SLICE))
+    if ((m_cfg->param->bEnableRecoveryPointSEI) && (slice->getSliceType() == I_SLICE))
     {
         if (m_cfg->m_gradualDecodingRefreshInfoEnabled && !slice->getRapPicFlag())
         {
@@ -497,7 +497,7 @@
 
         SEIRecoveryPoint sei_recovery_point;
         sei_recovery_point.m_recoveryPocCnt    = 0;
-        sei_recovery_point.m_exactMatchingFlag = (slice->getPOC() == 0) ? (true) : (false);
+        sei_recovery_point.m_exactMatchingFlag = true;
         sei_recovery_point.m_brokenLinkFlag    = false;
 
         m_seiWriter.writeSEImessage(nalu.m_bitstream, sei_recovery_point, slice->getSPS());
diff -r c6ca14a4f2fa -r 8bcbdbef4adf source/x265.cpp
--- a/source/x265.cpp	Tue Apr 29 14:05:50 2014 -0500
+++ b/source/x265.cpp	Wed Apr 30 02:13:22 2014 +0530
@@ -151,6 +151,8 @@
     { "ssim",                 no_argument, NULL, 0 },
     { "no-psnr",              no_argument, NULL, 0 },
     { "psnr",                 no_argument, NULL, 0 },
+    { "no-recovery",          no_argument, NULL, 0 },
+    { "recovery",             no_argument, NULL, 0 },
     { "hash",           required_argument, NULL, 0 },
     { "no-strong-intra-smoothing", no_argument, NULL, 0 },
     { "strong-intra-smoothing",    no_argument, NULL, 0 },
@@ -393,6 +395,7 @@
     H0("   --recon-depth <integer>       Bit-depth of reconstructed raw image file. Defaults to input bit depth, or 8 if Y4M\n");
     H0("\nSEI options:\n");
     H0("   --hash <integer>              Decoded Picture Hash SEI 0: disabled, 1: MD5, 2: CRC, 3: Checksum. Default %d\n", param->decodedPictureHashSEI);
+    H0("   --[no-]recovery               Enable recovery point SEI. Default %s\n", OPT(param->bEnableRecoveryPointSEI));
 #undef OPT
 #undef H0
     printf("\n\nFull documentation may be found at http://x265.readthedocs.org/en/default/cli.html\n");
diff -r c6ca14a4f2fa -r 8bcbdbef4adf source/x265.h
--- a/source/x265.h	Tue Apr 29 14:05:50 2014 -0500
+++ b/source/x265.h	Wed Apr 30 02:13:22 2014 +0530
@@ -355,6 +355,12 @@
      * types are MD5(1), CRC(2), Checksum(3).  Default is 0, none */
     int       decodedPictureHashSEI;
 
+    /* Enable generation of SEI messages for every keyframe. The recovery point SEI
+     * assists a decoder in determining when the decoding process will produce
+     * acceptable pictures for display after the decoder initiates random access
+     * or indicates a broken link. Default is disabled */
+    int       bEnableRecoveryPointSEI;
+
     /*== Internal Picture Specification ==*/
 
     /* Internal encoder bit depth. If x265 was compiled to use 8bit pixels


More information about the x265-devel mailing list