summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vp9/decoder/vp9_decodframe.c25
-rw-r--r--vp9/encoder/vp9_bitstream.c19
2 files changed, 33 insertions, 11 deletions
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index 1e2c7534a..deb39561d 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -959,6 +959,8 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi,
cm->error_resilient_mode = vp9_rb_read_bit(rb);
if (cm->frame_type == KEY_FRAME) {
+ int csp;
+
if (vp9_rb_read_literal(rb, 8) != SYNC_CODE_0 ||
vp9_rb_read_literal(rb, 8) != SYNC_CODE_1 ||
vp9_rb_read_literal(rb, 8) != SYNC_CODE_2) {
@@ -966,13 +968,24 @@ static size_t read_uncompressed_header(VP9D_COMP *pbi,
"Invalid frame sync code");
}
- vp9_rb_read_literal(rb, 3); // colorspace
- if (cm->version == 1) {
- cm->subsampling_x = vp9_rb_read_bit(rb);
- cm->subsampling_y = vp9_rb_read_bit(rb);
- vp9_rb_read_bit(rb); // has extra plane
+ csp = vp9_rb_read_literal(rb, 3); // colorspace
+ if (csp != 7) { // != sRGB
+ vp9_rb_read_bit(rb); // [16,235] (including xvycc) vs [0,255] range
+ if (cm->version == 1) {
+ cm->subsampling_x = vp9_rb_read_bit(rb);
+ cm->subsampling_y = vp9_rb_read_bit(rb);
+ vp9_rb_read_bit(rb); // has extra plane
+ } else {
+ cm->subsampling_y = cm->subsampling_x = 1;
+ }
} else {
- cm->subsampling_y = cm->subsampling_x = 1;
+ if (cm->version == 1) {
+ cm->subsampling_y = cm->subsampling_x = 0;
+ vp9_rb_read_bit(rb); // has extra plane
+ } else {
+ vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM,
+ "RGB not supported in profile 0");
+ }
}
vp9_setup_past_independence(cm, xd);
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c
index 8d5dc286a..2070432b2 100644
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -1361,12 +1361,21 @@ static void write_uncompressed_header(VP9_COMP *cpi,
// 000 - Unknown
// 001 - BT.601
// 010 - BT.709
- // 011 - xvYCC
- // 1xx - Reserved
+ // 011 - SMPTE-170
+ // 100 - SMPTE-240
+ // 101 - Reserved
+ // 110 - Reserved
+ // 111 - sRGB (RGB)
vp9_wb_write_literal(wb, 0, 3);
- if (cm->version == 1) {
- vp9_wb_write_bit(wb, cm->subsampling_x);
- vp9_wb_write_bit(wb, cm->subsampling_y);
+ if (1 /* colorspace != sRGB */) {
+ vp9_wb_write_bit(wb, 0); // 0: [16, 235] (i.e. xvYCC), 1: [0, 255]
+ if (cm->version == 1) {
+ vp9_wb_write_bit(wb, cm->subsampling_x);
+ vp9_wb_write_bit(wb, cm->subsampling_y);
+ vp9_wb_write_bit(wb, 0); // has extra plane
+ }
+ } else {
+ assert(cm->version == 1);
vp9_wb_write_bit(wb, 0); // has extra plane
}