mpegaudiodecheader.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * MPEG Audio header decoder
  3. * Copyright (c) 2001, 2002 Fabrice Bellard
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with FFmpeg; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file libavcodec/mpegaudiodecheader.c
  23. * MPEG Audio header decoder.
  24. */
  25. //#define DEBUG
  26. #include "avcodec.h"
  27. #include "mpegaudio.h"
  28. #include "mpegaudiodata.h"
  29. int ff_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
  30. {
  31. int sample_rate, frame_size, mpeg25, padding;
  32. int sample_rate_index, bitrate_index;
  33. if (header & (1<<20)) {
  34. s->lsf = (header & (1<<19)) ? 0 : 1;
  35. mpeg25 = 0;
  36. } else {
  37. s->lsf = 1;
  38. mpeg25 = 1;
  39. }
  40. s->layer = 4 - ((header >> 17) & 3);
  41. /* extract frequency */
  42. sample_rate_index = (header >> 10) & 3;
  43. sample_rate = ff_mpa_freq_tab[sample_rate_index] >> (s->lsf + mpeg25);
  44. sample_rate_index += 3 * (s->lsf + mpeg25);
  45. s->sample_rate_index = sample_rate_index;
  46. s->error_protection = ((header >> 16) & 1) ^ 1;
  47. s->sample_rate = sample_rate;
  48. bitrate_index = (header >> 12) & 0xf;
  49. padding = (header >> 9) & 1;
  50. //extension = (header >> 8) & 1;
  51. s->mode = (header >> 6) & 3;
  52. s->mode_ext = (header >> 4) & 3;
  53. //copyright = (header >> 3) & 1;
  54. //original = (header >> 2) & 1;
  55. //emphasis = header & 3;
  56. if (s->mode == MPA_MONO)
  57. s->nb_channels = 1;
  58. else
  59. s->nb_channels = 2;
  60. if (bitrate_index != 0) {
  61. frame_size = ff_mpa_bitrate_tab[s->lsf][s->layer - 1][bitrate_index];
  62. s->bit_rate = frame_size * 1000;
  63. switch(s->layer) {
  64. case 1:
  65. frame_size = (frame_size * 12000) / sample_rate;
  66. frame_size = (frame_size + padding) * 4;
  67. break;
  68. case 2:
  69. frame_size = (frame_size * 144000) / sample_rate;
  70. frame_size += padding;
  71. break;
  72. default:
  73. case 3:
  74. frame_size = (frame_size * 144000) / (sample_rate << s->lsf);
  75. frame_size += padding;
  76. break;
  77. }
  78. s->frame_size = frame_size;
  79. } else {
  80. /* if no frame size computed, signal it */
  81. return 1;
  82. }
  83. #if defined(DEBUG)
  84. dprintf(s->avctx, "layer%d, %d Hz, %d kbits/s, ",
  85. s->layer, s->sample_rate, s->bit_rate);
  86. if (s->nb_channels == 2) {
  87. if (s->layer == 3) {
  88. if (s->mode_ext & MODE_EXT_MS_STEREO)
  89. dprintf(s->avctx, "ms-");
  90. if (s->mode_ext & MODE_EXT_I_STEREO)
  91. dprintf(s->avctx, "i-");
  92. }
  93. dprintf(s->avctx, "stereo");
  94. } else {
  95. dprintf(s->avctx, "mono");
  96. }
  97. dprintf(s->avctx, "\n");
  98. #endif
  99. return 0;
  100. }