comparison aacsbr.c @ 11428:6b0d65c8c13d libavcodec

aacsbr: Propagate errors from read_sbr_grid to prevent crashes in malformatted streams.
author alexc
date Tue, 09 Mar 2010 06:13:48 +0000
parents 32504af93342
children 4eee52db3c4c
comparison
equal deleted inserted replaced
11427:32504af93342 11428:6b0d65c8c13d
855 *num_bits_left = 0; 855 *num_bits_left = 0;
856 break; 856 break;
857 } 857 }
858 } 858 }
859 859
860 static void read_sbr_single_channel_element(AACContext *ac, 860 static int read_sbr_single_channel_element(AACContext *ac,
861 SpectralBandReplication *sbr, 861 SpectralBandReplication *sbr,
862 GetBitContext *gb) 862 GetBitContext *gb)
863 { 863 {
864 if (get_bits1(gb)) // bs_data_extra 864 if (get_bits1(gb)) // bs_data_extra
865 skip_bits(gb, 4); // bs_reserved 865 skip_bits(gb, 4); // bs_reserved
866 866
867 read_sbr_grid(ac, sbr, gb, &sbr->data[0]); 867 if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]))
868 return -1;
868 read_sbr_dtdf(sbr, gb, &sbr->data[0]); 869 read_sbr_dtdf(sbr, gb, &sbr->data[0]);
869 read_sbr_invf(sbr, gb, &sbr->data[0]); 870 read_sbr_invf(sbr, gb, &sbr->data[0]);
870 read_sbr_envelope(sbr, gb, &sbr->data[0], 0); 871 read_sbr_envelope(sbr, gb, &sbr->data[0], 0);
871 read_sbr_noise(sbr, gb, &sbr->data[0], 0); 872 read_sbr_noise(sbr, gb, &sbr->data[0], 0);
872 873
873 if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb))) 874 if ((sbr->data[0].bs_add_harmonic_flag = get_bits1(gb)))
874 get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]); 875 get_bits1_vector(gb, sbr->data[0].bs_add_harmonic, sbr->n[1]);
875 } 876 }
876 877
877 static void read_sbr_channel_pair_element(AACContext *ac, 878 static int read_sbr_channel_pair_element(AACContext *ac,
878 SpectralBandReplication *sbr, 879 SpectralBandReplication *sbr,
879 GetBitContext *gb) 880 GetBitContext *gb)
880 { 881 {
881 if (get_bits1(gb)) // bs_data_extra 882 if (get_bits1(gb)) // bs_data_extra
882 skip_bits(gb, 8); // bs_reserved 883 skip_bits(gb, 8); // bs_reserved
883 884
884 if ((sbr->bs_coupling = get_bits1(gb))) { 885 if ((sbr->bs_coupling = get_bits1(gb))) {
885 read_sbr_grid(ac, sbr, gb, &sbr->data[0]); 886 if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]))
887 return -1;
886 copy_sbr_grid(&sbr->data[1], &sbr->data[0]); 888 copy_sbr_grid(&sbr->data[1], &sbr->data[0]);
887 read_sbr_dtdf(sbr, gb, &sbr->data[0]); 889 read_sbr_dtdf(sbr, gb, &sbr->data[0]);
888 read_sbr_dtdf(sbr, gb, &sbr->data[1]); 890 read_sbr_dtdf(sbr, gb, &sbr->data[1]);
889 read_sbr_invf(sbr, gb, &sbr->data[0]); 891 read_sbr_invf(sbr, gb, &sbr->data[0]);
890 memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0])); 892 memcpy(sbr->data[1].bs_invf_mode[1], sbr->data[1].bs_invf_mode[0], sizeof(sbr->data[1].bs_invf_mode[0]));
892 read_sbr_envelope(sbr, gb, &sbr->data[0], 0); 894 read_sbr_envelope(sbr, gb, &sbr->data[0], 0);
893 read_sbr_noise(sbr, gb, &sbr->data[0], 0); 895 read_sbr_noise(sbr, gb, &sbr->data[0], 0);
894 read_sbr_envelope(sbr, gb, &sbr->data[1], 1); 896 read_sbr_envelope(sbr, gb, &sbr->data[1], 1);
895 read_sbr_noise(sbr, gb, &sbr->data[1], 1); 897 read_sbr_noise(sbr, gb, &sbr->data[1], 1);
896 } else { 898 } else {
897 read_sbr_grid(ac, sbr, gb, &sbr->data[0]); 899 if (read_sbr_grid(ac, sbr, gb, &sbr->data[0]) ||
898 read_sbr_grid(ac, sbr, gb, &sbr->data[1]); 900 read_sbr_grid(ac, sbr, gb, &sbr->data[1]))
901 return -1;
899 read_sbr_dtdf(sbr, gb, &sbr->data[0]); 902 read_sbr_dtdf(sbr, gb, &sbr->data[0]);
900 read_sbr_dtdf(sbr, gb, &sbr->data[1]); 903 read_sbr_dtdf(sbr, gb, &sbr->data[1]);
901 read_sbr_invf(sbr, gb, &sbr->data[0]); 904 read_sbr_invf(sbr, gb, &sbr->data[0]);
902 read_sbr_invf(sbr, gb, &sbr->data[1]); 905 read_sbr_invf(sbr, gb, &sbr->data[1]);
903 read_sbr_envelope(sbr, gb, &sbr->data[0], 0); 906 read_sbr_envelope(sbr, gb, &sbr->data[0], 0);
916 GetBitContext *gb, int id_aac) 919 GetBitContext *gb, int id_aac)
917 { 920 {
918 unsigned int cnt = get_bits_count(gb); 921 unsigned int cnt = get_bits_count(gb);
919 922
920 if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) { 923 if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) {
921 read_sbr_single_channel_element(ac, sbr, gb); 924 if (read_sbr_single_channel_element(ac, sbr, gb)) {
925 sbr->start = 0;
926 return get_bits_count(gb) - cnt;
927 }
922 } else if (id_aac == TYPE_CPE) { 928 } else if (id_aac == TYPE_CPE) {
923 read_sbr_channel_pair_element(ac, sbr, gb); 929 if (read_sbr_channel_pair_element(ac, sbr, gb)) {
930 sbr->start = 0;
931 return get_bits_count(gb) - cnt;
932 }
924 } else { 933 } else {
925 av_log(ac->avccontext, AV_LOG_ERROR, 934 av_log(ac->avccontext, AV_LOG_ERROR,
926 "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac); 935 "Invalid bitstream - cannot apply SBR to element type %d\n", id_aac);
927 sbr->start = 0; 936 sbr->start = 0;
928 return get_bits_count(gb) - cnt; 937 return get_bits_count(gb) - cnt;