Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 17 Apr 2012 20:18:21 +0000 (22:18 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 17 Apr 2012 22:28:06 +0000 (00:28 +0200)
* qatar/master:
  aacenc: Fix issues with huge values of bit_rate.
  dv_tablegen: Drop unnecessary av_unused attribute from dv_vlc_map_tableinit().
  proresenc: multithreaded quantiser search
  riff: use bps instead of bits_per_coded_sample in the WAVEFORMATEXTENSIBLE header
  avconv: only set the "channels" option when it exists for the specified input format
  avplay: update get_buffer to be inline with avconv
  aacdec: More robust output configuration.
  faac: Fix multi-channel ordering
  faac: Add .channel_layouts
  rtmp: Support 'rtmp_playpath', an option which overrides the stream identifier
  rtmp: Support 'rtmp_app', an option which overrides the name of application
  avutil: add better documentation for AVSampleFormat

Conflicts:
libavcodec/aac.h
libavcodec/aacdec.c
libavcodec/aacenc.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
ffmpeg.c
ffplay.c
libavcodec/aac.h
libavcodec/aacdec.c
libavcodec/aacenc.c
libavcodec/aacsbr.c
libavcodec/dv_tablegen.h
libavcodec/libfaac.c
libavcodec/proresenc_kostya.c
libavformat/rtmpproto.c
libavutil/samplefmt.h

diff --cc ffmpeg.c
Simple merge
diff --cc ffplay.c
Simple merge
@@@ -299,8 -304,7 +304,8 @@@ typedef struct 
  
      DECLARE_ALIGNED(32, float, temp)[128];
  
-     enum OCStatus output_configured;
+     OutputConfiguration oc[2];
 +    int warned_num_aac_frames;
  } AACContext;
  
  #endif /* AVCODEC_AAC_H */
