Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 13 Nov 2011 22:43:12 +0000 (23:43 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 13 Nov 2011 23:33:39 +0000 (00:33 +0100)
* qatar/master:
  lavf: pass options from AVFormatContext to avio.
  avformat: Use avio_open2, pass the AVFormatContext interrupt_callback onwards
  avio: add avio_open2, taking an interrupt callback and options
  avio: add support for passing options to protocols.
  avio: add and use ffurl_protocol_next().
  avformat: Pass the interrupt callback on to chained muxers/demuxers
  avio: Add an AVIOInterruptCB parameter to ffurl_open/ffurl_alloc
  avformat: Use ff_check_interrupt
  avio: Add an internal utility function for checking the new interrupt callback
  avio: Add AVIOInterruptCB
  texi2html: remove stray \n
  doc: prettyfy the texi2html documentation
  swscale: handle unaligned buffers in yuv2plane1

Conflicts:
libavformat/avformat.h
libavformat/avio.c
libavformat/mov.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
29 files changed:
1  2 
doc/indevs.texi
doc/t2h.init
libavformat/applehttp.c
libavformat/applehttpproto.c
libavformat/avformat.h
libavformat/avio.c
libavformat/avio.h
libavformat/avio_internal.h
libavformat/aviobuf.c
libavformat/cache.c
libavformat/concat.c
libavformat/gopher.c
libavformat/http.c
libavformat/img2.c
libavformat/md5proto.c
libavformat/mmsh.c
libavformat/mmst.c
libavformat/mov.c
libavformat/options.c
libavformat/rtmpproto.c
libavformat/rtpenc_chain.c
libavformat/rtpproto.c
libavformat/rtsp.c
libavformat/sapdec.c
libavformat/sapenc.c
libavformat/tcp.c
libavformat/url.h
libavformat/utils.c
libswscale/x86/scale.asm

diff --cc doc/indevs.texi
Simple merge
diff --cc doc/t2h.init
@@@ -1,15 -1,71 +1,71 @@@
  # no horiz rules between sections
- $end_section = \&FFMPEG_end_section;
- sub FFMPEG_end_section($$)
 -$end_section = \&Libav_end_section;
 -sub Libav_end_section($$)
++$end_section = \&FFmpeg_end_section;
++sub FFmpeg_end_section($$)
  {
  }
  
- $print_page_foot = \&FFMPEG_print_page_foot;
- sub FFMPEG_print_page_foot($$)
+ $EXTRA_HEAD =
+ '<link rel="icon" href="favicon.png" type="image/png" />
+ <link rel="stylesheet" type="text/css" href="default.css" />
+ ';
+ $AFTER_BODY_OPEN =
+ '<div id="container">
+ <div id="body">';
+ $PRE_BODY_CLOSE = '</div></div>';
+ $SMALL_RULE = '';
+ $BODYTEXT = '';
 -$print_page_foot = \&Libav_print_page_foot;
 -sub Libav_print_page_foot($$)
++$print_page_foot = \&FFmpeg_print_page_foot;
++sub FFmpeg_print_page_foot($$)
  {
      my $fh = shift;
-     print $fh "$SMALL_RULE\n";
+     print $fh '<div id="footer">' . "\n";
      T2H_DEFAULT_print_page_foot($fh);
 -$print_page_head = \&Libav_print_page_head;
 -sub Libav_print_page_head($$)
+     print $fh "</div>\n";
+ }
 -    $longtitle = "Libav documentation : " . $longtitle;
++$print_page_head = \&FFmpeg_print_page_head;
++sub FFmpeg_print_page_head($$)
+ {
+     my $fh = shift;
+     my $longtitle = "$Texi2HTML::THISDOC{'title_no_texi'}";
+     $longtitle .= ": $Texi2HTML::NO_TEXI{'This'}" if exists $Texi2HTML::NO_TEXI{'This'};
+     my $description = $DOCUMENT_DESCRIPTION;
+     $description = $longtitle if (!defined($description));
+     $description = "<meta name=\"description\" content=\"$description\">" if
+          ($description ne '');
+     $description = $Texi2HTML::THISDOC{'documentdescription'} if (defined($Texi2HTML::THISDOC{'documentdescription'}));
+     my $encoding = '';
+     $encoding = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=$ENCODING\">" if (defined($ENCODING) and ($ENCODING ne ''));
+     $longtitle =~ s/Documentation.*//g;
++    $longtitle = "FFmpeg documentation : " . $longtitle;
+     print $fh <<EOT;
+ $DOCTYPE
+ <html>
+ $Texi2HTML::THISDOC{'copying'}<!-- Created on $Texi2HTML::THISDOC{today} by $Texi2HTML::THISDOC{program} -->
+ <!--
+ $Texi2HTML::THISDOC{program_authors}
+ -->
+ <head>
+ <title>$longtitle</title>
+ $description
+ <meta name="keywords" content="$longtitle">
+ <meta name="resource-type" content="document">
+ <meta name="distribution" content="global">
+ <meta name="Generator" content="$Texi2HTML::THISDOC{program}">
+ $encoding
+ $CSS_LINES
+ $EXTRA_HEAD
+ </head>
+ <body $BODYTEXT>
+ $AFTER_BODY_OPEN
+ EOT
  }
  
  # no navigation elements
Simple merge
Simple merge
@@@ -1028,11 -995,16 +1028,23 @@@ typedef struct AVFormatContext 
      int error_recognition;
  
      /**
+      * Custom interrupt callbacks for the I/O layer.
+      *
+      * decoding: set by the user before avformat_open_input().
+      * encoding: set by the user before avformat_write_header()
+      * (mainly useful for AVFMT_NOFILE formats). The callback
+      * should also be passed to avio_open2() if it's used to
+      * open the file.
+      */
+     AVIOInterruptCB interrupt_callback;
++    /**
 +     * Transport stream id.
 +     * This will be moved into demuxer private options. Thus no API/ABI compatibility
 +     */
 +    int ts_id;
 +
++
      /*****************************************************************
       * All fields below this line are not part of the public API. They
       * may not be used outside of libavformat and can be changed and
@@@ -49,14 -85,14 +85,12 @@@ const AVClass ffurl_context_class = 
  
  static int default_interrupt_cb(void);
  
- URLProtocol *first_protocol = NULL;
  int (*url_interrupt_cb)(void) = default_interrupt_cb;
  
 -#if FF_API_OLD_AVIO
  URLProtocol *av_protocol_next(URLProtocol *p)
  {
-     if(p) return p->next;
-     else  return first_protocol;
+     return ffurl_protocol_next(p);
  }
 -#endif
  
  const char *avio_enum_protocols(void **opaque, int output)
  {
@@@ -287,7 -329,7 +332,7 @@@ static inline int retry_transfer_wrappe
          if (ret)
             fast_retries = FFMAX(fast_retries, 2);
          len += ret;
-         if (len < size && url_interrupt_cb())
 -        if (ff_check_interrupt(&h->interrupt_callback))
++        if (len < size && ff_check_interrupt(&h->interrupt_callback))
              return AVERROR_EXIT;
      }
      return len;
Simple merge
Simple merge
Simple merge
index 74f008e,0000000..c2bddf5
mode 100644,000000..100644
--- /dev/null
@@@ -1,144 -1,0 +1,144 @@@
-     return ffurl_open(&c->inner, arg, flags);
 +/*
 + * Input cache protocol.
 + * Copyright (c) 2011 Michael Niedermayer
 + *
 + * This file is part of FFmpeg.
 + *
 + * 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.
 + *
 + * 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
 + *
 + * Based on file.c by Fabrice Bellard
 + */
 +
 +/**
 + * @TODO
 + *      support non continuous caching
 + *      support keeping files
 + *      support filling with a background thread
 + */
 +
 +#include "libavutil/avassert.h"
 +#include "libavutil/avstring.h"
 +#include "libavutil/file.h"
 +#include "avformat.h"
 +#include <fcntl.h>
 +#if HAVE_SETMODE
 +#include <io.h>
 +#endif
 +#include <unistd.h>
 +#include <sys/stat.h>
 +#include <stdlib.h>
 +#include "os_support.h"
 +#include "url.h"
 +
 +typedef struct Context {
 +    int fd;
 +    int64_t end;
 +    int64_t pos;
 +    URLContext *inner;
 +} Context;
 +
 +static int cache_open(URLContext *h, const char *arg, int flags)
 +{
 +    int access;
 +    const char *buffername;
 +    Context *c;
 +
 +    c = av_mallocz(sizeof(Context));
 +    if (!c) {
 +        return AVERROR(ENOMEM);
 +    }
 +    h->priv_data = c;
 +
 +    av_strstart(arg, "cache:", &arg);
 +
 +    c->fd = av_tempfile("ffcache", &buffername, 0, h);
 +    if (c->fd < 0){
 +        av_log(h, AV_LOG_ERROR, "Failed to create tempfile\n");
 +        return c->fd;
 +    }
 +
 +    unlink(buffername);
 +    av_free(buffername);
 +
++    return ffurl_open(&c->inner, arg, flags, &h->interrupt_callback, NULL);
 +}
 +
 +static int cache_read(URLContext *h, unsigned char *buf, int size)
 +{
 +    Context *c= h->priv_data;
 +    int r;
 +
 +    if(c->pos<c->end){
 +        r = read(c->fd, buf, FFMIN(size, c->end - c->pos));
 +        if(r>0)
 +            c->pos += r;
 +        return (-1 == r)?AVERROR(errno):r;
 +    }else{
 +        r = ffurl_read(c->inner, buf, size);
 +        if(r > 0){
 +            int r2= write(c->fd, buf, r);
 +            av_assert0(r2==r); // FIXME handle cache failure
 +            c->pos += r;
 +            c->end += r;
 +        }
 +        return r;
 +    }
 +}
 +
 +static int64_t cache_seek(URLContext *h, int64_t pos, int whence)
 +{
 +    Context *c= h->priv_data;
 +
 +    if (whence == AVSEEK_SIZE) {
 +        pos= ffurl_seek(c->inner, pos, whence);
 +        if(pos <= 0){
 +            pos= ffurl_seek(c->inner, -1, SEEK_END);
 +            ffurl_seek(c->inner, c->end, SEEK_SET);
 +            if(pos <= 0)
 +                return c->end;
 +        }
 +        return pos;
 +    }
 +
 +    pos= lseek(c->fd, pos, whence);
 +    if(pos<0){
 +        return pos;
 +    }else if(pos <= c->end){
 +        c->pos= pos;
 +        return pos;
 +    }else{
 +        lseek(c->fd, c->pos, SEEK_SET);
 +        return AVERROR(EPIPE);
 +    }
 +}
 +
 +static int cache_close(URLContext *h)
 +{
 +    Context *c= h->priv_data;
 +    close(c->fd);
 +    ffurl_close(c->inner);
 +
 +    av_freep(&h->priv_data);
 +
 +    return 0;
 +}
 +
 +URLProtocol ff_cache_protocol = {
 +    .name                = "cache",
 +    .url_open            = cache_open,
 +    .url_read            = cache_read,
 +    .url_seek            = cache_seek,
 +    .url_close           = cache_close,
 +};
Simple merge
Simple merge
Simple merge
@@@ -394,10 -386,11 +395,11 @@@ static int write_packet(AVFormatContex
              av_log(s, AV_LOG_ERROR,
                     "Could not get frame filename number %d from pattern '%s'\n",
                     img->img_number, img->path);
 -            return AVERROR(EIO);
 +            return AVERROR(EINVAL);
          }
          for(i=0; i<3; i++){
-             if (avio_open(&pb[i], filename, AVIO_FLAG_WRITE) < 0) {
+             if (avio_open2(&pb[i], filename, AVIO_FLAG_WRITE,
+                            &s->interrupt_callback, NULL) < 0) {
                  av_log(s, AV_LOG_ERROR, "Could not open file : %s\n",filename);
                  return AVERROR(EIO);
              }
Simple merge
Simple merge
Simple merge
@@@ -1837,7 -1770,8 +1837,8 @@@ static void mov_build_index(MOVContext 
      }
  }
  
- static int mov_open_dref(AVIOContext **pb, const char *src, MOVDref *ref)
 -static int mov_open_dref(AVIOContext **pb, char *src, MOVDref *ref,
++static int mov_open_dref(AVIOContext **pb, const char *src, MOVDref *ref,
+                          AVIOInterruptCB *int_cb)
  {
      /* try relative path, we do not try the absolute because it can leak information about our
         system to an attacker */
@@@ -49,19 -54,25 +54,29 @@@ static const AVClass *format_child_clas
      AVOutputFormat *ofmt = NULL;
  
      while (prev && (ifmt = av_iformat_next(ifmt)))
--        if (ifmt->priv_class == prev)
++        if (ifmt->priv_class == prev){
++            prev = NULL;
              break;
--    if ((prev && ifmt) || (!prev))
++        }
++    if (!prev)
          while (ifmt = av_iformat_next(ifmt))
              if (ifmt->priv_class)
                  return ifmt->priv_class;
  
      while (prev && (ofmt = av_oformat_next(ofmt)))
--        if (ofmt->priv_class == prev)
++        if (ofmt->priv_class == prev){
++            prev = NULL;
              break;
-     while (ofmt = av_oformat_next(ofmt))
-         if (ofmt->priv_class)
-             return ofmt->priv_class;
 -    if ((prev && ofmt) || (!prev))
++        }
++    if (!prev)
+         while (ofmt = av_oformat_next(ofmt))
+             if (ofmt->priv_class)
+                 return ofmt->priv_class;
+ #if !FF_API_OLD_AVIO
+     if (prev != &ffio_url_class)
+         return &ffio_url_class;
+ #endif
  
      return NULL;
  }
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge