Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 23 Oct 2011 23:01:21 +0000 (01:01 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 23 Oct 2011 23:01:21 +0000 (01:01 +0200)
* qatar/master:
  Move id3v2 tag writing to a separate file.
  swscale: add missing colons to x86 assembly yuv2planeX.
  g722: split decoder and encoder into separate files
  cosmetics: remove extra spaces before end-of-statement semi-colons
  vorbisdec: check output buffer size before writing output
  wavpack: calculate bpp using av_get_bytes_per_sample()
  ac3enc: Set max value for mode options correctly
  lavc: move get_b_cbp() from h263.h to mpeg4videoenc.c
  mpeg12: move closed_gop from MpegEncContext to Mpeg1Context
  mpeg12: move full_pel from MpegEncContext to Mpeg1Context
  mpeg12: move Mpeg1Context from mpeg12.c to mpeg12.h
  mpegvideo: remove some unused variables from MpegEncContext.

Conflicts:
libavcodec/mpeg12.c
libavformat/mp3enc.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
19 files changed:
1  2 
libavcodec/Makefile
libavcodec/arm/asm-offsets.h
libavcodec/g722.c
libavcodec/h263.h
libavcodec/h264.c
libavcodec/mpeg12.c
libavcodec/mpeg12.h
libavcodec/mpeg4videoenc.c
libavcodec/mpegvideo.c
libavcodec/mpegvideo.h
libavcodec/vdpau.c
libavcodec/vdpau_internal.h
libavcodec/vorbisdec.c
libavcodec/wavpack.c
libavformat/Makefile
libavformat/id3v2.h
libavformat/id3v2enc.c
libavformat/mp3enc.c
libswscale/x86/scale.asm

Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1060,9 -1033,7 +1060,8 @@@ static av_cold void common_init(H264Con
  
      h->dequant_coeff_pps= -1;
      s->unrestricted_mv=1;
-     s->decode=1; //FIXME
  
 +    s->dsp.dct_bits = 16;
      dsputil_init(&s->dsp, s->avctx); // needed so that idct permutation is known early
  
      memset(h->pps.scaling_matrix4, 16, 6*16*sizeof(uint8_t));
@@@ -2320,9 -2258,9 +2307,10 @@@ static int decode_chunks(AVCodecContex
                          s2->error_count += s2->thread_context[i]->error_count;
                  }
  
 -                if (CONFIG_MPEG_VDPAU_DECODER && avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)
 +                if (CONFIG_VDPAU && uses_vdpau(avctx))
-                     ff_vdpau_mpeg_picture_complete(s2, buf, buf_size, s->slice_count);
+                     ff_vdpau_mpeg_picture_complete(s, buf, buf_size, s->slice_count);
 +
                  if (slice_end(avctx, picture)) {
                      if (s2->last_picture_ptr || s2->low_delay) //FIXME merge with the stuff in mpeg_decode_slice
                          *data_size = sizeof(AVPicture);
  extern VLC ff_dc_lum_vlc;
  extern VLC ff_dc_chroma_vlc;
  
+ typedef struct Mpeg1Context {
+     MpegEncContext mpeg_enc_ctx;
+     int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
+     int repeat_field; /* true if we must repeat the field */
+     AVPanScan pan_scan;              /**< some temporary storage for the panscan */
+     int slice_count;
+     int swap_uv;//indicate VCR2
+     int save_aspect_info;
+     int save_width, save_height, save_progressive_seq;
+     AVRational frame_rate_ext;       ///< MPEG-2 specific framerate modificator
+     int sync;                        ///< Did we reach a sync point like a GOP/SEQ/KEYFrame?
+     int full_pel[2];
+     int closed_gop;                  ///< GOP is closed
++    int tmpgexs;
+ } Mpeg1Context;
  extern uint8_t ff_mpeg12_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
  
  void ff_mpeg12_common_init(MpegEncContext *s);
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 0000000,36c73bf..4e1cd75
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,146 +1,146 @@@
 - * This file is part of Libav.
+ /*
+  * ID3v2 header writer
+  *
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg.
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * 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 FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #include <stdint.h>
+ #include "libavutil/dict.h"
+ #include "libavutil/intreadwrite.h"
+ #include "avformat.h"
+ #include "avio.h"
+ #include "id3v2.h"
+ static void id3v2_put_size(AVFormatContext *s, int size)
+ {
+     avio_w8(s->pb, size >> 21 & 0x7f);
+     avio_w8(s->pb, size >> 14 & 0x7f);
+     avio_w8(s->pb, size >> 7  & 0x7f);
+     avio_w8(s->pb, size       & 0x7f);
+ }
+ static int string_is_ascii(const uint8_t *str)
+ {
+     while (*str && *str < 128) str++;
+     return !*str;
+ }
+ /**
+  * Write a text frame with one (normal frames) or two (TXXX frames) strings
+  * according to encoding (only UTF-8 or UTF-16+BOM supported).
+  * @return number of bytes written or a negative error code.
+  */
+ static int id3v2_put_ttag(AVFormatContext *s, const char *str1, const char *str2,
+                           uint32_t tag, enum ID3v2Encoding enc)
+ {
+     int len;
+     uint8_t *pb;
+     int (*put)(AVIOContext*, const char*);
+     AVIOContext *dyn_buf;
+     if (avio_open_dyn_buf(&dyn_buf) < 0)
+         return AVERROR(ENOMEM);
+     /* check if the strings are ASCII-only and use UTF16 only if
+      * they're not */
+     if (enc == ID3v2_ENCODING_UTF16BOM && string_is_ascii(str1) &&
+         (!str2 || string_is_ascii(str2)))
+         enc = ID3v2_ENCODING_ISO8859;
+     avio_w8(dyn_buf, enc);
+     if (enc == ID3v2_ENCODING_UTF16BOM) {
+         avio_wl16(dyn_buf, 0xFEFF);      /* BOM */
+         put = avio_put_str16le;
+     } else
+         put = avio_put_str;
+     put(dyn_buf, str1);
+     if (str2)
+         put(dyn_buf, str2);
+     len = avio_close_dyn_buf(dyn_buf, &pb);
+     avio_wb32(s->pb, tag);
+     id3v2_put_size(s, len);
+     avio_wb16(s->pb, 0);
+     avio_write(s->pb, pb, len);
+     av_freep(&pb);
+     return len + ID3v2_HEADER_SIZE;
+ }
+ static int id3v2_check_write_tag(AVFormatContext *s, AVDictionaryEntry *t, const char table[][4],
+                                  enum ID3v2Encoding enc)
+ {
+     uint32_t tag;
+     int i;
+     if (t->key[0] != 'T' || strlen(t->key) != 4)
+         return -1;
+     tag = AV_RB32(t->key);
+     for (i = 0; *table[i]; i++)
+         if (tag == AV_RB32(table[i]))
+             return id3v2_put_ttag(s, t->value, NULL, tag, enc);
+     return -1;
+ }
+ int ff_id3v2_write(struct AVFormatContext *s, int id3v2_version,
+                    const char *magic)
+ {
+     int64_t size_pos, cur_pos;
+     AVDictionaryEntry *t = NULL;
+     int totlen = 0, enc = id3v2_version == 3 ? ID3v2_ENCODING_UTF16BOM :
+                                                ID3v2_ENCODING_UTF8;
+     avio_wb32(s->pb, MKBETAG(magic[0], magic[1], magic[2], id3v2_version));
+     avio_w8(s->pb, 0);
+     avio_w8(s->pb, 0); /* flags */
+     /* reserve space for size */
+     size_pos = avio_tell(s->pb);
+     avio_wb32(s->pb, 0);
+     ff_metadata_conv(&s->metadata, ff_id3v2_34_metadata_conv, NULL);
+     if (id3v2_version == 4)
+         ff_metadata_conv(&s->metadata, ff_id3v2_4_metadata_conv, NULL);
+     while ((t = av_dict_get(s->metadata, "", t, AV_DICT_IGNORE_SUFFIX))) {
+         int ret;
+         if ((ret = id3v2_check_write_tag(s, t, ff_id3v2_tags, enc)) > 0) {
+             totlen += ret;
+             continue;
+         }
+         if ((ret = id3v2_check_write_tag(s, t, id3v2_version == 3 ?
+                                                ff_id3v2_3_tags : ff_id3v2_4_tags, enc)) > 0) {
+             totlen += ret;
+             continue;
+         }
+         /* unknown tag, write as TXXX frame */
+         if ((ret = id3v2_put_ttag(s, t->key, t->value, MKBETAG('T', 'X', 'X', 'X'), enc)) < 0)
+             return ret;
+         totlen += ret;
+     }
+     cur_pos = avio_tell(s->pb);
+     avio_seek(s->pb, size_pos, SEEK_SET);
+     id3v2_put_size(s, totlen);
+     avio_seek(s->pb, cur_pos, SEEK_SET);
+     return 0;
+ }
@@@ -78,66 -74,6 +78,9 @@@ static int id3v1_create_tag(AVFormatCon
      return count;
  }
  
- /* simple formats */
- static void id3v2_put_size(AVFormatContext *s, int size)
- {
-     avio_w8(s->pb, size >> 21 & 0x7f);
-     avio_w8(s->pb, size >> 14 & 0x7f);
-     avio_w8(s->pb, size >> 7  & 0x7f);
-     avio_w8(s->pb, size       & 0x7f);
- }
- static int string_is_ascii(const uint8_t *str)
- {
-     while (*str && *str < 128) str++;
-     return !*str;
- }
- /**
-  * Write a text frame with one (normal frames) or two (TXXX frames) strings
-  * according to encoding (only UTF-8 or UTF-16+BOM supported).
-  * @return number of bytes written or a negative error code.
-  */
- static int id3v2_put_ttag(AVFormatContext *s, const char *str1, const char *str2,
-                           uint32_t tag, enum ID3v2Encoding enc)
- {
-     int len;
-     uint8_t *pb;
-     int (*put)(AVIOContext*, const char*);
-     AVIOContext *dyn_buf;
-     if (avio_open_dyn_buf(&dyn_buf) < 0)
-         return AVERROR(ENOMEM);
-     /* check if the strings are ASCII-only and use UTF16 only if
-      * they're not */
-     if (enc == ID3v2_ENCODING_UTF16BOM && string_is_ascii(str1) &&
-         (!str2 || string_is_ascii(str2)))
-         enc = ID3v2_ENCODING_ISO8859;
-     avio_w8(dyn_buf, enc);
-     if (enc == ID3v2_ENCODING_UTF16BOM) {
-         avio_wl16(dyn_buf, 0xFEFF);      /* BOM */
-         put = avio_put_str16le;
-     } else
-         put = avio_put_str;
-     put(dyn_buf, str1);
-     if (str2)
-         put(dyn_buf, str2);
-     len = avio_close_dyn_buf(dyn_buf, &pb);
-     avio_wb32(s->pb, tag);
-     id3v2_put_size(s, len);
-     avio_wb16(s->pb, 0);
-     avio_write(s->pb, pb, len);
-     av_freep(&pb);
-     return len + ID3v2_HEADER_SIZE;
- }
 +#define VBR_NUM_BAGS 400
 +#define VBR_TOC_SIZE 100
++
  typedef struct MP3Context {
      const AVClass *class;
      int id3v2_version;
@@@ -204,36 -133,16 +147,21 @@@ static const AVClass mp3_muxer_class = 
      .version        = LIBAVUTIL_VERSION_INT,
  };
  
- static int id3v2_check_write_tag(AVFormatContext *s, AVDictionaryEntry *t, const char table[][4],
-                                  enum ID3v2Encoding enc)
- {
-     uint32_t tag;
-     int i;
-     if (t->key[0] != 'T' || strlen(t->key) != 4)
-         return -1;
-     tag = AV_RB32(t->key);
-     for (i = 0; *table[i]; i++)
-         if (tag == AV_RB32(table[i]))
-             return id3v2_put_ttag(s, t->value, NULL, tag, enc);
-     return -1;
- }
 -/* insert a dummy frame containing number of frames */
 -static void mp3_write_xing(AVFormatContext *s)
 +static const int64_t xing_offtbl[2][2] = {{32, 17}, {17,9}};
 +
 +/*
 + * Write an empty XING header and initialize respective data.
 + */
 +static int mp3_write_xing(AVFormatContext *s)
  {
 -    AVCodecContext *codec = s->streams[0]->codec;
 +    AVCodecContext   *codec = s->streams[0]->codec;
      MP3Context       *mp3 = s->priv_data;
 -    int       bitrate_idx = 1;    // 32 kbps
 -    int64_t   xing_offset = (codec->channels == 2) ? 32 : 17;
 -    int32_t        header;
 -    MPADecodeHeader  mpah;
 -    int srate_idx, i, channels;
 +    int              bitrate_idx = 3;
 +    int64_t          xing_offset;
 +    int32_t          mask, header;
 +    MPADecodeHeader  c;
 +    int              srate_idx, i, channels;
 +    int              needed;
  
      for (i = 0; i < FF_ARRAY_ELEMS(avpriv_mpa_freq_tab); i++)
          if (avpriv_mpa_freq_tab[i] == codec->sample_rate) {
Simple merge