]> granicus.if.org Git - libvpx/commitdiff
Fix bug in extend_frame chroma extended too far
authorAdrian Grange <agrange@google.com>
Fri, 22 Nov 2013 01:19:04 +0000 (17:19 -0800)
committerAdrian Grange <agrange@google.com>
Fri, 22 Nov 2013 17:55:10 +0000 (09:55 -0800)
This fixes issue 667.

In the case where the frame was an odd number of pixels
wide or high, the border was being extended by one col
or row too far.

The calculation of color plane dimensions was modified
to use those already computed at the time the frame
buffer was allocated.

Also freed the temporary scaling buffer in vpxdec to
prevent a memory leak.

Change-Id: Ied04bdcdfd77469731408c05da205db1a6f89bf5

vpx_scale/generic/yv12extend.c
vpxdec.c

index f2aec2b7a1abff1ac46aeb7c2491b7c4402f4bd1..7896dfee639c4e71912b4501df7b8cc70a293809 100644 (file)
@@ -84,14 +84,13 @@ void vp8_yv12_extend_frame_borders_c(YV12_BUFFER_CONFIG *ybf) {
 static void extend_frame(YV12_BUFFER_CONFIG *const ybf,
                          int subsampling_x, int subsampling_y,
                          int ext_size) {
-  const int c_w = (ybf->y_crop_width + subsampling_x) >> subsampling_x;
-  const int c_h = (ybf->y_crop_height + subsampling_y) >> subsampling_y;
-  const int c_et = ext_size >> subsampling_y;
-  const int c_el = ext_size >> subsampling_x;
-  const int c_eb = (ext_size + ybf->y_height - ybf->y_crop_height +
-                    subsampling_y) >> subsampling_y;
-  const int c_er = (ext_size + ybf->y_width - ybf->y_crop_width +
-                    subsampling_x) >> subsampling_x;
+  const int c_w = ybf->uv_crop_width;
+  const int c_h = ybf->uv_crop_height;
+  const int c_ext_size = ext_size >> 1;
+  const int c_et = c_ext_size;
+  const int c_el = c_ext_size;
+  const int c_eb = c_ext_size + ybf->uv_height - ybf->uv_crop_height;
+  const int c_er = c_ext_size + ybf->uv_width - ybf->uv_crop_width;
 
   assert(ybf->y_height - ybf->y_crop_height < 16);
   assert(ybf->y_width - ybf->y_crop_width < 16);
index dc2eec826cbd793c56a5cd5d9d138c18eeb78deb..633b9635114d24a9ec46a41cf37b9d45ed8b94f3 100644 (file)
--- a/vpxdec.c
+++ b/vpxdec.c
@@ -857,7 +857,8 @@ int main_loop(int argc, const char **argv_) {
 fail:
 
   if (vpx_codec_destroy(&decoder)) {
-    fprintf(stderr, "Failed to destroy decoder: %s\n", vpx_codec_error(&decoder));
+    fprintf(stderr, "Failed to destroy decoder: %s\n",
+            vpx_codec_error(&decoder));
     return EXIT_FAILURE;
   }
 
@@ -869,6 +870,8 @@ fail:
   else
     free(buf);
 
+  if (scaled_img) vpx_img_free(scaled_img);
+
   fclose(infile);
   free(argv);