| OLD | NEW | 
|     1 /* |     1 /* | 
|     2  * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |     2  * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 
|     3  * |     3  * | 
|     4  *  Use of this source code is governed by a BSD-style license |     4  *  Use of this source code is governed by a BSD-style license | 
|     5  *  that can be found in the LICENSE file in the root of the source |     5  *  that can be found in the LICENSE file in the root of the source | 
|     6  *  tree. An additional intellectual property rights grant can be found |     6  *  tree. An additional intellectual property rights grant can be found | 
|     7  *  in the file PATENTS.  All contributing project authors may |     7  *  in the file PATENTS.  All contributing project authors may | 
|     8  *  be found in the AUTHORS file in the root of the source tree. |     8  *  be found in the AUTHORS file in the root of the source tree. | 
|     9  */ |     9  */ | 
|    10  |    10  | 
| (...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   476     cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height, |   476     cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height, | 
|   477                                         cm->subsampling_x, cm->subsampling_y, |   477                                         cm->subsampling_x, cm->subsampling_y, | 
|   478 #if CONFIG_VP9_HIGHBITDEPTH |   478 #if CONFIG_VP9_HIGHBITDEPTH | 
|   479                                       cm->use_highbitdepth, |   479                                       cm->use_highbitdepth, | 
|   480 #endif |   480 #endif | 
|   481                                       oxcf->lag_in_frames); |   481                                       oxcf->lag_in_frames); | 
|   482   if (!cpi->lookahead) |   482   if (!cpi->lookahead) | 
|   483     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, |   483     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
|   484                        "Failed to allocate lag buffers"); |   484                        "Failed to allocate lag buffers"); | 
|   485  |   485  | 
 |   486   // TODO(agrange) Check if ARF is enabled and skip allocation if not. | 
