[x265] ptl: RExt profiles
Satoshi Nakagawa
nakagawa424 at oki.com
Fri Oct 10 12:06:21 CEST 2014
# HG changeset patch
# User Satoshi Nakagawa <nakagawa424 at oki.com>
# Date 1412935384 -32400
# Fri Oct 10 19:03:04 2014 +0900
# Node ID 95bb05fd7d143e7a123b6b1b475b35b5c2bf44f5
# Parent 4495af3b30bb7a361c3252a8800f8dfa9f191145
ptl: RExt profiles
diff -r 4495af3b30bb -r 95bb05fd7d14 source/common/slice.h
--- a/source/common/slice.h Thu Oct 09 14:28:14 2014 +0530
+++ b/source/common/slice.h Fri Oct 10 19:03:04 2014 +0900
@@ -63,6 +63,8 @@
MAIN = 1,
MAIN10 = 2,
MAINSTILLPICTURE = 3,
+ MAINREXT = 4,
+ HIGHTHROUGHPUTREXT = 5
};
}
@@ -100,10 +102,14 @@
bool nonPackedConstraintFlag;
bool frameOnlyConstraintFlag;
bool profileCompatibilityFlag[32];
+ bool intraConstraintFlag;
+ bool lowerBitRateConstraintFlag;
int profileIdc;
int levelIdc;
uint32_t minCrForLevel;
uint32_t maxLumaSrForLevel;
+ uint32_t bitDepthConstraint;
+ int chromaFormatConstraint;
};
struct HRDInfo
diff -r 4495af3b30bb -r 95bb05fd7d14 source/encoder/entropy.cpp
--- a/source/encoder/entropy.cpp Thu Oct 09 14:28:14 2014 +0530
+++ b/source/encoder/entropy.cpp Fri Oct 10 19:03:04 2014 +0900
@@ -190,9 +190,29 @@
WRITE_FLAG(ptl.nonPackedConstraintFlag, "general_non_packed_constraint_flag");
WRITE_FLAG(ptl.frameOnlyConstraintFlag, "general_frame_only_constraint_flag");
- WRITE_CODE(0, 16, "XXX_reserved_zero_44bits[0..15]");
- WRITE_CODE(0, 16, "XXX_reserved_zero_44bits[16..31]");
- WRITE_CODE(0, 12, "XXX_reserved_zero_44bits[32..43]");
+ if (ptl.profileIdc == Profile::MAINREXT || ptl.profileIdc == Profile::HIGHTHROUGHPUTREXT )
+ {
+ uint32_t bitDepthConstraint = ptl.bitDepthConstraint;
+ int csp = ptl.chromaFormatConstraint;
+ WRITE_FLAG(bitDepthConstraint<=12, "general_max_12bit_constraint_flag");
+ WRITE_FLAG(bitDepthConstraint<=10, "general_max_10bit_constraint_flag");
+ WRITE_FLAG(bitDepthConstraint<= 8 && csp != X265_CSP_I422 , "general_max_8bit_constraint_flag");
+ WRITE_FLAG(csp == X265_CSP_I422 || csp == X265_CSP_I420 || csp == X265_CSP_I400, "general_max_422chroma_constraint_flag");
+ WRITE_FLAG(csp == X265_CSP_I420 || csp == X265_CSP_I400, "general_max_420chroma_constraint_flag");
+ WRITE_FLAG(csp == X265_CSP_I400, "general_max_monochrome_constraint_flag");
+ WRITE_FLAG(ptl.intraConstraintFlag, "general_intra_constraint_flag");
+ WRITE_FLAG(0, "general_one_picture_only_constraint_flag");
+ WRITE_FLAG(ptl.lowerBitRateConstraintFlag, "general_lower_bit_rate_constraint_flag");
+ WRITE_CODE(0 , 16, "XXX_reserved_zero_35bits[0..15]");
+ WRITE_CODE(0 , 16, "XXX_reserved_zero_35bits[16..31]");
+ WRITE_CODE(0 , 3, "XXX_reserved_zero_35bits[32..34]");
+ }
+ else
+ {
+ WRITE_CODE(0, 16, "XXX_reserved_zero_44bits[0..15]");
+ WRITE_CODE(0, 16, "XXX_reserved_zero_44bits[16..31]");
+ WRITE_CODE(0, 12, "XXX_reserved_zero_44bits[32..43]");
+ }
WRITE_CODE(ptl.levelIdc, 8, "general_level_idc");
}
diff -r 4495af3b30bb -r 95bb05fd7d14 source/encoder/level.cpp
--- a/source/encoder/level.cpp Thu Oct 09 14:28:14 2014 +0530
+++ b/source/encoder/level.cpp Fri Oct 10 19:03:04 2014 +0900
@@ -77,7 +77,7 @@
else
{
/* TODO: Range extension profiles */
- vps.ptl.profileIdc = Profile::NONE;
+ vps.ptl.profileIdc = Profile::MAINREXT;
}
/* determine which profiles are compatible with this stream */
@@ -93,6 +93,10 @@
vps.ptl.profileCompatibilityFlag[Profile::MAIN] = true;
vps.ptl.profileCompatibilityFlag[Profile::MAIN10] = true;
}
+ else if (vps.ptl.profileIdc == Profile::MAINREXT)
+ {
+ vps.ptl.profileCompatibilityFlag[Profile::MAINREXT] = true;
+ }
uint32_t lumaSamples = param.sourceWidth * param.sourceHeight;
uint32_t samplesPerSec = (uint32_t)(lumaSamples * ((double)param.fpsNum / param.fpsDenom));
@@ -167,10 +171,29 @@
break;
}
- static const char *profiles[] = { "None", "Main", "Main10", "Mainstillpicture" };
+ vps.ptl.intraConstraintFlag = false;
+ vps.ptl.lowerBitRateConstraintFlag = true;
+ vps.ptl.bitDepthConstraint = param.internalBitDepth;
+ vps.ptl.chromaFormatConstraint = param.internalCsp;
+
+ static const char *profiles[] = { "None", "Main", "Main 10", "Main Still Picture", "RExt" };
static const char *tiers[] = { "Main", "High" };
+
+ const char *profile = profiles[vps.ptl.profileIdc];
+ if (vps.ptl.profileIdc == Profile::MAINREXT)
+ {
+ if (param.internalCsp == X265_CSP_I422)
+ profile = "Main 4:2:2 10";
+ if (param.internalCsp == X265_CSP_I444)
+ {
+ if (vps.ptl.bitDepthConstraint <= 8)
+ profile = "Main 4:4:4 8";
+ else if (vps.ptl.bitDepthConstraint <= 10)
+ profile = "Main 4:4:4 10";
+ }
+ }
x265_log(¶m, X265_LOG_INFO, "%s profile, Level-%s (%s tier)\n",
- profiles[vps.ptl.profileIdc], levels[i].name, tiers[vps.ptl.tierFlag]);
+ profile, levels[i].name, tiers[vps.ptl.tierFlag]);
}
/* enforce a maximum decoder level requirement, in other words assure that a
@@ -356,6 +379,22 @@
return -1;
#endif
}
+ else if (!strcmp(profile, "main422-10"))
+ {
+ param->internalCsp = X265_CSP_I422;
+ }
+ else if (!strcmp(profile, "main444-8"))
+ {
+ param->internalCsp = X265_CSP_I444;
+#if HIGH_BIT_DEPTH
+ x265_log(param, X265_LOG_ERROR, "Main 4:4:4 8 profile not supported, compiled for Main10.\n");
+ return -1;
+#endif
+ }
+ else if (!strcmp(profile, "main444-10"))
+ {
+ param->internalCsp = X265_CSP_I444;
+ }
else
{
x265_log(param, X265_LOG_ERROR, "unknown profile <%s>\n", profile);
More information about the x265-devel
mailing list