Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 31 May 2011 21:16:26 +0000 (23:16 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 31 May 2011 22:09:05 +0000 (00:09 +0200)
* qatar/master:
  vf_drawtext: Replace FFmpeg by Libav in license boilerplate.
  mpegaudiodec: remove unusued code and variables
  improved 'edts' atom writing support
  mpegaudio: clean up compute_antialias() definition
  vp8: fix segmentation race during frame-threading.

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/mpegaudiodec.c
libavcodec/mpegaudiodec_float.c
libavcodec/vp8.c
libavformat/movenc.c

@@@ -2,20 -2,20 +2,20 @@@
   * MPEG Audio decoder
   * Copyright (c) 2001, 2002 Fabrice Bellard
   *
 - * 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.
   *
 - * 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
 - * 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
   */
  
@@@ -112,8 -112,6 +112,6 @@@ typedef struct MPADecodeContext 
  #include "mpegaudiodata.h"
  #include "mpegaudiodectab.h"
  
- static void RENAME(compute_antialias)(MPADecodeContext *s, GranuleDef *g);
  /* vlc structure for decoding layer 3 huffman tables */
  static VLC huff_vlc[16];
  static VLC_TYPE huff_vlc_tables[
@@@ -135,8 -133,7 +133,7 @@@ static uint16_t band_index_long[9][23]
  /* intensity stereo coef table */
  static INTFLOAT is_table[2][16];
  static INTFLOAT is_table_lsf[2][2][16];
- static int32_t csa_table[8][4];
- static float csa_table_float[8][4];
+ static INTFLOAT csa_table[8][4];
  static INTFLOAT mdct_win[8][36];
  
  static int16_t division_tab3[1<<6 ];
@@@ -272,27 -269,6 +269,6 @@@ static inline int l3_unscale(int value
      return m;
  }
  
- /* all integer n^(4/3) computation code */
- #define DEV_ORDER 13
- #define POW_FRAC_BITS 24
- #define POW_FRAC_ONE    (1 << POW_FRAC_BITS)
- #define POW_FIX(a)   ((int)((a) * POW_FRAC_ONE))
- #define POW_MULL(a,b) (((int64_t)(a) * (int64_t)(b)) >> POW_FRAC_BITS)
- static int dev_4_3_coefs[DEV_ORDER];
- static av_cold void int_pow_init(void)
- {
-     int i, a;
-     a = POW_FIX(1.0);
-     for(i=0;i<DEV_ORDER;i++) {
-         a = POW_MULL(a, POW_FIX(4.0 / 3.0) - i * POW_FIX(1.0)) / (i + 1);
-         dev_4_3_coefs[i] = a;
-     }
- }
  static av_cold int decode_init(AVCodecContext * avctx)
  {
      MPADecodeContext *s = avctx->priv_data;
  
          /* compute n ^ (4/3) and store it in mantissa/exp format */
  
-         int_pow_init();
          mpegaudio_tableinit();
  
          for (i = 0; i < 4; i++)
              ci = ci_table[i];
              cs = 1.0 / sqrt(1.0 + ci * ci);
              ca = cs * ci;
+ #if !CONFIG_FLOAT
              csa_table[i][0] = FIXHR(cs/4);
              csa_table[i][1] = FIXHR(ca/4);
              csa_table[i][2] = FIXHR(ca/4) + FIXHR(cs/4);
              csa_table[i][3] = FIXHR(ca/4) - FIXHR(cs/4);
-             csa_table_float[i][0] = cs;
-             csa_table_float[i][1] = ca;
-             csa_table_float[i][2] = ca + cs;
-             csa_table_float[i][3] = ca - cs;
+ #else
+             csa_table[i][0] = cs;
+             csa_table[i][1] = ca;
+             csa_table[i][2] = ca + cs;
+             csa_table[i][3] = ca - cs;
+ #endif
          }
  
          /* compute mdct windows */
@@@ -1335,10 -1313,26 +1313,26 @@@ static void compute_stereo(MPADecodeCon
      }
  }
  
- #if !CONFIG_FLOAT
- static void compute_antialias_fixed(MPADecodeContext *s, GranuleDef *g)
+ #if CONFIG_FLOAT
+ #define AA(j) do {                                                      \
+         float tmp0 = ptr[-1-j];                                         \
+         float tmp1 = ptr[   j];                                         \
+         ptr[-1-j] = tmp0 * csa_table[j][0] - tmp1 * csa_table[j][1];    \
+         ptr[   j] = tmp0 * csa_table[j][1] + tmp1 * csa_table[j][0];    \
+     } while (0)
+ #else
+ #define AA(j) do {                                              \
+         int tmp0 = ptr[-1-j];                                   \
+         int tmp1 = ptr[   j];                                   \
+         int tmp2 = MULH(tmp0 + tmp1, csa_table[j][0]);          \
+         ptr[-1-j] = 4*(tmp2 - MULH(tmp1, csa_table[j][2]));     \
+         ptr[   j] = 4*(tmp2 + MULH(tmp0, csa_table[j][3]));     \
+     } while (0)
+ #endif
+ static void compute_antialias(MPADecodeContext *s, GranuleDef *g)
  {
-     int32_t *ptr, *csa;
+     INTFLOAT *ptr;
      int n, i;
  
      /* we antialias only "long" bands */
  
      ptr = g->sb_hybrid + 18;
      for(i = n;i > 0;i--) {
-         int tmp0, tmp1, tmp2;
-         csa = &csa_table[0][0];
- #define INT_AA(j) \
-             tmp0 = ptr[-1-j];\
-             tmp1 = ptr[   j];\
-             tmp2= MULH(tmp0 + tmp1, csa[0+4*j]);\
-             ptr[-1-j] = 4*(tmp2 - MULH(tmp1, csa[2+4*j]));\
-             ptr[   j] = 4*(tmp2 + MULH(tmp0, csa[3+4*j]));
-         INT_AA(0)
-         INT_AA(1)
-         INT_AA(2)
-         INT_AA(3)
-         INT_AA(4)
-         INT_AA(5)
-         INT_AA(6)
-         INT_AA(7)
+         AA(0);
+         AA(1);
+         AA(2);
+         AA(3);
+         AA(4);
+         AA(5);
+         AA(6);
+         AA(7);
  
          ptr += 18;
      }
  }