|   486   if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer, |   487   if (vp9_realloc_frame_buffer(&cpi->alt_ref_buffer, | 
|   487                                oxcf->width, oxcf->height, |   488                                oxcf->width, oxcf->height, | 
|   488                                cm->subsampling_x, cm->subsampling_y, |   489                                cm->subsampling_x, cm->subsampling_y, | 
|   489 #if CONFIG_VP9_HIGHBITDEPTH |   490 #if CONFIG_VP9_HIGHBITDEPTH | 
|   490                                cm->use_highbitdepth, |   491                                cm->use_highbitdepth, | 
|   491 #endif |   492 #endif | 
|   492                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, |   493                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, | 
|   493                                NULL, NULL, NULL)) |   494                                NULL, NULL, NULL)) | 
|   494     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, |   495     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
|   495                        "Failed to allocate altref buffer"); |   496                        "Failed to allocate altref buffer"); | 
|   496 } |   497 } | 
|   497  |   498  | 
|   498 static void alloc_ref_frame_buffers(VP9_COMP *cpi) { |  | 
|   499   VP9_COMMON *const cm = &cpi->common; |  | 
|   500   if (vp9_alloc_ref_frame_buffers(cm, cm->width, cm->height)) |  | 
|   501     vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, |  | 
|   502                        "Failed to allocate frame buffers"); |  | 
|   503 } |  | 
|   504  |  | 
|   505 static void alloc_util_frame_buffers(VP9_COMP *cpi) { |   499 static void alloc_util_frame_buffers(VP9_COMP *cpi) { | 
|   506   VP9_COMMON *const cm = &cpi->common; |   500   VP9_COMMON *const cm = &cpi->common; | 
|   507   if (vp9_realloc_frame_buffer(&cpi->last_frame_uf, |   501   if (vp9_realloc_frame_buffer(&cpi->last_frame_uf, | 
|   508                                cm->width, cm->height, |   502                                cm->width, cm->height, | 
|   509                                cm->subsampling_x, cm->subsampling_y, |   503                                cm->subsampling_x, cm->subsampling_y, | 
|   510 #if CONFIG_VP9_HIGHBITDEPTH |   504 #if CONFIG_VP9_HIGHBITDEPTH | 
|   511                                cm->use_highbitdepth, |   505                                cm->use_highbitdepth, | 
|   512 #endif |   506 #endif | 
|   513                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, |   507                                VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, | 
|   514                                NULL, NULL, NULL)) |   508                                NULL, NULL, NULL)) | 
| (...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1956  |  1950  | 
|  1957 typedef struct { |  1951 typedef struct { | 
|  1958   double psnr[4];       // total/y/u/v |  1952   double psnr[4];       // total/y/u/v | 
|  1959   uint64_t sse[4];      // total/y/u/v |  1953   uint64_t sse[4];      // total/y/u/v | 
|  1960   uint32_t samples[4];  // total/y/u/v |  1954   uint32_t samples[4];  // total/y/u/v | 
|  1961 } PSNR_STATS; |  1955 } PSNR_STATS; | 
|  1962  |  1956  | 
|  1963 static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b, |  1957 static void calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b, | 
|  1964                       PSNR_STATS *psnr) { |  1958                       PSNR_STATS *psnr) { | 
|  1965   static const double peak = 255.0; |  1959   static const double peak = 255.0; | 
|  1966   const int widths[3]        = {a->y_width,  a->uv_width,  a->uv_width }; |  1960   const int widths[3]        = { | 
|  1967   const int heights[3]       = {a->y_height, a->uv_height, a->uv_height}; |  1961       a->y_crop_width, a->uv_crop_width, a->uv_crop_width}; | 
|  1968   const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer,  a->v_buffer }; |  1962   const int heights[3]       = { | 
 |  1963       a->y_crop_height, a->uv_crop_height, a->uv_crop_height}; | 
 |  1964   const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer, a->v_buffer}; | 
|  1969   const int a_strides[3]     = {a->y_stride, a->uv_stride, a->uv_stride}; |  1965   const int a_strides[3]     = {a->y_stride, a->uv_stride, a->uv_stride}; | 
|  1970   const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer,  b->v_buffer }; |  1966   const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer, b->v_buffer}; | 
|  1971   const int b_strides[3]     = {b->y_stride, b->uv_stride, b->uv_stride}; |  1967   const int b_strides[3]     = {b->y_stride, b->uv_stride, b->uv_stride}; | 
|  1972   int i; |  1968   int i; | 
|  1973   uint64_t total_sse = 0; |  1969   uint64_t total_sse = 0; | 
|  1974   uint32_t total_samples = 0; |  1970   uint32_t total_samples = 0; | 
|  1975  |  1971  | 
|  1976   for (i = 0; i < 3; ++i) { |  1972   for (i = 0; i < 3; ++i) { | 
|  1977     const int w = widths[i]; |  1973     const int w = widths[i]; | 
|  1978     const int h = heights[i]; |  1974     const int h = heights[i]; | 
|  1979     const uint32_t samples = w * h; |  1975     const uint32_t samples = w * h; | 
|  1980     const uint64_t sse = get_sse(a_planes[i], a_strides[i], |  1976     const uint64_t sse = get_sse(a_planes[i], a_strides[i], | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  1993   psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak, |  1989   psnr->psnr[0] = vpx_sse_to_psnr((double)total_samples, peak, | 
|  1994                                   (double)total_sse); |  1990                                   (double)total_sse); | 
|  1995 } |  1991 } | 
|  1996  |  1992  | 
|  1997 #if CONFIG_VP9_HIGHBITDEPTH |  1993 #if CONFIG_VP9_HIGHBITDEPTH | 
|  1998 static void calc_highbd_psnr(const YV12_BUFFER_CONFIG *a, |  1994 static void calc_highbd_psnr(const YV12_BUFFER_CONFIG *a, | 
|  1999                              const YV12_BUFFER_CONFIG *b, |  1995                              const YV12_BUFFER_CONFIG *b, | 
|  2000                              PSNR_STATS *psnr, |  1996                              PSNR_STATS *psnr, | 
|  2001                              unsigned int bit_depth, |  1997                              unsigned int bit_depth, | 
|  2002                              unsigned int in_bit_depth) { |  1998                              unsigned int in_bit_depth) { | 
|  2003   const int widths[3] = {a->y_width,  a->uv_width,  a->uv_width }; |  1999   const int widths[3] = | 
|  2004   const int heights[3] = {a->y_height, a->uv_height, a->uv_height}; |  2000       {a->y_crop_width,  a->uv_crop_width,  a->uv_crop_width }; | 
 |  2001   const int heights[3] = | 
 |  2002       {a->y_crop_height, a->uv_crop_height, a->uv_crop_height}; | 
|  2005   const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer,  a->v_buffer }; |  2003   const uint8_t *a_planes[3] = {a->y_buffer, a->u_buffer,  a->v_buffer }; | 
|  2006   const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride}; |  2004   const int a_strides[3] = {a->y_stride, a->uv_stride, a->uv_stride}; | 
|  2007   const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer,  b->v_buffer }; |  2005   const uint8_t *b_planes[3] = {b->y_buffer, b->u_buffer,  b->v_buffer }; | 
|  2008   const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride}; |  2006   const int b_strides[3] = {b->y_stride, b->uv_stride, b->uv_stride}; | 
|  2009   int i; |  2007   int i; | 
|  2010   uint64_t total_sse = 0; |  2008   uint64_t total_sse = 0; | 
|  2011   uint32_t total_samples = 0; |  2009   uint32_t total_samples = 0; | 
|  2012   const double peak = (double)((1 << in_bit_depth) - 1); |  2010   const double peak = (double)((1 << in_bit_depth) - 1); | 
|  2013   const unsigned int input_shift = bit_depth - in_bit_depth; |  2011   const unsigned int input_shift = bit_depth - in_bit_depth; | 
|  2014  |  2012  | 
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2472                                lf->filter_level, 0, 0, |  2470                                lf->filter_level, 0, 0, | 
|  2473                                cpi->workers, cpi->num_workers, |  2471                                cpi->workers, cpi->num_workers, | 
|  2474                                &cpi->lf_row_sync); |  2472                                &cpi->lf_row_sync); | 
|  2475     else |  2473     else | 
|  2476       vp9_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0); |  2474       vp9_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0); | 
|  2477   } |  2475   } | 
|  2478  |  2476  | 
|  2479   vp9_extend_frame_inner_borders(cm->frame_to_show); |  2477   vp9_extend_frame_inner_borders(cm->frame_to_show); | 
|  2480 } |  2478 } | 
|  2481  |  2479  | 
 |  2480 static INLINE void alloc_frame_mvs(const VP9_COMMON *cm, | 
 |  2481                                    int buffer_idx) { | 
 |  2482   RefCntBuffer *const new_fb_ptr = &cm->buffer_pool->frame_bufs[buffer_idx]; | 
 |  2483   if (new_fb_ptr->mvs == NULL || | 
 |  2484       new_fb_ptr->mi_rows < cm->mi_rows || | 
 |  2485       new_fb_ptr->mi_cols < cm->mi_cols) { | 
 |  2486     vpx_free(new_fb_ptr->mvs); | 
 |  2487     new_fb_ptr->mvs = | 
 |  2488       (MV_REF *)vpx_calloc(cm->mi_rows * cm->mi_cols, | 
 |  2489                            sizeof(*new_fb_ptr->mvs)); | 
 |  2490     new_fb_ptr->mi_rows = cm->mi_rows; | 
 |  2491     new_fb_ptr->mi_cols = cm->mi_cols; | 
 |  2492   } | 
 |  2493 } | 
 |  2494  | 
