annotate ffmpeg/libavcodec/eac3enc.c @ 13:844d341cf643 tip

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