diff options
author | John Koleszar <jkoleszar@google.com> | 2013-06-07 11:41:02 -0700 |
---|---|---|
committer | Gerrit Code Review <gerrit@gerrit.golo.chromium.org> | 2013-06-07 11:41:02 -0700 |
commit | 229f9a5f0942a7902bceb0d6a4149e17c9293447 (patch) | |
tree | 753d7a1a769bf880f0d0635788a4a387c0a8f832 | |
parent | 8c6bff6c0c819b68c8d24c82b0935e79924f063d (diff) | |
parent | e5b956f620ffc3b84c71b88e41e67c15095f7c1c (diff) | |
download | libvpx-229f9a5f0942a7902bceb0d6a4149e17c9293447.tar libvpx-229f9a5f0942a7902bceb0d6a4149e17c9293447.tar.gz libvpx-229f9a5f0942a7902bceb0d6a4149e17c9293447.tar.bz2 libvpx-229f9a5f0942a7902bceb0d6a4149e17c9293447.zip |
Merge "Add bits for colorspace, profile" into experimental
-rw-r--r-- | vp9/decoder/vp9_decodframe.c | 24 | ||||
-rw-r--r-- | vp9/encoder/vp9_bitstream.c | 26 | ||||
-rw-r--r-- | vp9/vp9_dx_iface.c | 2 |
3 files changed, 45 insertions, 7 deletions
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c index 3eb17b065..0d7ffaa80 100644 --- a/vp9/decoder/vp9_decodframe.c +++ b/vp9/decoder/vp9_decodframe.c @@ -916,6 +916,11 @@ static void error_handler(void *data, int bit_offset) { 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; @@ -923,12 +928,17 @@ size_t read_uncompressed_header(VP9D_COMP *pbi, 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 || @@ -937,6 +947,14 @@ size_t read_uncompressed_header(VP9D_COMP *pbi, 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; + } } setup_frame_size(pbi, scaling_active, rb); diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c index 9e0713ad3..aea9fb6b1 100644 --- a/vp9/encoder/vp9_bitstream.c +++ b/vp9/encoder/vp9_bitstream.c @@ -1301,17 +1301,37 @@ void write_uncompressed_header(VP9_COMP *cpi, 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) { diff --git a/vp9/vp9_dx_iface.c b/vp9/vp9_dx_iface.c index b5aa10d52..32cd62037 100644 --- a/vp9/vp9_dx_iface.c +++ b/vp9/vp9_dx_iface.c @@ -217,7 +217,7 @@ static vpx_codec_err_t vp8_peek_si(const uint8_t *data, 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; |