|  2482 void vp9_scale_references(VP9_COMP *cpi) { |  2495 void vp9_scale_references(VP9_COMP *cpi) { | 
|  2483   VP9_COMMON *cm = &cpi->common; |  2496   VP9_COMMON *cm = &cpi->common; | 
|  2484   MV_REFERENCE_FRAME ref_frame; |  2497   MV_REFERENCE_FRAME ref_frame; | 
|  2485   const VP9_REFFRAME ref_mask[3] = {VP9_LAST_FLAG, VP9_GOLD_FLAG, VP9_ALT_FLAG}; |  2498   const VP9_REFFRAME ref_mask[3] = {VP9_LAST_FLAG, VP9_GOLD_FLAG, VP9_ALT_FLAG}; | 
|  2486  |  2499  | 
|  2487   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { |  2500   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { | 
|  2488     // Need to convert from VP9_REFFRAME to index into ref_mask (subtract 1). |  2501     // Need to convert from VP9_REFFRAME to index into ref_mask (subtract 1). | 
|  2489     if (cpi->ref_frame_flags & ref_mask[ref_frame - 1]) { |  2502     if (cpi->ref_frame_flags & ref_mask[ref_frame - 1]) { | 
|  2490       const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]; |  2503       BufferPool *const pool = cm->buffer_pool; | 
|  2491        BufferPool *const pool = cm->buffer_pool; |  2504       const YV12_BUFFER_CONFIG *const ref = get_ref_frame_buffer(cpi, | 
|  2492       const YV12_BUFFER_CONFIG *const ref = &pool->frame_bufs[idx].buf; |  2505                                                                  ref_frame); | 
 |  2506  | 
 |  2507       if (ref == NULL) { | 
 |  2508         cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX; | 
 |  2509         continue; | 
 |  2510       } | 
|  2493  |  2511  | 
|  2494 #if CONFIG_VP9_HIGHBITDEPTH |  2512 #if CONFIG_VP9_HIGHBITDEPTH | 
|  2495       if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) { |  2513       if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) { | 
|  2496         const int new_fb = get_free_fb(cm); |  2514         const int new_fb = get_free_fb(cm); | 
 |  2515         RefCntBuffer *const new_fb_ptr = &pool->frame_bufs[new_fb]; | 
|  2497         cm->cur_frame = &pool->frame_bufs[new_fb]; |  2516         cm->cur_frame = &pool->frame_bufs[new_fb]; | 
|  2498         vp9_realloc_frame_buffer(&pool->frame_bufs[new_fb].buf, |  2517         vp9_realloc_frame_buffer(&pool->frame_bufs[new_fb].buf, | 
|  2499                                  cm->width, cm->height, |  2518                                  cm->width, cm->height, | 
|  2500                                  cm->subsampling_x, cm->subsampling_y, |  2519                                  cm->subsampling_x, cm->subsampling_y, | 
|  2501                                  cm->use_highbitdepth, |  2520                                  cm->use_highbitdepth, | 
|  2502                                  VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, |  2521                                  VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, | 
|  2503                                  NULL, NULL, NULL); |  2522                                  NULL, NULL, NULL); | 
|  2504         scale_and_extend_frame(ref, &pool->frame_bufs[new_fb].buf, |  2523         scale_and_extend_frame(ref, &new_fb_ptr->buf, (int)cm->bit_depth); | 
|  2505                                (int)cm->bit_depth); |  | 
|  2506 #else |  2524 #else | 
|  2507       if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) { |  2525       if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) { | 
|  2508         const int new_fb = get_free_fb(cm); |  2526         const int new_fb = get_free_fb(cm); | 
|  2509         vp9_realloc_frame_buffer(&pool->frame_bufs[new_fb].buf, |  2527         RefCntBuffer *const new_fb_ptr = &pool->frame_bufs[new_fb]; | 
 |  2528         vp9_realloc_frame_buffer(&new_fb_ptr->buf, | 
|  2510                                  cm->width, cm->height, |  2529                                  cm->width, cm->height, | 
|  2511                                  cm->subsampling_x, cm->subsampling_y, |  2530                                  cm->subsampling_x, cm->subsampling_y, | 
|  2512                                  VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, |  2531                                  VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, | 
|  2513                                  NULL, NULL, NULL); |  2532                                  NULL, NULL, NULL); | 
|  2514         scale_and_extend_frame(ref, &pool->frame_bufs[new_fb].buf); |  2533         scale_and_extend_frame(ref, &new_fb_ptr->buf); | 
|  2515 #endif  // CONFIG_VP9_HIGHBITDEPTH |  2534 #endif  // CONFIG_VP9_HIGHBITDEPTH | 
|  2516         cpi->scaled_ref_idx[ref_frame - 1] = new_fb; |  2535         cpi->scaled_ref_idx[ref_frame - 1] = new_fb; | 
|  2517         if (pool->frame_bufs[new_fb].mvs == NULL || |  2536  | 
|  2518             pool->frame_bufs[new_fb].mi_rows < cm->mi_rows || |  2537         alloc_frame_mvs(cm, new_fb); | 
|  2519             pool->frame_bufs[new_fb].mi_cols < cm->mi_cols) { |  | 
|  2520           vpx_free(pool->frame_bufs[new_fb].mvs); |  | 
|  2521           pool->frame_bufs[new_fb].mvs = |  | 
|  2522             (MV_REF *)vpx_calloc(cm->mi_rows * cm->mi_cols, |  | 
|  2523                                  sizeof(*pool->frame_bufs[new_fb].mvs)); |  | 
|  2524           pool->frame_bufs[new_fb].mi_rows = cm->mi_rows; |  | 
|  2525           pool->frame_bufs[new_fb].mi_cols = cm->mi_cols; |  | 
|  2526         } |  | 
|  2527       } else { |  2538       } else { | 
|  2528         cpi->scaled_ref_idx[ref_frame - 1] = idx; |  2539         const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame); | 
|  2529         ++pool->frame_bufs[idx].ref_count; |  2540         cpi->scaled_ref_idx[ref_frame - 1] = buf_idx; | 
 |  2541         ++pool->frame_bufs[buf_idx].ref_count; | 
|  2530       } |  2542       } | 
|  2531     } else { |  2543     } else { | 
|  2532       cpi->scaled_ref_idx[ref_frame - 1] = INVALID_REF_BUFFER_IDX; |  2544       cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX; | 
|  2533     } |  2545     } | 
|  2534   } |  2546   } | 
|  2535 } |  2547 } | 
|  2536  |  2548  | 
|  2537 static void release_scaled_references(VP9_COMP *cpi) { |  2549 static void release_scaled_references(VP9_COMP *cpi) { | 
|  2538   VP9_COMMON *cm = &cpi->common; |  2550   VP9_COMMON *cm = &cpi->common; | 
|  2539   int i; |  2551   int i; | 
|  2540   for (i = 0; i < MAX_REF_FRAMES; ++i) { |  2552   for (i = 0; i < MAX_REF_FRAMES; ++i) { | 
|  2541     const int idx = cpi->scaled_ref_idx[i]; |  2553     const int idx = cpi->scaled_ref_idx[i]; | 
|  2542     RefCntBuffer *const buf = idx != INVALID_REF_BUFFER_IDX ? |  2554     RefCntBuffer *const buf = idx != INVALID_IDX ? | 
|  2543         &cm->buffer_pool->frame_bufs[idx] : NULL; |  2555         &cm->buffer_pool->frame_bufs[idx] : NULL; | 
|  2544     if (buf != NULL) { |  2556     if (buf != NULL) { | 
|  2545       --buf->ref_count; |  2557       --buf->ref_count; | 
|  2546       cpi->scaled_ref_idx[i] = INVALID_REF_BUFFER_IDX; |  2558       cpi->scaled_ref_idx[i] = INVALID_IDX; | 
|  2547     } |  2559     } | 
|  2548   } |  2560   } | 
|  2549 } |  2561 } | 
|  2550  |  2562  | 
|  2551 static void full_to_model_count(unsigned int *model_count, |  2563 static void full_to_model_count(unsigned int *model_count, | 
|  2552                                 unsigned int *full_count) { |  2564                                 unsigned int *full_count) { | 
|  2553   int n; |  2565   int n; | 
|  2554   model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN]; |  2566   model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN]; | 
|  2555   model_count[ONE_TOKEN] = full_count[ONE_TOKEN]; |  2567   model_count[ONE_TOKEN] = full_count[ONE_TOKEN]; | 
|  2556   model_count[TWO_TOKEN] = full_count[TWO_TOKEN]; |  2568   model_count[TWO_TOKEN] = full_count[TWO_TOKEN]; | 
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2740                          oxcf->scaled_frame_height); |  2752                          oxcf->scaled_frame_height); | 
|  2741   } |  2753   } | 
|  2742  |  2754  | 
|  2743   if ((oxcf->pass == 2) && |  2755   if ((oxcf->pass == 2) && | 
|  2744       (!cpi->use_svc || |  2756       (!cpi->use_svc || | 
|  2745           (is_two_pass_svc(cpi) && |  2757           (is_two_pass_svc(cpi) && | 
|  2746               cpi->svc.encode_empty_frame_state != ENCODING))) { |  2758               cpi->svc.encode_empty_frame_state != ENCODING))) { | 
|  2747     vp9_set_target_rate(cpi); |  2759     vp9_set_target_rate(cpi); | 
|  2748   } |  2760   } | 
|  2749  |  2761  | 
 |  2762   alloc_frame_mvs(cm, cm->new_fb_idx); | 
 |  2763  | 
