OSDN Git Service

Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 19 Jun 2011 02:02:06 +0000 (04:02 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 19 Jun 2011 02:02:06 +0000 (04:02 +0200)
* qatar/master:
  lavf: prevent crash in av_open_input_file() if ap == NULL.
  more Changelog additions
  lavf: add a forgotten NULL check in convert_format_parameters().
  Fix build if yasm is not available.
  H.264: Add x86 assembly for 10-bit MC Chroma H.264 functions.

Conflicts:
Changelog

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
Changelog
libavcodec/x86/Makefile
libavcodec/x86/dsputil_mmx.c
libavformat/utils.c

diff --combined Changelog
+++ b/Changelog
@@@ -2,33 -2,27 +2,37 @@@ Entries are sorted chronologically fro
  releases are sorted from youngest to oldest.
  
  
- version <next>:
+ version 0.7:
  
 +- many many things we forgot because we rather write code than changelogs
 +- libmpcodecs video filter support (3 times as many filters than before)
 +- mpeg2 aspect ratio dection fixed
 +- libxvid aspect pickiness fixed
 +- Frame multithreaded decoding
  - E-AC-3 audio encoder
  - ac3enc: add channel coupling support
  - floating-point sample format support to the ac3, eac3, dca, aac, and vorbis decoders.
  - H264/MPEG frame-level multi-threading
  - All av_metadata_* functions renamed to av_dict_* and moved to libavutil
+ - 4:4:4 H.264 decoding support
+ - 10-bit H.264 optimizations for x86
  
  
  version 0.7_beta2:
  
+ - VP8 frame-multithreading
+ - NEON optimizations for VP8
  - Lots of deprecated API cruft removed
  - fft and imdct optimizations for AVX (Sandy Bridge) processors
 +- showinfo filter added
  - DPX image encoder
  - SMPTE 302M AES3 audio decoder
 -- Remove support for quitting ffmpeg with 'q', ctrl+c should be used.
 +- Apple Core Audio Format muxer
- - 9bit and 10bit H.264 decoding
+ - 9bit and 10bit per sample support in the H.264 decoder
 +- 9bit and 10bit FFV1 encoding / decoding
 +- split filter added
 +- select filter added
 +- sdl output device added
  
  
  version 0.7_beta1:
@@@ -51,7 -45,6 +55,7 @@@
  - RTP depacketization of QDM2
  - ANSI/ASCII art playback system
  - Lego Mindstorms RSO de/muxer
 +- libavcore added
  - SubRip subtitle file muxer and demuxer
  - Chinese AVS encoding via libxavs
  - ffprobe -show_packets option added
  - replace the ocv_smooth filter with a more generic ocv filter
  - Windows Televison (WTV) demuxer
  - FFmpeg metadata format muxer and demuxer
 -- SubRip (srt) subtitle decoder
 +- SubRip (srt) subtitle encoder and decoder
  - floating-point AC-3 encoder added
  - Lagarith decoder
  - ffmpeg -copytb option added
  - sndio support for playback and record
  - Linux framebuffer input device added
  - Chronomaster DFA decoder
 -- Mobotix MxPEG decoder
 +- DPX image encoder
 +- MicroDVD subtitle file muxer and demuxer
 +- Playstation Portable PMP format demuxer
 +- fieldorder video filter added
  - AAC encoding via libvo-aacenc
  - AMR-WB encoding via libvo-amrwbenc
  - xWMA demuxer
 -- fieldorder video filter added
 +- Mobotix MxPEG decoder
  
  
  version 0.6:
@@@ -359,7 -349,6 +363,7 @@@ version 0.5
  - Gopher client support
  - MXF D-10 muxer
  - generic metadata API
 +- flash ScreenVideo2 encoder
  
  
  version 0.4.9-pre1:
diff --combined libavcodec/x86/Makefile
@@@ -26,7 -26,6 +26,7 @@@ MMX-OBJS-$(CONFIG_AC3DSP)              
  YASM-OBJS-$(CONFIG_AC3DSP)             += x86/ac3dsp.o
  MMX-OBJS-$(CONFIG_CAVS_DECODER)        += x86/cavsdsp_mmx.o
  MMX-OBJS-$(CONFIG_MPEGAUDIODSP)        += x86/mpegaudiodec_mmx.o
 +MMX-OBJS-$(CONFIG_PNG_DECODER)         += x86/png_mmx.o
  MMX-OBJS-$(CONFIG_ENCODERS)            += x86/dsputilenc_mmx.o
  YASM-OBJS-$(CONFIG_ENCODERS)           += x86/dsputilenc_yasm.o
  MMX-OBJS-$(CONFIG_GPL)                 += x86/idct_mmx.o
@@@ -45,6 -44,7 +45,7 @@@ MMX-OBJS-$(HAVE_YASM)                  
                                            x86/deinterlace.o             \
                                            x86/fmtconvert.o              \
                                            x86/h264_chromamc.o           \
+                                           x86/h264_chromamc_10bit.o     \
                                            $(YASM-OBJS-yes)
  
  MMX-OBJS-$(CONFIG_FFT)                 += x86/fft.o
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2000, 2001 Fabrice Bellard
   * Copyright (c) 2002-2004 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
   *
   * MMX optimization by Nick Kurshev <nickols_k@mail.ru>
@@@ -580,6 -580,28 +580,6 @@@ static void add_bytes_mmx(uint8_t *dst
          dst[i+0] += src[i+0];
  }
  
 -static void add_bytes_l2_mmx(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){
 -    x86_reg i=0;
 -    __asm__ volatile(
 -        "jmp 2f                         \n\t"
 -        "1:                             \n\t"
 -        "movq   (%2, %0), %%mm0         \n\t"
 -        "movq  8(%2, %0), %%mm1         \n\t"
 -        "paddb  (%3, %0), %%mm0         \n\t"
 -        "paddb 8(%3, %0), %%mm1         \n\t"
 -        "movq %%mm0,  (%1, %0)          \n\t"
 -        "movq %%mm1, 8(%1, %0)          \n\t"
 -        "add $16, %0                    \n\t"
 -        "2:                             \n\t"
 -        "cmp %4, %0                     \n\t"
 -        " js 1b                         \n\t"
 -        : "+r" (i)
 -        : "r"(dst), "r"(src1), "r"(src2), "r"((x86_reg)w-15)
 -    );
 -    for(; i<w; i++)
 -        dst[i] = src1[i] + src2[i];
 -}
 -
  #if HAVE_7REGS && HAVE_TEN_OPERANDS
  static void add_hfyu_median_prediction_cmov(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top) {
      x86_reg w2 = -w;
@@@ -855,6 -877,80 +855,6 @@@ static void draw_edges_mmx(uint8_t *buf
      }
  }
  
 -#define PAETH(cpu, abs3)\
 -static void add_png_paeth_prediction_##cpu(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp)\
 -{\
 -    x86_reg i = -bpp;\
 -    x86_reg end = w-3;\
 -    __asm__ volatile(\
 -        "pxor      %%mm7, %%mm7 \n"\
 -        "movd    (%1,%0), %%mm0 \n"\
 -        "movd    (%2,%0), %%mm1 \n"\
 -        "punpcklbw %%mm7, %%mm0 \n"\
 -        "punpcklbw %%mm7, %%mm1 \n"\
 -        "add       %4, %0 \n"\
 -        "1: \n"\
 -        "movq      %%mm1, %%mm2 \n"\
 -        "movd    (%2,%0), %%mm1 \n"\
 -        "movq      %%mm2, %%mm3 \n"\
 -        "punpcklbw %%mm7, %%mm1 \n"\
 -        "movq      %%mm2, %%mm4 \n"\
 -        "psubw     %%mm1, %%mm3 \n"\
 -        "psubw     %%mm0, %%mm4 \n"\
 -        "movq      %%mm3, %%mm5 \n"\
 -        "paddw     %%mm4, %%mm5 \n"\
 -        abs3\
 -        "movq      %%mm4, %%mm6 \n"\
 -        "pminsw    %%mm5, %%mm6 \n"\
 -        "pcmpgtw   %%mm6, %%mm3 \n"\
 -        "pcmpgtw   %%mm5, %%mm4 \n"\
 -        "movq      %%mm4, %%mm6 \n"\
 -        "pand      %%mm3, %%mm4 \n"\
 -        "pandn     %%mm3, %%mm6 \n"\
 -        "pandn     %%mm0, %%mm3 \n"\
 -        "movd    (%3,%0), %%mm0 \n"\
 -        "pand      %%mm1, %%mm6 \n"\
 -        "pand      %%mm4, %%mm2 \n"\
 -        "punpcklbw %%mm7, %%mm0 \n"\
 -        "movq      %6,    %%mm5 \n"\
 -        "paddw     %%mm6, %%mm0 \n"\
 -        "paddw     %%mm2, %%mm3 \n"\
 -        "paddw     %%mm3, %%mm0 \n"\
 -        "pand      %%mm5, %%mm0 \n"\
 -        "movq      %%mm0, %%mm3 \n"\
 -        "packuswb  %%mm3, %%mm3 \n"\
 -        "movd      %%mm3, (%1,%0) \n"\
 -        "add       %4, %0 \n"\
 -        "cmp       %5, %0 \n"\
 -        "jle 1b \n"\
 -        :"+r"(i)\
 -        :"r"(dst), "r"(top), "r"(src), "r"((x86_reg)bpp), "g"(end),\
 -         "m"(ff_pw_255)\
 -        :"memory"\
 -    );\
 -}
 -
 -#define ABS3_MMX2\
 -        "psubw     %%mm5, %%mm7 \n"\
 -        "pmaxsw    %%mm7, %%mm5 \n"\
 -        "pxor      %%mm6, %%mm6 \n"\
 -        "pxor      %%mm7, %%mm7 \n"\
 -        "psubw     %%mm3, %%mm6 \n"\
 -        "psubw     %%mm4, %%mm7 \n"\
 -        "pmaxsw    %%mm6, %%mm3 \n"\
 -        "pmaxsw    %%mm7, %%mm4 \n"\
 -        "pxor      %%mm7, %%mm7 \n"
 -
 -#define ABS3_SSSE3\
 -        "pabsw     %%mm3, %%mm3 \n"\
 -        "pabsw     %%mm4, %%mm4 \n"\
 -        "pabsw     %%mm5, %%mm5 \n"
 -
 -PAETH(mmx2, ABS3_MMX2)
 -#if HAVE_SSSE3
 -PAETH(ssse3, ABS3_SSSE3)
 -#endif
 -
  #define QPEL_V_LOW(m3,m4,m5,m6, pw_20, pw_3, rnd, in0, in1, in2, in7, out, OP)\
          "paddw " #m4 ", " #m3 "           \n\t" /* x1 */\
          "movq "MANGLE(ff_pw_20)", %%mm4   \n\t" /* 20 */\
@@@ -1842,6 -1938,19 +1842,19 @@@ void ff_avg_h264_chroma_mc8_ssse3_rnd (
  void ff_avg_h264_chroma_mc4_ssse3     (uint8_t *dst, uint8_t *src,
                                         int stride, int h, int x, int y);
  
+ #define CHROMA_MC(OP, NUM, DEPTH, OPT) \
+ void ff_ ## OP ## _h264_chroma_mc ## NUM ## _ ## DEPTH ## _ ## OPT \
+                                       (uint8_t *dst, uint8_t *src,\
+                                        int stride, int h, int x, int y);
+ CHROMA_MC(put, 2, 10, mmxext)
+ CHROMA_MC(avg, 2, 10, mmxext)
+ CHROMA_MC(put, 4, 10, mmxext)
+ CHROMA_MC(avg, 4, 10, mmxext)
+ CHROMA_MC(put, 8, 10, sse2)
+ CHROMA_MC(avg, 8, 10, sse2)
+ CHROMA_MC(put, 8, 10, avx)
+ CHROMA_MC(avg, 8, 10, avx)
  
  /* CAVS specific */
  void ff_put_cavs_qpel8_mc00_mmx2(uint8_t *dst, uint8_t *src, int stride) {
@@@ -2324,6 -2433,7 +2337,7 @@@ void dsputil_init_mmx(DSPContext* c, AV
  {
      int mm_flags = av_get_cpu_flags();
      const int high_bit_depth = avctx->codec_id == CODEC_ID_H264 && avctx->bits_per_raw_sample > 8;
+     const int bit_depth = avctx->bits_per_raw_sample;
  
      if (avctx->dsp_mask) {
          if (avctx->dsp_mask & AV_CPU_FLAG_FORCE)
  #endif
  
          c->add_bytes= add_bytes_mmx;
 -        c->add_bytes_l2= add_bytes_l2_mmx;
  
          if (!high_bit_depth)
          c->draw_edges = draw_edges_mmx;
              c->avg_h264_chroma_pixels_tab[2]= ff_avg_h264_chroma_mc2_mmx2;
              c->put_h264_chroma_pixels_tab[2]= ff_put_h264_chroma_mc2_mmx2;
              }
+             if (bit_depth == 10) {
+                 c->put_h264_chroma_pixels_tab[2]= ff_put_h264_chroma_mc2_10_mmxext;
+                 c->avg_h264_chroma_pixels_tab[2]= ff_avg_h264_chroma_mc2_10_mmxext;
+                 c->put_h264_chroma_pixels_tab[1]= ff_put_h264_chroma_mc4_10_mmxext;
+                 c->avg_h264_chroma_pixels_tab[1]= ff_avg_h264_chroma_mc4_10_mmxext;
+             }
  
              c->add_hfyu_median_prediction = ff_add_hfyu_median_prediction_mmx2;
  #endif
                  c->add_hfyu_median_prediction = add_hfyu_median_prediction_cmov;
  #endif
  
 -            c->add_png_paeth_prediction= add_png_paeth_prediction_mmx2;
          } else if (mm_flags & AV_CPU_FLAG_3DNOW) {
              c->prefetch = prefetch_3dnow;
  
              H264_QPEL_FUNCS(3, 2, sse2);
              H264_QPEL_FUNCS(3, 3, sse2);
              }
+ #if HAVE_YASM
+             if (bit_depth == 10) {
+                 c->put_h264_chroma_pixels_tab[0]= ff_put_h264_chroma_mc8_10_sse2;
+                 c->avg_h264_chroma_pixels_tab[0]= ff_avg_h264_chroma_mc8_10_sse2;
+             }
+ #endif
          }
  #if HAVE_SSSE3
          if(mm_flags & AV_CPU_FLAG_SSSE3){
              H264_QPEL_FUNCS(3, 2, ssse3);
              H264_QPEL_FUNCS(3, 3, ssse3);
              }
 -            c->add_png_paeth_prediction= add_png_paeth_prediction_ssse3;
  #if HAVE_YASM
              if (!high_bit_depth) {
              c->put_h264_chroma_pixels_tab[0]= ff_put_h264_chroma_mc8_ssse3_rnd;
              }
  #endif
          }
+ #if HAVE_AVX && HAVE_YASM
+         if (mm_flags & AV_CPU_FLAG_AVX) {
+             if (bit_depth == 10) {
+                 c->put_h264_chroma_pixels_tab[0]= ff_put_h264_chroma_mc8_10_avx;
+                 c->avg_h264_chroma_pixels_tab[0]= ff_avg_h264_chroma_mc8_10_avx;
+             }
+         }
+ #endif
      }
  
      if (CONFIG_ENCODERS)
diff --combined libavformat/utils.c
@@@ -1,21 -1,21 +1,21 @@@
  /*
 - * various utility functions for use within Libav
 + * various utility functions for use within FFmpeg
   * 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
   */
  
@@@ -25,7 -25,6 +25,7 @@@
  #include "avio_internal.h"
  #include "internal.h"
  #include "libavcodec/internal.h"
 +#include "libavcodec/raw.h"
  #include "libavutil/opt.h"
  #include "libavutil/dict.h"
  #include "libavutil/pixdesc.h"
@@@ -48,7 -47,7 +48,7 @@@
  
  /**
   * @file
 - * various utility functions for use within Libav
 + * various utility functions for use within FFmpeg
   */
  
  unsigned avformat_version(void)
  
  const char *avformat_configuration(void)
  {
 -    return LIBAV_CONFIGURATION;
 +    return FFMPEG_CONFIGURATION;
  }
  
  const char *avformat_license(void)
  {
  #define LICENSE_PREFIX "libavformat license: "
 -    return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
 +    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
  }
  
  /* fraction handling */
@@@ -304,11 -303,11 +304,11 @@@ int av_filename_number_test(const char 
      return filename && (av_get_frame_filename(buf, sizeof(buf), filename, 1)>=0);
  }
  
 -AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
 +AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened, int *score_ret)
  {
      AVProbeData lpd = *pd;
      AVInputFormat *fmt1 = NULL, *fmt;
 -    int score, id3 = 0;
 +    int score, score_max=0;
  
      if (lpd.buf_size > 10 && ff_id3v2_match(lpd.buf, ID3v2_DEFAULT_MAGIC)) {
          int id3len = ff_id3v2_tag_len(lpd.buf);
              lpd.buf += id3len;
              lpd.buf_size -= id3len;
          }
 -        id3 = 1;
      }
  
      fmt = NULL;
          score = 0;
          if (fmt1->read_probe) {
              score = fmt1->read_probe(&lpd);
 +            if(!score && fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions))
 +                score = 1;
          } else if (fmt1->extensions) {
              if (av_match_ext(lpd.filename, fmt1->extensions)) {
                  score = 50;
              }
          }
 -        if (score > *score_max) {
 -            *score_max = score;
 +        if (score > score_max) {
 +            score_max = score;
              fmt = fmt1;
 -        }else if (score == *score_max)
 +        }else if (score == score_max)
              fmt = NULL;
      }
 -
 -    /* a hack for files with huge id3v2 tags -- try to guess by file extension. */
 -    if (!fmt && id3 && *score_max < AVPROBE_SCORE_MAX/4) {
 -        while ((fmt = av_iformat_next(fmt)))
 -            if (fmt->extensions && av_match_ext(lpd.filename, fmt->extensions)) {
 -                *score_max = AVPROBE_SCORE_MAX/4;
 -                break;
 -            }
 -    }
 -
 +    *score_ret= score_max;
      return fmt;
  }
  
 +AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)
 +{
 +    int score_ret;
 +    AVInputFormat *fmt= av_probe_input_format3(pd, is_opened, &score_ret);
 +    if(score_ret > *score_max){
 +        *score_max= score_ret;
 +        return fmt;
 +    }else
 +        return NULL;
 +}
 +
  AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened){
      int score=0;
      return av_probe_input_format2(pd, is_opened, &score);
  }
  
 -static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd, int score)
 +static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st, AVProbeData *pd)
  {
      static const struct {
          const char *name; enum CodecID id; enum AVMediaType type;
          { "mpegvideo", CODEC_ID_MPEG2VIDEO, AVMEDIA_TYPE_VIDEO },
          { 0 }
      };
 -    AVInputFormat *fmt = av_probe_input_format2(pd, 1, &score);
 +    int score;
 +    AVInputFormat *fmt = av_probe_input_format3(pd, 1, &score);
  
      if (fmt) {
          int i;
              }
          }
      }
 -    return !!fmt;
 +    return score;
  }
  
  /************************************************************/
