OSDN Git Service

Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 11 Aug 2011 18:17:53 +0000 (20:17 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 11 Aug 2011 18:39:20 +0000 (20:39 +0200)
* qatar/master:
  ac3enc: add macros for option names to make them more understandable.
  ac3enc: fix 'channel_coupling' option to actually allow 'auto'.
  cavs: fix some crashes with invalid bitstreams
  ac3enc: clip coupling coordinates during calculation
  Remove incorrect info in documentation of AVCodecContext.bits_per_raw_sample.
  lavc: fix parentheses placement in avcodec_open2().

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/ac3enc.c
libavcodec/ac3enc.h
libavcodec/ac3enc_combined.c
libavcodec/avcodec.h
libavcodec/cavsdec.c

diff --combined libavcodec/ac3enc.c
@@@ -4,20 -4,20 +4,20 @@@
   * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com>
   * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de>
   *
 - * 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
   */
  
@@@ -1664,9 -1664,9 +1664,9 @@@ static void dprint_options(AC3EncodeCon
      if (opt->audio_production_info) {
          av_dlog(avctx, "mixing_level: %ddB\n", opt->mixing_level);
          switch (opt->room_type) {
-         case 0:  av_strlcpy(strbuf, "notindicated", 32); break;
-         case 1:  av_strlcpy(strbuf, "large", 32);        break;
-         case 2:  av_strlcpy(strbuf, "small", 32);        break;
+         case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break;
+         case AC3ENC_OPT_LARGE_ROOM:    av_strlcpy(strbuf, "large", 32);        break;
+         case AC3ENC_OPT_SMALL_ROOM:    av_strlcpy(strbuf, "small", 32);        break;
          default: snprintf(strbuf, 32, "ERROR (%d)", opt->room_type);
          }
          av_dlog(avctx, "room_type: %s\n", strbuf);
      av_dlog(avctx, "dialnorm: %ddB\n", opt->dialogue_level);
      if (s->channel_mode == AC3_CHMODE_STEREO) {
          switch (opt->dolby_surround_mode) {
-         case 0:  av_strlcpy(strbuf, "notindicated", 32); break;
-         case 1:  av_strlcpy(strbuf, "on", 32);           break;
-         case 2:  av_strlcpy(strbuf, "off", 32);          break;
+         case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break;
+         case AC3ENC_OPT_MODE_ON:       av_strlcpy(strbuf, "on", 32);           break;
+         case AC3ENC_OPT_MODE_OFF:      av_strlcpy(strbuf, "off", 32);          break;
          default: snprintf(strbuf, 32, "ERROR (%d)", opt->dolby_surround_mode);
          }
          av_dlog(avctx, "dsur_mode: %s\n", strbuf);
      if (s->bitstream_id == 6) {
          if (opt->extended_bsi_1) {
              switch (opt->preferred_stereo_downmix) {
-             case 0:  av_strlcpy(strbuf, "notindicated", 32); break;
-             case 1:  av_strlcpy(strbuf, "ltrt", 32);         break;
-             case 2:  av_strlcpy(strbuf, "loro", 32);         break;
+             case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break;
+             case AC3ENC_OPT_DOWNMIX_LTRT:  av_strlcpy(strbuf, "ltrt", 32);         break;
+             case AC3ENC_OPT_DOWNMIX_LORO:  av_strlcpy(strbuf, "loro", 32);         break;
              default: snprintf(strbuf, 32, "ERROR (%d)", opt->preferred_stereo_downmix);
              }
              av_dlog(avctx, "dmix_mode: %s\n", strbuf);
          }
          if (opt->extended_bsi_2) {
              switch (opt->dolby_surround_ex_mode) {
-             case 0:  av_strlcpy(strbuf, "notindicated", 32); break;
-             case 1:  av_strlcpy(strbuf, "on", 32);           break;
-             case 2:  av_strlcpy(strbuf, "off", 32);          break;
+             case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break;
+             case AC3ENC_OPT_MODE_ON:       av_strlcpy(strbuf, "on", 32);           break;
+             case AC3ENC_OPT_MODE_OFF:      av_strlcpy(strbuf, "off", 32);          break;
              default: snprintf(strbuf, 32, "ERROR (%d)", opt->dolby_surround_ex_mode);
              }
              av_dlog(avctx, "dsurex_mode: %s\n", strbuf);
              switch (opt->dolby_headphone_mode) {
-             case 0:  av_strlcpy(strbuf, "notindicated", 32); break;
-             case 1:  av_strlcpy(strbuf, "on", 32);           break;
-             case 2:  av_strlcpy(strbuf, "off", 32);          break;
+             case AC3ENC_OPT_NOT_INDICATED: av_strlcpy(strbuf, "notindicated", 32); break;
+             case AC3ENC_OPT_MODE_ON:       av_strlcpy(strbuf, "on", 32);           break;
+             case AC3ENC_OPT_MODE_OFF:      av_strlcpy(strbuf, "off", 32);          break;
              default: snprintf(strbuf, 32, "ERROR (%d)", opt->dolby_headphone_mode);
              }
              av_dlog(avctx, "dheadphone_mode: %s\n", strbuf);
  
              switch (opt->ad_converter_type) {
-             case 0:  av_strlcpy(strbuf, "standard", 32); break;
-             case 1:  av_strlcpy(strbuf, "hdcd", 32);     break;
+             case AC3ENC_OPT_ADCONV_STANDARD: av_strlcpy(strbuf, "standard", 32); break;
+             case AC3ENC_OPT_ADCONV_HDCD:     av_strlcpy(strbuf, "hdcd", 32);     break;
              default: snprintf(strbuf, 32, "ERROR (%d)", opt->ad_converter_type);
              }
              av_dlog(avctx, "ad_conv_type: %s\n", strbuf);
@@@ -1791,7 -1791,7 +1791,7 @@@ int ff_ac3_validate_metadata(AC3EncodeC
      opt->eac3_info_metadata    = 0;
  
      /* determine mixing metadata / xbsi1 use */
-     if (s->channel_mode > AC3_CHMODE_STEREO && opt->preferred_stereo_downmix >= 0) {
+     if (s->channel_mode > AC3_CHMODE_STEREO && opt->preferred_stereo_downmix != AC3ENC_OPT_NONE) {
          opt->extended_bsi_1       = 1;
          opt->eac3_mixing_metadata = 1;
      }
          /* determine info metadata use */
          if (avctx->audio_service_type != AV_AUDIO_SERVICE_TYPE_MAIN)
              opt->eac3_info_metadata = 1;
-         if (opt->copyright >= 0 || opt->original >= 0)
+         if (opt->copyright != AC3ENC_OPT_NONE || opt->original != AC3ENC_OPT_NONE)
              opt->eac3_info_metadata = 1;
          if (s->channel_mode == AC3_CHMODE_STEREO &&
-             (opt->dolby_headphone_mode >= 0 || opt->dolby_surround_mode >= 0))
+             (opt->dolby_headphone_mode != AC3ENC_OPT_NONE || opt->dolby_surround_mode != AC3ENC_OPT_NONE))
              opt->eac3_info_metadata = 1;
-         if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode >= 0)
+         if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode != AC3ENC_OPT_NONE)
              opt->eac3_info_metadata = 1;
-         if (opt->mixing_level >= 0 || opt->room_type >= 0 || opt->ad_converter_type >= 0) {
+         if (opt->mixing_level != AC3ENC_OPT_NONE || opt->room_type != AC3ENC_OPT_NONE ||
+             opt->ad_converter_type != AC3ENC_OPT_NONE) {
              opt->audio_production_info = 1;
              opt->eac3_info_metadata    = 1;
          }
      } else {
          /* determine audio production info use */
-         if (opt->mixing_level >= 0 || opt->room_type >= 0)
+         if (opt->mixing_level != AC3ENC_OPT_NONE || opt->room_type != AC3ENC_OPT_NONE)
              opt->audio_production_info = 1;
  
          /* determine xbsi2 use */
-         if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode >= 0)
+         if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode != AC3ENC_OPT_NONE)
              opt->extended_bsi_2 = 1;
-         if (s->channel_mode == AC3_CHMODE_STEREO && opt->dolby_headphone_mode >= 0)
+         if (s->channel_mode == AC3_CHMODE_STEREO && opt->dolby_headphone_mode != AC3ENC_OPT_NONE)
              opt->extended_bsi_2 = 1;
-         if (opt->ad_converter_type >= 0)
+         if (opt->ad_converter_type != AC3ENC_OPT_NONE)
              opt->extended_bsi_2 = 1;
      }
  
      /* validate extended bsi 1 / mixing metadata */
      if (opt->extended_bsi_1 || opt->eac3_mixing_metadata) {
          /* default preferred stereo downmix */
-         if (opt->preferred_stereo_downmix < 0)
-             opt->preferred_stereo_downmix = 0;
+         if (opt->preferred_stereo_downmix == AC3ENC_OPT_NONE)
+             opt->preferred_stereo_downmix = AC3ENC_OPT_NOT_INDICATED;
          if (!s->eac3 || s->has_center) {
              /* validate Lt/Rt center mix level */
              validate_mix_level(avctx, "ltrt_center_mix_level",
      /* validate extended bsi 2 / info metadata */
      if (opt->extended_bsi_2 || opt->eac3_info_metadata) {
          /* default dolby headphone mode */
-         if (opt->dolby_headphone_mode < 0)
-             opt->dolby_headphone_mode = 0;
+         if (opt->dolby_headphone_mode == AC3ENC_OPT_NONE)
+             opt->dolby_headphone_mode = AC3ENC_OPT_NOT_INDICATED;
          /* default dolby surround ex mode */
-         if (opt->dolby_surround_ex_mode < 0)
-             opt->dolby_surround_ex_mode = 0;
+         if (opt->dolby_surround_ex_mode == AC3ENC_OPT_NONE)
+             opt->dolby_surround_ex_mode = AC3ENC_OPT_NOT_INDICATED;
          /* default A/D converter type */
-         if (opt->ad_converter_type < 0)
-             opt->ad_converter_type = 0;
+         if (opt->ad_converter_type == AC3ENC_OPT_NONE)
+             opt->ad_converter_type = AC3ENC_OPT_ADCONV_STANDARD;
      }
  
      /* copyright & original defaults */
      if (!s->eac3 || opt->eac3_info_metadata) {
          /* default copyright */
-         if (opt->copyright < 0)
-             opt->copyright = 0;
+         if (opt->copyright == AC3ENC_OPT_NONE)
+             opt->copyright = AC3ENC_OPT_OFF;
          /* default original */
-         if (opt->original < 0)
-             opt->original = 1;
+         if (opt->original == AC3ENC_OPT_NONE)
+             opt->original = AC3ENC_OPT_ON;
      }
  
      /* dolby surround mode default */
      if (!s->eac3 || opt->eac3_info_metadata) {
-         if (opt->dolby_surround_mode < 0)
-             opt->dolby_surround_mode = 0;
+         if (opt->dolby_surround_mode == AC3ENC_OPT_NONE)
+             opt->dolby_surround_mode = AC3ENC_OPT_NOT_INDICATED;
      }
  
      /* validate audio production info */
      if (opt->audio_production_info) {
-         if (opt->mixing_level < 0) {
+         if (opt->mixing_level == AC3ENC_OPT_NONE) {
              av_log(avctx, AV_LOG_ERROR, "mixing_level must be set if "
                     "room_type is set\n");
              return AVERROR(EINVAL);
              return AVERROR(EINVAL);
          }
          /* default room type */
-         if (opt->room_type < 0)
-             opt->room_type = 0;
+         if (opt->room_type == AC3ENC_OPT_NONE)
+             opt->room_type = AC3ENC_OPT_NOT_INDICATED;
      }
  
      /* set bitstream id for alternate bitstream syntax */
@@@ -2207,12 -2208,16 +2208,16 @@@ static av_cold void set_bandwidth(AC3En
  
      /* initialize coupling strategy */
      if (s->cpl_enabled) {
-         if (s->options.cpl_start >= 0) {
+         if (s->options.cpl_start != AC3ENC_OPT_AUTO) {
              cpl_start = s->options.cpl_start;
          } else {
              cpl_start = ac3_coupling_start_tab[s->channel_mode-2][s->bit_alloc.sr_code][s->frame_size_code/2];
-             if (cpl_start < 0)
-                 s->cpl_enabled = 0;
+             if (cpl_start < 0) {
+                 if (s->options.channel_coupling == AC3ENC_OPT_AUTO)
+                     s->cpl_enabled = 0;
+                 else
+                     cpl_start = 15;
+             }
          }
      }
      if (s->cpl_enabled) {
diff --combined libavcodec/ac3enc.h
@@@ -65,8 -65,24 +65,25 @@@ typedef int32_t CoefType
  typedef int64_t CoefSumType;
  #endif
  
+ /* common option values */
+ #define AC3ENC_OPT_NONE            -1
+ #define AC3ENC_OPT_AUTO            -1
+ #define AC3ENC_OPT_OFF              0
+ #define AC3ENC_OPT_ON               1
+ #define AC3ENC_OPT_NOT_INDICATED    0
+ #define AC3ENC_OPT_MODE_ON          1
+ #define AC3ENC_OPT_MODE_OFF         2
+ /* specific option values */
+ #define AC3ENC_OPT_LARGE_ROOM       1
+ #define AC3ENC_OPT_SMALL_ROOM       2
+ #define AC3ENC_OPT_DOWNMIX_LTRT     1
+ #define AC3ENC_OPT_DOWNMIX_LORO     2
+ #define AC3ENC_OPT_ADCONV_STANDARD  0
+ #define AC3ENC_OPT_ADCONV_HDCD      1
  
 +#if 0
  /**
   * Encoding Options used by AVOption.
   */
@@@ -101,7 -117,7 +118,7 @@@ typedef struct AC3EncOptions 
      int channel_coupling;
      int cpl_start;
  } AC3EncOptions;
 -
 +#endif
  /**
   * Data for a single audio block.
   */
@@@ -240,6 -256,8 +257,6 @@@ typedef struct AC3EncodeContext 
  } AC3EncodeContext;
  
  
 -extern const int64_t ff_ac3_channel_layouts[19];
 -
  int ff_ac3_encode_init(AVCodecContext *avctx);
  
  int ff_ac3_encode_close(AVCodecContext *avctx);
index db832f1,0000000..a3f1d27
mode 100644,000000..100644
--- /dev/null
@@@ -1,100 -1,0 +1,118 @@@
 +
 +#include "libavutil/opt.h"
 +#include "libavutil/samplefmt.h"
 +#include "avcodec.h"
 +#include "ac3.h"
 +
 +typedef struct CombineContext{
 +    AVClass *av_class;                      ///< AVClass used for AVOption
 +    AC3EncOptions options;                  ///< encoding options
 +    void *ctx;
 +    AVCodec *codec;
 +}CombineContext;
 +
 +#define OFFSET(param) offsetof(CombineContext, options.param)
 +#define AC3ENC_PARAM (AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
 +
 +#define AC3ENC_TYPE_AC3_FIXED   0
 +#define AC3ENC_TYPE_AC3         1
 +#define AC3ENC_TYPE_EAC3        2
 +
 +#define AC3ENC_TYPE 12354
++
++/* common option values */
++#define AC3ENC_OPT_NONE            -1
++#define AC3ENC_OPT_AUTO            -1
++#define AC3ENC_OPT_OFF              0
++#define AC3ENC_OPT_ON               1
++#define AC3ENC_OPT_NOT_INDICATED    0
++#define AC3ENC_OPT_MODE_ON          1
++#define AC3ENC_OPT_MODE_OFF         2
++
++/* specific option values */
++#define AC3ENC_OPT_LARGE_ROOM       1
++#define AC3ENC_OPT_SMALL_ROOM       2
++#define AC3ENC_OPT_DOWNMIX_LTRT     1
++#define AC3ENC_OPT_DOWNMIX_LORO     2
++#define AC3ENC_OPT_ADCONV_STANDARD  0
++#define AC3ENC_OPT_ADCONV_HDCD      1
++
 +#include "ac3enc_opts_template.c"
 +
 +static AVClass ac3enc_class = { "AC-3 Encoder", av_default_item_name,
 +                                eac3_options, LIBAVUTIL_VERSION_INT };
 +
 +static av_cold AVCodec *get_codec(enum AVSampleFormat s){
 +#if CONFIG_AC3_FIXED_ENCODER
 +    if(s==AV_SAMPLE_FMT_S16) return &ff_ac3_fixed_encoder;
 +#endif
 +#if CONFIG_AC3_FLOAT_ENCODER
 +    if(s==AV_SAMPLE_FMT_FLT) return &ff_ac3_float_encoder;
 +#endif
 +    return NULL;
 +}
 +
 +
 +static av_cold int encode_init(AVCodecContext *avctx)
 +{
 +    CombineContext *c= avctx->priv_data;
 +    int ret;
 +    int offset= (uint8_t*)&c->options - (uint8_t*)c;
 +
 +    c->codec= get_codec(avctx->sample_fmt);
 +    if(!c->codec){
 +        av_log(avctx, AV_LOG_ERROR, "Unsupported sample format\n");
 +        return -1;
 +    }
 +    c->ctx= av_mallocz(c->codec->priv_data_size);
 +    memcpy((uint8_t*)c->ctx + offset, &c->options, (uint8_t*)&c->ctx - (uint8_t*)&c->options);
 +    FFSWAP(void *,avctx->priv_data, c->ctx);
 +    ret= c->codec->init(avctx);
 +    FFSWAP(void *,avctx->priv_data, c->ctx);
 +    return ret;
 +}
 +
 +static int encode_frame(AVCodecContext *avctx, unsigned char *frame,
 +                        int buf_size, void *data)
 +{
 +    CombineContext *c= avctx->priv_data;
 +    int ret;
 +
 +    FFSWAP(void *,avctx->priv_data, c->ctx);
 +    ret= c->codec->encode(avctx, frame, buf_size, data);
 +    FFSWAP(void *,avctx->priv_data, c->ctx);
 +    return ret;
 +}
 +
 +static av_cold int encode_close(AVCodecContext *avctx)
 +{
 +    CombineContext *c= avctx->priv_data;
 +    int ret;
 +
 +    FFSWAP(void *,avctx->priv_data, c->ctx);
 +    ret= c->codec->close(avctx);
 +    FFSWAP(void *,avctx->priv_data, c->ctx);
 +    return ret;
 +}
 +
 +AVCodec ff_ac3_encoder = {
 +    "ac3",
 +    AVMEDIA_TYPE_AUDIO,
 +    CODEC_ID_AC3,
 +    sizeof(CombineContext),
 +    encode_init,
 +    encode_frame,
 +    encode_close,
 +    NULL,
 +    .sample_fmts = (const enum AVSampleFormat[]){
 +#if CONFIG_AC3_FLOAT_ENCODER
 +        AV_SAMPLE_FMT_FLT,
 +#endif
 +#if CONFIG_AC3_FIXED_ENCODER
 +        AV_SAMPLE_FMT_S16,
 +#endif
 +        AV_SAMPLE_FMT_NONE},
 +    .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
 +    .priv_class = &ac3enc_class,
 +    .channel_layouts = ff_ac3_channel_layouts,
 +};
diff --combined libavcodec/avcodec.h
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * copyright (c) 2001 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
   */
  
@@@ -208,8 -208,6 +208,8 @@@ enum CodecID 
      CODEC_ID_PRORES,
      CODEC_ID_JV,
      CODEC_ID_DFA,
 +    CODEC_ID_8SVX_RAW,
 +    CODEC_ID_G2M,
  
      /* various PCM "codecs" */
      CODEC_ID_PCM_S16LE= 0x10000,
      CODEC_ID_BINKAUDIO_DCT,
      CODEC_ID_AAC_LATM,
      CODEC_ID_QDMC,
 +    CODEC_ID_CELT,
  
      /* subtitle codecs */
      CODEC_ID_DVD_SUBTITLE= 0x17000,
      CODEC_ID_HDMV_PGS_SUBTITLE,
      CODEC_ID_DVB_TELETEXT,
      CODEC_ID_SRT,
 +    CODEC_ID_MICRODVD,
  
      /* other specific kind of codecs (generally used for attachments) */
      CODEC_ID_TTF= 0x18000,
   * Note: If the first 23 bits of the additional bytes are not 0, then damaged
   * MPEG bitstreams could cause overread and segfault.
   */
 -#define FF_INPUT_BUFFER_PADDING_SIZE 8
 +#define FF_INPUT_BUFFER_PADDING_SIZE 16
  
  /**
   * minimum encoding buffer size
@@@ -679,12 -675,10 +679,12 @@@ typedef struct RcOverride
   * Codec should fill in channel configuration and samplerate instead of container
   */
  #define CODEC_CAP_CHANNEL_CONF     0x0400
 +
  /**
   * Codec is able to deal with negative linesizes
   */
  #define CODEC_CAP_NEG_LINESIZES    0x0800
 +
  /**
   * Codec supports frame-level multithreading.
   */
   * Codec supports slice-based (or partition-based) multithreading.
   */
  #define CODEC_CAP_SLICE_THREADS    0x2000
 +/**
 + * Codec is lossless.
 + */
 +#define CODEC_CAP_LOSSLESS         0x80000000
  
  //The following defines may change, don't expect compatibility if you use them.
  #define MB_TYPE_INTRA4x4   0x0001
@@@ -1080,7 -1070,7 +1080,7 @@@ typedef struct AVFrame 
      int64_t reordered_opaque;
  
      /**
 -     * hardware accelerator private data (Libav-allocated)
 +     * hardware accelerator private data (FFmpeg-allocated)
       * - encoding: unused
       * - decoding: Set by libavcodec
       */
       * - decoding: Set by libavcodec.
       */
      void *thread_opaque;
 +
 +    /**
 +     * frame timestamp estimated using various heuristics, in stream time base
 +     * - encoding: unused
 +     * - decoding: set by libavcodec, read by user.
 +     */
 +    int64_t best_effort_timestamp;
 +
 +    /**
 +     * reordered pos from the last AVPacket that has been input into the decoder
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    int64_t pkt_pos;
 +
 +    /**
 +     * reordered sample aspect ratio for the video frame, 0/1 if unknown\unspecified
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    AVRational sample_aspect_ratio;
 +
 +    /**
 +     * width and height of the video frame
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    int width, height;
 +
 +    /**
 +     * format of the frame, -1 if unknown or unset
 +     * It should be cast to the corresponding enum (enum PixelFormat
 +     * for video, enum AVSampleFormat for audio)
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    int format;
 +
  } AVFrame;
  
  /**
@@@ -2635,7 -2587,6 +2635,6 @@@ typedef struct AVCodecContext 
  
      /**
       * Bits per sample/pixel of internal libavcodec pixel/sample format.
-      * This field is applicable only when sample_fmt is AV_SAMPLE_FMT_S32.
       * - encoding: set by user.
       * - decoding: set by libavcodec.
       */
      /**
       * Audio channel layout.
       * - encoding: set by user.
 -     * - decoding: set by libavcodec.
 +     * - decoding: set by user, may be overwritten by libavcodec.
       */
      int64_t channel_layout;
  
       * Hardware accelerator context.
       * For some hardware accelerators, a global context needs to be
       * provided by the user. In that case, this holds display-dependent
 -     * data Libav cannot instantiate itself. Please refer to the
 -     * Libav HW accelerator documentation to know how to fill this
 +     * data FFmpeg cannot instantiate itself. Please refer to the
 +     * FFmpeg HW accelerator documentation to know how to fill this
       * is. e.g. for VA API, this is a struct vaapi_context.
       * - encoding: unused
       * - decoding: Set by user
      enum AVAudioServiceType audio_service_type;
  
      /**
 -     * Used to request a sample format from the decoder.
 -     * - encoding: unused.
 +     * desired sample format
 +     * - encoding: Not used.
       * - decoding: Set by user.
 +     * Decoder will decode to this format if it can.
       */
      enum AVSampleFormat request_sample_fmt;
 +
 +    /**
 +     * Current statistics for PTS correction.
 +     * - decoding: maintained and used by libavcodec, not intended to be used by user apps
 +     * - encoding: unused
 +     */
 +    int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far
 +    int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far
 +    int64_t pts_correction_last_pts;       /// PTS of the last frame
 +    int64_t pts_correction_last_dts;       /// DTS of the last frame
 +
 +
  } AVCodecContext;
  
  /**
@@@ -3269,11 -3207,6 +3268,11 @@@ uint8_t* av_packet_new_side_data(AVPack
  uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
                                   int *size);
  
 +int av_packet_merge_side_data(AVPacket *pkt);
 +
 +int av_packet_split_side_data(AVPacket *pkt);
 +
 +
  /* resample.c */
  
  struct ReSampleContext;
@@@ -3433,9 -3366,6 +3432,9 @@@ void avcodec_get_chroma_sub_sample(enu
  
  #if FF_API_GET_PIX_FMT_NAME
  /**
 + * Return the short name for a pixel format.
 + *
 + * \see av_get_pix_fmt(), av_get_pix_fmt_string().
   * @deprecated Deprecated in favor of av_get_pix_fmt_name().
   */
  attribute_deprecated
@@@ -4283,7 -4213,7 +4282,7 @@@ unsigned int av_xiphlacing(unsigned cha
  
  /**
   * Logs a generic warning message about a missing feature. This function is
 - * intended to be used internally by Libav (libavcodec, libavformat, etc.)
 + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.)
   * only, and would normally not be used by applications.
   * @param[in] avc a pointer to an arbitrary struct of which the first field is
   * a pointer to an AVClass struct
@@@ -4297,7 -4227,7 +4296,7 @@@ void av_log_missing_feature(void *avc, 
  
  /**
   * Log a generic warning message asking for a sample. This function is
 - * intended to be used internally by Libav (libavcodec, libavformat, etc.)
 + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.)
   * only, and would normally not be used by applications.
   * @param[in] avc a pointer to an arbitrary struct of which the first field is
   * a pointer to an AVClass struct
@@@ -4334,7 -4264,7 +4333,7 @@@ enum AVLockOp 
   * lockmgr should store/get a pointer to a user allocated mutex. It's
   * NULL upon AV_LOCK_CREATE and != NULL for all other ops.
   *
 - * @param cb User defined callback. Note: Libav may invoke calls to this
 + * @param cb User defined callback. Note: FFmpeg may invoke calls to this
   *           callback during the call to av_lockmgr_register().
   *           Thus, the application must be prepared to handle that.
   *           If cb is set to NULL the lockmgr will be unregistered.
diff --combined libavcodec/cavsdec.c
@@@ -2,20 -2,20 +2,20 @@@
   * Chinese AVS video (AVS1-P2, JiZhun profile) decoder.
   * Copyright (c) 2006  Stefan Gehrer <stefan.gehrer@gmx.de>
   *
 - * 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
   */
  
@@@ -115,8 -115,7 +115,8 @@@ static inline int get_ue_code(GetBitCon
  static int decode_residual_block(AVSContext *h, GetBitContext *gb,
                                   const struct dec_2dvlc *r, int esc_golomb_order,
                                   int qp, uint8_t *dst, int stride) {
 -    int i, level_code, esc_code, level, run, mask;
 +    int i, esc_code, level, mask;
 +    unsigned int level_code, run;
      DCTELEM level_buf[65];
      uint8_t run_buf[65];
      DCTELEM *block = h->block;
          level_code = get_ue_code(gb,r->golomb_order);
          if(level_code >= ESCAPE_CODE) {
              run = ((level_code - ESCAPE_CODE) >> 1) + 1;
 +            if(run > 64)
 +                return -1;
              esc_code = get_ue_code(gb,esc_golomb_order);
              level = esc_code + (run > r->max_run ? 1 : r->level_add[run]);
              while(level > r->inc_limit)
                  r++;
              mask = -(level_code & 1);
              level = (level^mask) - mask;
 -        } else if (level_code >= 0) {
 +        } else {
              level = r->rltab[level_code][0];
              if(!level) //end of block signal
                  break;
              run   = r->rltab[level_code][1];
              r += r->rltab[level_code][2];
 -        } else {
 -            break;
          }
          level_buf[i] = level;
          run_buf[i] = run;
@@@ -166,7 -165,7 +166,7 @@@ static inline int decode_residual_inter
  
      /* get coded block pattern */
      int cbp= get_ue_golomb(&h->s.gb);
 -    if(cbp > 63){
 +    if(cbp > 63U){
          av_log(h->s.avctx, AV_LOG_ERROR, "illegal inter cbp\n");
          return -1;
      }
  
  static int decode_mb_i(AVSContext *h, int cbp_code) {
      GetBitContext *gb = &h->s.gb;
-     int block, pred_mode_uv;
+     unsigned pred_mode_uv;
+     int block;
      uint8_t top[18];
      uint8_t *left = NULL;
      uint8_t *d;
      /* get coded block pattern */
      if(h->pic_type == AV_PICTURE_TYPE_I)
          cbp_code = get_ue_golomb(gb);
 -    if(cbp_code > 63){
 +    if(cbp_code > 63U){
          av_log(h->s.avctx, AV_LOG_ERROR, "illegal intra cbp\n");
          return -1;
      }
@@@ -448,6 -448,8 +449,8 @@@ static inline int check_for_slice(AVSCo
      if((show_bits_long(gb,24+align) & 0xFFFFFF) == 0x000001) {
          skip_bits_long(gb,24+align);
          h->stc = get_bits(gb,8);
+         if (h->stc >= h->mb_height)
+             return 0;
          decode_slice_header(h,gb);
          return 1;
      }
@@@ -662,7 -664,7 +665,7 @@@ static int cavs_decode_frame(AVCodecCon
      buf_end = buf + buf_size;
      for(;;) {
          buf_ptr = ff_find_start_code(buf_ptr,buf_end, &stc);
-         if(stc & 0xFFFFFE00)
+         if((stc & 0xFFFFFE00) || buf_ptr == buf_end)
              return FFMAX(0, buf_ptr - buf - s->parse_context.last_index);
          input_size = (buf_end - buf_ptr)*8;
          switch(stc) {