adts_header.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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 FFmpeg.
  8. *
  9. * FFmpeg 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. * FFmpeg 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 FFmpeg; 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 "adts_header.h"
  25. #include "adts_parser.h"
  26. #include "get_bits.h"
  27. #include "mpeg4audio.h"
  28. int ff_adts_header_parse(GetBitContext *gbc, AACADTSHeaderInfo *hdr)
  29. {
  30. int size, rdb, ch, sr;
  31. int aot, crc_abs;
  32. if (get_bits(gbc, 12) != 0xfff)
  33. return AAC_AC3_PARSE_ERROR_SYNC;
  34. skip_bits1(gbc); /* id */
  35. skip_bits(gbc, 2); /* layer */
  36. crc_abs = get_bits1(gbc); /* protection_absent */
  37. aot = get_bits(gbc, 2); /* profile_objecttype */
  38. sr = get_bits(gbc, 4); /* sample_frequency_index */
  39. if (!avpriv_mpeg4audio_sample_rates[sr])
  40. return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
  41. skip_bits1(gbc); /* private_bit */
  42. ch = get_bits(gbc, 3); /* channel_configuration */
  43. skip_bits1(gbc); /* original/copy */
  44. skip_bits1(gbc); /* home */
  45. /* adts_variable_header */
  46. skip_bits1(gbc); /* copyright_identification_bit */
  47. skip_bits1(gbc); /* copyright_identification_start */
  48. size = get_bits(gbc, 13); /* aac_frame_length */
  49. if (size < AV_AAC_ADTS_HEADER_SIZE)
  50. return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
  51. skip_bits(gbc, 11); /* adts_buffer_fullness */
  52. rdb = get_bits(gbc, 2); /* number_of_raw_data_blocks_in_frame */
  53. hdr->object_type = aot + 1;
  54. hdr->chan_config = ch;
  55. hdr->crc_absent = crc_abs;
  56. hdr->num_aac_frames = rdb + 1;
  57. hdr->sampling_index = sr;
  58. hdr->sample_rate = avpriv_mpeg4audio_sample_rates[sr];
  59. hdr->samples = (rdb + 1) * 1024;
  60. hdr->bit_rate = size * 8 * hdr->sample_rate / hdr->samples;
  61. return size;
  62. }