Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * E-AC-3 encoder
  3.  * Copyright (c) 2011 Justin Ruggles <justin.ruggles@gmail.com>
  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. /**
  23.  * @file
  24.  * E-AC-3 encoder
  25.  */
  26.  
  27. #define CONFIG_AC3ENC_FLOAT 1
  28.  
  29. #include "libavutil/attributes.h"
  30. #include "ac3enc.h"
  31. #include "eac3enc.h"
  32. #include "eac3_data.h"
  33.  
  34.  
  35. #define AC3ENC_TYPE AC3ENC_TYPE_EAC3
  36. #include "ac3enc_opts_template.c"
  37.  
  38. static const AVClass eac3enc_class = {
  39.     .class_name = "E-AC-3 Encoder",
  40.     .item_name  = av_default_item_name,
  41.     .option     = ac3_options,
  42.     .version    = LIBAVUTIL_VERSION_INT,
  43. };
  44.  
  45. /**
  46.  * LUT for finding a matching frame exponent strategy index from a set of
  47.  * exponent strategies for a single channel across all 6 blocks.
  48.  */
  49. static int8_t eac3_frame_expstr_index_tab[3][4][4][4][4][4];
  50.  
  51.  
  52. av_cold void ff_eac3_exponent_init(void)
  53. {
  54.     int i;
  55.  
  56.     memset(eac3_frame_expstr_index_tab, -1, sizeof(eac3_frame_expstr_index_tab));
  57.     for (i = 0; i < 32; i++) {
  58.         eac3_frame_expstr_index_tab[ff_eac3_frm_expstr[i][0]-1]
  59.                                    [ff_eac3_frm_expstr[i][1]]
  60.                                    [ff_eac3_frm_expstr[i][2]]
  61.                                    [ff_eac3_frm_expstr[i][3]]
  62.                                    [ff_eac3_frm_expstr[i][4]]
  63.                                    [ff_eac3_frm_expstr[i][5]] = i;
  64.     }
  65. }
  66.  
  67.  
  68. void ff_eac3_get_frame_exp_strategy(AC3EncodeContext *s)
  69. {
  70.     int ch;
  71.  
  72.     if (s->num_blocks < 6) {
  73.         s->use_frame_exp_strategy = 0;
  74.         return;
  75.     }
  76.  
  77.     s->use_frame_exp_strategy = 1;
  78.     for (ch = !s->cpl_on; ch <= s->fbw_channels; ch++) {
  79.         int expstr = eac3_frame_expstr_index_tab[s->exp_strategy[ch][0]-1]
  80.                                                 [s->exp_strategy[ch][1]]
  81.                                                 [s->exp_strategy[ch][2]]
  82.                                                 [s->exp_strategy[ch][3]]
  83.                                                 [s->exp_strategy[ch][4]]
  84.                                                 [s->exp_strategy[ch][5]];
  85.         if (expstr < 0) {
  86.             s->use_frame_exp_strategy = 0;
  87.             break;
  88.         }
  89.         s->frame_exp_strategy[ch] = expstr;
  90.     }
  91. }
  92.  
  93.  
  94.  
  95. void ff_eac3_set_cpl_states(AC3EncodeContext *s)
  96. {
  97.     int ch, blk;
  98.     int first_cpl_coords[AC3_MAX_CHANNELS];
  99.  
  100.     /* set first cpl coords */
  101.     for (ch = 1; ch <= s->fbw_channels; ch++)
  102.         first_cpl_coords[ch] = 1;
  103.     for (blk = 0; blk < s->num_blocks; blk++) {
  104.         AC3Block *block = &s->blocks[blk];
  105.         for (ch = 1; ch <= s->fbw_channels; ch++) {
  106.             if (block->channel_in_cpl[ch]) {
  107.                 if (first_cpl_coords[ch]) {
  108.                     block->new_cpl_coords[ch] = 2;
  109.                     first_cpl_coords[ch]  = 0;
  110.                 }
  111.             } else {
  112.                 first_cpl_coords[ch] = 1;
  113.             }
  114.         }
  115.     }
  116.  
  117.     /* set first cpl leak */
  118.     for (blk = 0; blk < s->num_blocks; blk++) {
  119.         AC3Block *block = &s->blocks[blk];
  120.         if (block->cpl_in_use) {
  121.             block->new_cpl_leak = 2;
  122.             break;
  123.         }
  124.     }
  125. }
  126.  
  127.  
  128. void ff_eac3_output_frame_header(AC3EncodeContext *s)
  129. {
  130.     int blk, ch;
  131.     AC3EncOptions *opt = &s->options;
  132.  
  133.     put_bits(&s->pb, 16, 0x0b77);                   /* sync word */
  134.  
  135.     /* BSI header */
  136.     put_bits(&s->pb,  2, 0);                        /* stream type = independent */
  137.     put_bits(&s->pb,  3, 0);                        /* substream id = 0 */
  138.     put_bits(&s->pb, 11, (s->frame_size / 2) - 1);  /* frame size */
  139.     if (s->bit_alloc.sr_shift) {
  140.         put_bits(&s->pb, 2, 0x3);                   /* fscod2 */
  141.         put_bits(&s->pb, 2, s->bit_alloc.sr_code);  /* sample rate code */
  142.     } else {
  143.         put_bits(&s->pb, 2, s->bit_alloc.sr_code);  /* sample rate code */
  144.         put_bits(&s->pb, 2, s->num_blks_code);      /* number of blocks */
  145.     }
  146.     put_bits(&s->pb, 3, s->channel_mode);           /* audio coding mode */
  147.     put_bits(&s->pb, 1, s->lfe_on);                 /* LFE channel indicator */
  148.     put_bits(&s->pb, 5, s->bitstream_id);           /* bitstream id (EAC3=16) */
  149.     put_bits(&s->pb, 5, -opt->dialogue_level);      /* dialogue normalization level */
  150.     put_bits(&s->pb, 1, 0);                         /* no compression gain */
  151.     /* mixing metadata*/
  152.     put_bits(&s->pb, 1, opt->eac3_mixing_metadata);
  153.     if (opt->eac3_mixing_metadata) {
  154.         if (s->channel_mode > AC3_CHMODE_STEREO)
  155.             put_bits(&s->pb, 2, opt->preferred_stereo_downmix);
  156.         if (s->has_center) {
  157.             put_bits(&s->pb, 3, s->ltrt_center_mix_level);
  158.             put_bits(&s->pb, 3, s->loro_center_mix_level);
  159.         }
  160.         if (s->has_surround) {
  161.             put_bits(&s->pb, 3, s->ltrt_surround_mix_level);
  162.             put_bits(&s->pb, 3, s->loro_surround_mix_level);
  163.         }
  164.         if (s->lfe_on)
  165.             put_bits(&s->pb, 1, 0);
  166.         put_bits(&s->pb, 1, 0);                     /* no program scale */
  167.         put_bits(&s->pb, 1, 0);                     /* no ext program scale */
  168.         put_bits(&s->pb, 2, 0);                     /* no mixing parameters */
  169.         if (s->channel_mode < AC3_CHMODE_STEREO)
  170.             put_bits(&s->pb, 1, 0);                 /* no pan info */
  171.         put_bits(&s->pb, 1, 0);                     /* no frame mix config info */
  172.     }
  173.     /* info metadata*/
  174.     put_bits(&s->pb, 1, opt->eac3_info_metadata);
  175.     if (opt->eac3_info_metadata) {
  176.         put_bits(&s->pb, 3, s->bitstream_mode);
  177.         put_bits(&s->pb, 1, opt->copyright);
  178.         put_bits(&s->pb, 1, opt->original);
  179.         if (s->channel_mode == AC3_CHMODE_STEREO) {
  180.             put_bits(&s->pb, 2, opt->dolby_surround_mode);
  181.             put_bits(&s->pb, 2, opt->dolby_headphone_mode);
  182.         }
  183.         if (s->channel_mode >= AC3_CHMODE_2F2R)
  184.             put_bits(&s->pb, 2, opt->dolby_surround_ex_mode);
  185.         put_bits(&s->pb, 1, opt->audio_production_info);
  186.         if (opt->audio_production_info) {
  187.             put_bits(&s->pb, 5, opt->mixing_level - 80);
  188.             put_bits(&s->pb, 2, opt->room_type);
  189.             put_bits(&s->pb, 1, opt->ad_converter_type);
  190.         }
  191.         put_bits(&s->pb, 1, 0);
  192.     }
  193.     if (s->num_blocks != 6)
  194.         put_bits(&s->pb, 1, !(s->avctx->frame_number % 6)); /* converter sync flag */
  195.     put_bits(&s->pb, 1, 0);                         /* no additional bit stream info */
  196.  
  197.     /* frame header */
  198.     if (s->num_blocks == 6) {
  199.     put_bits(&s->pb, 1, !s->use_frame_exp_strategy);/* exponent strategy syntax */
  200.     put_bits(&s->pb, 1, 0);                         /* aht enabled = no */
  201.     }
  202.     put_bits(&s->pb, 2, 0);                         /* snr offset strategy = 1 */
  203.     put_bits(&s->pb, 1, 0);                         /* transient pre-noise processing enabled = no */
  204.     put_bits(&s->pb, 1, 0);                         /* block switch syntax enabled = no */
  205.     put_bits(&s->pb, 1, 0);                         /* dither flag syntax enabled = no */
  206.     put_bits(&s->pb, 1, 0);                         /* bit allocation model syntax enabled = no */
  207.     put_bits(&s->pb, 1, 0);                         /* fast gain codes enabled = no */
  208.     put_bits(&s->pb, 1, 0);                         /* dba syntax enabled = no */
  209.     put_bits(&s->pb, 1, 0);                         /* skip field syntax enabled = no */
  210.     put_bits(&s->pb, 1, 0);                         /* spx enabled = no */
  211.     /* coupling strategy use flags */
  212.     if (s->channel_mode > AC3_CHMODE_MONO) {
  213.         put_bits(&s->pb, 1, s->blocks[0].cpl_in_use);
  214.         for (blk = 1; blk < s->num_blocks; blk++) {
  215.             AC3Block *block = &s->blocks[blk];
  216.             put_bits(&s->pb, 1, block->new_cpl_strategy);
  217.             if (block->new_cpl_strategy)
  218.                 put_bits(&s->pb, 1, block->cpl_in_use);
  219.         }
  220.     }
  221.     /* exponent strategy */
  222.     if (s->use_frame_exp_strategy) {
  223.         for (ch = !s->cpl_on; ch <= s->fbw_channels; ch++)
  224.             put_bits(&s->pb, 5, s->frame_exp_strategy[ch]);
  225.     } else {
  226.         for (blk = 0; blk < s->num_blocks; blk++)
  227.             for (ch = !s->blocks[blk].cpl_in_use; ch <= s->fbw_channels; ch++)
  228.                 put_bits(&s->pb, 2, s->exp_strategy[ch][blk]);
  229.     }
  230.     if (s->lfe_on) {
  231.         for (blk = 0; blk < s->num_blocks; blk++)
  232.             put_bits(&s->pb, 1, s->exp_strategy[s->lfe_channel][blk]);
  233.     }
  234.     /* E-AC-3 to AC-3 converter exponent strategy (not optional when num blocks == 6) */
  235.     if (s->num_blocks != 6) {
  236.         put_bits(&s->pb, 1, 0);
  237.     } else {
  238.     for (ch = 1; ch <= s->fbw_channels; ch++) {
  239.         if (s->use_frame_exp_strategy)
  240.             put_bits(&s->pb, 5, s->frame_exp_strategy[ch]);
  241.         else
  242.             put_bits(&s->pb, 5, 0);
  243.     }
  244.     }
  245.     /* snr offsets */
  246.     put_bits(&s->pb, 6, s->coarse_snr_offset);
  247.     put_bits(&s->pb, 4, s->fine_snr_offset[1]);
  248.     /* block start info */
  249.     if (s->num_blocks > 1)
  250.         put_bits(&s->pb, 1, 0);
  251. }
  252.  
  253.  
  254. #if CONFIG_EAC3_ENCODER
  255. AVCodec ff_eac3_encoder = {
  256.     .name            = "eac3",
  257.     .long_name       = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"),
  258.     .type            = AVMEDIA_TYPE_AUDIO,
  259.     .id              = AV_CODEC_ID_EAC3,
  260.     .priv_data_size  = sizeof(AC3EncodeContext),
  261.     .init            = ff_ac3_encode_init,
  262.     .encode2         = ff_ac3_float_encode_frame,
  263.     .close           = ff_ac3_encode_close,
  264.     .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
  265.                                                       AV_SAMPLE_FMT_NONE },
  266.     .priv_class      = &eac3enc_class,
  267.     .channel_layouts = ff_ac3_channel_layouts,
  268.     .defaults        = ac3_defaults,
  269. };
  270. #endif
  271.