mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 12:36:41 +08:00 
			
		
		
		
	aacenc: Split paths in the scalefactor selection trellis into a 2-D array.
Originally committed as revision 19947 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
		| @@ -468,26 +468,28 @@ static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, | |||||||
|                                        const float lambda) |                                        const float lambda) | ||||||
| { | { | ||||||
|     int q, w, w2, g, start = 0; |     int q, w, w2, g, start = 0; | ||||||
|     int i; |     int i, j; | ||||||
|     int idx; |     int idx; | ||||||
|     TrellisPath paths[256*121]; |     TrellisPath paths[121][256]; | ||||||
|     int bandaddr[121]; |     int bandaddr[121]; | ||||||
|     int minq; |     int minq; | ||||||
|     float mincost; |     float mincost; | ||||||
|  |  | ||||||
|     for (i = 0; i < 256; i++) { |     for (i = 0; i < 256; i++) { | ||||||
|         paths[i].cost    = 0.0f; |         paths[0][i].cost    = 0.0f; | ||||||
|         paths[i].prev    = -1; |         paths[0][i].prev    = -1; | ||||||
|         paths[i].min_val = i; |         paths[0][i].min_val = i; | ||||||
|         paths[i].max_val = i; |         paths[0][i].max_val = i; | ||||||
|     } |     } | ||||||
|     for (i = 256; i < 256*121; i++) { |     for (j = 1; j < 121; j++) { | ||||||
|         paths[i].cost    = INFINITY; |         for (i = 0; i < 256; i++) { | ||||||
|         paths[i].prev    = -2; |             paths[j][i].cost    = INFINITY; | ||||||
|         paths[i].min_val = INT_MAX; |             paths[j][i].prev    = -2; | ||||||
|         paths[i].max_val = 0; |             paths[j][i].min_val = INT_MAX; | ||||||
|  |             paths[j][i].max_val = 0; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     idx = 256; |     idx = 1; | ||||||
|     abs_pow34_v(s->scoefs, sce->coeffs, 1024); |     abs_pow34_v(s->scoefs, sce->coeffs, 1024); | ||||||
|     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { | ||||||
|         start = w*128; |         start = w*128; | ||||||
| @@ -496,7 +498,7 @@ static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, | |||||||
|             float qmin, qmax; |             float qmin, qmax; | ||||||
|             int nz = 0; |             int nz = 0; | ||||||
|  |  | ||||||
|             bandaddr[idx >> 8] = w * 16 + g; |             bandaddr[idx] = w * 16 + g; | ||||||
|             qmin = INT_MAX; |             qmin = INT_MAX; | ||||||
|             qmax = 0.0f; |             qmax = 0.0f; | ||||||
|             for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |             for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { | ||||||
| @@ -539,63 +541,64 @@ static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, | |||||||
|                     for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { |                     for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { | ||||||
|                         float cost; |                         float cost; | ||||||
|                         int minv, maxv; |                         int minv, maxv; | ||||||
|                         if (isinf(paths[idx - 256 + i].cost)) |                         if (isinf(paths[idx - 1][i].cost)) | ||||||
|                             continue; |                             continue; | ||||||
|                         cost = paths[idx - 256 + i].cost + dist |                         cost = paths[idx - 1][i].cost + dist | ||||||
|                                + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; |                                + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; | ||||||
|                         minv = FFMIN(paths[idx - 256 + i].min_val, q); |                         minv = FFMIN(paths[idx - 1][i].min_val, q); | ||||||
|                         maxv = FFMAX(paths[idx - 256 + i].max_val, q); |                         maxv = FFMAX(paths[idx - 1][i].max_val, q); | ||||||
|                         if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { |                         if (cost < paths[idx][q].cost && maxv-minv < SCALE_MAX_DIFF) { | ||||||
|                             paths[idx + q].cost    = cost; |                             paths[idx][q].cost    = cost; | ||||||
|                             paths[idx + q].prev    = idx - 256 + i; |                             paths[idx][q].prev    = i; | ||||||
|                             paths[idx + q].min_val = minv; |                             paths[idx][q].min_val = minv; | ||||||
|                             paths[idx + q].max_val = maxv; |                             paths[idx][q].max_val = maxv; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
|                 for (q = 0; q < 256; q++) { |                 for (q = 0; q < 256; q++) { | ||||||
|                     if (!isinf(paths[idx - 256 + q].cost)) { |                     if (!isinf(paths[idx - 1][q].cost)) { | ||||||
|                         paths[idx + q].cost = paths[idx - 256 + q].cost + 1; |                         paths[idx][q].cost = paths[idx - 1][q].cost + 1; | ||||||
|                         paths[idx + q].prev = idx - 256 + q; |                         paths[idx][q].prev = q; | ||||||
|                         paths[idx + q].min_val = FFMIN(paths[idx - 256 + q].min_val, q); |                         paths[idx][q].min_val = FFMIN(paths[idx - 1][q].min_val, q); | ||||||
|                         paths[idx + q].max_val = FFMAX(paths[idx - 256 + q].max_val, q); |                         paths[idx][q].max_val = FFMAX(paths[idx - 1][q].max_val, q); | ||||||
|                         continue; |                         continue; | ||||||
|                     } |                     } | ||||||
|                     for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { |                     for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { | ||||||
|                         float cost; |                         float cost; | ||||||
|                         int minv, maxv; |                         int minv, maxv; | ||||||
|                         if (isinf(paths[idx - 256 + i].cost)) |                         if (isinf(paths[idx - 1][i].cost)) | ||||||
|                             continue; |                             continue; | ||||||
|                         cost = paths[idx - 256 + i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; |                         cost = paths[idx - 1][i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; | ||||||
|                         minv = FFMIN(paths[idx - 256 + i].min_val, q); |                         minv = FFMIN(paths[idx - 1][i].min_val, q); | ||||||
|                         maxv = FFMAX(paths[idx - 256 + i].max_val, q); |                         maxv = FFMAX(paths[idx - 1][i].max_val, q); | ||||||
|                         if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { |                         if (cost < paths[idx][q].cost && maxv-minv < SCALE_MAX_DIFF) { | ||||||
|                             paths[idx + q].cost    = cost; |                             paths[idx][q].cost    = cost; | ||||||
|                             paths[idx + q].prev    = idx - 256 + i; |                             paths[idx][q].prev    = i; | ||||||
|                             paths[idx + q].min_val = minv; |                             paths[idx][q].min_val = minv; | ||||||
|                             paths[idx + q].max_val = maxv; |                             paths[idx][q].max_val = maxv; | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             sce->zeroes[w*16+g] = !nz; |             sce->zeroes[w*16+g] = !nz; | ||||||
|             start += sce->ics.swb_sizes[g]; |             start += sce->ics.swb_sizes[g]; | ||||||
|             idx   += 256; |             idx++; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     idx -= 256; |     idx--; | ||||||
|     mincost = paths[idx].cost; |     mincost = paths[idx][0].cost; | ||||||
|     minq    = idx; |     minq    = 0; | ||||||
|     for (i = 1; i < 256; i++) { |     for (i = 1; i < 256; i++) { | ||||||
|         if (paths[idx + i].cost < mincost) { |         if (paths[idx][i].cost < mincost) { | ||||||
|             mincost = paths[idx + i].cost; |             mincost = paths[idx][i].cost; | ||||||
|             minq = idx + i; |             minq = i; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     while (minq >= 256) { |     while (idx) { | ||||||
|         sce->sf_idx[bandaddr[minq>>8]] = minq & 0xFF; |         sce->sf_idx[bandaddr[idx]] = minq; | ||||||
|         minq = paths[minq].prev; |         minq = paths[idx][minq].prev; | ||||||
|  |         idx--; | ||||||
|     } |     } | ||||||
|     //set the same quantizers inside window groups |     //set the same quantizers inside window groups | ||||||
|     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |     for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Alex Converse
					Alex Converse