@@@ -149,13 -149,9 +149,13 @@@ static av_cold int che_configure(AACCon
              ff_aac_sbr_ctx_init(ac, &ac->che[type][id]->sbr);
          }
          if (type != TYPE_CCE) {
-             if (*channels >= MAX_CHANNELS - (type == TYPE_CPE || (type == TYPE_SCE && ac->m4ac.ps == 1))) {
++            if (*channels >= MAX_CHANNELS - (type == TYPE_CPE || (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1))) {
 +                av_log(ac->avctx, AV_LOG_ERROR, "Too many channels\n");
 +                return AVERROR_INVALIDDATA;
 +            }
              ac->output_data[(*channels)++] = ac->che[type][id]->ch[0].ret;
              if (type == TYPE_CPE ||
-                 (type == TYPE_SCE && ac->m4ac.ps == 1)) {
+                 (type == TYPE_SCE && ac->oc[1].m4ac.ps == 1)) {
                  ac->output_data[(*channels)++] = ac->che[type][id]->ch[1].ret;
              }
          }
@@@ -355,6 -351,28 +355,33 @@@ static uint64_t sniff_channel_order(uin
  }
  
  /**
 -        ac->oc[1] = ac->oc[0];
 -        ac->avctx->channels = ac->oc[1].channels;
 -        ac->avctx->channel_layout = ac->oc[1].channels;
+  * Save current output configuration if and only if it has been locked.
+  */
+ static void push_output_configuration(AACContext *ac) {
+     if (ac->oc[1].status == OC_LOCKED) {
+         ac->oc[0] = ac->oc[1];
+     }
+     ac->oc[1].status = OC_NONE;
+ }
+ /**
+  * Restore the previous output configuration if and only if the current
+  * configuration is unlocked.
+  */
+ static void pop_output_configuration(AACContext *ac) {
+     if (ac->oc[1].status != OC_LOCKED) {
++        if (ac->oc[0].status == OC_LOCKED) {
++            ac->oc[1] = ac->oc[0];
++            ac->avctx->channels = ac->oc[1].channels;
++            ac->avctx->channel_layout = ac->oc[1].channel_layout;
++        }else{
++            ac->avctx->channels = 0;
++            ac->avctx->channel_layout = 0;
++        }
+     }
+ }
+ /**
   * Configure output channel order based on the current program configuration element.
   *
   * @return  Returns error status. 0 - OK, !0 - error
@@@ -388,9 -406,9 +415,10 @@@ static int output_configure(AACContext 
      }
  
      memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
 -    avctx->channel_layout = ac->oc[1].channel_layout = layout;
 +    if (layout) avctx->channel_layout = layout;
-     avctx->channels = channels;
-     ac->output_configured = oc_type;
++    ac->oc[1].channel_layout = layout;
+     avctx->channels = ac->oc[1].channels = channels;
+     ac->oc[1].status = oc_type;
  
      return 0;
  }
@@@ -963,13 -976,13 +1007,13 @@@ static int decode_ics_info(AACContext *
          ics->predictor_present     = get_bits1(gb);
          ics->predictor_reset_group = 0;
          if (ics->predictor_present) {
-             if (ac->m4ac.object_type == AOT_AAC_MAIN) {
+             if (ac->oc[1].m4ac.object_type == AOT_AAC_MAIN) {
                  if (decode_prediction(ac, ics, gb)) {
 -                    return AVERROR_INVALIDDATA;
 +                    goto fail;
                  }
-             } else if (ac->m4ac.object_type == AOT_AAC_LC) {
+             } else if (ac->oc[1].m4ac.object_type == AOT_AAC_LC) {
                  av_log(ac->avctx, AV_LOG_ERROR, "Prediction is not allowed in AAC-LC.\n");
 -                return AVERROR_INVALIDDATA;
 +                goto fail;
              } else {
                  if ((ics->ltp.present = get_bits(gb, 1)))
                      decode_ltp(ac, &ics->ltp, gb, ics->max_sfb);
@@@ -2301,8 -2311,13 +2345,15 @@@ static int parse_adts_frame_header(AACC
  
      size = avpriv_aac_parse_header(gb, &hdr_info);
      if (size > 0) {
 -        if (hdr_info.num_aac_frames != 1) {
++        if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) {
++            // This is 2 for "VLB " audio in NSV files.
++            // See samples/nsv/vlb_audio.
+             av_log_missing_feature(ac->avctx, "More than one AAC RDB per ADTS frame is", 0);
 -            return -1;
++            ac->warned_num_aac_frames = 1;
+         }
+         push_output_configuration(ac);
          if (hdr_info.chan_config) {
-             ac->m4ac.chan_config = hdr_info.chan_config;
+             ac->oc[1].m4ac.chan_config = hdr_info.chan_config;
              if (set_default_channel_config(ac->avctx, layout_map,
                      &layout_map_tags, hdr_info.chan_config))
                  return -7;
@@@ -2402,12 -2414,14 +2450,14 @@@ static int aac_decode_frame_int(AVCodec
                  err = tags;
                  break;
              }
-             if (ac->output_configured > OC_TRIAL_PCE)
+             if (pce_found) {
 -                av_log(avctx, AV_LOG_ERROR,
 -                       "Not evaluating a further program_config_element as this construct is dubious at best.\n");
 -                pop_output_configuration(ac);
 -            } else {
 -                err = output_configure(ac, layout_map, tags, 0, OC_TRIAL_PCE);
 -                pce_found = 1;
 +                av_log(avctx, AV_LOG_INFO,
 +                       "Evaluating a further program_config_element.\n");
+             }
 +            err = output_configure(ac, layout_map, tags, 0, OC_TRIAL_PCE);
 +            if (!err)
-                 ac->m4ac.chan_config = 0;
++                ac->oc[1].m4ac.chan_config = 0;
++            pce_found = 1;
              break;
          }
  
@@@ -571,8 -571,11 +571,10 @@@ static int aac_encode_frame(AVCodecCont
          }
          start_ch += chans;
      }
-     if ((ret = ff_alloc_packet2(avctx, avpkt, 768 * s->channels)))
 -    if ((ret = ff_alloc_packet(avpkt, 768 * s->channels))) {
++    if ((ret = ff_alloc_packet2(avctx, avpkt, 768 * s->channels))) {
+         av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
          return ret;
 -
+     }
      do {
          int frame_bits;
  
Simple merge
Simple merge
@@@ -39,13 -40,7 +40,6 @@@ typedef struct FaacAudioContext 
      AudioFrameQueue afq;
  } FaacAudioContext;
  
- static const int channel_maps[][6] = {
-     { 2, 0, 1 },          //< C L R
-     { 2, 0, 1, 3 },       //< C L R Cs
-     { 2, 0, 1, 3, 4 },    //< C L R Ls Rs
-     { 2, 0, 1, 4, 5, 3 }, //< C L R Ls Rs LFE
- };
--
  static av_cold int Faac_encode_close(AVCodecContext *avctx)
  {
      FaacAudioContext *s = avctx->priv_data;
@@@ -184,8 -186,10 +185,10 @@@ static int Faac_encode_frame(AVCodecCon
      int num_samples  = frame ? frame->nb_samples : 0;
      void *samples    = frame ? frame->data[0]    : NULL;
  
-     if ((ret = ff_alloc_packet2(avctx, avpkt, (7 + 768) * avctx->channels)))
 -    if ((ret = ff_alloc_packet(avpkt, (7 + 768) * avctx->channels))) {
++    if ((ret = ff_alloc_packet2(avctx, avpkt, (7 + 768) * avctx->channels))) {
+         av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
          return ret;
+     }
  
      bytes_written = faacEncEncode(s->faac_handle, samples,
                                    num_samples * avctx->channels,
Simple merge
Simple merge
Simple merge