- #endif
  
  static void compute_imdct(MPADecodeContext *s,
                            GranuleDef *g,
  /* main layer3 decoding function */
  static int mp_decode_layer3(MPADecodeContext *s)
  {
-     int nb_granules, main_data_begin, private_bits;
+     int nb_granules, main_data_begin;
      int gr, ch, blocksplit_flag, i, j, k, n, bits_pos;
      GranuleDef *g;
      int16_t exponents[576]; //FIXME try INTFLOAT
      /* read side info */
      if (s->lsf) {
          main_data_begin = get_bits(&s->gb, 8);
-         private_bits = get_bits(&s->gb, s->nb_channels);
+         skip_bits(&s->gb, s->nb_channels);
          nb_granules = 1;
      } else {
          main_data_begin = get_bits(&s->gb, 9);
          if (s->nb_channels == 2)
-             private_bits = get_bits(&s->gb, 3);
+             skip_bits(&s->gb, 3);
          else
-             private_bits = get_bits(&s->gb, 5);
+             skip_bits(&s->gb, 5);
          nb_granules = 2;
          for(ch=0;ch<s->nb_channels;ch++) {
              s->granules[ch][0].scfsi = 0;/* all scale factors are transmitted */
              g = &s->granules[ch][gr];
  
              reorder_block(s, g);
-             RENAME(compute_antialias)(s, g);
+             compute_antialias(s, g);
              compute_imdct(s, g, &s->sb_samples[ch][18 * gr][0], s->mdct_buf[ch]);
          }
      } /* gr */
@@@ -1724,6 -1708,7 +1708,6 @@@ static int mp_decode_frame(MPADecodeCon
      if (s->error_protection)
          skip_bits(&s->gb, 16);
  
 -    av_dlog(s->avctx, "frame %d:\n", s->frame_count);
      switch(s->layer) {
      case 1:
          s->avctx->frame_size = 384;
@@@ -2,65 -2,26 +2,26 @@@
   * Float MPEG Audio decoder
   * Copyright (c) 2010 Michael Niedermayer
   *
 - * 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.
   *
 - * 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
 - * 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
   */
  
  #define CONFIG_FLOAT 1
  #include "mpegaudiodec.c"
  
- static void compute_antialias_float(MPADecodeContext *s,
-                               GranuleDef *g)
- {
-     float *ptr;
-     int n, i;
-     /* we antialias only "long" bands */
-     if (g->block_type == 2) {
-         if (!g->switch_point)
-             return;
-         /* XXX: check this for 8000Hz case */
-         n = 1;
-     } else {
-         n = SBLIMIT - 1;
-     }
-     ptr = g->sb_hybrid + 18;
-     for(i = n;i > 0;i--) {
-         float tmp0, tmp1;
-         float *csa = &csa_table_float[0][0];
- #define FLOAT_AA(j)\
-         tmp0= ptr[-1-j];\
-         tmp1= ptr[   j];\
-         ptr[-1-j] = tmp0 * csa[0+4*j] - tmp1 * csa[1+4*j];\
-         ptr[   j] = tmp0 * csa[1+4*j] + tmp1 * csa[0+4*j];
-         FLOAT_AA(0)
-         FLOAT_AA(1)
-         FLOAT_AA(2)
-         FLOAT_AA(3)
-         FLOAT_AA(4)
-         FLOAT_AA(5)
-         FLOAT_AA(6)
-         FLOAT_AA(7)
-         ptr += 18;
-     }
- }
  #if CONFIG_MP1FLOAT_DECODER
  AVCodec ff_mp1float_decoder =
  {
diff --combined libavcodec/vp8.c
@@@ -5,20 -5,20 +5,20 @@@
   * Copyright (C) 2010 Ronald S. Bultje
   * Copyright (C) 2010 Jason Garrett-Glaser
   *
 - * 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.
   *
 - * 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
 - * 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
   */
  
@@@ -1612,7 -1612,7 +1612,7 @@@ static int vp8_decode_frame(AVCodecCont
  
          s->mv_min.x = -MARGIN;
          s->mv_max.x = ((s->mb_width  - 1) << 6) + MARGIN;
-         if (prev_frame && s->segmentation.enabled && s->segmentation.update_map)
+         if (prev_frame && s->segmentation.enabled && !s->segmentation.update_map)
              ff_thread_await_progress(prev_frame, mb_y, 0);
  
          for (mb_x = 0; mb_x < s->mb_width; mb_x++, mb_xy++, mb++) {
diff --combined libavformat/movenc.c
@@@ -4,20 -4,20 +4,20 @@@
   * Copyright (c) 2004 Gildas Bazin <gbazin at videolan dot org>
   * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot 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.
   *
 - * 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
 - * 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
   */
  
@@@ -261,20 -261,10 +261,20 @@@ static void putDescr(AVIOContext *pb, i
      avio_w8(pb, size & 0x7F);
  }
  
 +static unsigned compute_avg_bitrate(MOVTrack *track)
 +{
 +    uint64_t size = 0;
 +    int i;
 +    for (i = 0; i < track->entry; i++)
 +        size += track->cluster[i].size;
 +    return size * 8 * track->timescale / track->trackDuration;
 +}
 +
  static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic
  {
      int64_t pos = avio_tell(pb);
      int decoderSpecificInfoLen = track->vosLen ? 5+track->vosLen : 0;
 +    unsigned avg_bitrate;
  
      avio_wb32(pb, 0); // size
      ffio_wfourcc(pb, "esds");
      avio_w8(pb,  track->enc->rc_buffer_size>>(3+16));      // Buffersize DB (24 bits)
      avio_wb16(pb, (track->enc->rc_buffer_size>>3)&0xFFFF); // Buffersize DB
  
 -    avio_wb32(pb, FFMAX(track->enc->bit_rate, track->enc->rc_max_rate)); // maxbitrate (FIXME should be max rate in any 1 sec window)
 -    if(track->enc->rc_max_rate != track->enc->rc_min_rate || track->enc->rc_min_rate==0)
 -        avio_wb32(pb, 0); // vbr
 -    else
 -        avio_wb32(pb, track->enc->rc_max_rate); // avg bitrate
 +    avg_bitrate = compute_avg_bitrate(track);
 +    // maxbitrate (FIXME should be max rate in any 1 sec window)
 +    avio_wb32(pb, FFMAX3(track->enc->bit_rate, track->enc->rc_max_rate, avg_bitrate));
 +    avio_wb32(pb, avg_bitrate);
  
      if (track->vosLen) {
          // DecoderSpecific info descriptor
@@@ -1288,20 -1279,49 +1288,49 @@@ static int mov_write_tapt_tag(AVIOConte
  // This box seems important for the psp playback ... without it the movie seems to hang
  static int mov_write_edts_tag(AVIOContext *pb, MOVTrack *track)
  {
-     avio_wb32(pb, 0x24); /* size  */
+     int64_t duration = av_rescale_rnd(track->trackDuration, MOV_TIMESCALE,
+                                       track->timescale, AV_ROUND_UP);
+     int version = duration < INT32_MAX ? 0 : 1;
+     int entry_size, entry_count, size;
+     int64_t delay, start_ct = track->cluster[0].cts;
+     delay = av_rescale_rnd(track->cluster[0].dts + start_ct, MOV_TIMESCALE,
+                            track->timescale, AV_ROUND_DOWN);
+     version |= delay < INT32_MAX ? 0 : 1;
+     entry_size = (version == 1) ? 20 : 12;
+     entry_count = 1 + (delay > 0);
+     size = 24 + entry_count * entry_size;
+     /* write the atom data */
+     avio_wb32(pb, size);
      ffio_wfourcc(pb, "edts");
-     avio_wb32(pb, 0x1c); /* size  */
+     avio_wb32(pb, size - 8);
      ffio_wfourcc(pb, "elst");
-     avio_wb32(pb, 0x0);
-     avio_wb32(pb, 0x1);
+     avio_w8(pb, version);
+     avio_wb24(pb, 0); /* flags */
  
-     /* duration   ... doesn't seem to effect psp */
-     avio_wb32(pb, av_rescale_rnd(track->trackDuration, MOV_TIMESCALE,
-                                 track->timescale, AV_ROUND_UP));
+     avio_wb32(pb, entry_count);
+     if (delay > 0) { /* add an empty edit to delay presentation */
+         if (version == 1) {
+             avio_wb64(pb, delay);
+             avio_wb64(pb, -1);
+         } else {
+             avio_wb32(pb, delay);
+             avio_wb32(pb, -1);
+         }
+         avio_wb32(pb, 0x00010000);
+     }
  
-     avio_wb32(pb, track->cluster[0].cts); /* first pts is cts since dts is 0 */
+     /* duration */
+     if (version == 1) {
+         avio_wb64(pb, duration);
+         avio_wb64(pb, start_ct);
+     } else {
+         avio_wb32(pb, duration);
+         avio_wb32(pb, start_ct);
+     }
      avio_wb32(pb, 0x00010000);
-     return 0x24;
+     return size;
  }
  
  static int mov_write_tref_tag(AVIOContext *pb, MOVTrack *track)
@@@ -1333,12 -1353,12 +1362,12 @@@ static int mov_write_uuid_tag_psp(AVIOC
      return 0x34;
  }
  
 -static int mov_write_udta_sdp(AVIOContext *pb, AVCodecContext *ctx, int index)
 +static int mov_write_udta_sdp(AVIOContext *pb, AVFormatContext *ctx, int index)
  {
      char buf[1000] = "";
      int len;
  
 -    ff_sdp_write_media(buf, sizeof(buf), ctx, NULL, NULL, 0, 0);
 +    ff_sdp_write_media(buf, sizeof(buf), ctx->streams[0]->codec, NULL, NULL, 0, 0, ctx->flags);
      av_strlcatf(buf, sizeof(buf), "a=control:streamid=%d\r\n", index);
      len = strlen(buf);
  
@@@ -1358,7 -1378,7 +1387,7 @@@ static int mov_write_trak_tag(AVIOConte
      avio_wb32(pb, 0); /* size */
      ffio_wfourcc(pb, "trak");
      mov_write_tkhd_tag(pb, track, st);
-     if (track->mode == MODE_PSP || track->flags & MOV_TRACK_CTTS)
+     if (track->mode == MODE_PSP || track->flags & MOV_TRACK_CTTS || track->cluster[0].dts)
          mov_write_edts_tag(pb, track);  // PSP Movies require edts box
      if (track->tref_tag)
          mov_write_tref_tag(pb, track);
      if (track->mode == MODE_PSP)
          mov_write_uuid_tag_psp(pb,track);  // PSP Movies require this uuid box
      if (track->tag == MKTAG('r','t','p',' '))
 -        mov_write_udta_sdp(pb, track->rtp_ctx->streams[0]->codec, track->trackID);
 +        mov_write_udta_sdp(pb, track->rtp_ctx, track->trackID);
      if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO && track->mode == MODE_MOV) {
          double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio);
          if (0.0 != sample_aspect_ratio && 1.0 != sample_aspect_ratio)
@@@ -2007,10 -2027,6 +2036,10 @@@ int ff_mov_write_packet(AVFormatContex
          /* from x264 or from bytestream h264 */
          /* nal reformating needed */
          size = ff_avc_parse_nal_units(pb, pkt->data, pkt->size);
 +    } else if (enc->codec_id == CODEC_ID_AAC && pkt->size > 2 &&
 +               (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) {
 +        av_log(s, AV_LOG_ERROR, "malformated aac bitstream, use -absf aac_adtstoasc\n");
 +        return -1;
      } else {
          avio_write(pb, pkt->data, size);
      }