shithub: libvpx

Download patch

ref: e5b956f620ffc3b84c71b88e41e67c15095f7c1c
parent: a425e2cc0658ffdcc4dbc97edb62e24bc8a794a5
author: John Koleszar <jkoleszar@google.com>
date: Thu Jun 6 19:53:56 EDT 2013

Add bits for colorspace, profile

Adds 3 bits for colorspace (sent on keyframes), 2 bits for version.

Change-Id: Iaa0cf1dcdd085cebb46e2bc4a7c78cd33cf24325

--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -907,6 +907,11 @@
   vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, "Truncated packet");
 }
 
+#define RESERVED \
+  if (vp9_rb_read_bit(rb)) \
+      vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM, \
+                         "Reserved bit must be unset")
+
 size_t read_uncompressed_header(VP9D_COMP *pbi,
                                 struct vp9_read_bit_buffer *rb) {
   VP9_COMMON *const cm = &pbi->common;
@@ -914,12 +919,17 @@
 
   int scaling_active, i;
   cm->last_frame_type = cm->frame_type;
+  if (vp9_rb_read_literal(rb, 2) != 0x2)
+      vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM,
+                         "Invalid frame marker");
+
+  cm->version = vp9_rb_read_bit(rb);
+  RESERVED;
+
   cm->frame_type = (FRAME_TYPE) vp9_rb_read_bit(rb);
-  cm->version = vp9_rb_read_literal(rb, 3);
   cm->show_frame = vp9_rb_read_bit(rb);
   scaling_active = vp9_rb_read_bit(rb);
-  cm->subsampling_x = vp9_rb_read_bit(rb);
-  cm->subsampling_y = vp9_rb_read_bit(rb);
+  RESERVED;
 
   if (cm->frame_type == KEY_FRAME) {
     if (vp9_rb_read_literal(rb, 8) != SYNC_CODE_0 ||
@@ -927,6 +937,14 @@
         vp9_rb_read_literal(rb, 8) != SYNC_CODE_2) {
       vpx_internal_error(&cm->error, VPX_CODEC_UNSUP_BITSTREAM,
                          "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
+    } else {
+      cm->subsampling_y = cm->subsampling_x = 1;
     }
   }
 
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -1317,17 +1317,37 @@
   const int scaling_active = cm->width != cm->display_width ||
                              cm->height != cm->display_height;
 
+  // frame marker bits
+  vp9_wb_write_bit(wb, 1);
+  vp9_wb_write_bit(wb, 0);
+
+  // bitstream version.
+  // 00 - profile 0. 4:2:0 only
+  // 10 - profile 1. adds 4:4:4, 4:2:2, alpha
+  vp9_wb_write_bit(wb, cm->version);
+  vp9_wb_write_bit(wb, 0);
+
   vp9_wb_write_bit(wb, cm->frame_type);
-  vp9_wb_write_literal(wb, cm->version, 3);
   vp9_wb_write_bit(wb, cm->show_frame);
   vp9_wb_write_bit(wb, scaling_active);
-  vp9_wb_write_bit(wb, cm->subsampling_x);
-  vp9_wb_write_bit(wb, cm->subsampling_y);
+  vp9_wb_write_bit(wb, 0);
 
   if (cm->frame_type == KEY_FRAME) {
     vp9_wb_write_literal(wb, SYNC_CODE_0, 8);
     vp9_wb_write_literal(wb, SYNC_CODE_1, 8);
     vp9_wb_write_literal(wb, SYNC_CODE_2, 8);
+    // colorspaces
+    // 000 - Unknown
+    // 001 - BT.601
+    // 010 - BT.709
+    // 011 - xvYCC
+    // 1xx - Reserved
+    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);
+      vp9_wb_write_bit(wb, 0);  // has extra plane
+    }
   }
 
   if (scaling_active) {
--- a/vp9/vp9_dx_iface.c
+++ b/vp9/vp9_dx_iface.c
@@ -217,7 +217,7 @@
   else {
     si->is_kf = 0;
 
-    if (data_sz >= 8 && !(data[0] & 0x80)) { /* I-Frame */
+    if (data_sz >= 8 && (data[0] & 0xD8) == 0x80) { /* I-Frame */
       const uint8_t *c = data + 1;
       si->is_kf = 1;