Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * AC-3 parser
  3.  * Copyright (c) 2003 Fabrice Bellard
  4.  * Copyright (c) 2003 Michael Niedermayer
  5.  *
  6.  * This file is part of FFmpeg.
  7.  *
  8.  * FFmpeg is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU Lesser General Public
  10.  * License as published by the Free Software Foundation; either
  11.  * version 2.1 of the License, or (at your option) any later version.
  12.  *
  13.  * FFmpeg is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16.  * Lesser General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with FFmpeg; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21.  */
  22.  
  23. #include "libavutil/channel_layout.h"
  24. #include "parser.h"
  25. #include "ac3_parser.h"
  26. #include "aac_ac3_parser.h"
  27. #include "get_bits.h"
  28.  
  29.  
  30. #define AC3_HEADER_SIZE 7
  31.  
  32.  
  33. static const uint8_t eac3_blocks[4] = {
  34.     1, 2, 3, 6
  35. };
  36.  
  37. /**
  38.  * Table for center mix levels
  39.  * reference: Section 5.4.2.4 cmixlev
  40.  */
  41. static const uint8_t center_levels[4] = { 4, 5, 6, 5 };
  42.  
  43. /**
  44.  * Table for surround mix levels
  45.  * reference: Section 5.4.2.5 surmixlev
  46.  */
  47. static const uint8_t surround_levels[4] = { 4, 6, 7, 6 };
  48.  
  49.  
  50. int avpriv_ac3_parse_header(GetBitContext *gbc, AC3HeaderInfo *hdr)
  51. {
  52.     int frame_size_code;
  53.  
  54.     memset(hdr, 0, sizeof(*hdr));
  55.  
  56.     hdr->sync_word = get_bits(gbc, 16);
  57.     if(hdr->sync_word != 0x0B77)
  58.         return AAC_AC3_PARSE_ERROR_SYNC;
  59.  
  60.     /* read ahead to bsid to distinguish between AC-3 and E-AC-3 */
  61.     hdr->bitstream_id = show_bits_long(gbc, 29) & 0x1F;
  62.     if(hdr->bitstream_id > 16)
  63.         return AAC_AC3_PARSE_ERROR_BSID;
  64.  
  65.     hdr->num_blocks = 6;
  66.  
  67.     /* set default mix levels */
  68.     hdr->center_mix_level   = 5;  // -4.5dB
  69.     hdr->surround_mix_level = 6;  // -6.0dB
  70.  
  71.     if(hdr->bitstream_id <= 10) {
  72.         /* Normal AC-3 */
  73.         hdr->crc1 = get_bits(gbc, 16);
  74.         hdr->sr_code = get_bits(gbc, 2);
  75.         if(hdr->sr_code == 3)
  76.             return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
  77.  
  78.         frame_size_code = get_bits(gbc, 6);
  79.         if(frame_size_code > 37)
  80.             return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
  81.  
  82.         skip_bits(gbc, 5); // skip bsid, already got it
  83.  
  84.         hdr->bitstream_mode = get_bits(gbc, 3);
  85.         hdr->channel_mode = get_bits(gbc, 3);
  86.  
  87.         if(hdr->channel_mode == AC3_CHMODE_STEREO) {
  88.             skip_bits(gbc, 2); // skip dsurmod
  89.         } else {
  90.             if((hdr->channel_mode & 1) && hdr->channel_mode != AC3_CHMODE_MONO)
  91.                 hdr->  center_mix_level =   center_levels[get_bits(gbc, 2)];
  92.             if(hdr->channel_mode & 4)
  93.                 hdr->surround_mix_level = surround_levels[get_bits(gbc, 2)];
  94.         }
  95.         hdr->lfe_on = get_bits1(gbc);
  96.  
  97.         hdr->sr_shift = FFMAX(hdr->bitstream_id, 8) - 8;
  98.         hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code] >> hdr->sr_shift;
  99.         hdr->bit_rate = (ff_ac3_bitrate_tab[frame_size_code>>1] * 1000) >> hdr->sr_shift;
  100.         hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on;
  101.         hdr->frame_size = ff_ac3_frame_size_tab[frame_size_code][hdr->sr_code] * 2;
  102.         hdr->frame_type = EAC3_FRAME_TYPE_AC3_CONVERT; //EAC3_FRAME_TYPE_INDEPENDENT;
  103.         hdr->substreamid = 0;
  104.     } else {
  105.         /* Enhanced AC-3 */
  106.         hdr->crc1 = 0;
  107.         hdr->frame_type = get_bits(gbc, 2);
  108.         if(hdr->frame_type == EAC3_FRAME_TYPE_RESERVED)
  109.             return AAC_AC3_PARSE_ERROR_FRAME_TYPE;
  110.  
  111.         hdr->substreamid = get_bits(gbc, 3);
  112.  
  113.         hdr->frame_size = (get_bits(gbc, 11) + 1) << 1;
  114.         if(hdr->frame_size < AC3_HEADER_SIZE)
  115.             return AAC_AC3_PARSE_ERROR_FRAME_SIZE;
  116.  
  117.         hdr->sr_code = get_bits(gbc, 2);
  118.         if (hdr->sr_code == 3) {
  119.             int sr_code2 = get_bits(gbc, 2);
  120.             if(sr_code2 == 3)
  121.                 return AAC_AC3_PARSE_ERROR_SAMPLE_RATE;
  122.             hdr->sample_rate = ff_ac3_sample_rate_tab[sr_code2] / 2;
  123.             hdr->sr_shift = 1;
  124.         } else {
  125.             hdr->num_blocks = eac3_blocks[get_bits(gbc, 2)];
  126.             hdr->sample_rate = ff_ac3_sample_rate_tab[hdr->sr_code];
  127.             hdr->sr_shift = 0;
  128.         }
  129.  
  130.         hdr->channel_mode = get_bits(gbc, 3);
  131.         hdr->lfe_on = get_bits1(gbc);
  132.  
  133.         hdr->bit_rate = (uint32_t)(8.0 * hdr->frame_size * hdr->sample_rate /
  134.                         (hdr->num_blocks * 256.0));
  135.         hdr->channels = ff_ac3_channels_tab[hdr->channel_mode] + hdr->lfe_on;
  136.     }
  137.     hdr->channel_layout = avpriv_ac3_channel_layout_tab[hdr->channel_mode];
  138.     if (hdr->lfe_on)
  139.         hdr->channel_layout |= AV_CH_LOW_FREQUENCY;
  140.  
  141.     return 0;
  142. }
  143.  
  144. static int ac3_sync(uint64_t state, AACAC3ParseContext *hdr_info,
  145.         int *need_next_header, int *new_frame_start)
  146. {
  147.     int err;
  148.     union {
  149.         uint64_t u64;
  150.         uint8_t  u8[8];
  151.     } tmp = { av_be2ne64(state) };
  152.     AC3HeaderInfo hdr;
  153.     GetBitContext gbc;
  154.  
  155.     init_get_bits(&gbc, tmp.u8+8-AC3_HEADER_SIZE, 54);
  156.     err = avpriv_ac3_parse_header(&gbc, &hdr);
  157.  
  158.     if(err < 0)
  159.         return 0;
  160.  
  161.     hdr_info->sample_rate = hdr.sample_rate;
  162.     hdr_info->bit_rate = hdr.bit_rate;
  163.     hdr_info->channels = hdr.channels;
  164.     hdr_info->channel_layout = hdr.channel_layout;
  165.     hdr_info->samples = hdr.num_blocks * 256;
  166.     hdr_info->service_type = hdr.bitstream_mode;
  167.     if (hdr.bitstream_mode == 0x7 && hdr.channels > 1)
  168.         hdr_info->service_type = AV_AUDIO_SERVICE_TYPE_KARAOKE;
  169.     if(hdr.bitstream_id>10)
  170.         hdr_info->codec_id = AV_CODEC_ID_EAC3;
  171.     else if (hdr_info->codec_id == AV_CODEC_ID_NONE)
  172.         hdr_info->codec_id = AV_CODEC_ID_AC3;
  173.  
  174.     *need_next_header = (hdr.frame_type != EAC3_FRAME_TYPE_AC3_CONVERT);
  175.     *new_frame_start  = (hdr.frame_type != EAC3_FRAME_TYPE_DEPENDENT);
  176.     return hdr.frame_size;
  177. }
  178.  
  179. static av_cold int ac3_parse_init(AVCodecParserContext *s1)
  180. {
  181.     AACAC3ParseContext *s = s1->priv_data;
  182.     s->header_size = AC3_HEADER_SIZE;
  183.     s->sync = ac3_sync;
  184.     return 0;
  185. }
  186.  
  187.  
  188. AVCodecParser ff_ac3_parser = {
  189.     .codec_ids      = { AV_CODEC_ID_AC3, AV_CODEC_ID_EAC3 },
  190.     .priv_data_size = sizeof(AACAC3ParseContext),
  191.     .parser_init    = ac3_parse_init,
  192.     .parser_parse   = ff_aac_ac3_parse,
  193.     .parser_close   = ff_parse_close,
  194. };
  195.