diff --git a/vp9/common/vp9_onyx.h b/vp9/common/vp9_onyx.h
index d93b7d5fb91c8f6942b240ce015c180be6deed4c..79d060945bbbb1befcdf3805a4d45bde7a065bc5 100644
--- a/vp9/common/vp9_onyx.h
+++ b/vp9/common/vp9_onyx.h
@@ -94,7 +94,7 @@ extern "C"
     int Width;              // width of data passed to the compressor
     int Height;             // height of data passed to the compressor
     double frame_rate;       // set to passed in framerate
-    int target_bandwidth;    // bandwidth to be used in kilobits per second
+    int64_t target_bandwidth;    // bandwidth to be used in kilobits per second
 
     int noise_sensitivity;   // parameter used for applying pre processing blur: recommendation 0
     int Sharpness;          // parameter used for sharpening output: recommendation 0:
@@ -135,9 +135,9 @@ extern "C"
     int over_shoot_pct;
 
     // buffering parameters
-    int starting_buffer_level;  // in seconds
-    int optimal_buffer_level;
-    int maximum_buffer_size;
+    int64_t starting_buffer_level;  // in seconds
+    int64_t optimal_buffer_level;
+    int64_t maximum_buffer_size;
 
     // controlling quality
     int fixed_q;
diff --git a/vp9/decoder/vp9_decodframe.c b/vp9/decoder/vp9_decodframe.c
index 86806d2d0143b6906688530ece299628f9090f32..785eb3a2f9c5abcaa5f8f6cc250f87ad90956d0a 100644
--- a/vp9/decoder/vp9_decodframe.c
+++ b/vp9/decoder/vp9_decodframe.c
@@ -1267,13 +1267,14 @@ int vp9_decode_frame(VP9D_COMP *pbi, const unsigned char **p_data_end) {
        * if we have enough data. Otherwise we will end up with the wrong
        * size.
        */
-      if (data + 4 < data_end) {
-        pc->Width = (data[0] | (data[1] << 8)) & 0x3fff;
-        pc->horiz_scale = data[1] >> 6;
-        pc->Height = (data[2] | (data[3] << 8)) & 0x3fff;
-        pc->vert_scale = data[3] >> 6;
+      if (data + 5 < data_end) {
+        pc->Width  = (data[0] | (data[1] << 8));
+        pc->Height = (data[2] | (data[3] << 8));
+
+        pc->horiz_scale = data[4] >> 4;
+        pc->vert_scale  = data[4] & 0x0F;
       }
-      data += 4;
+      data += 5;
 
       if (width != pc->Width || height != pc->Height) {
         if (pc->Width <= 0) {
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c
index 7101947a6a6660ae9c18bdba76e1c623941d959d..d0e97db7baa5e194560da71a22b867060026a347 100644
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -1500,17 +1500,20 @@ void vp9_pack_bitstream(VP9_COMP *cpi, unsigned char *dest,
   {
     int v;
 
-    /* TODO(jkoleszar): support arbitrary resolutions */
-    v = (pc->horiz_scale << 14) | pc->Width;
+    // support arbitrary resolutions
+    v = pc->Width;
     cx_data[0] = v;
     cx_data[1] = v >> 8;
 
-    v = (pc->vert_scale << 14) | pc->Height;
+    v = pc->Height;
     cx_data[2] = v;
     cx_data[3] = v >> 8;
 
-    extra_bytes_packed += 4;
-    cx_data += 4;
+    // 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;
   }
 
   vp9_start_encode(&header_bc, cx_data);
diff --git a/vp9/encoder/vp9_encodeframe.c b/vp9/encoder/vp9_encodeframe.c
index 5271a597c35a159dcd4fbc24f60c765486c0e120..6d02fa75b4509a157f7b4f59c2ab3c5de3340fa3 100644
--- a/vp9/encoder/vp9_encodeframe.c
+++ b/vp9/encoder/vp9_encodeframe.c
@@ -1247,8 +1247,8 @@ static void encode_frame_internal(VP9_COMP *cpi) {
   MACROBLOCKD *const xd = &x->e_mbd;
   int totalrate;
 
-  // printf("encode_frame_internal frame %d (%d)\n",
-  //        cpi->common.current_video_frame, cpi->common.show_frame);
+//   fprintf(stderr, "encode_frame_internal frame %d (%d)\n",
+//          cpi->common.current_video_frame, cpi->common.show_frame);
 
   // Compute a modified set of reference frame probabilities to use when
   // prediction fails. These are based on the current general estimates for
@@ -1329,12 +1329,11 @@ static void encode_frame_internal(VP9_COMP *cpi) {
       // Take tiles into account and give start/end MB
       int tile_col;
       TOKENEXTRA *tp = cpi->tok;
-
       for (tile_col = 0; tile_col < cm->tile_columns; tile_col++) {
         TOKENEXTRA *tp_old = tp;
-
         // For each row of SBs in the frame
         vp9_get_tile_col_offsets(cm, tile_col);
+
         for (mb_row = 0; mb_row < cm->mb_rows; mb_row += 4) {
           encode_sb_row(cpi, mb_row, &tp, &totalrate);
         }
diff --git a/vp9/encoder/vp9_onyx_if.c b/vp9/encoder/vp9_onyx_if.c
index 5278ac2a31cf066a0c278d1800c8f8b5068b4aa2..6335827cfcd7be7b09b5cc3134c033401c7afd69 100644
--- a/vp9/encoder/vp9_onyx_if.c
+++ b/vp9/encoder/vp9_onyx_if.c
@@ -1086,14 +1086,12 @@ void vp9_new_frame_rate(VP9_COMP *cpi, double framerate) {
     cpi->max_gf_interval = cpi->twopass.static_scene_max_gf_interval;
 }
 
-
-static int
-rescale(int val, int num, int denom) {
+static int64_t rescale(int val, int64_t num, int denom) {
   int64_t llnum = num;
   int64_t llden = denom;
   int64_t llval = val;
 
-  return (int)(llval * llnum / llden);
+  return (llval * llnum / llden);
 }
 
 static void set_tile_limits(VP9_COMP *cpi) {
diff --git a/vp9/encoder/vp9_onyx_int.h b/vp9/encoder/vp9_onyx_int.h
index 02a371964679346290bfbfa04617eaa8adbc1c17..0bc7bc835d5128791547366e889a44e5843de26a 100644
--- a/vp9/encoder/vp9_onyx_int.h
+++ b/vp9/encoder/vp9_onyx_int.h
@@ -485,7 +485,7 @@ typedef struct VP9_COMP {
   int kf_boost;
   int kf_zeromotion_pct;
 
-  int target_bandwidth;
+  int64_t target_bandwidth;
   struct vpx_codec_pkt_list  *output_pkt_list;
 
 #if 0
diff --git a/vp9/vp9_cx_iface.c b/vp9/vp9_cx_iface.c
index 2653954d06e766a8e7c15d1b350310fa5ff86b6b..db7a2fd11a463f2b8aa9ab42d7ba73bde198982f 100644
--- a/vp9/vp9_cx_iface.c
+++ b/vp9/vp9_cx_iface.c
@@ -126,8 +126,8 @@ update_error_state(vpx_codec_alg_priv_t                 *ctx,
 static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t      *ctx,
                                        const vpx_codec_enc_cfg_t *cfg,
                                        const struct vp8_extracfg *vp8_cfg) {
-  RANGE_CHECK(cfg, g_w,                   1, 16383); /* 14 bits available */
-  RANGE_CHECK(cfg, g_h,                   1, 16383); /* 14 bits available */
+  RANGE_CHECK(cfg, g_w,                   1, 65535); /* 16 bits available */
+  RANGE_CHECK(cfg, g_h,                   1, 65535); /* 16 bits available */
   RANGE_CHECK(cfg, g_timebase.den,        1, 1000000000);
   RANGE_CHECK(cfg, g_timebase.num,        1, cfg->g_timebase.den);
   RANGE_CHECK_HI(cfg, g_profile,          3);
diff --git a/vp9/vp9_dx_iface.c b/vp9/vp9_dx_iface.c
index b2ce9aa2e7d83559856af8f0147f8b385288379a..f2b80e1fbe894d2e3446f5f523622396859f5a5a 100644
--- a/vp9/vp9_dx_iface.c
+++ b/vp9/vp9_dx_iface.c
@@ -229,8 +229,8 @@ static vpx_codec_err_t vp8_peek_si(const uint8_t         *data,
       if (c[0] != 0x9d || c[1] != 0x01 || c[2] != 0x2a)
         res = VPX_CODEC_UNSUP_BITSTREAM;
 
-      si->w = (c[3] | (c[4] << 8)) & 0x3fff;
-      si->h = (c[5] | (c[6] << 8)) & 0x3fff;
+      si->w = (c[3] | (c[4] << 8));
+      si->h = (c[5] | (c[6] << 8));
 
       /*printf("w=%d, h=%d\n", si->w, si->h);*/
       if (!(si->h | si->w))