@@@ -400,6 -395,9 +400,9 @@@ static AVDictionary *convert_format_par
      char buf[1024];
      AVDictionary *opts = NULL;
  
+     if (!ap)
+         return NULL;
      if (ap->time_base.num) {
          snprintf(buf, sizeof(buf), "%d/%d", ap->time_base.den, ap->time_base.num);
          av_dict_set(&opts, "framerate", buf, 0);
@@@ -471,22 -469,6 +474,22 @@@ fail
  }
  #endif
  
 +int av_demuxer_open(AVFormatContext *ic, AVFormatParameters *ap){
 +    int err;
 +
 +    if (ic->iformat->read_header) {
 +        err = ic->iformat->read_header(ic, ap);
 +        if (err < 0)
 +            return err;
 +    }
 +
 +    if (ic->pb && !ic->data_offset)
 +        ic->data_offset = avio_tell(ic->pb);
 +
 +    return 0;
 +}
 +
 +
  /** size of probe buffer, for guessing file type from file contents */
  #define PROBE_BUF_MIN 2048
  #define PROBE_BUF_MAX (1<<20)
@@@ -540,9 -522,9 +543,9 @@@ int av_probe_input_buffer(AVIOContext *
          *fmt = av_probe_input_format2(&pd, 1, &score);
          if(*fmt){
              if(score <= AVPROBE_SCORE_MAX/4){ //this can only be true in the last iteration
 -                av_log(logctx, AV_LOG_WARNING, "Format detected only with low score of %d, misdetection possible!\n", score);
 +                av_log(logctx, AV_LOG_WARNING, "Format %s detected only with low score of %d, misdetection possible!\n", (*fmt)->name, score);
              }else
 -                av_log(logctx, AV_LOG_DEBUG, "Probed with size=%d and score=%d\n", probe_size, score);
 +                av_log(logctx, AV_LOG_DEBUG, "Format %s probed with size=%d and score=%d\n", (*fmt)->name, probe_size, score);
          }
      }
  
