avcodec/aacdec_fixed: use 64bit to avoid overflow in rounding in apply_dependent_coup...
[ffmpeg.git] / libavcodec / eac3enc.c
index 09fa80f..e1d61f6 100644 (file)
@@ -2,20 +2,20 @@
  * E-AC-3 encoder
  * Copyright (c) 2011 Justin Ruggles <justin.ruggles@gmail.com>
  *
  * E-AC-3 encoder
  * Copyright (c) 2011 Justin Ruggles <justin.ruggles@gmail.com>
  *
- * This file is part of Libav.
+ * This file is part of FFmpeg.
  *
  *
- * Libav is free software; you can redistribute it and/or
+ * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
- * Libav is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
- * License along with Libav; if not, write to the Free Software
+ * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
@@ -25,6 +25,8 @@
  */
 
 #define CONFIG_AC3ENC_FLOAT 1
  */
 
 #define CONFIG_AC3ENC_FLOAT 1
+
+#include "libavutil/attributes.h"
 #include "ac3enc.h"
 #include "eac3enc.h"
 #include "eac3_data.h"
 #include "ac3enc.h"
 #include "eac3enc.h"
 #include "eac3_data.h"
 
 #define AC3ENC_TYPE AC3ENC_TYPE_EAC3
 #include "ac3enc_opts_template.c"
 
 #define AC3ENC_TYPE AC3ENC_TYPE_EAC3
 #include "ac3enc_opts_template.c"
