summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
authorJohn Koleszar <jkoleszar@google.com>2013-03-14 14:36:08 -0700
committerJohn Koleszar <jkoleszar@google.com>2013-03-18 12:02:20 -0700
commit8a3f55f2d459b1de112502d32719ffa56fe7604c (patch)
tree5c1b84bce10c6fcde2b9b643e1846f448893de99 /vp9/encoder
parentc5b317057b292718afc07a842b69f5f06caadb4e (diff)
downloadlibvpx-8a3f55f2d459b1de112502d32719ffa56fe7604c.tar
libvpx-8a3f55f2d459b1de112502d32719ffa56fe7604c.tar.gz
libvpx-8a3f55f2d459b1de112502d32719ffa56fe7604c.tar.bz2
libvpx-8a3f55f2d459b1de112502d32719ffa56fe7604c.zip
Replace scaling byte with explicit display size
If the intended display size is different than the size the frame is coded at, then send that size explicitly in the bitstream. Adds a new bit to the frame header to indicate whether the extra size fields are present. Change-Id: I525c66f22d207efaf1e5f903c6a2a91b80245854
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_bitstream.c26
-rw-r--r--vp9/encoder/vp9_onyx_if.c37
2 files changed, 30 insertions, 33 deletions
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c
index 84d412397..c96ae6a1c 100644
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -2270,7 +2270,18 @@ void vp9_pack_bitstream(VP9_COMP *cpi, unsigned char *dest,
{
int v;
- // support arbitrary resolutions
+ if (pc->Width != pc->display_width || pc->Height != pc->display_height) {
+ v = pc->display_width;
+ cx_data[0] = v;
+ cx_data[1] = v >> 8;
+
+ v = pc->display_height;
+ cx_data[2] = v;
+ cx_data[3] = v >> 8;
+ cx_data += 4;
+ extra_bytes_packed += 4;
+ }
+
v = pc->Width;
cx_data[0] = v;
cx_data[1] = v >> 8;
@@ -2279,11 +2290,8 @@ void vp9_pack_bitstream(VP9_COMP *cpi, unsigned char *dest,
cx_data[2] = v;
cx_data[3] = v >> 8;
- // use a separate byte to store the scale factors, each ranging 0-15
- cx_data[4] = (pc->horiz_scale << 4) | (pc->vert_scale);
-
- extra_bytes_packed += 5;
- cx_data += 5;
+ extra_bytes_packed += 4;
+ cx_data += 4;
}
vp9_start_encode(&header_bc, cx_data);
@@ -2801,11 +2809,15 @@ void vp9_pack_bitstream(VP9_COMP *cpi, unsigned char *dest,
/* update frame tag */
{
- int v = (oh.first_partition_length_in_bytes << 5) |
+ int scaling = (pc->Width != pc->display_width
+ || pc->Height != pc->display_height);
+ int v = (oh.first_partition_length_in_bytes << 8) |
+ (scaling << 5) |
(oh.show_frame << 4) |
(oh.version << 1) |
oh.type;
+ assert(oh.first_partition_length_in_bytes <= 0xffff);
dest[0] = v;
dest[1] = v >> 8;
dest[2] = v >> 16;
diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c
index 57ebfa1b1..9c0fb6c64 100644
--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -1115,6 +1115,9 @@ static void init_config(VP9_PTR ptr, VP9_CONFIG *oxcf) {
cm->version = oxcf->Version;
vp9_setup_version(cm);
+ cm->Width = oxcf->Width;
+ cm->Height = oxcf->Height;
+
// change includes all joint functionality
vp9_change_config(ptr, oxcf);
@@ -1299,8 +1302,8 @@ void vp9_change_config(VP9_PTR ptr, VP9_CONFIG *oxcf) {
cpi->target_bandwidth = cpi->oxcf.target_bandwidth;
- cm->Width = cpi->oxcf.Width;
- cm->Height = cpi->oxcf.Height;
+ cm->display_width = cpi->oxcf.Width;
+ cm->display_height = cpi->oxcf.Height;
// VP8 sharpness level mapping 0-7 (vs 0-10 in general VPx dialogs)
if (cpi->oxcf.Sharpness > 7)
@@ -1308,18 +1311,6 @@ void vp9_change_config(VP9_PTR ptr, VP9_CONFIG *oxcf) {
cm->sharpness_level = cpi->oxcf.Sharpness;
- if (cm->horiz_scale != NORMAL || cm->vert_scale != NORMAL) {
- int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
- int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
-
- Scale2Ratio(cm->horiz_scale, &hr, &hs);
- Scale2Ratio(cm->vert_scale, &vr, &vs);
-
- // always go to the next whole number
- cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
- cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
- }
-
// Increasing the size of the frame beyond the first seen frame, or some
// otherwise signalled maximum size, is not supported.
// TODO(jkoleszar): exit gracefully.
@@ -4149,6 +4140,7 @@ int vp9_set_internal_size(VP9_PTR comp,
VPX_SCALING horiz_mode, VPX_SCALING vert_mode) {
VP9_COMP *cpi = (VP9_COMP *) comp;
VP9_COMMON *cm = &cpi->common;
+ int hr = 0, hs = 0, vr = 0, vs = 0;
if (horiz_mode > ONETWO)
return -1;
@@ -4156,20 +4148,13 @@ int vp9_set_internal_size(VP9_PTR comp,
if (vert_mode > ONETWO)
return -1;
- if (cm->horiz_scale != horiz_mode || cm->vert_scale != vert_mode) {
- int UNINITIALIZED_IS_SAFE(hr), UNINITIALIZED_IS_SAFE(hs);
- int UNINITIALIZED_IS_SAFE(vr), UNINITIALIZED_IS_SAFE(vs);
-
- cm->horiz_scale = horiz_mode;
- cm->vert_scale = vert_mode;
+ Scale2Ratio(horiz_mode, &hr, &hs);
+ Scale2Ratio(vert_mode, &vr, &vs);
- Scale2Ratio(cm->horiz_scale, &hr, &hs);
- Scale2Ratio(cm->vert_scale, &vr, &vs);
+ // always go to the next whole number
+ cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
+ cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
- // always go to the next whole number
- cm->Width = (hs - 1 + cpi->oxcf.Width * hr) / hs;
- cm->Height = (vs - 1 + cpi->oxcf.Height * vr) / vs;
- }
assert(cm->Width <= cpi->initial_width);
assert(cm->Height <= cpi->initial_height);
update_frame_size(cpi);