Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(609)

Side by Side Diff: source/patched-ffmpeg-mt/libavcodec/aacsbr.c

Issue 2850032: ffmpeg update to june 23 version which fixes mp4 crash on still frames with 3... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: Created 10 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * AAC Spectral Band Replication decoding functions 2 * AAC Spectral Band Replication decoding functions
3 * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl ) 3 * Copyright (c) 2008-2009 Robert Swain ( rob opendot cl )
4 * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com> 4 * Copyright (c) 2009-2010 Alex Converse <alex.converse@gmail.com>
5 * 5 *
6 * This file is part of FFmpeg. 6 * This file is part of FFmpeg.
7 * 7 *
8 * FFmpeg is free software; you can redistribute it and/or 8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public 9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 13 matching lines...) Expand all
24 * @file 24 * @file
25 * AAC Spectral Band Replication decoding functions 25 * AAC Spectral Band Replication decoding functions
26 * @author Robert Swain ( rob opendot cl ) 26 * @author Robert Swain ( rob opendot cl )
27 */ 27 */
28 28
29 #include "aac.h" 29 #include "aac.h"
30 #include "sbr.h" 30 #include "sbr.h"
31 #include "aacsbr.h" 31 #include "aacsbr.h"
32 #include "aacsbrdata.h" 32 #include "aacsbrdata.h"
33 #include "fft.h" 33 #include "fft.h"
34 #include "ps.h"
34 35
35 #include <stdint.h> 36 #include <stdint.h>
36 #include <float.h> 37 #include <float.h>
37 38
38 #define ENVELOPE_ADJUSTMENT_OFFSET 2 39 #define ENVELOPE_ADJUSTMENT_OFFSET 2
39 #define NOISE_FLOOR_OFFSET 6.0f 40 #define NOISE_FLOOR_OFFSET 6.0f
40 41
41 /** 42 /**
42 * SBR VLC tables 43 * SBR VLC tables
43 */ 44 */
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 SBR_INIT_VLC_STATIC(8, 592); 114 SBR_INIT_VLC_STATIC(8, 592);
114 SBR_INIT_VLC_STATIC(9, 512); 115 SBR_INIT_VLC_STATIC(9, 512);
115 116
116 for (n = 1; n < 320; n++) 117 for (n = 1; n < 320; n++)
117 sbr_qmf_window_us[320 + n] = sbr_qmf_window_us[320 - n]; 118 sbr_qmf_window_us[320 + n] = sbr_qmf_window_us[320 - n];
118 sbr_qmf_window_us[384] = -sbr_qmf_window_us[384]; 119 sbr_qmf_window_us[384] = -sbr_qmf_window_us[384];
119 sbr_qmf_window_us[512] = -sbr_qmf_window_us[512]; 120 sbr_qmf_window_us[512] = -sbr_qmf_window_us[512];
120 121
121 for (n = 0; n < 320; n++) 122 for (n = 0; n < 320; n++)
122 sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n]; 123 sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n];
124
125 ff_ps_init();
123 } 126 }
124 127
125 av_cold void ff_aac_sbr_ctx_init(SpectralBandReplication *sbr) 128 av_cold void ff_aac_sbr_ctx_init(SpectralBandReplication *sbr)
126 { 129 {
127 sbr->kx[0] = sbr->kx[1] = 32; //Typo in spec, kx' inits to 32 130 sbr->kx[0] = sbr->kx[1] = 32; //Typo in spec, kx' inits to 32
128 sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1; 131 sbr->data[0].e_a[1] = sbr->data[1].e_a[1] = -1;
129 sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); 132 sbr->data[0].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
130 sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128); 133 sbr->data[1].synthesis_filterbank_samples_offset = SBR_SYNTHESIS_BUF_SIZE - (1280 - 128);
131 ff_mdct_init(&sbr->mdct, 7, 1, 1.0/64); 134 ff_mdct_init(&sbr->mdct, 7, 1, 1.0/64);
132 ff_mdct_init(&sbr->mdct_ana, 7, 1, -2.0); 135 ff_mdct_init(&sbr->mdct_ana, 7, 1, -2.0);
136 ff_ps_ctx_init(&sbr->ps);
133 } 137 }
134 138
135 av_cold void ff_aac_sbr_ctx_close(SpectralBandReplication *sbr) 139 av_cold void ff_aac_sbr_ctx_close(SpectralBandReplication *sbr)
136 { 140 {
137 ff_mdct_end(&sbr->mdct); 141 ff_mdct_end(&sbr->mdct);
138 ff_mdct_end(&sbr->mdct_ana); 142 ff_mdct_end(&sbr->mdct_ana);
139 } 143 }
140 144
141 static int qsort_comparison_function_int16(const void *a, const void *b) 145 static int qsort_comparison_function_int16(const void *a, const void *b)
142 { 146 {
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 } else if (sbr->sample_rate >= 48000) 372 } else if (sbr->sample_rate >= 48000)
369 max_qmf_subbands = 32; 373 max_qmf_subbands = 32;
370 374
371 if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) { 375 if (sbr->k[2] - sbr->k[0] > max_qmf_subbands) {
372 av_log(ac->avctx, AV_LOG_ERROR, 376 av_log(ac->avctx, AV_LOG_ERROR,
373 "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr ->k[0]); 377 "Invalid bitstream, too many QMF subbands: %d\n", sbr->k[2] - sbr ->k[0]);
374 return -1; 378 return -1;
375 } 379 }
376 380
377 if (!spectrum->bs_freq_scale) { 381 if (!spectrum->bs_freq_scale) {
378 unsigned int dk; 382 int dk, k2diff;
379 int k2diff;
380 383
381 dk = spectrum->bs_alter_scale + 1; 384 dk = spectrum->bs_alter_scale + 1;
382 sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1; 385 sbr->n_master = ((sbr->k[2] - sbr->k[0] + (dk&2)) >> dk) << 1;
383 if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xov er_band)) 386 if (check_n_master(ac->avctx, sbr->n_master, sbr->spectrum_params.bs_xov er_band))
384 return -1; 387 return -1;
385 388
386 for (k = 1; k <= sbr->n_master; k++) 389 for (k = 1; k <= sbr->n_master; k++)
387 sbr->f_master[k] = dk; 390 sbr->f_master[k] = dk;
388 391
389 k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk; 392 k2diff = sbr->k[2] - sbr->k[0] - sbr->n_master * dk;
390 if (k2diff < 0) { 393 if (k2diff < 0) {
391 sbr->f_master[1]--; 394 sbr->f_master[1]--;
392 sbr->f_master[2]-= (k2diff < 1); 395 sbr->f_master[2]-= (k2diff < -1);
393 } else if (k2diff) { 396 } else if (k2diff) {
394 sbr->f_master[sbr->n_master]++; 397 sbr->f_master[sbr->n_master]++;
395 } 398 }
396 399
397 sbr->f_master[0] = sbr->k[0]; 400 sbr->f_master[0] = sbr->k[0];
398 for (k = 1; k <= sbr->n_master; k++) 401 for (k = 1; k <= sbr->n_master; k++)
399 sbr->f_master[k] += sbr->f_master[k - 1]; 402 sbr->f_master[k] += sbr->f_master[k - 1];
400 403
401 } else { 404 } else {
402 int half_bands = 7 - spectrum->bs_freq_scale; // bs_freq_scale = { 1,2,3} 405 int half_bands = 7 - spectrum->bs_freq_scale; // bs_freq_scale = { 1,2,3}
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 886
884 //assign 0th elements of noise_facs from last elements 887 //assign 0th elements of noise_facs from last elements
885 memcpy(ch_data->noise_facs[0], ch_data->noise_facs[ch_data->bs_num_noise], 888 memcpy(ch_data->noise_facs[0], ch_data->noise_facs[ch_data->bs_num_noise],
886 sizeof(ch_data->noise_facs[0])); 889 sizeof(ch_data->noise_facs[0]));
887 } 890 }
888 891
889 static void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr, 892 static void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr,
890 GetBitContext *gb, 893 GetBitContext *gb,
891 int bs_extension_id, int *num_bits_left) 894 int bs_extension_id, int *num_bits_left)
892 { 895 {
893 //TODO - implement ps_data for parametric stereo parsing
894 switch (bs_extension_id) { 896 switch (bs_extension_id) {
895 case EXTENSION_ID_PS: 897 case EXTENSION_ID_PS:
896 if (!ac->m4ac.ps) { 898 if (!ac->m4ac.ps) {
897 av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be no t-present but was found in the bitstream.\n"); 899 av_log(ac->avctx, AV_LOG_ERROR, "Parametric Stereo signaled to be no t-present but was found in the bitstream.\n");
898 skip_bits_long(gb, *num_bits_left); // bs_fill_bits 900 skip_bits_long(gb, *num_bits_left); // bs_fill_bits
899 *num_bits_left = 0; 901 *num_bits_left = 0;
900 } else { 902 } else {
901 #if 0 903 #if 1
902 *num_bits_left -= ff_ps_data(gb, ps); 904 *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps, *num_bits _left);
903 #else 905 #else
904 av_log_missing_feature(ac->avctx, "Parametric Stereo is", 0); 906 av_log_missing_feature(ac->avctx, "Parametric Stereo is", 0);
905 skip_bits_long(gb, *num_bits_left); // bs_fill_bits 907 skip_bits_long(gb, *num_bits_left); // bs_fill_bits
906 *num_bits_left = 0; 908 *num_bits_left = 0;
907 #endif 909 #endif
908 } 910 }
909 break; 911 break;
910 default: 912 default:
911 av_log_missing_feature(ac->avctx, "Reserved SBR extensions are", 1); 913 av_log_missing_feature(ac->avctx, "Reserved SBR extensions are", 1);
912 skip_bits_long(gb, *num_bits_left); // bs_fill_bits 914 skip_bits_long(gb, *num_bits_left); // bs_fill_bits
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1001 if (get_bits1(gb)) { // bs_extended_data 1003 if (get_bits1(gb)) { // bs_extended_data
1002 int num_bits_left = get_bits(gb, 4); // bs_extension_size 1004 int num_bits_left = get_bits(gb, 4); // bs_extension_size
1003 if (num_bits_left == 15) 1005 if (num_bits_left == 15)
1004 num_bits_left += get_bits(gb, 8); // bs_esc_count 1006 num_bits_left += get_bits(gb, 8); // bs_esc_count
1005 1007
1006 num_bits_left <<= 3; 1008 num_bits_left <<= 3;
1007 while (num_bits_left > 7) { 1009 while (num_bits_left > 7) {
1008 num_bits_left -= 2; 1010 num_bits_left -= 2;
1009 read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id 1011 read_sbr_extension(ac, sbr, gb, get_bits(gb, 2), &num_bits_left); // bs_extension_id
1010 } 1012 }
1013 if (num_bits_left < 0) {
1014 av_log(ac->avctx, AV_LOG_ERROR, "SBR Extension over read.\n");
1015 }
1016 if (num_bits_left > 0)
1017 skip_bits(gb, num_bits_left);
1011 } 1018 }
1012 1019
1013 return get_bits_count(gb) - cnt; 1020 return get_bits_count(gb) - cnt;
1014 } 1021 }
1015 1022
1016 static void sbr_reset(AACContext *ac, SpectralBandReplication *sbr) 1023 static void sbr_reset(AACContext *ac, SpectralBandReplication *sbr)
1017 { 1024 {
1018 int err; 1025 int err;
1019 err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params); 1026 err = sbr_make_f_master(ac, sbr, &sbr->spectrum_params);
1020 if (err >= 0) 1027 if (err >= 0)
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 } 1166 }
1160 x += 32; 1167 x += 32;
1161 } 1168 }
1162 } 1169 }
1163 1170
1164 /** 1171 /**
1165 * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank 1172 * Synthesis QMF Bank (14496-3 sp04 p206) and Downsampled Synthesis QMF Bank
1166 * (14496-3 sp04 p206) 1173 * (14496-3 sp04 p206)
1167 */ 1174 */
1168 static void sbr_qmf_synthesis(DSPContext *dsp, FFTContext *mdct, 1175 static void sbr_qmf_synthesis(DSPContext *dsp, FFTContext *mdct,
1169 float *out, float X[2][32][64], 1176 float *out, float X[2][38][64],
1170 float mdct_buf[2][64], 1177 float mdct_buf[2][64],
1171 float *v0, int *v_off, const unsigned int div, 1178 float *v0, int *v_off, const unsigned int div,
1172 float bias, float scale) 1179 float bias, float scale)
1173 { 1180 {
1174 int i, n; 1181 int i, n;
1175 const float *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us; 1182 const float *sbr_qmf_window = div ? sbr_qmf_window_ds : sbr_qmf_window_us;
1176 int scale_and_bias = scale != 1.0f || bias != 0.0f; 1183 int scale_and_bias = scale != 1.0f || bias != 0.0f;
1177 float *v; 1184 float *v;
1178 for (i = 0; i < 32; i++) { 1185 for (i = 0; i < 32; i++) {
1179 if (*v_off == 0) { 1186 if (*v_off == 0) {
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
1395 } 1402 }
1396 } 1403 }
1397 } 1404 }
1398 if (k < sbr->m[1] + sbr->kx[1]) 1405 if (k < sbr->m[1] + sbr->kx[1])
1399 memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high)); 1406 memset(X_high + k, 0, (sbr->m[1] + sbr->kx[1] - k) * sizeof(*X_high));
1400 1407
1401 return 0; 1408 return 0;
1402 } 1409 }
1403 1410
1404 /// Generate the subband filtered lowband 1411 /// Generate the subband filtered lowband
1405 static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][32][64], 1412 static int sbr_x_gen(SpectralBandReplication *sbr, float X[2][38][64],
1406 const float X_low[32][40][2], const float Y[2][38][64][2], 1413 const float X_low[32][40][2], const float Y[2][38][64][2],
1407 int ch) 1414 int ch)
1408 { 1415 {
1409 int k, i; 1416 int k, i;
1410 const int i_f = 32; 1417 const int i_f = 32;
1411 const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0); 1418 const int i_Temp = FFMAX(2*sbr->data[ch].t_env_num_env_old - i_f, 0);
1412 memset(X, 0, 2*sizeof(*X)); 1419 memset(X, 0, 2*sizeof(*X));
1413 for (k = 0; k < sbr->kx[0]; k++) { 1420 for (k = 0; k < sbr->kx[0]; k++) {
1414 for (i = 0; i < i_Temp; i++) { 1421 for (i = 0; i < i_Temp; i++) {
1415 X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; 1422 X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1416 X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; 1423 X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1417 } 1424 }
1418 } 1425 }
1419 for (; k < sbr->kx[0] + sbr->m[0]; k++) { 1426 for (; k < sbr->kx[0] + sbr->m[0]; k++) {
1420 for (i = 0; i < i_Temp; i++) { 1427 for (i = 0; i < i_Temp; i++) {
1421 X[0][i][k] = Y[0][i + i_f][k][0]; 1428 X[0][i][k] = Y[0][i + i_f][k][0];
1422 X[1][i][k] = Y[0][i + i_f][k][1]; 1429 X[1][i][k] = Y[0][i + i_f][k][1];
1423 } 1430 }
1424 } 1431 }
1425 1432
1426 for (k = 0; k < sbr->kx[1]; k++) { 1433 for (k = 0; k < sbr->kx[1]; k++) {
1427 for (i = i_Temp; i < i_f; i++) { 1434 for (i = i_Temp; i < 38; i++) {
1428 X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0]; 1435 X[0][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][0];
1429 X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1]; 1436 X[1][i][k] = X_low[k][i + ENVELOPE_ADJUSTMENT_OFFSET][1];
1430 } 1437 }
1431 } 1438 }
1432 for (; k < sbr->kx[1] + sbr->m[1]; k++) { 1439 for (; k < sbr->kx[1] + sbr->m[1]; k++) {
1433 for (i = i_Temp; i < i_f; i++) { 1440 for (i = i_Temp; i < i_f; i++) {
1434 X[0][i][k] = Y[1][i][k][0]; 1441 X[0][i][k] = Y[1][i][k][0];
1435 X[1][i][k] = Y[1][i][k][1]; 1442 X[1][i][k] = Y[1][i][k][1];
1436 } 1443 }
1437 } 1444 }
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
1733 sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); 1740 sbr_mapping(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a);
1734 sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]); 1741 sbr_env_estimate(sbr->e_curr, sbr->X_high, sbr, &sbr->data[ch]);
1735 sbr_gain_calc(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a); 1742 sbr_gain_calc(ac, sbr, &sbr->data[ch], sbr->data[ch].e_a);
1736 sbr_hf_assemble(sbr->data[ch].Y, sbr->X_high, sbr, &sbr->data[ch], 1743 sbr_hf_assemble(sbr->data[ch].Y, sbr->X_high, sbr, &sbr->data[ch],
1737 sbr->data[ch].e_a); 1744 sbr->data[ch].e_a);
1738 } 1745 }
1739 1746
1740 /* synthesis */ 1747 /* synthesis */
1741 sbr_x_gen(sbr, sbr->X[ch], sbr->X_low, sbr->data[ch].Y, ch); 1748 sbr_x_gen(sbr, sbr->X[ch], sbr->X_low, sbr->data[ch].Y, ch);
1742 } 1749 }
1750
1751 if (ac->m4ac.ps == 1) {
1752 if (sbr->ps.start) {
1753 ff_ps_apply(ac->avctx, &sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]);
1754 } else {
1755 memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0]));
1756 }
1757 nch = 2;
1758 }
1759
1743 sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, L, sbr->X[0], sbr->qmf_filter_scratc h, 1760 sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, L, sbr->X[0], sbr->qmf_filter_scratc h,
1744 sbr->data[0].synthesis_filterbank_samples, 1761 sbr->data[0].synthesis_filterbank_samples,
1745 &sbr->data[0].synthesis_filterbank_samples_offset, 1762 &sbr->data[0].synthesis_filterbank_samples_offset,
1746 downsampled, 1763 downsampled,
1747 ac->add_bias, -1024 * ac->sf_scale); 1764 ac->add_bias, -1024 * ac->sf_scale);
1748 if (nch == 2) 1765 if (nch == 2)
1749 sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, R, sbr->X[1], sbr->qmf_filter_sc ratch, 1766 sbr_qmf_synthesis(&ac->dsp, &sbr->mdct, R, sbr->X[1], sbr->qmf_filter_sc ratch,
1750 sbr->data[1].synthesis_filterbank_samples, 1767 sbr->data[1].synthesis_filterbank_samples,
1751 &sbr->data[1].synthesis_filterbank_samples_offset, 1768 &sbr->data[1].synthesis_filterbank_samples_offset,
1752 downsampled, 1769 downsampled,
1753 ac->add_bias, -1024 * ac->sf_scale); 1770 ac->add_bias, -1024 * ac->sf_scale);
1754 } 1771 }
OLDNEW
« no previous file with comments | « source/patched-ffmpeg-mt/libavcodec/aacdec.c ('k') | source/patched-ffmpeg-mt/libavcodec/allcodecs.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698