|  2750   // Reset the frame pointers to the current frame size. |  2764   // Reset the frame pointers to the current frame size. | 
|  2751   vp9_realloc_frame_buffer(get_frame_new_buffer(cm), |  2765   vp9_realloc_frame_buffer(get_frame_new_buffer(cm), | 
|  2752                            cm->width, cm->height, |  2766                            cm->width, cm->height, | 
|  2753                            cm->subsampling_x, cm->subsampling_y, |  2767                            cm->subsampling_x, cm->subsampling_y, | 
|  2754 #if CONFIG_VP9_HIGHBITDEPTH |  2768 #if CONFIG_VP9_HIGHBITDEPTH | 
|  2755                            cm->use_highbitdepth, |  2769                            cm->use_highbitdepth, | 
|  2756 #endif |  2770 #endif | 
|  2757                            VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, |  2771                            VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, | 
|  2758                            NULL, NULL, NULL); |  2772                            NULL, NULL, NULL); | 
|  2759  |  2773  | 
|  2760   alloc_util_frame_buffers(cpi); |  2774   alloc_util_frame_buffers(cpi); | 
|  2761   init_motion_estimation(cpi); |  2775   init_motion_estimation(cpi); | 
|  2762  |  2776  | 
|  2763   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { |  2777   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) { | 
|  2764     const int idx = cm->ref_frame_map[get_ref_frame_idx(cpi, ref_frame)]; |  | 
|  2765     YV12_BUFFER_CONFIG *const buf = &cm->buffer_pool->frame_bufs[idx].buf; |  | 
|  2766     RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1]; |  2778     RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1]; | 
|  2767     ref_buf->buf = buf; |  2779     const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame); | 
|  2768     ref_buf->idx = idx; |  2780  | 
 |  2781     ref_buf->idx = buf_idx; | 
 |  2782  | 
 |  2783     if (buf_idx != INVALID_IDX) { | 
 |  2784       YV12_BUFFER_CONFIG *const buf = &cm->buffer_pool->frame_bufs[buf_idx].buf; | 
 |  2785       ref_buf->buf = buf; | 
|  2769 #if CONFIG_VP9_HIGHBITDEPTH |  2786 #if CONFIG_VP9_HIGHBITDEPTH | 
|  2770     vp9_setup_scale_factors_for_frame(&ref_buf->sf, |  2787       vp9_setup_scale_factors_for_frame(&ref_buf->sf, | 
|  2771                                       buf->y_crop_width, buf->y_crop_height, |  2788                                         buf->y_crop_width, buf->y_crop_height, | 
|  2772                                       cm->width, cm->height, |  2789                                         cm->width, cm->height, | 
|  2773                                       (buf->flags & YV12_FLAG_HIGHBITDEPTH) ? |  2790                                         (buf->flags & YV12_FLAG_HIGHBITDEPTH) ? | 
|  2774                                           1 : 0); |  2791                                             1 : 0); | 
|  2775 #else |  2792 #else | 
|  2776     vp9_setup_scale_factors_for_frame(&ref_buf->sf, |  2793       vp9_setup_scale_factors_for_frame(&ref_buf->sf, | 
|  2777                                       buf->y_crop_width, buf->y_crop_height, |  2794                                         buf->y_crop_width, buf->y_crop_height, | 
|  2778                                       cm->width, cm->height); |  2795                                         cm->width, cm->height); | 
|  2779 #endif  // CONFIG_VP9_HIGHBITDEPTH |  2796 #endif  // CONFIG_VP9_HIGHBITDEPTH | 
|  2780     if (vp9_is_scaled(&ref_buf->sf)) |  2797       if (vp9_is_scaled(&ref_buf->sf)) | 
|  2781       vp9_extend_frame_borders(buf); |  2798         vp9_extend_frame_borders(buf); | 
 |  2799     } else { | 
 |  2800       ref_buf->buf = NULL; | 
 |  2801     } | 
