Commit 4c4b9658 authored by Fredrik Hubinette's avatar Fredrik Hubinette Committed by Commit Bot

Better VideoColorSpace -> ColorSpace conversion

Instead of defaulting everything to BT709, we look
at other fields to see if we can make a better guess.

Bug: 754986
Cq-Include-Trybots: master.tryserver.chromium.android:android_optional_gpu_tests_rel;master.tryserver.chromium.linux:linux_optional_gpu_tests_rel;master.tryserver.chromium.mac:mac_optional_gpu_tests_rel;master.tryserver.chromium.win:win_optional_gpu_tests_rel
Change-Id: Ie33df88aa50dd6629fa0721995aa33bcd1149d5e
Reviewed-on: https://chromium-review.googlesource.com/909336
Commit-Queue: Fredrik Hubinette <hubbe@chromium.org>
Reviewed-by: default avatarccameron <ccameron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#546192}
parent 34008d88
...@@ -72,23 +72,38 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const { ...@@ -72,23 +72,38 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const {
gfx::ColorSpace::TransferID::INVALID; gfx::ColorSpace::TransferID::INVALID;
gfx::ColorSpace::MatrixID matrix_id = gfx::ColorSpace::MatrixID::INVALID; gfx::ColorSpace::MatrixID matrix_id = gfx::ColorSpace::MatrixID::INVALID;
// Bitfield, note that guesses with higher values take precedence over
// guesses with lower values.
enum Guess {
GUESS_BT709 = 1 << 4,
GUESS_BT470M = 1 << 3,
GUESS_BT470BG = 1 << 2,
GUESS_SMPTE170M = 1 << 1,
GUESS_SMPTE240M = 1 << 0,
};
uint32_t guess = 0;
switch (primaries) { switch (primaries) {
case PrimaryID::INVALID:
case PrimaryID::BT709: case PrimaryID::BT709:
case PrimaryID::UNSPECIFIED:
primary_id = gfx::ColorSpace::PrimaryID::BT709; primary_id = gfx::ColorSpace::PrimaryID::BT709;
guess |= GUESS_BT709;
break; break;
case PrimaryID::BT470M: case PrimaryID::BT470M:
primary_id = gfx::ColorSpace::PrimaryID::BT470M; primary_id = gfx::ColorSpace::PrimaryID::BT470M;
guess |= GUESS_BT470M;
break; break;
case PrimaryID::BT470BG: case PrimaryID::BT470BG:
primary_id = gfx::ColorSpace::PrimaryID::BT470BG; primary_id = gfx::ColorSpace::PrimaryID::BT470BG;
guess |= GUESS_BT470BG;
break; break;
case PrimaryID::SMPTE170M: case PrimaryID::SMPTE170M:
primary_id = gfx::ColorSpace::PrimaryID::SMPTE170M; primary_id = gfx::ColorSpace::PrimaryID::SMPTE170M;
guess |= GUESS_SMPTE170M;
break; break;
case PrimaryID::SMPTE240M: case PrimaryID::SMPTE240M:
primary_id = gfx::ColorSpace::PrimaryID::SMPTE240M; primary_id = gfx::ColorSpace::PrimaryID::SMPTE240M;
guess |= GUESS_SMPTE240M;
break; break;
case PrimaryID::FILM: case PrimaryID::FILM:
primary_id = gfx::ColorSpace::PrimaryID::FILM; primary_id = gfx::ColorSpace::PrimaryID::FILM;
...@@ -109,13 +124,15 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const { ...@@ -109,13 +124,15 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const {
// TODO(uzair.jaleel) Need to check this once. // TODO(uzair.jaleel) Need to check this once.
primary_id = gfx::ColorSpace::PrimaryID::INVALID; primary_id = gfx::ColorSpace::PrimaryID::INVALID;
break; break;
case PrimaryID::INVALID:
case PrimaryID::UNSPECIFIED:
break;
} }
switch (transfer) { switch (transfer) {
case TransferID::INVALID:
case TransferID::BT709: case TransferID::BT709:
case TransferID::UNSPECIFIED:
transfer_id = gfx::ColorSpace::TransferID::BT709; transfer_id = gfx::ColorSpace::TransferID::BT709;
guess |= GUESS_BT709;
break; break;
case TransferID::GAMMA22: case TransferID::GAMMA22:
transfer_id = gfx::ColorSpace::TransferID::GAMMA22; transfer_id = gfx::ColorSpace::TransferID::GAMMA22;
...@@ -125,9 +142,11 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const { ...@@ -125,9 +142,11 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const {
break; break;
case TransferID::SMPTE170M: case TransferID::SMPTE170M:
transfer_id = gfx::ColorSpace::TransferID::SMPTE170M; transfer_id = gfx::ColorSpace::TransferID::SMPTE170M;
guess |= GUESS_SMPTE170M;
break; break;
case TransferID::SMPTE240M: case TransferID::SMPTE240M:
transfer_id = gfx::ColorSpace::TransferID::SMPTE240M; transfer_id = gfx::ColorSpace::TransferID::SMPTE240M;
guess |= GUESS_SMPTE240M;
break; break;
case TransferID::LINEAR: case TransferID::LINEAR:
transfer_id = gfx::ColorSpace::TransferID::LINEAR; transfer_id = gfx::ColorSpace::TransferID::LINEAR;
...@@ -162,28 +181,33 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const { ...@@ -162,28 +181,33 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const {
case TransferID::ARIB_STD_B67: case TransferID::ARIB_STD_B67:
transfer_id = gfx::ColorSpace::TransferID::ARIB_STD_B67; transfer_id = gfx::ColorSpace::TransferID::ARIB_STD_B67;
break; break;
case TransferID::INVALID:
case TransferID::UNSPECIFIED:
break;
} }
switch (matrix) { switch (matrix) {
case MatrixID::RGB: case MatrixID::RGB:
matrix_id = gfx::ColorSpace::MatrixID::RGB; matrix_id = gfx::ColorSpace::MatrixID::RGB;
break; break;
case MatrixID::INVALID:
case MatrixID::BT709: case MatrixID::BT709:
case MatrixID::UNSPECIFIED:
matrix_id = gfx::ColorSpace::MatrixID::BT709; matrix_id = gfx::ColorSpace::MatrixID::BT709;
guess |= GUESS_BT709;
break; break;
case MatrixID::FCC: case MatrixID::FCC:
matrix_id = gfx::ColorSpace::MatrixID::FCC; matrix_id = gfx::ColorSpace::MatrixID::FCC;
break; break;
case MatrixID::BT470BG: case MatrixID::BT470BG:
matrix_id = gfx::ColorSpace::MatrixID::BT470BG; matrix_id = gfx::ColorSpace::MatrixID::BT470BG;
guess |= GUESS_BT470BG;
break; break;
case MatrixID::SMPTE170M: case MatrixID::SMPTE170M:
matrix_id = gfx::ColorSpace::MatrixID::SMPTE170M; matrix_id = gfx::ColorSpace::MatrixID::SMPTE170M;
guess |= GUESS_SMPTE170M;
break; break;
case MatrixID::SMPTE240M: case MatrixID::SMPTE240M:
matrix_id = gfx::ColorSpace::MatrixID::SMPTE240M; matrix_id = gfx::ColorSpace::MatrixID::SMPTE240M;
guess |= GUESS_SMPTE240M;
break; break;
case MatrixID::YCOCG: case MatrixID::YCOCG:
matrix_id = gfx::ColorSpace::MatrixID::YCOCG; matrix_id = gfx::ColorSpace::MatrixID::YCOCG;
...@@ -197,6 +221,67 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const { ...@@ -197,6 +221,67 @@ gfx::ColorSpace VideoColorSpace::ToGfxColorSpace() const {
case MatrixID::YDZDX: case MatrixID::YDZDX:
matrix_id = gfx::ColorSpace::MatrixID::YDZDX; matrix_id = gfx::ColorSpace::MatrixID::YDZDX;
break; break;
case MatrixID::INVALID:
case MatrixID::UNSPECIFIED:
break;
}
// Removes lowest bit until only a single bit remains.
while (guess & (guess - 1)) {
guess &= guess - 1;
}
if (!guess)
guess = GUESS_BT709;
if (primary_id == gfx::ColorSpace::PrimaryID::INVALID) {
switch (guess) {
case GUESS_BT709:
primary_id = gfx::ColorSpace::PrimaryID::BT709;
break;
case GUESS_BT470M:
primary_id = gfx::ColorSpace::PrimaryID::BT470M;
break;
case GUESS_BT470BG:
primary_id = gfx::ColorSpace::PrimaryID::BT470BG;
break;
case GUESS_SMPTE170M:
primary_id = gfx::ColorSpace::PrimaryID::SMPTE170M;
break;
case GUESS_SMPTE240M:
primary_id = gfx::ColorSpace::PrimaryID::SMPTE240M;
break;
}
}
if (transfer_id == gfx::ColorSpace::TransferID::INVALID) {
switch (guess) {
case GUESS_BT709:
transfer_id = gfx::ColorSpace::TransferID::BT709;
break;
case GUESS_BT470M:
case GUESS_BT470BG:
case GUESS_SMPTE170M:
transfer_id = gfx::ColorSpace::TransferID::SMPTE170M;
break;
case GUESS_SMPTE240M:
transfer_id = gfx::ColorSpace::TransferID::SMPTE240M;
break;
}
}
if (matrix_id == gfx::ColorSpace::MatrixID::INVALID) {
switch (guess) {
case GUESS_BT709:
matrix_id = gfx::ColorSpace::MatrixID::BT709;
break;
case GUESS_BT470M:
case GUESS_BT470BG:
case GUESS_SMPTE170M:
matrix_id = gfx::ColorSpace::MatrixID::SMPTE170M;
break;
case GUESS_SMPTE240M:
matrix_id = gfx::ColorSpace::MatrixID::SMPTE240M;
break;
}
} }
return gfx::ColorSpace(primary_id, transfer_id, matrix_id, range); return gfx::ColorSpace(primary_id, transfer_id, matrix_id, range);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment