diff options
Diffstat (limited to 'vp9/encoder')
-rw-r--r-- | vp9/encoder/vp9_bitstream.c | 26 | ||||
-rw-r--r-- | vp9/encoder/vp9_onyx_if.c | 37 |
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); |