Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 28 Nov 2011 00:07:11 +0000 (01:07 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 28 Nov 2011 00:07:11 +0000 (01:07 +0100)
* qatar/master:
  vc1: use an enum for Frame Coding Mode
  doc: cleanup filter section
  indeo3: error out if no motion vector is set.
  x86inc: Flag shufps as an floating-point instruction for the AVX emulation code.
  mpegaudio: do not use init_static_data() for initializing tables.
  musepack: fix signed shift overflow in mpc_read_packet()
  mov: Make format string match variable type.
  wmavoice: Make format string match variable type.
  vc1: select interlaced scan table by FCM element
  Generalize RIFF INFO tag support; support reading INFO tag in wav
  pthread: track thread existence in a separate variable.

Conflicts:
doc/filters.texi
libavcodec/pthread.c
libavformat/avi.c
libavformat/riff.c
libavformat/riff.h
libavformat/wav.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
19 files changed:
1  2 
doc/filters.texi
libavcodec/dxva2_vc1.c
libavcodec/indeo3.c
libavcodec/mpegaudiodec.c
libavcodec/mpegaudiodec_float.c
libavcodec/pthread.c
libavcodec/vc1.c
libavcodec/vc1.h
libavcodec/vc1dec.c
libavcodec/wmavoice.c
libavformat/Makefile
libavformat/avi.h
libavformat/avidec.c
libavformat/avienc.c
libavformat/mov.c
libavformat/mpc.c
libavformat/riff.c
libavformat/riff.h
libavformat/wav.c

@@@ -1401,10 -780,9 +1401,9 @@@ gradfun=1.
  
  Flip the input video horizontally.
  
- For example to horizontally flip the video in input with
- @file{ffmpeg}:
 -For example to horizontally flip the input video with @command{avconv}:
++For example to horizontally flip the input video with @command{ffmpeg}:
  @example
 -avconv -i in.avi -vf "hflip" out.avi
 +ffmpeg -i in.avi -vf "hflip" out.avi
  @end example
  
  @section hqdn3d
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -659,9 -652,8 +659,9 @@@ static void frame_thread_free(AVCodecCo
          pthread_cond_signal(&p->input_cond);
          pthread_mutex_unlock(&p->mutex);
  
-         if (p->thread_created)
+         if (p->thread_init)
              pthread_join(p->thread, NULL);
-         p->thread_created=0;
++        p->thread_init=0;
  
          if (codec->close)
              codec->close(p->avctx);
@@@ -765,9 -757,8 +765,9 @@@ static int frame_thread_init(AVCodecCon
  
          if (err) goto error;
  
-         p->thread_created= !pthread_create(&p->thread, NULL, frame_worker_thread, p);
-         if(!p->thread_created)
 -        if (!pthread_create(&p->thread, NULL, frame_worker_thread, p))
 -            p->thread_init = 1;
++        p->thread_init= !pthread_create(&p->thread, NULL, frame_worker_thread, p);
++        if(!p->thread_init)
 +            goto error;
      }
  
      return 0;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -349,14 -342,28 +349,36 @@@ const AVCodecTag ff_codec_wav_tags[] = 
      { CODEC_ID_NONE,      0 },
  };
  
 +const AVCodecGuid ff_codec_wav_guids[] = {
 +    {CODEC_ID_AC3,        {0x2C,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
 +    {CODEC_ID_ATRAC3P,    {0xBF,0xAA,0x23,0xE9,0x58,0xCB,0x71,0x44,0xA1,0x19,0xFF,0xFA,0x01,0xE4,0xCE,0x62}},
 +    {CODEC_ID_EAC3,       {0xAF,0x87,0xFB,0xA7,0x02,0x2D,0xFB,0x42,0xA4,0xD4,0x05,0xCD,0x93,0x84,0x3B,0xDD}},
 +    {CODEC_ID_MP2,        {0x2B,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
 +    {CODEC_ID_NONE}
 +};
 +
+ const AVMetadataConv ff_riff_info_conv[] = {
+     { "IART", "artist"    },
+     { "ICMT", "comment"   },
+     { "ICOP", "copyright" },
+     { "ICRD", "date"      },
+     { "IGNR", "genre"     },
+     { "ILNG", "language"  },
+     { "INAM", "title"     },
+     { "IPRD", "album"     },
+     { "IPRT", "track"     },
+     { "ISFT", "encoder"   },
+     { "ITCH", "encoded_by"},
+     { 0 },
+ };
+ const char ff_riff_tags[][5] = {
+     "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
+     "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
+     "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
+     {0}
+ };
  #if CONFIG_MUXERS
  int64_t ff_start_tag(AVIOContext *pb, const char *tag)
  {
@@@ -641,18 -636,48 +663,64 @@@ void ff_parse_specific_params(AVCodecCo
      *au_rate /= gcd;
  }
  
 +void ff_get_guid(AVIOContext *s, ff_asf_guid *g)
 +{
 +    assert(sizeof(*g) == 16);
 +    avio_read(s, *g, sizeof(*g));
 +}
 +
 +enum CodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
 +{
 +    int i;
 +    for (i = 0; guids[i].id != CODEC_ID_NONE; i++) {
 +        if (!ff_guidcmp(guids[i].guid, guid))
 +            return guids[i].id;
 +    }
 +    return CODEC_ID_NONE;
 +}
++
+ int ff_read_riff_info(AVFormatContext *s, int64_t size)
+ {
+     int64_t start, end, cur;
+     AVIOContext *pb = s->pb;
+     start = avio_tell(pb);
+     end = start + size;
+     while ((cur = avio_tell(pb)) >= 0 && cur <= end - 8 /* = tag + size */) {
+         uint32_t chunk_code;
+         int64_t chunk_size;
+         char key[5] = {0};
+         char *value;
+         chunk_code = avio_rl32(pb);
+         chunk_size = avio_rl32(pb);
+         if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
+             av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n");
+             return AVERROR_INVALIDDATA;
+         }
+         chunk_size += (chunk_size & 1);
+         value = av_malloc(chunk_size + 1);
+         if (!value) {
+             av_log(s, AV_LOG_ERROR, "out of memory, unable to read INFO tag\n");
+             return AVERROR(ENOMEM);
+         }
+         AV_WL32(key, chunk_code);
+         if (avio_read(pb, value, chunk_size) != chunk_size) {
+             av_freep(key);
+             av_freep(value);
+             av_log(s, AV_LOG_ERROR, "premature end of file while reading INFO tag\n");
+             return AVERROR_INVALIDDATA;
+         }
+         value[chunk_size] = 0;
+         av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
+     }
+     return 0;
+ }
@@@ -54,30 -58,6 +58,32 @@@ unsigned int ff_codec_get_tag(const AVC
  enum CodecID ff_codec_get_id(const AVCodecTag *tags, unsigned int tag);
  void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale);
  
 +typedef uint8_t ff_asf_guid[16];
 +
+ int ff_read_riff_info(AVFormatContext *s, int64_t size);
 +#define FF_PRI_GUID \
 +    "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
 +#define FF_ARG_GUID(g) \
 +    g[0],g[1],g[2],g[3],g[4],g[5],g[6],g[7],g[8],g[9],g[10],g[11],g[12],g[13],g[14],g[15]
 +
 +static av_always_inline int ff_guidcmp(const void *g1, const void *g2)
 +{
 +    return memcmp(g1, g2, sizeof(ff_asf_guid));
 +}
 +
 +void ff_get_guid(AVIOContext *s, ff_asf_guid *g);
 +
 +typedef struct {
 +    enum CodecID id;
 +    ff_asf_guid guid;
 +} AVCodecGuid;
 +
 +enum CodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid);
 +
 +extern const AVCodecGuid ff_codec_wav_guids[];
 +
 +#define FF_MEDIASUBTYPE_BASE_GUID \
 +    0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
 +
  #endif /* AVFORMAT_RIFF_H */
@@@ -392,9 -384,9 +391,9 @@@ static int wav_read_header(AVFormatCont
      int64_t size, av_uninit(data_size);
      int64_t sample_count=0;
      int rf64;
-     unsigned int tag;
+     uint32_t tag, list_type;
      AVIOContext *pb = s->pb;
 -    AVStream *st;
 +    AVStream *st = NULL;
      WAVContext *wav = s->priv_data;
      int ret, got_fmt = 0;
      int64_t next_tag_ofs, data_ofs = -1;
              if ((ret = wav_parse_bext_tag(s, size)) < 0)
                  return ret;
              break;
 +        case MKTAG('S','M','V','0'):
 +            // SMV file, a wav file with video appended.
 +            if (size != MKTAG('0','2','0','0')) {
 +                av_log(s, AV_LOG_ERROR, "Unknown SMV version found\n");
 +                goto break_loop;
 +            }
 +            av_log(s, AV_LOG_DEBUG, "Found SMV data\n");
 +            vst = avformat_new_stream(s, NULL);
 +            if (!vst)
 +                return AVERROR(ENOMEM);
 +            avio_r8(pb);
 +            vst->id = 1;
 +            vst->codec->codec_type = AVMEDIA_TYPE_VIDEO;
 +            vst->codec->codec_id = CODEC_ID_MJPEG;
 +            vst->codec->width  = avio_rl24(pb);
 +            vst->codec->height = avio_rl24(pb);
 +            size = avio_rl24(pb);
 +            wav->smv_data_ofs = avio_tell(pb) + (size - 5) * 3;
 +            avio_rl24(pb);
 +            wav->smv_block_size = avio_rl24(pb);
 +            av_set_pts_info(vst, 32, 1, avio_rl24(pb));
 +            vst->duration = avio_rl24(pb);
 +            avio_rl24(pb);
 +            avio_rl24(pb);
 +            wav->smv_frames_per_jpeg = avio_rl24(pb);
 +            goto break_loop;
+         case MKTAG('L', 'I', 'S', 'T'):
+             list_type = avio_rl32(pb);
+             if (size <= 4) {
+                 av_log(s, AV_LOG_ERROR, "too short LIST");
+                 return AVERROR_INVALIDDATA;
+             }
+             switch (list_type) {
+             case MKTAG('I', 'N', 'F', 'O'):
+                 if ((ret = ff_read_riff_info(s, size - 4)) < 0)
+                     return ret;
+             }
+             break;
          }
  
          /* seek to next tag unless we know that we'll run into EOF */