You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.5KB

  1. /*
  2. * Audio and Video frame extraction
  3. * Copyright (c) 2003 Fabrice Bellard
  4. * Copyright (c) 2003 Michael Niedermayer
  5. * Copyright (c) 2009 Alex Converse
  6. *
  7. * This file is part of Libav.
  8. *
  9. * Libav is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation; either
  12. * version 2.1 of the License, or (at your option) any later version.
  13. *
  14. * Libav is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with Libav; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. */
  23. #include "aac_ac3_parser.h"
  24. #include "aacadtsdec.h"
  25. #include "get_bits.h"
  26. #include "mpeg4audio.h"
  27. int avpriv_aac_parse_header(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
  28. {
  29. int size, rdb, ch, sr;
  30. int aot, crc_abs;
  31. if (get_bits(gbc, 12) != 0xfff)
  32. return AAC_AC3_PARSE_ERROR_SYNC;
  33. skip_bits1(gbc); /* id */
  34. skip_bits(gbc, 2); /* layer */
  35. crc_abs = get_bits1(gbc); /* protection_absent */
  36. aot = get_bits(gbc, 2); /* profile_objecttype */
  37. sr = get_bits(gbc, 4); /* sample_frequency_index */
  38. if (!avpriv_mpeg4audio_sample_rates[sr])
  39. return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
  40. skip_bits1(gbc); /* private_bit */
  41. ch = get_bits(gbc, 3); /* channel_configuration */
  42. skip_bits1(gbc); /* original/copy */
  43. skip_bits1(gbc); /* home */
  44. /* adts_variable_header */
  45. skip_bits1(gbc); /* copyright_identification_bit */
  46. skip_bits1(gbc); /* copyright_identification_start */
  47. size = get_bits(gbc, 13); /* aac_frame_length */
  48. if (size < AAC_ADTS_HEADER_SIZE)
  49. return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
  50. skip_bits(gbc, 11); /* adts_buffer_fullness */
  51. rdb = get_bits(gbc, 2); /* number_of_raw_data_blocks_in_frame */
  52. hdr->object_type = aot + 1;
  53. hdr->chan_config = ch;
  54. hdr->crc_absent = crc_abs;
  55. hdr->num_aac_frames = rdb + 1;
  56. hdr->sampling_index = sr;
  57. hdr->sample_rate = avpriv_mpeg4audio_sample_rates[sr];
  58. hdr->samples = (rdb + 1) * 1024;
  59. hdr->bit_rate = size * 8 * hdr->sample_rate / hdr->samples;
  60. return size;
  61. }