Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 16 Nov 2012 12:23:35 +0000 (13:23 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 16 Nov 2012 12:23:35 +0000 (13:23 +0100)
* qatar/master:
  x86: dsputil: port to cpuflags
  crc: av_crc() parameter names should match between .c, .h and doxygen
  avserver: replace av_read_packet with av_read_frame
  avserver: fix constness casting warnings

Conflicts:
libavcodec/x86/dsputil.asm

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
ffserver.c
libavcodec/x86/dsputil.asm
libavcodec/x86/dsputil_mmx.c
libavutil/crc.h

diff --combined ffserver.c
@@@ -1,28 -1,24 +1,28 @@@
  /*
 - * Multiple format streaming server
   * Copyright (c) 2000, 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
   */
  
 +/**
 + * @file
 + * multiple format streaming server based on the FFmpeg libraries
 + */
 +
  #include "config.h"
  #if !HAVE_CLOSESOCKET
  #define closesocket close
@@@ -31,7 -27,7 +31,7 @@@
  #include <stdlib.h>
  #include <stdio.h>
  #include "libavformat/avformat.h"
 -// FIXME those are internal headers, avserver _really_ shouldn't use them
 +// FIXME those are internal headers, ffserver _really_ shouldn't use them
  #include "libavformat/ffm.h"
  #include "libavformat/network.h"
  #include "libavformat/os_support.h"
@@@ -41,7 -37,6 +41,7 @@@
  #include "libavformat/internal.h"
  #include "libavformat/url.h"
  
 +#include "libavutil/avassert.h"
  #include "libavutil/avstring.h"
  #include "libavutil/lfg.h"
  #include "libavutil/dict.h"
@@@ -69,7 -64,7 +69,7 @@@
  
  #include "cmdutils.h"
  
 -const char program_name[] = "avserver";
 +const char program_name[] = "ffserver";
  const int program_birth_year = 2000;
  
  static const OptionDef options[];
@@@ -210,7 -205,7 +210,7 @@@ typedef struct IPAddressACL 
      struct in_addr last;
  } IPAddressACL;
  
 -/* description of each stream of the avserver.conf file */
 +/* description of each stream of the ffserver.conf file */
  typedef struct FFStream {
      enum StreamType stream_type;
      char filename[1024];     /* stream filename */
      char title[512];
      char copyright[512];
      char comment[512];
 -    pid_t pid;  /* of avconv process */
 -    time_t pid_start;  /* of avconv process */
 +    pid_t pid;  /* Of ffmpeg process */
 +    time_t pid_start;  /* Of ffmpeg process */
      char **child_argv;
      struct FFStream *next;
      unsigned bandwidth; /* bandwidth, in kbits/s */
@@@ -308,9 -303,9 +308,9 @@@ static int rtp_new_av_stream(HTTPContex
  
  static const char *my_program_name;
  
 -static const char *config_filename = "/etc/avserver.conf";
 +static const char *config_filename = "/etc/ffserver.conf";
  
 -static int avserver_debug;
 +static int ffserver_debug;
  static int no_launch;
  static int need_to_start_children;
  
@@@ -332,8 -327,7 +332,8 @@@ static int64_t ffm_read_write_index(in
  {
      uint8_t buf[8];
  
 -    lseek(fd, 8, SEEK_SET);
 +    if (lseek(fd, 8, SEEK_SET) < 0)
 +        return AVERROR(EIO);
      if (read(fd, buf, 8) != 8)
          return AVERROR(EIO);
      return AV_RB64(buf);
@@@ -346,8 -340,7 +346,8 @@@ static int ffm_write_write_index(int fd
  
      for(i=0;i<8;i++)
          buf[i] = (pos >> (56 - i * 8)) & 0xff;
 -    lseek(fd, 8, SEEK_SET);
 +    if (lseek(fd, 8, SEEK_SET) < 0)
 +        return AVERROR(EIO);
      if (write(fd, buf, 8) != 8)
          return AVERROR(EIO);
      return 8;
@@@ -361,7 -354,7 +361,7 @@@ static void ffm_set_write_index(AVForma
      ffm->file_size = file_size;
  }
  
 -/* FIXME: make avserver work with IPv6 */
 +/* FIXME: make ffserver work with IPv6 */
  /* resolve host with also IP address parsing */
  static int resolve_host(struct in_addr *sin_addr, const char *hostname)
  {
@@@ -509,7 -502,7 +509,7 @@@ static void start_children(FFStream *fe
                      slash = pathname;
                  else
                      slash++;
 -                strcpy(slash, "avconv");
 +                strcpy(slash, "ffmpeg");
  
                  http_log("Launch command line: ");
                  http_log("%s ", pathname);
                  for (i = 3; i < 256; i++)
                      close(i);
  
 -                if (!avserver_debug) {
 +                if (!ffserver_debug) {
                      if (!freopen("/dev/null", "r", stdin))
                          http_log("failed to redirect STDIN to /dev/null\n;");
                      if (!freopen("/dev/null", "w", stdout))
@@@ -578,17 -571,15 +578,17 @@@ static void start_multicast(void
      FFStream *stream;
      char session_id[32];
      HTTPContext *rtp_c;
 -    struct sockaddr_in dest_addr;
 +    struct sockaddr_in dest_addr = {0};
      int default_port, stream_index;
  
      default_port = 6000;
      for(stream = first_stream; stream != NULL; stream = stream->next) {
          if (stream->is_multicast) {
 +            unsigned random0 = av_lfg_get(&random_state);
 +            unsigned random1 = av_lfg_get(&random_state);
              /* open the RTP connection */
              snprintf(session_id, sizeof(session_id), "%08x%08x",
 -                     av_lfg_get(&random_state), av_lfg_get(&random_state));
 +                     random0, random1);
  
              /* choose a port if none given */
              if (stream->multicast_port == 0) {
@@@ -659,7 -650,7 +659,7 @@@ static int http_server(void
          return -1;
      }
  
 -    http_log("AVserver started.\n");
 +    http_log("FFserver started.\n");
  
      start_children(first_feed);
  
                      poll_entry->events = POLLOUT;
                      poll_entry++;
                  } else {
 -                    /* when avserver is doing the timing, we work by
 +                    /* when ffserver is doing the timing, we work by
                         looking at which packet need to be sent every
                         10 ms */
                      delay1 = 10; /* one tick wait XXX: 10 ms assumed */
@@@ -786,17 -777,16 +786,17 @@@ static void start_wait_request(HTTPCont
  
  static void http_send_too_busy_reply(int fd)
  {
 -    char buffer[300];
 +    char buffer[400];
      int len = snprintf(buffer, sizeof(buffer),
                         "HTTP/1.0 503 Server too busy\r\n"
                         "Content-type: text/html\r\n"
                         "\r\n"
                         "<html><head><title>Too busy</title></head><body>\r\n"
                         "<p>The server is too busy to serve your request at this time.</p>\r\n"
 -                       "<p>The number of current connections is %d, and this exceeds the limit of %d.</p>\r\n"
 +                       "<p>The number of current connections is %u, and this exceeds the limit of %u.</p>\r\n"
                         "</body></html>\r\n",
                         nb_connections, nb_max_connections);
 +    av_assert0(len < sizeof(buffer));
      send(fd, buffer, len, 0);
  }
  
@@@ -921,8 -911,6 +921,8 @@@ static void close_connection(HTTPContex
  
      for(i=0; i<ctx->nb_streams; i++)
          av_free(ctx->streams[i]);
 +    av_freep(&ctx->streams);
 +    av_freep(&ctx->priv_data);
  
      if (c->stream && !c->post && c->stream->stream_type == STREAM_TYPE_LIVE)
          current_bandwidth -= c->stream->bandwidth;
@@@ -1490,7 -1478,8 +1490,8 @@@ enum RedirType 
  /* parse http request and prepare header */
  static int http_parse_request(HTTPContext *c)
  {
-     char *p;
+     const char *p;
+     char *p1;
      enum RedirType redir_type;
      char cmd[32];
      char info[1024], filename[1024];
      FFStream *stream;
      int i;
      char ratebuf[32];
-     char *useragent = 0;
+     const char *useragent = 0;
  
      p = c->buffer;
-     get_word(cmd, sizeof(cmd), (const char **)&p);
+     get_word(cmd, sizeof(cmd), &p);
      av_strlcpy(c->method, cmd, sizeof(c->method));
  
      if (!strcmp(cmd, "GET"))
      else
          return -1;
  
-     get_word(url, sizeof(url), (const char **)&p);
+     get_word(url, sizeof(url), &p);
      av_strlcpy(c->url, url, sizeof(c->url));
  
      get_word(protocol, sizeof(protocol), (const char **)&p);
  
      av_strlcpy(c->protocol, protocol, sizeof(c->protocol));
  
 -    if (avserver_debug)
 +    if (ffserver_debug)
          http_log("%s - - New connection: %s %s\n", inet_ntoa(c->from_addr.sin_addr), cmd, url);
  
      /* find the filename and the optional info string in the request */
-     p = strchr(url, '?');
-     if (p) {
-         av_strlcpy(info, p, sizeof(info));
-         *p = '\0';
+     p1 = strchr(url, '?');
+     if (p1) {
+         av_strlcpy(info, p1, sizeof(info));
+         *p1 = '\0';
      } else
          info[0] = '\0';
  
      if (stream->stream_type == STREAM_TYPE_REDIRECT) {
          c->http_error = 301;
          q = c->buffer;
 -        q += snprintf(q, c->buffer_size,
 +        snprintf(q, c->buffer_size,
                        "HTTP/1.0 301 Moved\r\n"
                        "Location: %s\r\n"
                        "Content-type: text/html\r\n"
                        "<html><head><title>Moved</title></head><body>\r\n"
                        "You should be <a href=\"%s\">redirected</a>.\r\n"
                        "</body></html>\r\n", stream->feed_filename, stream->feed_filename);
 +        q += strlen(q);
          /* prepare output buffer */
          c->buffer_ptr = c->buffer;
          c->buffer_end = q;
      if (c->post == 0 && max_bandwidth < current_bandwidth) {
          c->http_error = 503;
          q = c->buffer;
 -        q += snprintf(q, c->buffer_size,
 +        snprintf(q, c->buffer_size,
                        "HTTP/1.0 503 Server too busy\r\n"
                        "Content-type: text/html\r\n"
                        "\r\n"
                        "<p>The bandwidth being served (including your stream) is %"PRIu64"kbit/sec, "
                        "and this exceeds the limit of %"PRIu64"kbit/sec.</p>\r\n"
                        "</body></html>\r\n", current_bandwidth, max_bandwidth);
 +        q += strlen(q);
          /* prepare output buffer */
          c->buffer_ptr = c->buffer;
          c->buffer_end = q;
      }
  
      if (redir_type != REDIR_NONE) {
-         char *hostinfo = 0;
+         const char *hostinfo = 0;
  
          for (p = c->buffer; *p && *p != '\r' && *p != '\n'; ) {
              if (av_strncasecmp(p, "Host:", 5) == 0) {
                      q = c->buffer;
                      switch(redir_type) {
                      case REDIR_ASX:
 -                        q += snprintf(q, c->buffer_size,
 +                        snprintf(q, c->buffer_size,
                                        "HTTP/1.0 200 ASX Follows\r\n"
                                        "Content-type: video/x-ms-asf\r\n"
                                        "\r\n"
                                        "<ASX Version=\"3\">\r\n"
 -                                      //"<!-- Autogenerated by avserver -->\r\n"
 +                                      //"<!-- Autogenerated by ffserver -->\r\n"
                                        "<ENTRY><REF HREF=\"http://%s/%s%s\"/></ENTRY>\r\n"
                                        "</ASX>\r\n", hostbuf, filename, info);
 +                        q += strlen(q);
                          break;
                      case REDIR_RAM:
 -                        q += snprintf(q, c->buffer_size,
 +                        snprintf(q, c->buffer_size,
                                        "HTTP/1.0 200 RAM Follows\r\n"
                                        "Content-type: audio/x-pn-realaudio\r\n"
                                        "\r\n"
 -                                      "# Autogenerated by avserver\r\n"
 +                                      "# Autogenerated by ffserver\r\n"
                                        "http://%s/%s%s\r\n", hostbuf, filename, info);
 +                        q += strlen(q);
                          break;
                      case REDIR_ASF:
 -                        q += snprintf(q, c->buffer_size,
 +                        snprintf(q, c->buffer_size,
                                        "HTTP/1.0 200 ASF Redirect follows\r\n"
                                        "Content-type: video/x-ms-asf\r\n"
                                        "\r\n"
                                        "[Reference]\r\n"
                                        "Ref1=http://%s/%s%s\r\n", hostbuf, filename, info);
 +                        q += strlen(q);
                          break;
                      case REDIR_RTSP:
                          {
                              p = strrchr(hostname, ':');
                              if (p)
                                  *p = '\0';
 -                            q += snprintf(q, c->buffer_size,
 +                            snprintf(q, c->buffer_size,
                                            "HTTP/1.0 200 RTSP Redirect follows\r\n"
                                            /* XXX: incorrect mime type ? */
                                            "Content-type: application/x-rtsp\r\n"
                                            "\r\n"
                                            "rtsp://%s:%d/%s\r\n", hostname, ntohs(my_rtsp_addr.sin_port), filename);
 +                            q += strlen(q);
                          }
                          break;
                      case REDIR_SDP:
                              socklen_t len;
                              struct sockaddr_in my_addr;
  
 -                            q += snprintf(q, c->buffer_size,
 +                            snprintf(q, c->buffer_size,
                                            "HTTP/1.0 200 OK\r\n"
                                            "Content-type: application/sdp\r\n"
                                            "\r\n");
 +                            q += strlen(q);
  
                              len = sizeof(my_addr);
                              getsockname(c->fd, (struct sockaddr *)&my_addr, &len);
          if (!stream->is_feed) {
              /* However it might be a status report from WMP! Let us log the
               * data as it might come in handy one day. */
-             char *logline = 0;
+             const char *logline = 0;
              int client_id = 0;
  
              for (p = c->buffer; *p && *p != '\r' && *p != '\n'; ) {
      }
  
      /* prepare http header */
 -    q = c->buffer;
 -    q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "HTTP/1.0 200 OK\r\n");
 +    c->buffer[0] = 0;
 +    av_strlcatf(c->buffer, c->buffer_size, "HTTP/1.0 200 OK\r\n");
      mime_type = c->stream->fmt->mime_type;
      if (!mime_type)
          mime_type = "application/x-octet-stream";
 -    q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "Pragma: no-cache\r\n");
 +    av_strlcatf(c->buffer, c->buffer_size, "Pragma: no-cache\r\n");
  
      /* for asf, we need extra headers */
      if (!strcmp(c->stream->fmt->name,"asf_stream")) {
  
          c->wmp_client_id = av_lfg_get(&random_state);
  
 -        q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "Server: Cougar 4.1.0.3923\r\nCache-Control: no-cache\r\nPragma: client-id=%d\r\nPragma: features=\"broadcast\"\r\n", c->wmp_client_id);
 +        av_strlcatf(c->buffer, c->buffer_size, "Server: Cougar 4.1.0.3923\r\nCache-Control: no-cache\r\nPragma: client-id=%d\r\nPragma: features=\"broadcast\"\r\n", c->wmp_client_id);
      }
 -    q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "Content-Type: %s\r\n", mime_type);
 -    q += snprintf(q, q - (char *) c->buffer + c->buffer_size, "\r\n");
 +    av_strlcatf(c->buffer, c->buffer_size, "Content-Type: %s\r\n", mime_type);
 +    av_strlcatf(c->buffer, c->buffer_size, "\r\n");
 +    q = c->buffer + strlen(c->buffer);
  
      /* prepare output buffer */
      c->http_error = 0;
   send_error:
      c->http_error = 404;
      q = c->buffer;
 -    q += snprintf(q, c->buffer_size,
 +    snprintf(q, c->buffer_size,
                    "HTTP/1.0 404 Not Found\r\n"
                    "Content-type: text/html\r\n"
                    "\r\n"
                    "<head><title>404 Not Found</title></head>\n"
                    "<body>%s</body>\n"
                    "</html>\n", msg);
 +    q += strlen(q);
      /* prepare output buffer */
      c->buffer_ptr = c->buffer;
      c->buffer_end = q;
@@@ -2059,7 -2039,7 +2060,7 @@@ static void compute_status(HTTPContext 
                          char cpuperc[10];
                          char cpuused[64];
  
 -                        if (fscanf(pid_stat, "%10s %64s", cpuperc,
 +                        if (fscanf(pid_stat, "%9s %63s", cpuperc,
                                     cpuused) == 2) {
                              avio_printf(pb, "Currently using %s%% of the cpu. Total time used %s.\n",
                                           cpuperc, cpuused);
@@@ -2165,13 -2145,12 +2166,13 @@@ static int open_input_stream(HTTPContex
      char buf[128];
      char input_filename[1024];
      AVFormatContext *s = NULL;
 -    int i, ret;
 +    int buf_size, i, ret;
      int64_t stream_pos;
  
      /* find file name */
      if (c->stream->feed) {
          strcpy(input_filename, c->stream->feed->feed_filename);
 +        buf_size = FFM_PACKET_SIZE;
          /* compute position (absolute time) */
          if (av_find_info_tag(buf, sizeof(buf), "date", info)) {
              if ((ret = av_parse_time(&stream_pos, buf, 0)) < 0)
              stream_pos = av_gettime() - c->stream->prebuffer * (int64_t)1000;
      } else {
          strcpy(input_filename, c->stream->feed_filename);
 +        buf_size = 0;
          /* compute position (relative time) */
          if (av_find_info_tag(buf, sizeof(buf), "date", info)) {
              if ((ret = av_parse_time(&stream_pos, buf, 1)) < 0)
          http_log("could not open %s: %d\n", input_filename, ret);
          return -1;
      }
 +
 +    /* set buffer size */
 +    if (buf_size > 0) ffio_set_buf_size(s->pb, buf_size);
 +
      s->flags |= AVFMT_FLAG_GENPTS;
      c->fmt_in = s;
      if (strcmp(s->iformat->name, "ffm") && avformat_find_stream_info(c->fmt_in, NULL) < 0) {
@@@ -2299,7 -2273,7 +2300,7 @@@ static int http_prepare_data(HTTPContex
  
          /*
           * HACK to avoid mpeg ps muxer to spit many underflow errors
 -         * Default value from Libav
 +         * Default value from FFmpeg
           * Try to set it use configuration option
           */
          c->fmt_ctx.max_delay = (int)(0.7*AV_TIME_BASE);
@@@ -3131,12 -3105,9 +3132,12 @@@ static void rtsp_cmd_setup(HTTPContext 
   found:
  
      /* generate session id if needed */
 -    if (h->session_id[0] == '\0')
 +    if (h->session_id[0] == '\0') {
 +        unsigned random0 = av_lfg_get(&random_state);
 +        unsigned random1 = av_lfg_get(&random_state);
          snprintf(h->session_id, sizeof(h->session_id), "%08x%08x",
 -                 av_lfg_get(&random_state), av_lfg_get(&random_state));
 +                 random0, random1);
 +    }
  
      /* find rtp session, and create it if none found */
      rtp_c = find_rtp_session(h->session_id);
@@@ -3499,15 -3470,12 +3500,15 @@@ static int rtp_new_av_stream(HTTPContex
  }
  
  /********************************************************************/
 -/* avserver initialization */
 +/* ffserver initialization */
  
  static AVStream *add_av_stream1(FFStream *stream, AVCodecContext *codec, int copy)
  {
      AVStream *fst;
  
 +    if(stream->nb_streams >= FF_ARRAY_ELEMS(stream->streams))
 +        return NULL;
 +
      fst = av_mallocz(sizeof(AVStream));
      if (!fst)
          return NULL;
@@@ -3594,6 -3562,8 +3595,8 @@@ static void extract_mpeg4_header(AVForm
      AVStream *st;
      const uint8_t *p;
  
+     infile->flags |= AVFMT_FLAG_NOFILLIN | AVFMT_FLAG_NOPARSE;
      mpeg4_count = 0;
      for(i=0;i<infile->nb_streams;i++) {
          st = infile->streams[i];
  
      printf("MPEG4 without extra data: trying to find header in %s\n", infile->filename);
      while (mpeg4_count > 0) {
-         if (av_read_packet(infile, &pkt) < 0)
+         if (av_read_frame(infile, &pkt) < 0)
              break;
          st = infile->streams[pkt.stream_index];
          if (st->codec->codec_id == AV_CODEC_ID_MPEG4 &&
@@@ -3713,8 -3683,6 +3716,8 @@@ static void build_feed_streams(void
              int matches = 0;
  
              if (avformat_open_input(&s, feed->feed_filename, NULL, NULL) >= 0) {
 +                /* set buffer size */
 +                ffio_set_buf_size(s->pb, FFM_PACKET_SIZE);
                  /* Now see if it matches */
                  if (s->nb_streams == feed->nb_streams) {
                      matches = 1;
              s->nb_streams = feed->nb_streams;
              s->streams = feed->streams;
              if (avformat_write_header(s, NULL) < 0) {
 -                http_log("Container doesn't supports the required parameters\n");
 +                http_log("Container doesn't support the required parameters\n");
                  exit(1);
              }
              /* XXX: need better api */
@@@ -3855,9 -3823,6 +3858,9 @@@ static void add_codec(FFStream *stream
  {
      AVStream *st;
  
 +    if(stream->nb_streams >= FF_ARRAY_ELEMS(stream->streams))
 +        return;
 +
      /* compute default parameters */
      switch(av->codec_type) {
      case AVMEDIA_TYPE_AUDIO:
@@@ -3963,10 -3928,10 +3966,10 @@@ static void load_module(const char *fil
          return;
      }
  
 -    init_func = dlsym(dll, "avserver_module_init");
 +    init_func = dlsym(dll, "ffserver_module_init");
      if (!init_func) {
          fprintf(stderr,
 -                "%s: init function 'avserver_module_init()' not found\n",
 +                "%s: init function 'ffserver_module_init()' not found\n",
                  filename);
          dlclose(dll);
      }
  }
  #endif
  
 -static int avserver_opt_default(const char *opt, const char *arg,
 +static int ffserver_opt_default(const char *opt, const char *arg,
                         AVCodecContext *avctx, int type)
  {
      int ret = 0;
      return ret;
  }
  
 -static int avserver_opt_preset(const char *arg,
 +static int ffserver_opt_preset(const char *arg,
                         AVCodecContext *avctx, int type,
                         enum AVCodecID *audio_id, enum AVCodecID *video_id)
  {
              *video_id = opt_video_codec(tmp2);
          }else if(!strcmp(tmp, "scodec")){
              /* opt_subtitle_codec(tmp2); */
 -        }else if(avserver_opt_default(tmp, tmp2, avctx, type) < 0){
 +        }else if(ffserver_opt_default(tmp, tmp2, avctx, type) < 0){
              fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
              ret = 1;
              break;
      return ret;
  }
  
 -static AVOutputFormat *avserver_guess_format(const char *short_name, const char *filename,
 +static AVOutputFormat *ffserver_guess_format(const char *short_name, const char *filename,
                                               const char *mime_type)
  {
      AVOutputFormat *fmt = av_guess_format(short_name, filename, mime_type);
@@@ -4114,8 -4079,6 +4117,8 @@@ static int parse_ffconfig(const char *f
              if (resolve_host(&my_http_addr.sin_addr, arg) != 0) {
                  ERROR("%s:%d: Invalid host/IP address: %s\n", arg);
              }
 +        } else if (!av_strcasecmp(cmd, "NoDaemon")) {
 +            // do nothing here, its the default now
          } else if (!av_strcasecmp(cmd, "RTSPPort")) {
              get_arg(arg, sizeof(arg), &p);
              val = atoi(arg);
              } else
                  max_bandwidth = llval;
          } else if (!av_strcasecmp(cmd, "CustomLog")) {
 -            if (!avserver_debug)
 +            if (!ffserver_debug)
                  get_arg(logfilename, sizeof(logfilename), &p);
          } else if (!av_strcasecmp(cmd, "<Feed")) {
              /*********************************************/
                      feed->child_argv[i] = av_strdup(arg);
                  }
  
 -                feed->child_argv[i] = av_malloc(30 + strlen(feed->filename));
 -
 -                snprintf(feed->child_argv[i], 30+strlen(feed->filename),
 -                    "http://%s:%d/%s",
 +                feed->child_argv[i] = av_asprintf("http://%s:%d/%s",
                          (my_http_addr.sin_addr.s_addr == INADDR_ANY) ? "127.0.0.1" :
                      inet_ntoa(my_http_addr.sin_addr),
                      ntohs(my_http_addr.sin_port), feed->filename);
                  stream = av_mallocz(sizeof(FFStream));
                  get_arg(stream->filename, sizeof(stream->filename), &p);
                  q = strrchr(stream->filename, '>');
 -                if (*q)
 +                if (q)
                      *q = '\0';
  
                  for (s = first_stream; s; s = s->next) {
                      }
                  }
  
 -                stream->fmt = avserver_guess_format(NULL, stream->filename, NULL);
 +                stream->fmt = ffserver_guess_format(NULL, stream->filename, NULL);
                  avcodec_get_context_defaults3(&video_enc, NULL);
                  avcodec_get_context_defaults3(&audio_enc, NULL);
 +
                  audio_id = AV_CODEC_ID_NONE;
                  video_id = AV_CODEC_ID_NONE;
                  if (stream->fmt) {
                      /* jpeg cannot be used here, so use single frame jpeg */
                      if (!strcmp(arg, "jpeg"))
                          strcpy(arg, "mjpeg");
 -                    stream->fmt = avserver_guess_format(arg, NULL, NULL);
 +                    stream->fmt = ffserver_guess_format(arg, NULL, NULL);
                      if (!stream->fmt) {
                          ERROR("Unknown Format: %s\n", arg);
                      }
                  avctx = &audio_enc;
                  type = AV_OPT_FLAG_AUDIO_PARAM;
              }
 -            if (avserver_opt_default(arg, arg2, avctx, type|AV_OPT_FLAG_ENCODING_PARAM)) {
 +            if (ffserver_opt_default(arg, arg2, avctx, type|AV_OPT_FLAG_ENCODING_PARAM)) {
                  ERROR("AVOption error: %s %s\n", arg, arg2);
              }
          } else if (!av_strcasecmp(cmd, "AVPresetVideo") ||
                  audio_enc.codec_id = audio_id;
                  type = AV_OPT_FLAG_AUDIO_PARAM;
              }
 -            if (avserver_opt_preset(arg, avctx, type|AV_OPT_FLAG_ENCODING_PARAM, &audio_id, &video_id)) {
 +            if (ffserver_opt_preset(arg, avctx, type|AV_OPT_FLAG_ENCODING_PARAM, &audio_id, &video_id)) {
                  ERROR("AVPreset error: %s\n", arg);
              }
          } else if (!av_strcasecmp(cmd, "VideoTag")) {
@@@ -4685,13 -4650,13 +4688,13 @@@ static void handle_child_exit(int sig
  
  static void opt_debug(void)
  {
 -    avserver_debug = 1;
 +    ffserver_debug = 1;
      logfilename[0] = '-';
  }
  
  void show_help_default(const char *opt, const char *arg)
  {
 -    printf("usage: avserver [options]\n"
 +    printf("usage: ffserver [options]\n"
             "Hyper fast multi format Audio/Video streaming server\n");
      printf("\n");
      show_help_options(options, "Main options:", 0, 0, 0);
@@@ -4701,7 -4666,7 +4704,7 @@@ static const OptionDef options[] = 
  #include "cmdutils_common_opts.h"
      { "n", OPT_BOOL, {(void *)&no_launch }, "enable no-launch mode" },
      { "d", 0, {(void*)opt_debug}, "enable debug mode" },
 -    { "f", HAS_ARG | OPT_STRING, {(void*)&config_filename }, "use configfile instead of /etc/avserver.conf", "configfile" },
 +    { "f", HAS_ARG | OPT_STRING, {(void*)&config_filename }, "use configfile instead of /etc/ffserver.conf", "configfile" },
      { NULL },
  };
  
@@@ -4713,7 -4678,7 +4716,7 @@@ int main(int argc, char **argv
      av_register_all();
      avformat_network_init();
  
 -    show_banner();
 +    show_banner(argc, argv, options);
  
      my_program_name = argv[0];
  
@@@ -2,20 -2,20 +2,20 @@@
  ;* MMX optimized DSP utils
  ;* Copyright (c) 2008 Loren Merritt
  ;*
 -;* 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
  ;******************************************************************************
  
@@@ -33,9 -33,9 +33,9 @@@ pb_bswap32: db 3, 2, 1, 0, 7, 6, 5, 4, 
  
  SECTION_TEXT
  
- %macro SCALARPRODUCT 1
+ %macro SCALARPRODUCT 0
  ; int scalarproduct_int16(int16_t *v1, int16_t *v2, int order)
- cglobal scalarproduct_int16_%1, 3,3,3, v1, v2, order
+ cglobal scalarproduct_int16, 3,3,3, v1, v2, order
      shl orderq, 1
      add v1q, orderq
      add v2q, orderq
@@@ -62,7 -62,7 +62,7 @@@
      RET
  
  ; int scalarproduct_and_madd_int16(int16_t *v1, int16_t *v2, int16_t *v3, int order, int mul)
- cglobal scalarproduct_and_madd_int16_%1, 4,4,8, v1, v2, v3, order, mul
+ cglobal scalarproduct_and_madd_int16, 4,4,8, v1, v2, v3, order, mul
      shl orderq, 1
      movd    m7, mulm
  %if mmsize == 16
      RET
  %endmacro
  
- INIT_MMX
- SCALARPRODUCT mmxext
- INIT_XMM
- SCALARPRODUCT sse2
+ INIT_MMX mmxext
+ SCALARPRODUCT
+ INIT_XMM sse2
+ SCALARPRODUCT
  
  %macro SCALARPRODUCT_LOOP 1
  align 16
  %endmacro
  
  ; int scalarproduct_and_madd_int16(int16_t *v1, int16_t *v2, int16_t *v3, int order, int mul)
- cglobal scalarproduct_and_madd_int16_ssse3, 4,5,10, v1, v2, v3, order, mul
+ INIT_XMM ssse3
+ cglobal scalarproduct_and_madd_int16, 4,5,10, v1, v2, v3, order, mul
      shl orderq, 1
      movd    m7, mulm
      pshuflw m7, m7, 0
@@@ -207,48 -208,60 +208,60 @@@ SCALARPRODUCT_LOOP 
  ;                            const int16_t *window, unsigned int len)
  ;-----------------------------------------------------------------------------
  
- %macro REVERSE_WORDS_MMXEXT 1-2
-     pshufw   %1, %1, 0x1B
- %endmacro
- %macro REVERSE_WORDS_SSE2 1-2
+ %macro REVERSE_WORDS 1-2
+ %if cpuflag(ssse3) && notcpuflag(atom)
+     pshufb  %1, %2
+ %elif cpuflag(sse2)
      pshuflw  %1, %1, 0x1B
      pshufhw  %1, %1, 0x1B
      pshufd   %1, %1, 0x4E
+ %elif cpuflag(mmxext)
+     pshufw   %1, %1, 0x1B
+ %endif
  %endmacro
  
- %macro REVERSE_WORDS_SSSE3 2
-     pshufb  %1, %2
- %endmacro
+ %macro MUL16FIXED 3
+ %if cpuflag(ssse3) ; dst, src, unused
+ ; dst = ((dst * src) + (1<<14)) >> 15
+     pmulhrsw   %1, %2
+ %elif cpuflag(mmxext) ; dst, src, temp
  ; dst = (dst * src) >> 15
  ; pmulhw cuts off the bottom bit, so we have to lshift by 1 and add it back
  ; in from the pmullw result.
- %macro MUL16FIXED_MMXEXT 3 ; dst, src, temp
      mova    %3, %1
      pmulhw  %1, %2
      pmullw  %3, %2
      psrlw   %3, 15
      psllw   %1, 1
      por     %1, %3
+ %endif
  %endmacro
  
- ; dst = ((dst * src) + (1<<14)) >> 15
- %macro MUL16FIXED_SSSE3 3 ; dst, src, unused
-     pmulhrsw   %1, %2
- %endmacro
- %macro APPLY_WINDOW_INT16 3 ; %1=instruction set, %2=mmxext/sse2 bit exact version, %3=has_ssse3
- cglobal apply_window_int16_%1, 4,5,6, output, input, window, offset, offset2
+ %macro APPLY_WINDOW_INT16 1 ; %1 bitexact version
+ %if %1
+ cglobal apply_window_int16, 4,5,6, output, input, window, offset, offset2
+ %else
+ cglobal apply_window_int16_round, 4,5,6, output, input, window, offset, offset2
+ %endif
      lea     offset2q, [offsetq-mmsize]
- %if %2
-     mova          m5, [pd_16384]
- %elifidn %1, ssse3
+ %if cpuflag(ssse3) && notcpuflag(atom)
      mova          m5, [pb_revwords]
      ALIGN 16
+ %elif %1
+     mova          m5, [pd_16384]
  %endif
  .loop:
- %if %2
+ %if cpuflag(ssse3)
+     ; This version does the 16x16->16 multiplication in-place without expanding
+     ; to 32-bit. The ssse3 version is bit-identical.
+     mova          m0, [windowq+offset2q]
+     mova          m1, [ inputq+offset2q]
+     pmulhrsw      m1, m0
+     REVERSE_WORDS m0, m5
+     pmulhrsw      m0, [ inputq+offsetq ]
+     mova  [outputq+offset2q], m1
+     mova  [outputq+offsetq ], m0
+ %elif %1
      ; This version expands 16-bit to 32-bit, multiplies by the window,
      ; adds 16384 for rounding, right shifts 15, then repacks back to words to
      ; save to the output. The window is reversed for the second half.
      psrad         m2, 15
      packssdw      m0, m2
      mova  [outputq+offsetq], m0
- %elif %3
-     ; This version does the 16x16->16 multiplication in-place without expanding
-     ; to 32-bit. The ssse3 version is bit-identical.
-     mova          m0, [windowq+offset2q]
-     mova          m1, [ inputq+offset2q]
-     pmulhrsw      m1, m0
-     REVERSE_WORDS m0, m5
-     pmulhrsw      m0, [ inputq+offsetq ]
-     mova  [outputq+offset2q], m1
-     mova  [outputq+offsetq ], m0
  %else
      ; This version does the 16x16->16 multiplication in-place without expanding
      ; to 32-bit. The mmxext and sse2 versions do not use rounding, and
      REP_RET
  %endmacro
  
- INIT_MMX
- %define REVERSE_WORDS REVERSE_WORDS_MMXEXT
- %define MUL16FIXED MUL16FIXED_MMXEXT
- APPLY_WINDOW_INT16 mmxext,     0, 0
- APPLY_WINDOW_INT16 mmxext_ba,  1, 0
- INIT_XMM
- %define REVERSE_WORDS REVERSE_WORDS_SSE2
- APPLY_WINDOW_INT16 sse2,       0, 0
- APPLY_WINDOW_INT16 sse2_ba,    1, 0
- APPLY_WINDOW_INT16 ssse3_atom, 0, 1
- %define REVERSE_WORDS REVERSE_WORDS_SSSE3
- APPLY_WINDOW_INT16 ssse3,      0, 1
+ INIT_MMX mmxext
+ APPLY_WINDOW_INT16 0
+ INIT_XMM sse2
+ APPLY_WINDOW_INT16 0
+ INIT_MMX mmxext
+ APPLY_WINDOW_INT16 1
+ INIT_XMM sse2
+ APPLY_WINDOW_INT16 1
+ INIT_XMM ssse3
+ APPLY_WINDOW_INT16 1
+ INIT_XMM ssse3, atom
+ APPLY_WINDOW_INT16 1
  
  
  ; void add_hfyu_median_prediction_mmxext(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top)
- cglobal add_hfyu_median_prediction_mmxext, 6,6,0, dst, top, diff, w, left, left_top
+ INIT_MMX mmxext
+ cglobal add_hfyu_median_prediction, 6,6,0, dst, top, diff, w, left, left_top
      movq    mm0, [topq]
      movq    mm2, mm0
      movd    mm4, [left_topq]
  %endmacro
  
  ; int add_hfyu_left_prediction(uint8_t *dst, const uint8_t *src, int w, int left)
- INIT_MMX
- cglobal add_hfyu_left_prediction_ssse3, 3,3,7, dst, src, w, left
+ INIT_MMX ssse3
+ cglobal add_hfyu_left_prediction, 3,3,7, dst, src, w, left
  .skip_prologue:
      mova    m5, [pb_7]
      mova    m4, [pb_zzzz3333zzzzbbbb]
      psllq   m0, 56
      ADD_HFYU_LEFT_LOOP 1, 1
  
- INIT_XMM
- cglobal add_hfyu_left_prediction_sse4, 3,3,7, dst, src, w, left
+ INIT_XMM sse4
+ cglobal add_hfyu_left_prediction, 3,3,7, dst, src, w, left
      mova    m5, [pb_f]
      mova    m6, [pb_zzzzzzzz77777777]
      mova    m4, [pb_zzzz3333zzzzbbbb]
  
  
  ; float scalarproduct_float_sse(const float *v1, const float *v2, int len)
- cglobal scalarproduct_float_sse, 3,3,2, v1, v2, offset
+ INIT_XMM sse
+ cglobal scalarproduct_float, 3,3,2, v1, v2, offset
      neg offsetq
      shl offsetq, 2
      sub v1q, offsetq
@@@ -1168,10 -1174,8 +1174,10 @@@ ALIGN 1
  
  INIT_XMM sse
  VECTOR_FMUL_REVERSE
 +%if HAVE_AVX_EXTERNAL
  INIT_YMM avx
  VECTOR_FMUL_REVERSE
 +%endif
  
  ;-----------------------------------------------------------------------------
  ; vector_fmul_add(float *dst, const float *src0, const float *src1,
@@@ -1198,10 -1202,8 +1204,10 @@@ ALIGN 1
  
  INIT_XMM sse
  VECTOR_FMUL_ADD
 +%if HAVE_AVX_EXTERNAL
  INIT_YMM avx
  VECTOR_FMUL_ADD
 +%endif
  
  ;-----------------------------------------------------------------------------
  ; void ff_butterflies_float_interleave(float *dst, const float *src0,
@@@ -1244,20 -1246,23 +1250,25 @@@ cglobal butterflies_float_interleave, 4
  
  INIT_XMM sse
  BUTTERFLIES_FLOAT_INTERLEAVE
 +%if HAVE_AVX_EXTERNAL
  INIT_YMM avx
  BUTTERFLIES_FLOAT_INTERLEAVE
 +%endif
  
- INIT_XMM sse2
  ; %1 = aligned/unaligned
- %macro BSWAP_LOOPS_SSE2  1
+ %macro BSWAP_LOOPS  1
      mov      r3, r2
      sar      r2, 3
      jz       .left4_%1
  .loop8_%1:
      mov%1    m0, [r1 +  0]
      mov%1    m1, [r1 + 16]
+ %if cpuflag(ssse3)
+     pshufb   m0, m2
+     pshufb   m1, m2
+     mova     [r0 +  0], m0
+     mova     [r0 + 16], m1
+ %else
      pshuflw  m0, m0, 10110001b
      pshuflw  m1, m1, 10110001b
      pshufhw  m0, m0, 10110001b
      por      m3, m1
      mova     [r0 +  0], m2
      mova     [r0 + 16], m3
-     add      r1, 32
+ %endif
      add      r0, 32
+     add      r1, 32
      dec      r2
      jnz      .loop8_%1
  .left4_%1:
      and      r3, 4
      jz       .left
      mov%1    m0, [r1]
+ %if cpuflag(ssse3)
+     pshufb   m0, m2
+     mova     [r0], m0
+ %else
      pshuflw  m0, m0, 10110001b
      pshufhw  m0, m0, 10110001b
      mova     m2, m0
      psrlw    m2, 8
      por      m2, m0
      mova     [r0], m2
+ %endif
      add      r1, 16
      add      r0, 16
  %endmacro
  
  ; void bswap_buf(uint32_t *dst, const uint32_t *src, int w);
+ %macro BSWAP32_BUF 0
+ %if cpuflag(ssse3)
+ cglobal bswap32_buf, 3,4,3
+     mov      r3, r1
+     mova     m2, [pb_bswap32]
+ %else
  cglobal bswap32_buf, 3,4,5
      mov      r3, r1
+ %endif
      and      r3, 15
      jz       .start_align
-     BSWAP_LOOPS_SSE2  u
+     BSWAP_LOOPS  u
      jmp      .left
  .start_align:
-     BSWAP_LOOPS_SSE2  a
+     BSWAP_LOOPS  a
  .left:
-     and      r2, 3
-     jz       .end
- .loop2:
-     mov      r3d, [r1]
-     bswap    r3d
-     mov      [r0], r3d
-     add      r1, 4
-     add      r0, 4
-     dec      r2
-     jnz      .loop2
- .end:
-     RET
- ; %1 = aligned/unaligned
- %macro BSWAP_LOOPS_SSSE3  1
-     mov      r3, r2
-     sar      r2, 3
-     jz       .left4_%1
- .loop8_%1:
-     mov%1    m0, [r1 +  0]
-     mov%1    m1, [r1 + 16]
-     pshufb   m0, m2
-     pshufb   m1, m2
-     mova     [r0 +  0], m0
-     mova     [r0 + 16], m1
-     add      r0, 32
-     add      r1, 32
-     dec      r2
-     jnz      .loop8_%1
- .left4_%1:
-     mov      r2, r3
-     and      r3, 4
-     jz       .left2
-     mov%1    m0, [r1]
-     pshufb   m0, m2
-     mova     [r0], m0
-     add      r1, 16
-     add      r0, 16
- %endmacro
- INIT_XMM ssse3
- ; void bswap_buf(uint32_t *dst, const uint32_t *src, int w);
- cglobal bswap32_buf, 3,4,3
-     mov      r3, r1
-     mova     m2, [pb_bswap32]
-     and      r3, 15
-     jz       .start_align
-     BSWAP_LOOPS_SSSE3  u
-     jmp      .left2
- .start_align:
-     BSWAP_LOOPS_SSSE3  a
- .left2:
+ %if cpuflag(ssse3)
      mov      r3, r2
      and      r2, 2
      jz       .left1
      mov      r2d, [r1]
      bswap    r2d
      mov      [r0], r2d
+ %else
+     and      r2, 3
+     jz       .end
+ .loop2:
+     mov      r3d, [r1]
+     bswap    r3d
+     mov      [r0], r3d
+     add      r1, 4
+     add      r0, 4
+     dec      r2
+     jnz      .loop2
+ %endif
  .end:
      RET
+ %endmacro
+ INIT_XMM sse2
+ BSWAP32_BUF
  
+ INIT_XMM ssse3
+ BSWAP32_BUF
@@@ -3,23 -3,23 +3,23 @@@
   * Copyright (c) 2000, 2001 Fabrice Bellard
   * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
   *
 - * MMX optimization by Nick Kurshev <nickols_k@mail.ru>
 - *
 - * 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
 + *
 + * MMX optimization by Nick Kurshev <nickols_k@mail.ru>
   */
  
  #include "libavutil/cpu.h"
@@@ -30,7 -30,6 +30,7 @@@
  #include "libavcodec/simple_idct.h"
  #include "dsputil_mmx.h"
  #include "idct_xvid.h"
 +#include "diracdsp_mmx.h"
  
  //#undef NDEBUG
  //#include <assert.h>
@@@ -836,7 -835,7 +836,7 @@@ static void draw_edges_mmx(uint8_t *buf
              : "+r"(ptr)
              : "r"((x86_reg)wrap), "r"((x86_reg)width), "r"(ptr + wrap * height)
              );
 -    } else {
 +    } else if(w==16){
          __asm__ volatile (
              "1:                                 \n\t"
              "movd            (%0), %%mm0        \n\t"
              : "+r"(ptr)
              : "r"((x86_reg)wrap), "r"((x86_reg)width), "r"(ptr + wrap * height)
              );
 +    } else {
 +        av_assert1(w == 4);
 +        __asm__ volatile (
 +            "1:                             \n\t"
 +            "movd            (%0), %%mm0    \n\t"
 +            "punpcklbw      %%mm0, %%mm0    \n\t"
 +            "punpcklwd      %%mm0, %%mm0    \n\t"
 +            "movd           %%mm0, -4(%0)   \n\t"
 +            "movd      -4(%0, %2), %%mm1    \n\t"
 +            "punpcklbw      %%mm1, %%mm1    \n\t"
 +            "punpckhwd      %%mm1, %%mm1    \n\t"
 +            "punpckhdq      %%mm1, %%mm1    \n\t"
 +            "movd           %%mm1, (%0, %2) \n\t"
 +            "add               %1, %0       \n\t"
 +            "cmp               %3, %0       \n\t"
 +            "jb                1b           \n\t"
 +            : "+r"(ptr)
 +            : "r"((x86_reg)wrap), "r"((x86_reg)width), "r"(ptr + wrap * height)
 +            );
      }
  
      /* top and bottom (and hopefully also the corners) */
@@@ -1896,8 -1876,8 +1896,8 @@@ static av_always_inline void emulated_e
      start_x = FFMAX(0, -src_x);
      end_y   = FFMIN(block_h, h-src_y);
      end_x   = FFMIN(block_w, w-src_x);
 -    assert(start_x < end_x && block_w > 0);
 -    assert(start_y < end_y && block_h > 0);
 +    av_assert2(start_x < end_x && block_w > 0);
 +    av_assert2(start_y < end_y && block_h > 0);
  
      // fill in the to-be-copied part plus all above/below
      src += (src_y_add + start_y) * linesize + start_x;
@@@ -1929,15 -1909,10 +1929,15 @@@ static av_noinline void emulated_edge_m
  
  #if HAVE_INLINE_ASM
  
 -static void gmc_mmx(uint8_t *dst, uint8_t *src,
 -                    int stride, int h, int ox, int oy,
 -                    int dxx, int dxy, int dyx, int dyy,
 -                    int shift, int r, int width, int height)
 +typedef void emulated_edge_mc_func(uint8_t *dst, const uint8_t *src,
 +                                   int linesize, int block_w, int block_h,
 +                                   int src_x, int src_y, int w, int h);
 +
 +static av_always_inline void gmc(uint8_t *dst, uint8_t *src,
 +                                 int stride, int h, int ox, int oy,
 +                                 int dxx, int dxy, int dyx, int dyy,
 +                                 int shift, int r, int width, int height,
 +                                 emulated_edge_mc_func *emu_edge_fn)
  {
      const int w    = 8;
      const int ix   = ox  >> (16 + shift);
      const uint16_t dxy4[4] = { dxys, dxys, dxys, dxys };
      const uint16_t dyy4[4] = { dyys, dyys, dyys, dyys };
      const uint64_t shift2 = 2 * shift;
 +#define MAX_STRIDE 4096U
 +#define MAX_H 8U
 +    uint8_t edge_buf[(MAX_H + 1) * MAX_STRIDE];
      int x, y;
  
      const int dxw = (dxx - (1 << (16 + shift))) * (w - 1);
      const int dyh = (dyy - (1 << (16 + shift))) * (h - 1);
      const int dxh = dxy * (h - 1);
      const int dyw = dyx * (w - 1);
 +    int need_emu =  (unsigned)ix >= width  - w ||
 +                    (unsigned)iy >= height - h;
 +
      if ( // non-constant fullpel offset (3% of blocks)
          ((ox ^ (ox + dxw)) | (ox ^ (ox + dxh)) | (ox ^ (ox + dxw + dxh)) |
           (oy ^ (oy + dyw)) | (oy ^ (oy + dyh)) | (oy ^ (oy + dyw + dyh))) >> (16 + shift)
          // uses more than 16 bits of subpel mv (only at huge resolution)
 -        || (dxx | dxy | dyx | dyy) & 15 ||
 -        (unsigned)ix >= width  - w ||
 -        (unsigned)iy >= height - h) {
 +        || (dxx | dxy | dyx | dyy) & 15
 +        || (need_emu && (h > MAX_H || stride > MAX_STRIDE))) {
          // FIXME could still use mmx for some of the rows
          ff_gmc_c(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy,
                   shift, r, width, height);
      }
  
      src += ix + iy * stride;
 +    if (need_emu) {
 +        emu_edge_fn(edge_buf, src, stride, w + 1, h + 1, ix, iy, width, height);
 +        src = edge_buf;
 +    }
  
      __asm__ volatile (
          "movd         %0, %%mm6         \n\t"
      }
  }
  
 +#if HAVE_YASM
 +#if ARCH_X86_32
 +static void gmc_mmx(uint8_t *dst, uint8_t *src,
 +                    int stride, int h, int ox, int oy,
 +                    int dxx, int dxy, int dyx, int dyy,
 +                    int shift, int r, int width, int height)
 +{
 +    gmc(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy, shift, r,
 +        width, height, &emulated_edge_mc_mmx);
 +}
 +#endif
 +static void gmc_sse(uint8_t *dst, uint8_t *src,
 +                    int stride, int h, int ox, int oy,
 +                    int dxx, int dxy, int dyx, int dyy,
 +                    int shift, int r, int width, int height)
 +{
 +    gmc(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy, shift, r,
 +        width, height, &emulated_edge_mc_sse);
 +}
 +#else
 +static void gmc_mmx(uint8_t *dst, uint8_t *src,
 +                    int stride, int h, int ox, int oy,
 +                    int dxx, int dxy, int dyx, int dyy,
 +                    int shift, int r, int width, int height)
 +{
 +    gmc(dst, src, stride, h, ox, oy, dxx, dxy, dyx, dyy, shift, r,
 +        width, height, &ff_emulated_edge_mc_8);
 +}
 +#endif
 +
  #define PREFETCH(name, op)                      \
  static void name(void *mem, int stride, int h)  \
  {                                               \
@@@ -2186,116 -2122,6 +2186,116 @@@ void ff_avg_vc1_mspel_mc00_mmxext(uint8
      avg_pixels8_mmxext(dst, src, stride, 8);
  }
  
 +/* only used in VP3/5/6 */
 +static void put_vp_no_rnd_pixels8_l2_mmx(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h)
 +{
 +//    START_TIMER
 +    MOVQ_BFE(mm6);
 +    __asm__ volatile(
 +        "1:                             \n\t"
 +        "movq   (%1), %%mm0             \n\t"
 +        "movq   (%2), %%mm1             \n\t"
 +        "movq   (%1,%4), %%mm2          \n\t"
 +        "movq   (%2,%4), %%mm3          \n\t"
 +        PAVGBP_MMX_NO_RND(%%mm0, %%mm1, %%mm4,   %%mm2, %%mm3, %%mm5)
 +        "movq   %%mm4, (%3)             \n\t"
 +        "movq   %%mm5, (%3,%4)          \n\t"
 +
 +        "movq   (%1,%4,2), %%mm0        \n\t"
 +        "movq   (%2,%4,2), %%mm1        \n\t"
 +        "movq   (%1,%5), %%mm2          \n\t"
 +        "movq   (%2,%5), %%mm3          \n\t"
 +        "lea    (%1,%4,4), %1           \n\t"
 +        "lea    (%2,%4,4), %2           \n\t"
 +        PAVGBP_MMX_NO_RND(%%mm0, %%mm1, %%mm4,   %%mm2, %%mm3, %%mm5)
 +        "movq   %%mm4, (%3,%4,2)        \n\t"
 +        "movq   %%mm5, (%3,%5)          \n\t"
 +        "lea    (%3,%4,4), %3           \n\t"
 +        "subl   $4, %0                  \n\t"
 +        "jnz    1b                      \n\t"
 +        :"+r"(h), "+r"(a), "+r"(b), "+r"(dst)
 +        :"r"((x86_reg)stride), "r"((x86_reg)3L*stride)
 +        :"memory");
 +//    STOP_TIMER("put_vp_no_rnd_pixels8_l2_mmx")
 +}
 +static void put_vp_no_rnd_pixels16_l2_mmx(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h)
 +{
 +    put_vp_no_rnd_pixels8_l2_mmx(dst, a, b, stride, h);
 +    put_vp_no_rnd_pixels8_l2_mmx(dst+8, a+8, b+8, stride, h);
 +}
 +
 +#if CONFIG_DIRAC_DECODER
 +#define DIRAC_PIXOP(OPNAME, EXT)\
 +void ff_ ## OPNAME ## _dirac_pixels8_ ## EXT(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels8_ ## EXT(dst, src[0], stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels16_ ## EXT(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_ ## EXT(dst, src[0], stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels32_ ## EXT(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_ ## EXT(dst   , src[0]   , stride, h);\
 +    OPNAME ## _pixels16_ ## EXT(dst+16, src[0]+16, stride, h);\
 +}
 +
 +DIRAC_PIXOP(put, mmx)
 +DIRAC_PIXOP(avg, mmx)
 +DIRAC_PIXOP(avg, mmxext)
 +
 +void ff_put_dirac_pixels16_sse2(uint8_t *dst, const uint8_t *src[5], int stride, int h)
 +{
 +    put_pixels16_sse2(dst, src[0], stride, h);
 +}
 +void ff_avg_dirac_pixels16_sse2(uint8_t *dst, const uint8_t *src[5], int stride, int h)
 +{
 +    avg_pixels16_sse2(dst, src[0], stride, h);
 +}
 +void ff_put_dirac_pixels32_sse2(uint8_t *dst, const uint8_t *src[5], int stride, int h)
 +{
 +    put_pixels16_sse2(dst   , src[0]   , stride, h);
 +    put_pixels16_sse2(dst+16, src[0]+16, stride, h);
 +}
 +void ff_avg_dirac_pixels32_sse2(uint8_t *dst, const uint8_t *src[5], int stride, int h)
 +{
 +    avg_pixels16_sse2(dst   , src[0]   , stride, h);
 +    avg_pixels16_sse2(dst+16, src[0]+16, stride, h);
 +}
 +#endif
 +
 +/* XXX: Those functions should be suppressed ASAP when all IDCTs are
 + * converted. */
 +#if CONFIG_GPL
 +static void ff_libmpeg2mmx_idct_put(uint8_t *dest, int line_size,
 +                                    DCTELEM *block)
 +{
 +    ff_mmx_idct(block);
 +    ff_put_pixels_clamped_mmx(block, dest, line_size);
 +}
 +
 +static void ff_libmpeg2mmx_idct_add(uint8_t *dest, int line_size,
 +                                    DCTELEM *block)
 +{
 +    ff_mmx_idct(block);
 +    ff_add_pixels_clamped_mmx(block, dest, line_size);
 +}
 +
 +static void ff_libmpeg2mmx2_idct_put(uint8_t *dest, int line_size,
 +                                     DCTELEM *block)
 +{
 +    ff_mmxext_idct(block);
 +    ff_put_pixels_clamped_mmx(block, dest, line_size);
 +}
 +
 +static void ff_libmpeg2mmx2_idct_add(uint8_t *dest, int line_size,
 +                                     DCTELEM *block)
 +{
 +    ff_mmxext_idct(block);
 +    ff_add_pixels_clamped_mmx(block, dest, line_size);
 +}
 +#endif
 +
  static void vorbis_inverse_coupling_3dnow(float *mag, float *ang, int blocksize)
  {
      int i;
@@@ -2471,16 -2297,16 +2471,16 @@@ int32_t ff_scalarproduct_and_madd_int16
                                                const int16_t *v3,
                                                int order, int mul);
  
- void ff_apply_window_int16_mmxext    (int16_t *output, const int16_t *input,
-                                       const int16_t *window, unsigned int len);
- void ff_apply_window_int16_mmxext_ba (int16_t *output, const int16_t *input,
-                                       const int16_t *window, unsigned int len);
- void ff_apply_window_int16_sse2      (int16_t *output, const int16_t *input,
-                                       const int16_t *window, unsigned int len);
- void ff_apply_window_int16_sse2_ba   (int16_t *output, const int16_t *input,
-                                       const int16_t *window, unsigned int len);
- void ff_apply_window_int16_ssse3     (int16_t *output, const int16_t *input,
+ void ff_apply_window_int16_round_mmxext(int16_t *output, const int16_t *input,
+                                         const int16_t *window, unsigned int len);
+ void ff_apply_window_int16_round_sse2(int16_t *output, const int16_t *input,
                                        const int16_t *window, unsigned int len);
+ void ff_apply_window_int16_mmxext(int16_t *output, const int16_t *input,
+                                   const int16_t *window, unsigned int len);
+ void ff_apply_window_int16_sse2(int16_t *output, const int16_t *input,
+                                 const int16_t *window, unsigned int len);
+ void ff_apply_window_int16_ssse3(int16_t *output, const int16_t *input,
+                                  const int16_t *window, unsigned int len);
  void ff_apply_window_int16_ssse3_atom(int16_t *output, const int16_t *input,
                                        const int16_t *window, unsigned int len);
  
@@@ -2587,17 -2413,27 +2587,17 @@@ static void dsputil_init_mmx(DSPContex
          SET_HPEL_FUNCS(put_no_rnd, 1,  8, mmx);
          SET_HPEL_FUNCS(avg,        1,  8, mmx);
          SET_HPEL_FUNCS(avg_no_rnd, 1,  8, mmx);
 -
 -        switch (avctx->idct_algo) {
 -        case FF_IDCT_AUTO:
 -        case FF_IDCT_SIMPLEMMX:
 -            c->idct_put              = ff_simple_idct_put_mmx;
 -            c->idct_add              = ff_simple_idct_add_mmx;
 -            c->idct                  = ff_simple_idct_mmx;
 -            c->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
 -            break;
 -        case FF_IDCT_XVIDMMX:
 -            c->idct_put              = ff_idct_xvid_mmx_put;
 -            c->idct_add              = ff_idct_xvid_mmx_add;
 -            c->idct                  = ff_idct_xvid_mmx;
 -            break;
 -        }
      }
  
 +#if ARCH_X86_32 || !HAVE_YASM
      c->gmc = gmc_mmx;
 +#endif
  
      c->add_bytes = add_bytes_mmx;
  
 +    c->put_no_rnd_pixels_l2[0]= put_vp_no_rnd_pixels16_l2_mmx;
 +    c->put_no_rnd_pixels_l2[1]= put_vp_no_rnd_pixels8_l2_mmx;
 +
      if (CONFIG_H263_DECODER || CONFIG_H263_ENCODER) {
          c->h263_v_loop_filter = h263_v_loop_filter_mmx;
          c->h263_h_loop_filter = h263_h_loop_filter_mmx;
@@@ -2657,6 -2493,12 +2657,6 @@@ static void dsputil_init_mmxext(DSPCont
          }
      }
  
 -    if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX) {
 -        c->idct_put = ff_idct_xvid_mmxext_put;
 -        c->idct_add = ff_idct_xvid_mmxext_add;
 -        c->idct     = ff_idct_xvid_mmxext;
 -    }
 -
      if (CONFIG_VP3_DECODER && (avctx->codec_id == AV_CODEC_ID_VP3 ||
                                 avctx->codec_id == AV_CODEC_ID_THEORA)) {
          c->put_no_rnd_pixels_tab[1][1] = put_no_rnd_pixels8_x2_exact_mmxext;
      c->scalarproduct_and_madd_int16 = ff_scalarproduct_and_madd_int16_mmxext;
  
      if (avctx->flags & CODEC_FLAG_BITEXACT) {
-         c->apply_window_int16 = ff_apply_window_int16_mmxext_ba;
-     } else {
          c->apply_window_int16 = ff_apply_window_int16_mmxext;
+     } else {
+         c->apply_window_int16 = ff_apply_window_int16_round_mmxext;
      }
  #endif /* HAVE_YASM */
  }
@@@ -2846,9 -2688,6 +2846,9 @@@ static void dsputil_init_sse(DSPContex
  
      if (!high_bit_depth)
          c->emulated_edge_mc = emulated_edge_mc_sse;
 +#if HAVE_INLINE_ASM
 +    c->gmc = gmc_sse;
 +#endif
  #endif /* HAVE_YASM */
  }
  
@@@ -2885,6 -2724,13 +2885,6 @@@ static void dsputil_init_sse2(DSPContex
          H264_QPEL_FUNCS(3, 2, sse2);
          H264_QPEL_FUNCS(3, 3, sse2);
      }
 -
 -    if (!high_bit_depth && avctx->idct_algo == FF_IDCT_XVIDMMX) {
 -        c->idct_put              = ff_idct_xvid_sse2_put;
 -        c->idct_add              = ff_idct_xvid_sse2_add;
 -        c->idct                  = ff_idct_xvid_sse2;
 -        c->idct_permutation_type = FF_SSE2_IDCT_PERM;
 -    }
  #endif /* HAVE_INLINE_ASM */
  
  #if HAVE_YASM
          c->vector_clip_int32 = ff_vector_clip_int32_sse2;
      }
      if (avctx->flags & CODEC_FLAG_BITEXACT) {
-         c->apply_window_int16 = ff_apply_window_int16_sse2_ba;
-     } else if (!(mm_flags & AV_CPU_FLAG_SSE2SLOW)) {
          c->apply_window_int16 = ff_apply_window_int16_sse2;
+     } else if (!(mm_flags & AV_CPU_FLAG_SSE2SLOW)) {
+         c->apply_window_int16 = ff_apply_window_int16_round_sse2;
      }
      c->bswap_buf = ff_bswap32_buf_sse2;
  #endif /* HAVE_YASM */
@@@ -3011,50 -2857,8 +3011,50 @@@ void ff_dsputil_init_mmx(DSPContext *c
          c->add_hfyu_median_prediction = add_hfyu_median_prediction_cmov;
  #endif
  
 -    if (mm_flags & AV_CPU_FLAG_MMX)
 +    if (mm_flags & AV_CPU_FLAG_MMX) {
 +#if HAVE_INLINE_ASM
 +        const int idct_algo = avctx->idct_algo;
 +
 +        if (avctx->lowres == 0 && avctx->bits_per_raw_sample <= 8) {
 +            if (idct_algo == FF_IDCT_AUTO || idct_algo == FF_IDCT_SIMPLEMMX) {
 +                c->idct_put              = ff_simple_idct_put_mmx;
 +                c->idct_add              = ff_simple_idct_add_mmx;
 +                c->idct                  = ff_simple_idct_mmx;
 +                c->idct_permutation_type = FF_SIMPLE_IDCT_PERM;
 +#if CONFIG_GPL
 +            } else if (idct_algo == FF_IDCT_LIBMPEG2MMX) {
 +                if (mm_flags & AV_CPU_FLAG_MMX2) {
 +                    c->idct_put = ff_libmpeg2mmx2_idct_put;
 +                    c->idct_add = ff_libmpeg2mmx2_idct_add;
 +                    c->idct     = ff_mmxext_idct;
 +                } else {
 +                    c->idct_put = ff_libmpeg2mmx_idct_put;
 +                    c->idct_add = ff_libmpeg2mmx_idct_add;
 +                    c->idct     = ff_mmx_idct;
 +                }
 +                c->idct_permutation_type = FF_LIBMPEG2_IDCT_PERM;
 +#endif
 +            } else if (idct_algo == FF_IDCT_XVIDMMX) {
 +                if (mm_flags & AV_CPU_FLAG_SSE2) {
 +                    c->idct_put              = ff_idct_xvid_sse2_put;
 +                    c->idct_add              = ff_idct_xvid_sse2_add;
 +                    c->idct                  = ff_idct_xvid_sse2;
 +                    c->idct_permutation_type = FF_SSE2_IDCT_PERM;
 +                } else if (mm_flags & AV_CPU_FLAG_MMXEXT) {
 +                    c->idct_put              = ff_idct_xvid_mmxext_put;
 +                    c->idct_add              = ff_idct_xvid_mmxext_add;
 +                    c->idct                  = ff_idct_xvid_mmxext;
 +                } else {
 +                    c->idct_put              = ff_idct_xvid_mmx_put;
 +                    c->idct_add              = ff_idct_xvid_mmx_add;
 +                    c->idct                  = ff_idct_xvid_mmx;
 +                }
 +            }
 +        }
 +#endif /* HAVE_INLINE_ASM */
 +
          dsputil_init_mmx(c, avctx, mm_flags);
 +    }
  
      if (mm_flags & AV_CPU_FLAG_MMXEXT)
          dsputil_init_mmxext(c, avctx, mm_flags);
diff --combined libavutil/crc.h
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
   *
 - * 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
   */
  
@@@ -68,6 -68,7 +68,7 @@@ const AVCRC *av_crc_get_table(AVCRCId c
   *
   * @see av_crc_init() "le" parameter
   */
- uint32_t av_crc(const AVCRC *ctx, uint32_t start_crc, const uint8_t *buffer, size_t length) av_pure;
+ uint32_t av_crc(const AVCRC *ctx, uint32_t crc,
+                 const uint8_t *buffer, size_t length) av_pure;
  
  #endif /* AVUTIL_CRC_H */