-static const AVClass eac3enc_class = { "E-AC-3 Encoder", av_default_item_name,
-                                       eac3_options, LIBAVUTIL_VERSION_INT };
 
 
+static const AVClass eac3enc_class = {
+    .class_name = "E-AC-3 Encoder",
+    .item_name  = av_default_item_name,
+    .option     = ac3_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
 
 /**
  * LUT for finding a matching frame exponent strategy index from a set of
 
 /**
  * LUT for finding a matching frame exponent strategy index from a set of
@@ -43,7 +49,7 @@ static const AVClass eac3enc_class = { "E-AC-3 Encoder", av_default_item_name,
 static int8_t eac3_frame_expstr_index_tab[3][4][4][4][4][4];
 
 
 static int8_t eac3_frame_expstr_index_tab[3][4][4][4][4][4];
 
 
-void ff_eac3_exponent_init(void)
+av_cold void ff_eac3_exponent_init(void)
 {
     int i;
 
 {
     int i;
 
@@ -63,6 +69,11 @@ void ff_eac3_get_frame_exp_strategy(AC3EncodeContext *s)
 {
     int ch;
 
 {
     int ch;
 
+    if (s->num_blocks < 6) {
+        s->use_frame_exp_strategy = 0;
+        return;
+    }
+
     s->use_frame_exp_strategy = 1;
     for (ch = !s->cpl_on; ch <= s->fbw_channels; ch++) {
         int expstr = eac3_frame_expstr_index_tab[s->exp_strategy[ch][0]-1]
     s->use_frame_exp_strategy = 1;
     for (ch = !s->cpl_on; ch <= s->fbw_channels; ch++) {
         int expstr = eac3_frame_expstr_index_tab[s->exp_strategy[ch][0]-1]
@@ -89,12 +100,12 @@ void ff_eac3_set_cpl_states(AC3EncodeContext *s)
     /* set first cpl coords */
     for (ch = 1; ch <= s->fbw_channels; ch++)
         first_cpl_coords[ch] = 1;
     /* set first cpl coords */
     for (ch = 1; ch <= s->fbw_channels; ch++)
         first_cpl_coords[ch] = 1;
-    for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
+    for (blk = 0; blk < s->num_blocks; blk++) {
         AC3Block *block = &s->blocks[blk];
         for (ch = 1; ch <= s->fbw_channels; ch++) {
             if (block->channel_in_cpl[ch]) {
                 if (first_cpl_coords[ch]) {
         AC3Block *block = &s->blocks[blk];
         for (ch = 1; ch <= s->fbw_channels; ch++) {
             if (block->channel_in_cpl[ch]) {
                 if (first_cpl_coords[ch]) {
-                    block->new_cpl_coords = 2;
+                    block->new_cpl_coords[ch] = 2;
                     first_cpl_coords[ch]  = 0;
                 }
             } else {
                     first_cpl_coords[ch]  = 0;
                 }
             } else {
@@ -104,7 +115,7 @@ void ff_eac3_set_cpl_states(AC3EncodeContext *s)
     }
 
     /* set first cpl leak */
     }
 
     /* set first cpl leak */
-    for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) {
+    for (blk = 0; blk < s->num_blocks; blk++) {
         AC3Block *block = &s->blocks[blk];
         if (block->cpl_in_use) {
             block->new_cpl_leak = 2;
         AC3Block *block = &s->blocks[blk];
         if (block->cpl_in_use) {
             block->new_cpl_leak = 2;
@@ -130,22 +141,64 @@ void ff_eac3_output_frame_header(AC3EncodeContext *s)
         put_bits(&s->pb, 2, s->bit_alloc.sr_code);  /* sample rate code */
     } else {
         put_bits(&s->pb, 2, s->bit_alloc.sr_code);  /* sample rate code */
         put_bits(&s->pb, 2, s->bit_alloc.sr_code);  /* sample rate code */
     } else {
         put_bits(&s->pb, 2, s->bit_alloc.sr_code);  /* sample rate code */
-        put_bits(&s->pb, 2, 0x3);                   /* number of blocks = 6 */
+        put_bits(&s->pb, 2, s->num_blks_code);      /* number of blocks */
     }
     put_bits(&s->pb, 3, s->channel_mode);           /* audio coding mode */
     put_bits(&s->pb, 1, s->lfe_on);                 /* LFE channel indicator */
     put_bits(&s->pb, 5, s->bitstream_id);           /* bitstream id (EAC3=16) */
     put_bits(&s->pb, 5, -opt->dialogue_level);      /* dialogue normalization level */
     put_bits(&s->pb, 1, 0);                         /* no compression gain */
     }
     put_bits(&s->pb, 3, s->channel_mode);           /* audio coding mode */
     put_bits(&s->pb, 1, s->lfe_on);                 /* LFE channel indicator */
     put_bits(&s->pb, 5, s->bitstream_id);           /* bitstream id (EAC3=16) */
     put_bits(&s->pb, 5, -opt->dialogue_level);      /* dialogue normalization level */
     put_bits(&s->pb, 1, 0);                         /* no compression gain */
-    put_bits(&s->pb, 1, 0);                         /* no mixing metadata */
-    /* TODO: mixing metadata */
-    put_bits(&s->pb, 1, 0);                         /* no info metadata */
-    /* TODO: info metadata */
+    /* mixing metadata*/
+    put_bits(&s->pb, 1, opt->eac3_mixing_metadata);
+    if (opt->eac3_mixing_metadata) {
+        if (s->channel_mode > AC3_CHMODE_STEREO)
+            put_bits(&s->pb, 2, opt->preferred_stereo_downmix);
+        if (s->has_center) {
+            put_bits(&s->pb, 3, s->ltrt_center_mix_level);
+            put_bits(&s->pb, 3, s->loro_center_mix_level);
+        }
+        if (s->has_surround) {
+            put_bits(&s->pb, 3, s->ltrt_surround_mix_level);
+            put_bits(&s->pb, 3, s->loro_surround_mix_level);
+        }
+        if (s->lfe_on)
+            put_bits(&s->pb, 1, 0);
+        put_bits(&s->pb, 1, 0);                     /* no program scale */
+        put_bits(&s->pb, 1, 0);                     /* no ext program scale */
+        put_bits(&s->pb, 2, 0);                     /* no mixing parameters */
+        if (s->channel_mode < AC3_CHMODE_STEREO)
+            put_bits(&s->pb, 1, 0);                 /* no pan info */
+        put_bits(&s->pb, 1, 0);                     /* no frame mix config info */
+    }
+    /* info metadata*/
+    put_bits(&s->pb, 1, opt->eac3_info_metadata);
+    if (opt->eac3_info_metadata) {
+        put_bits(&s->pb, 3, s->bitstream_mode);
+        put_bits(&s->pb, 1, opt->copyright);
+        put_bits(&s->pb, 1, opt->original);
+        if (s->channel_mode == AC3_CHMODE_STEREO) {
+            put_bits(&s->pb, 2, opt->dolby_surround_mode);
+            put_bits(&s->pb, 2, opt->dolby_headphone_mode);
+        }
+        if (s->channel_mode >= AC3_CHMODE_2F2R)
+            put_bits(&s->pb, 2, opt->dolby_surround_ex_mode);
+        put_bits(&s->pb, 1, opt->audio_production_info);
+        if (opt->audio_production_info) {
+            put_bits(&s->pb, 5, opt->mixing_level - 80);
+            put_bits(&s->pb, 2, opt->room_type);
+            put_bits(&s->pb, 1, opt->ad_converter_type);
+        }
+        put_bits(&s->pb, 1, 0);
+    }
+    if (s->num_blocks != 6)
+        put_bits(&s->pb, 1, !(s->avctx->frame_number % 6)); /* converter sync flag */
     put_bits(&s->pb, 1, 0);                         /* no additional bit stream info */
 
     /* frame header */
     put_bits(&s->pb, 1, 0);                         /* no additional bit stream info */
 
     /* frame header */
+    if (s->num_blocks == 6) {
     put_bits(&s->pb, 1, !s->use_frame_exp_strategy);/* exponent strategy syntax */
     put_bits(&s->pb, 1, 0);                         /* aht enabled = no */
     put_bits(&s->pb, 1, !s->use_frame_exp_strategy);/* exponent strategy syntax */
     put_bits(&s->pb, 1, 0);                         /* aht enabled = no */
+    }
     put_bits(&s->pb, 2, 0);                         /* snr offset strategy = 1 */
     put_bits(&s->pb, 1, 0);                         /* transient pre-noise processing enabled = no */
     put_bits(&s->pb, 1, 0);                         /* block switch syntax enabled = no */
     put_bits(&s->pb, 2, 0);                         /* snr offset strategy = 1 */
     put_bits(&s->pb, 1, 0);                         /* transient pre-noise processing enabled = no */
     put_bits(&s->pb, 1, 0);                         /* block switch syntax enabled = no */
@@ -158,7 +211,7 @@ void ff_eac3_output_frame_header(AC3EncodeContext *s)
     /* coupling strategy use flags */
     if (s->channel_mode > AC3_CHMODE_MONO) {
         put_bits(&s->pb, 1, s->blocks[0].cpl_in_use);
     /* coupling strategy use flags */
     if (s->channel_mode > AC3_CHMODE_MONO) {
         put_bits(&s->pb, 1, s->blocks[0].cpl_in_use);
-        for (blk = 1; blk < AC3_MAX_BLOCKS; blk++) {
+        for (blk = 1; blk < s->num_blocks; blk++) {
             AC3Block *block = &s->blocks[blk];
             put_bits(&s->pb, 1, block->new_cpl_strategy);
             if (block->new_cpl_strategy)
             AC3Block *block = &s->blocks[blk];
             put_bits(&s->pb, 1, block->new_cpl_strategy);
             if (block->new_cpl_strategy)
@@ -170,41 +223,46 @@ void ff_eac3_output_frame_header(AC3EncodeContext *s)
         for (ch = !s->cpl_on; ch <= s->fbw_channels; ch++)
             put_bits(&s->pb, 5, s->frame_exp_strategy[ch]);
     } else {
         for (ch = !s->cpl_on; ch <= s->fbw_channels; ch++)
             put_bits(&s->pb, 5, s->frame_exp_strategy[ch]);
     } else {
-        for (blk = 0; blk < AC3_MAX_BLOCKS; blk++)
+        for (blk = 0; blk < s->num_blocks; blk++)
             for (ch = !s->blocks[blk].cpl_in_use; ch <= s->fbw_channels; ch++)
                 put_bits(&s->pb, 2, s->exp_strategy[ch][blk]);
     }
     if (s->lfe_on) {
             for (ch = !s->blocks[blk].cpl_in_use; ch <= s->fbw_channels; ch++)
                 put_bits(&s->pb, 2, s->exp_strategy[ch][blk]);
     }
     if (s->lfe_on) {
-        for (blk = 0; blk < AC3_MAX_BLOCKS; blk++)
+        for (blk = 0; blk < s->num_blocks; blk++)
             put_bits(&s->pb, 1, s->exp_strategy[s->lfe_channel][blk]);
     }
             put_bits(&s->pb, 1, s->exp_strategy[s->lfe_channel][blk]);
     }
-    /* E-AC-3 to AC-3 converter exponent strategy (unfortunately not optional...) */
+    /* E-AC-3 to AC-3 converter exponent strategy (not optional when num blocks == 6) */
+    if (s->num_blocks != 6) {
+        put_bits(&s->pb, 1, 0);
+    } else {
     for (ch = 1; ch <= s->fbw_channels; ch++) {
         if (s->use_frame_exp_strategy)
             put_bits(&s->pb, 5, s->frame_exp_strategy[ch]);
         else
             put_bits(&s->pb, 5, 0);
     }
     for (ch = 1; ch <= s->fbw_channels; ch++) {
         if (s->use_frame_exp_strategy)
             put_bits(&s->pb, 5, s->frame_exp_strategy[ch]);
         else
             put_bits(&s->pb, 5, 0);
     }
+    }
     /* snr offsets */
     put_bits(&s->pb, 6, s->coarse_snr_offset);
     put_bits(&s->pb, 4, s->fine_snr_offset[1]);
     /* block start info */
     /* snr offsets */
     put_bits(&s->pb, 6, s->coarse_snr_offset);
     put_bits(&s->pb, 4, s->fine_snr_offset[1]);
     /* block start info */
-    put_bits(&s->pb, 1, 0);
+    if (s->num_blocks > 1)
+        put_bits(&s->pb, 1, 0);
 }
 
 
 }
 
 
-#if CONFIG_EAC3_ENCODER
 AVCodec ff_eac3_encoder = {
     .name            = "eac3",
 AVCodec ff_eac3_encoder = {
     .name            = "eac3",
+    .long_name       = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"),
     .type            = AVMEDIA_TYPE_AUDIO,
     .type            = AVMEDIA_TYPE_AUDIO,
-    .id              = CODEC_ID_EAC3,
+    .id              = AV_CODEC_ID_EAC3,
     .priv_data_size  = sizeof(AC3EncodeContext),
     .priv_data_size  = sizeof(AC3EncodeContext),
-    .init            = ff_ac3_encode_init,
-    .encode          = ff_ac3_float_encode_frame,
+    .init            = ff_ac3_float_encode_init,
+    .encode2         = ff_ac3_float_encode_frame,
     .close           = ff_ac3_encode_close,
     .close           = ff_ac3_encode_close,
-    .sample_fmts     = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE},
-    .long_name       = NULL_IF_CONFIG_SMALL("ATSC A/52 E-AC-3"),
+    .sample_fmts     = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
+                                                      AV_SAMPLE_FMT_NONE },
     .priv_class      = &eac3enc_class,
     .channel_layouts = ff_ac3_channel_layouts,
     .priv_class      = &eac3enc_class,
     .channel_layouts = ff_ac3_channel_layouts,
+    .defaults        = ac3_defaults,
 };
 };
-#endif