|  2782   } |  2802   } | 
|  2783  |  2803  | 
|  2784   set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME); |  2804   set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME); | 
|  2785 } |  2805 } | 
|  2786  |  2806  | 
|  2787 static void encode_without_recode_loop(VP9_COMP *cpi) { |  2807 static void encode_without_recode_loop(VP9_COMP *cpi) { | 
|  2788   VP9_COMMON *const cm = &cpi->common; |  2808   VP9_COMMON *const cm = &cpi->common; | 
|  2789   int q = 0, bottom_index = 0, top_index = 0;  // Dummy variables. |  2809   int q = 0, bottom_index = 0, top_index = 0;  // Dummy variables. | 
|  2790  |  2810  | 
|  2791   vp9_clear_system_state(); |  2811   vp9_clear_system_state(); | 
| (...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3437  |  3457  | 
|  3438 static void Pass2Encode(VP9_COMP *cpi, size_t *size, |  3458 static void Pass2Encode(VP9_COMP *cpi, size_t *size, | 
|  3439                         uint8_t *dest, unsigned int *frame_flags) { |  3459                         uint8_t *dest, unsigned int *frame_flags) { | 
|  3440   cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; |  3460   cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED; | 
|  3441   encode_frame_to_data_rate(cpi, size, dest, frame_flags); |  3461   encode_frame_to_data_rate(cpi, size, dest, frame_flags); | 
|  3442  |  3462  | 
|  3443   if (!(is_two_pass_svc(cpi) && cpi->svc.encode_empty_frame_state == ENCODING)) |  3463   if (!(is_two_pass_svc(cpi) && cpi->svc.encode_empty_frame_state == ENCODING)) | 
|  3444     vp9_twopass_postencode_update(cpi); |  3464     vp9_twopass_postencode_update(cpi); | 
|  3445 } |  3465 } | 
|  3446  |  3466  | 
 |  3467 static void init_ref_frame_bufs(VP9_COMMON *cm) { | 
 |  3468   int i; | 
 |  3469   BufferPool *const pool = cm->buffer_pool; | 
 |  3470   cm->new_fb_idx = INVALID_IDX; | 
 |  3471   for (i = 0; i < REF_FRAMES; ++i) { | 
 |  3472     cm->ref_frame_map[i] = INVALID_IDX; | 
 |  3473     pool->frame_bufs[i].ref_count = 0; | 
 |  3474   } | 
 |  3475 } | 
 |  3476  | 
|  3447 static void check_initial_width(VP9_COMP *cpi, |  3477 static void check_initial_width(VP9_COMP *cpi, | 
|  3448 #if CONFIG_VP9_HIGHBITDEPTH |  3478 #if CONFIG_VP9_HIGHBITDEPTH | 
|  3449                                 int use_highbitdepth, |  3479                                 int use_highbitdepth, | 
|  3450 #endif |  3480 #endif | 
|  3451                                 int subsampling_x, int subsampling_y) { |  3481                                 int subsampling_x, int subsampling_y) { | 
|  3452   VP9_COMMON *const cm = &cpi->common; |  3482   VP9_COMMON *const cm = &cpi->common; | 
|  3453  |  3483  | 
|  3454   if (!cpi->initial_width) { |  3484   if (!cpi->initial_width || | 
 |  3485 #if CONFIG_VP9_HIGHBITDEPTH | 
 |  3486       cm->use_highbitdepth != use_highbitdepth || | 
 |  3487 #endif | 
 |  3488       cm->subsampling_x != subsampling_x || | 
 |  3489       cm->subsampling_y != subsampling_y) { | 
|  3455     cm->subsampling_x = subsampling_x; |  3490     cm->subsampling_x = subsampling_x; | 
|  3456     cm->subsampling_y = subsampling_y; |  3491     cm->subsampling_y = subsampling_y; | 
|  3457 #if CONFIG_VP9_HIGHBITDEPTH |  3492 #if CONFIG_VP9_HIGHBITDEPTH | 
|  3458     cm->use_highbitdepth = use_highbitdepth; |  3493     cm->use_highbitdepth = use_highbitdepth; | 
|  3459 #endif |  3494 #endif | 
|  3460  |  3495  | 
|  3461     alloc_raw_frame_buffers(cpi); |  3496     alloc_raw_frame_buffers(cpi); | 
|  3462     alloc_ref_frame_buffers(cpi); |  3497     init_ref_frame_bufs(cm); | 
|  3463     alloc_util_frame_buffers(cpi); |  3498     alloc_util_frame_buffers(cpi); | 
|  3464  |  3499  | 
|  3465     init_motion_estimation(cpi);  // TODO(agrange) This can be removed. |  3500     init_motion_estimation(cpi);  // TODO(agrange) This can be removed. | 
|  3466  |  3501  | 
|  3467     cpi->initial_width = cm->width; |  3502     cpi->initial_width = cm->width; | 
|  3468     cpi->initial_height = cm->height; |  3503     cpi->initial_height = cm->height; | 
|  3469     cpi->initial_mbs = cm->MBs; |  3504     cpi->initial_mbs = cm->MBs; | 
|  3470   } |  3505   } | 
|  3471 } |  3506 } | 
|  3472  |  3507  | 
| (...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3777   } |  3812   } | 
|  3778  |  3813  | 
|  3779   if (cpi->svc.number_temporal_layers > 1 && |  3814   if (cpi->svc.number_temporal_layers > 1 && | 
|  3780       oxcf->rc_mode == VPX_CBR) { |  3815       oxcf->rc_mode == VPX_CBR) { | 
|  3781     vp9_update_temporal_layer_framerate(cpi); |  3816     vp9_update_temporal_layer_framerate(cpi); | 
|  3782     vp9_restore_layer_context(cpi); |  3817     vp9_restore_layer_context(cpi); | 
|  3783   } |  3818   } | 
|  3784  |  3819  | 
|  3785   // Find a free buffer for the new frame, releasing the reference previously |  3820   // Find a free buffer for the new frame, releasing the reference previously | 
|  3786   // held. |  3821   // held. | 
|  3787   pool->frame_bufs[cm->new_fb_idx].ref_count--; |  3822   if (cm->new_fb_idx != INVALID_IDX) { | 
 |  3823     --pool->frame_bufs[cm->new_fb_idx].ref_count; | 
 |  3824   } | 
|  3788   cm->new_fb_idx = get_free_fb(cm); |  3825   cm->new_fb_idx = get_free_fb(cm); | 
 |  3826  | 
 |  3827   if (cm->new_fb_idx == INVALID_IDX) | 
 |  3828     return -1; | 
 |  3829  | 
|  3789   cm->cur_frame = &pool->frame_bufs[cm->new_fb_idx]; |  3830   cm->cur_frame = &pool->frame_bufs[cm->new_fb_idx]; | 
|  3790  |  3831  | 
|  3791   if (!cpi->use_svc && cpi->multi_arf_allowed) { |  3832   if (!cpi->use_svc && cpi->multi_arf_allowed) { | 
|  3792     if (cm->frame_type == KEY_FRAME) { |  3833     if (cm->frame_type == KEY_FRAME) { | 
|  3793       init_buffer_indices(cpi); |  3834       init_buffer_indices(cpi); | 
|  3794     } else if (oxcf->pass == 2) { |  3835     } else if (oxcf->pass == 2) { | 
|  3795       const GF_GROUP *const gf_group = &cpi->twopass.gf_group; |  3836       const GF_GROUP *const gf_group = &cpi->twopass.gf_group; | 
|  3796       cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index]; |  3837       cpi->alt_fb_idx = gf_group->arf_ref_idx[gf_group->index]; | 
|  3797     } |  3838     } | 
|  3798   } |  3839   } | 
|  3799  |  3840  | 
|  3800   // Start with a 0 size frame. |  3841   // Start with a 0 size frame. | 
|  3801   *size = 0; |  3842   *size = 0; | 
|  3802  |  3843  | 
|  3803   cpi->frame_flags = *frame_flags; |  3844   cpi->frame_flags = *frame_flags; | 
|  3804  |  3845  | 
|  3805   if ((oxcf->pass == 2) && |  3846   if ((oxcf->pass == 2) && | 
|  3806       (!cpi->use_svc || |  3847       (!cpi->use_svc || | 
|  3807           (is_two_pass_svc(cpi) && |  3848           (is_two_pass_svc(cpi) && | 
|  3808               cpi->svc.encode_empty_frame_state != ENCODING))) { |  3849               cpi->svc.encode_empty_frame_state != ENCODING))) { | 
|  3809     vp9_rc_get_second_pass_params(cpi); |  3850     vp9_rc_get_second_pass_params(cpi); | 
|  3810   } else { |  3851   } else { | 
|  3811     set_frame_size(cpi); |  3852     set_frame_size(cpi); | 
|  3812   } |  3853   } | 
|  3813  |  3854  | 
|  3814   for (i = 0; i < MAX_REF_FRAMES; ++i) |  3855   for (i = 0; i < MAX_REF_FRAMES; ++i) | 
|  3815     cpi->scaled_ref_idx[i] = INVALID_REF_BUFFER_IDX; |  3856     cpi->scaled_ref_idx[i] = INVALID_IDX; | 
|  3816  |  3857  | 
|  3817   if (oxcf->pass == 1 && |  3858   if (oxcf->pass == 1 && | 
|  3818       (!cpi->use_svc || is_two_pass_svc(cpi))) { |  3859       (!cpi->use_svc || is_two_pass_svc(cpi))) { | 
|  3819     const int lossless = is_lossless_requested(oxcf); |  3860     const int lossless = is_lossless_requested(oxcf); | 
|  3820 #if CONFIG_VP9_HIGHBITDEPTH |  3861 #if CONFIG_VP9_HIGHBITDEPTH | 
|  3821     if (cpi->oxcf.use_highbitdepth) |  3862     if (cpi->oxcf.use_highbitdepth) | 
|  3822       cpi->td.mb.fwd_txm4x4 = lossless ? |  3863       cpi->td.mb.fwd_txm4x4 = lossless ? | 
|  3823           vp9_highbd_fwht4x4 : vp9_highbd_fdct4x4; |  3864           vp9_highbd_fwht4x4 : vp9_highbd_fdct4x4; | 
|  3824     else |  3865     else | 
|  3825       cpi->td.mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; |  3866       cpi->td.mb.fwd_txm4x4 = lossless ? vp9_fwht4x4 : vp9_fdct4x4; | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3891         cpi->total_y += psnr.psnr[1]; |  3932         cpi->total_y += psnr.psnr[1]; | 
|  3892         cpi->total_u += psnr.psnr[2]; |  3933         cpi->total_u += psnr.psnr[2]; | 
|  3893         cpi->total_v += psnr.psnr[3]; |  3934         cpi->total_v += psnr.psnr[3]; | 
|  3894         cpi->total_sq_error += psnr.sse[0]; |  3935         cpi->total_sq_error += psnr.sse[0]; | 
|  3895         cpi->total_samples += psnr.samples[0]; |  3936         cpi->total_samples += psnr.samples[0]; | 
|  3896  |  3937  | 
|  3897         { |  3938         { | 
|  3898           PSNR_STATS psnr2; |  3939           PSNR_STATS psnr2; | 
|  3899           double frame_ssim2 = 0, weight = 0; |  3940           double frame_ssim2 = 0, weight = 0; | 
|  3900 #if CONFIG_VP9_POSTPROC |  3941 #if CONFIG_VP9_POSTPROC | 
|  3901           // TODO(agrange) Add resizing of post-proc buffer in here when the |  3942           if (vp9_alloc_frame_buffer(&cm->post_proc_buffer, | 
|  3902           // encoder is changed to use on-demand buffer allocation. |  3943                                      recon->y_crop_width, recon->y_crop_height, | 
 |  3944                                      cm->subsampling_x, cm->subsampling_y, | 
 |  3945 #if CONFIG_VP9_HIGHBITDEPTH | 
 |  3946                                      cm->use_highbitdepth, | 
 |  3947 #endif | 
 |  3948                                      VP9_ENC_BORDER_IN_PIXELS, | 
 |  3949                                      cm->byte_alignment) < 0) { | 
 |  3950             vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR, | 
 |  3951                                "Failed to allocate post processing buffer"); | 
 |  3952           } | 
 |  3953  | 
|  3903           vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer, |  3954           vp9_deblock(cm->frame_to_show, &cm->post_proc_buffer, | 
|  3904                       cm->lf.filter_level * 10 / 6); |  3955                       cm->lf.filter_level * 10 / 6); | 
|  3905 #endif |  3956 #endif | 
|  3906           vp9_clear_system_state(); |  3957           vp9_clear_system_state(); | 
|  3907  |  3958  | 
|  3908 #if CONFIG_VP9_HIGHBITDEPTH |  3959 #if CONFIG_VP9_HIGHBITDEPTH | 
|  3909           calc_highbd_psnr(orig, pp, &psnr, cpi->td.mb.e_mbd.bd, |  3960           calc_highbd_psnr(orig, pp, &psnr, cpi->td.mb.e_mbd.bd, | 
|  3910                            cpi->oxcf.input_bit_depth); |  3961                            cpi->oxcf.input_bit_depth); | 
|  3911 #else |  3962 #else | 
|  3912           calc_psnr(orig, pp, &psnr2); |  3963           calc_psnr(orig, pp, &psnr2); | 
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4070  |  4121  | 
|  4071   update_frame_size(cpi); |  4122   update_frame_size(cpi); | 
|  4072  |  4123  | 
|  4073   return 0; |  4124   return 0; | 
|  4074 } |  4125 } | 
|  4075  |  4126  | 
|  4076 int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width, |  4127 int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width, | 
|  4077                          unsigned int height) { |  4128                          unsigned int height) { | 
|  4078   VP9_COMMON *cm = &cpi->common; |  4129   VP9_COMMON *cm = &cpi->common; | 
|  4079 #if CONFIG_VP9_HIGHBITDEPTH |  4130 #if CONFIG_VP9_HIGHBITDEPTH | 
|  4080   check_initial_width(cpi, 1, 1, cm->use_highbitdepth); |  4131   check_initial_width(cpi, cm->use_highbitdepth, 1, 1); | 
|  4081 #else |  4132 #else | 
|  4082   check_initial_width(cpi, 1, 1); |  4133   check_initial_width(cpi, 1, 1); | 
|  4083 #endif  // CONFIG_VP9_HIGHBITDEPTH |  4134 #endif  // CONFIG_VP9_HIGHBITDEPTH | 
|  4084  |  4135  | 
|  4085 #if CONFIG_VP9_TEMPORAL_DENOISING |  4136 #if CONFIG_VP9_TEMPORAL_DENOISING | 
|  4086   setup_denoiser_buffer(cpi); |  4137   setup_denoiser_buffer(cpi); | 
|  4087 #endif |  4138 #endif | 
|  4088  |  4139  | 
|  4089   if (width) { |  4140   if (width) { | 
|  4090     cm->width = width; |  4141     cm->width = width; | 
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4171     if (flags & VP8_EFLAG_NO_UPD_ARF) |  4222     if (flags & VP8_EFLAG_NO_UPD_ARF) | 
|  4172       upd ^= VP9_ALT_FLAG; |  4223       upd ^= VP9_ALT_FLAG; | 
|  4173  |  4224  | 
|  4174     vp9_update_reference(cpi, upd); |  4225     vp9_update_reference(cpi, upd); | 
|  4175   } |  4226   } | 
|  4176  |  4227  | 
|  4177   if (flags & VP8_EFLAG_NO_UPD_ENTROPY) { |  4228   if (flags & VP8_EFLAG_NO_UPD_ENTROPY) { | 
|  4178     vp9_update_entropy(cpi, 0); |  4229     vp9_update_entropy(cpi, 0); | 
|  4179   } |  4230   } | 
|  4180 } |  4231 } | 
| OLD | NEW |