@@@ -567,7 -549,7 +570,7 @@@ int av_open_input_file(AVFormatContext 
      int err;
      AVDictionary *opts = convert_format_parameters(ap);
  
-     if (!ap->prealloced_context)
+     if (!ap || !ap->prealloced_context)
          *ic_ptr = NULL;
  
      err = avformat_open_input(ic_ptr, filename, fmt, &opts);
@@@ -653,11 -635,11 +656,11 @@@ int avformat_open_input(AVFormatContex
      if (s->pb)
          ff_id3v2_read(s, ID3v2_DEFAULT_MAGIC);
  
 -    if (s->iformat->read_header)
 +    if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->iformat->read_header)
          if ((ret = s->iformat->read_header(s, &ap)) < 0)
              goto fail;
  
 -    if (s->pb && !s->data_offset)
 +    if (!(s->flags&AVFMT_FLAG_PRIV_OPT) && s->pb && !s->data_offset)
          s->data_offset = avio_tell(s->pb);
  
      s->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE;
@@@ -707,7 -689,12 +710,7 @@@ int av_read_packet(AVFormatContext *s, 
  
          if (pktl) {
              *pkt = pktl->pkt;
 -            if(s->streams[pkt->stream_index]->codec->codec_id != CODEC_ID_PROBE ||
 -               !s->streams[pkt->stream_index]->probe_packets ||
 -               s->raw_packet_buffer_remaining_size < pkt->size){
 -                AVProbeData *pd = &s->streams[pkt->stream_index]->probe_data;
 -                av_freep(&pd->buf);
 -                pd->buf_size = 0;
 +            if(s->streams[pkt->stream_index]->request_probe <= 0){
                  s->raw_packet_buffer = pktl->next;
                  s->raw_packet_buffer_remaining_size += pkt->size;
                  av_free(pktl);
              if (!pktl || ret == AVERROR(EAGAIN))
                  return ret;
              for (i = 0; i < s->nb_streams; i++)
 -                s->streams[i]->probe_packets = 0;
 +                if(s->streams[i]->request_probe > 0)
 +                    s->streams[i]->request_probe = -1;
              continue;
          }
 +
 +        if(!(s->flags & AVFMT_FLAG_KEEP_SIDE_DATA))
 +            av_packet_merge_side_data(pkt);
          st= s->streams[pkt->stream_index];
  
          switch(st->codec->codec_type){
              break;
          }
  
 -        if(!pktl && (st->codec->codec_id != CODEC_ID_PROBE ||
 -                     !st->probe_packets))
 +        if(!pktl && st->request_probe <= 0)
              return ret;
  
          add_to_pktbuf(&s->raw_packet_buffer, pkt, &s->raw_packet_buffer_end);
          s->raw_packet_buffer_remaining_size -= pkt->size;
  
 -        if(st->codec->codec_id == CODEC_ID_PROBE){
 +        if(st->request_probe>0){
              AVProbeData *pd = &st->probe_data;
 -            av_log(s, AV_LOG_DEBUG, "probing stream %d\n", st->index);
 +            int end;
 +            av_log(s, AV_LOG_DEBUG, "probing stream %d pp:%d\n", st->index, st->probe_packets);
              --st->probe_packets;
  
              pd->buf = av_realloc(pd->buf, pd->buf_size+pkt->size+AVPROBE_PADDING_SIZE);
              pd->buf_size += pkt->size;
              memset(pd->buf+pd->buf_size, 0, AVPROBE_PADDING_SIZE);
  
 -            if(av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
 -                //FIXME we dont reduce score to 0 for the case of running out of buffer space in bytes
 -                set_codec_from_probe_data(s, st, pd, st->probe_packets > 0 ? AVPROBE_SCORE_MAX/4 : 0);
 -                if(st->codec->codec_id != CODEC_ID_PROBE){
 +            end=    s->raw_packet_buffer_remaining_size <= 0
 +                 || st->probe_packets<=0;
 +
 +            if(end || av_log2(pd->buf_size) != av_log2(pd->buf_size - pkt->size)){
 +                int score= set_codec_from_probe_data(s, st, pd);
 +                if(    (st->codec->codec_id != CODEC_ID_NONE && score > AVPROBE_SCORE_MAX/4)
 +                    || end){
                      pd->buf_size=0;
                      av_freep(&pd->buf);
 +                    st->request_probe= -1;
 +                    if(st->codec->codec_id != CODEC_ID_NONE){
                      av_log(s, AV_LOG_DEBUG, "probed stream %d\n", st->index);
 +                    }else
 +                        av_log(s, AV_LOG_WARNING, "probed stream %d failed\n", st->index);
                  }
              }
          }
@@@ -1158,9 -1134,8 +1161,9 @@@ static int av_read_frame_internal(AVFor
                      compute_pkt_fields(s, st, st->parser, pkt);
  
                      if((s->iformat->flags & AVFMT_GENERIC_INDEX) && pkt->flags & AV_PKT_FLAG_KEY){
 +                        int64_t pos= (st->parser->flags & PARSER_FLAG_COMPLETE_FRAMES) ? pkt->pos : st->parser->frame_offset;
                          ff_reduce_index(s, st->index);
 -                        av_add_index_entry(st, st->parser->frame_offset, pkt->dts,
 +                        av_add_index_entry(st, pos, pkt->dts,
                                             0, 0, AVINDEX_KEYFRAME);
                      }
  
@@@ -1838,23 -1813,18 +1841,23 @@@ static int av_has_duration(AVFormatCont
   */
  static void av_update_stream_timings(AVFormatContext *ic)
  {
 -    int64_t start_time, start_time1, end_time, end_time1;
 +    int64_t start_time, start_time1, start_time_text, end_time, end_time1;
      int64_t duration, duration1;
      int i;
      AVStream *st;
  
      start_time = INT64_MAX;
 +    start_time_text = INT64_MAX;
      end_time = INT64_MIN;
      duration = INT64_MIN;
      for(i = 0;i < ic->nb_streams; i++) {
          st = ic->streams[i];
          if (st->start_time != AV_NOPTS_VALUE && st->time_base.den) {
              start_time1= av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q);
 +            if (st->codec->codec_id == CODEC_ID_DVB_TELETEXT) {
 +                if (start_time1 < start_time_text)
 +                    start_time_text = start_time1;
 +            } else
              if (start_time1 < start_time)
                  start_time = start_time1;
              if (st->duration != AV_NOPTS_VALUE) {
                  duration = duration1;
          }
      }
 +    if (start_time == INT64_MAX || (start_time > start_time_text && start_time - start_time_text < AV_TIME_BASE))
 +        start_time = start_time_text;
      if (start_time != INT64_MAX) {
          ic->start_time = start_time;
          if (end_time != INT64_MIN) {
@@@ -2052,22 -2020,20 +2055,22 @@@ static void av_estimate_timings(AVForma
      }
      av_update_stream_timings(ic);
  
 +#if 0
      {
          int i;
          AVStream av_unused *st;
          for(i = 0;i < ic->nb_streams; i++) {
              st = ic->streams[i];
 -            av_dlog(ic, "%d: start_time: %0.3f duration: %0.3f\n", i,
 -                    (double) st->start_time / AV_TIME_BASE,
 -                    (double) st->duration   / AV_TIME_BASE);
 +        printf("%d: start_time: %0.3f duration: %0.3f\n",
 +               i, (double)st->start_time / AV_TIME_BASE,
 +               (double)st->duration / AV_TIME_BASE);
          }
 -        av_dlog(ic, "stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
 -                (double) ic->start_time / AV_TIME_BASE,
 -                (double) ic->duration   / AV_TIME_BASE,
 -                ic->bit_rate / 1000);
 +        printf("stream: start_time: %0.3f duration: %0.3f bitrate=%d kb/s\n",
 +               (double)ic->start_time / AV_TIME_BASE,
 +               (double)ic->duration / AV_TIME_BASE,
 +               ic->bit_rate / 1000);
      }
 +#endif
  }
  
  static int has_codec_parameters(AVCodecContext *enc)
              enc->codec_id == CODEC_ID_MP1 ||
              enc->codec_id == CODEC_ID_MP2 ||
              enc->codec_id == CODEC_ID_MP3 ||
 -            enc->codec_id == CODEC_ID_SPEEX))
 +            enc->codec_id == CODEC_ID_SPEEX ||
 +            enc->codec_id == CODEC_ID_CELT))
              return 0;
          break;
      case AVMEDIA_TYPE_VIDEO:
@@@ -2368,9 -2333,8 +2371,9 @@@ int av_find_stream_info(AVFormatContex
  
          st = ic->streams[pkt->stream_index];
          if (st->codec_info_nb_frames>1) {
 -            if (st->time_base.den > 0 && av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q) >= ic->max_analyze_duration) {
 -                av_log(ic, AV_LOG_WARNING, "max_analyze_duration reached\n");
 +            int64_t t;
 +            if (st->time_base.den > 0 && (t=av_rescale_q(st->info->codec_info_duration, st->time_base, AV_TIME_BASE_Q)) >= ic->max_analyze_duration) {
 +                av_log(ic, AV_LOG_WARNING, "max_analyze_duration %d reached at %"PRId64"\n", ic->max_analyze_duration, t);
                  break;
              }
              st->info->codec_info_duration += pkt->duration;
                       (st->codec_info_nb_frames-2)*(int64_t)st->time_base.den,
                        st->info->codec_info_duration*(int64_t)st->time_base.num, 60000);
          if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 -            if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample)
 -                st->codec->codec_tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
 +            if(st->codec->codec_id == CODEC_ID_RAWVIDEO && !st->codec->codec_tag && !st->codec->bits_per_coded_sample){
 +                uint32_t tag= avcodec_pix_fmt_to_codec_tag(st->codec->pix_fmt);
 +                if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)
 +                    st->codec->codec_tag= tag;
 +            }
  
              // the check for tb_unreliable() is not completely correct, since this is not about handling
              // a unreliable/inexact time base, but a time base that is finer than necessary, as e.g.
              // ipmovie.c produces.
 -            if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > 1 && !st->r_frame_rate.num)
 +            if (tb_unreliable(st->codec) && st->info->duration_count > 15 && st->info->duration_gcd > FFMAX(1, st->time_base.den/(500LL*st->time_base.num)) && !st->r_frame_rate.num)
                  av_reduce(&st->r_frame_rate.num, &st->r_frame_rate.den, st->time_base.den, st->time_base.num * st->info->duration_gcd, INT_MAX);
              if (st->info->duration_count && !st->r_frame_rate.num
                 && tb_unreliable(st->codec) /*&&
@@@ -2778,6 -2739,8 +2781,6 @@@ AVChapter *ff_new_chapter(AVFormatConte
  #if FF_API_FORMAT_PARAMETERS
  int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap)
  {
 -    int ret;
 -
      if (s->oformat->priv_data_size > 0) {
          s->priv_data = av_mallocz(s->oformat->priv_data_size);
          if (!s->priv_data)
      } else
          s->priv_data = NULL;
  
 -    if (s->oformat->set_parameters) {
 -        ret = s->oformat->set_parameters(s, ap);
 -        if (ret < 0)
 -            return ret;
 +    return 0;
 +}
 +#endif
 +
 +int avformat_alloc_output_context2(AVFormatContext **avctx, AVOutputFormat *oformat,
 +                                   const char *format, const char *filename)
 +{
 +    AVFormatContext *s = avformat_alloc_context();
 +    int ret = 0;
 +
 +    *avctx = NULL;
 +    if (!s)
 +        goto nomem;
 +
 +    if (!oformat) {
 +        if (format) {
 +            oformat = av_guess_format(format, NULL, NULL);
 +            if (!oformat) {
 +                av_log(s, AV_LOG_ERROR, "Requested output format '%s' is not a suitable output format\n", format);
 +                ret = AVERROR(EINVAL);
 +                goto error;
 +            }
 +        } else {
 +            oformat = av_guess_format(NULL, filename, NULL);
 +            if (!oformat) {
 +                ret = AVERROR(EINVAL);
 +                av_log(s, AV_LOG_ERROR, "Unable to find a suitable output format for '%s'\n",
 +                       filename);
 +                goto error;
 +            }
 +        }
      }
 +
 +    s->oformat = oformat;
 +    if (s->oformat->priv_data_size > 0) {
 +        s->priv_data = av_mallocz(s->oformat->priv_data_size);
 +        if (!s->priv_data)
 +            goto nomem;
 +        if (s->oformat->priv_class) {
 +            *(const AVClass**)s->priv_data= s->oformat->priv_class;
 +            av_opt_set_defaults(s->priv_data);
 +        }
 +    } else
 +        s->priv_data = NULL;
 +
 +    if (filename)
 +        av_strlcpy(s->filename, filename, sizeof(s->filename));
 +    *avctx = s;
      return 0;
 +nomem:
 +    av_log(s, AV_LOG_ERROR, "Out of memory\n");
 +    ret = AVERROR(ENOMEM);
 +error:
 +    avformat_free_context(s);
 +    return ret;
 +}
 +
 +#if FF_API_ALLOC_OUTPUT_CONTEXT
 +AVFormatContext *avformat_alloc_output_context(const char *format,
 +                                               AVOutputFormat *oformat, const char *filename)
 +{
 +    AVFormatContext *avctx;
 +    int ret = avformat_alloc_output_context2(&avctx, oformat, format, filename);
 +    return ret < 0 ? NULL : avctx;
  }
  #endif
  
@@@ -3070,7 -2975,7 +3073,7 @@@ static int compute_pkt_fields2(AVFormat
          pkt->dts= st->pts_buffer[0];
      }
  
 -    if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && st->cur_dts >= pkt->dts){
 +    if(st->cur_dts && st->cur_dts != AV_NOPTS_VALUE && ((!(s->oformat->flags & AVFMT_TS_NONSTRICT) && st->cur_dts >= pkt->dts) || st->cur_dts > pkt->dts)){
          av_log(s, AV_LOG_ERROR,
                 "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %"PRId64" >= %"PRId64"\n",
                 st->index, st->cur_dts, pkt->dts);
@@@ -3114,8 -3019,6 +3117,8 @@@ int av_write_frame(AVFormatContext *s, 
          return ret;
  
      ret= s->oformat->write_packet(s, pkt);
 +    if(!ret)
 +        ret= url_ferror(s->pb);
      return ret;
  }
  
@@@ -3242,8 -3145,6 +3245,8 @@@ int av_interleaved_write_frame(AVFormat
  
          if(ret<0)
              return ret;
 +        if(url_ferror(s->pb))
 +            return url_ferror(s->pb);
      }
  }
  
@@@ -3265,15 -3166,11 +3268,15 @@@ int av_write_trailer(AVFormatContext *s
  
          if(ret<0)
              goto fail;
 +        if(url_ferror(s->pb))
 +            goto fail;
      }
  
      if(s->oformat->write_trailer)
          ret = s->oformat->write_trailer(s);
  fail:
 +    if(ret == 0)
 +       ret=url_ferror(s->pb);
      for(i=0;i<s->nb_streams;i++) {
          av_freep(&s->streams[i]->priv_data);
          av_freep(&s->streams[i]->index_entries);