Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 28 Feb 2012 02:38:58 +0000 (03:38 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 28 Feb 2012 02:38:58 +0000 (03:38 +0100)
* qatar/master:
  avcodec_default_reget_buffer(): fix compilation in DEBUG mode
  fate: Overhaul WavPack coverage
  h264: fix mmxext chroma deblock to use correct TC values.
  flvdec: Remove the now redundant check for known broken metadata creator
  flvdec: Validate index entries added from metadata while reading
  rtsp: Handle requests from server to client
  movenc: use timestamps instead of frame_size for samples-per-packet
  movenc: use the first cluster duration as the tfhd default duration
  movenc: factorize calculation of cluster duration into a separate function
  doc/APIchanges: fill in missing dates and hashes.
  lavc: reorder AVCodecContext fields.
  lavc: reorder AVFrame fields.

Conflicts:
doc/APIchanges
libavcodec/avcodec.h
libavformat/flvdec.c
libavformat/movenc.c
tests/fate/lossless-audio.mak

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
doc/APIchanges
libavcodec/avcodec.h
libavcodec/pthread.c
libavcodec/utils.c
libavcodec/x86/h264_deblock_10bit.asm
libavformat/flvdec.c
libavformat/movenc.c
libavformat/rtsp.c
tests/fate/lossless-audio.mak

diff --cc doc/APIchanges
@@@ -13,41 -12,19 +13,41 @@@ libavutil:   2011-04-1
  
  API changes, most recent first:
  
- 2012-xx-xx - xxxxxxx - lavu 51.24.0 - error.h
 +2012-02-21 - xxxxxxx - lavc 54.4.100
 +  Add av_get_pcm_codec() function.
 +
 +2012-02-16 - xxxxxxx - libswr 0.7.100
 +  Add swr_set_matrix() function.
 +
 +2012-02-09 - xxxxxxx - lavu 51.39.100
 +  Add a new installed header libavutil/timestamp.h with timestamp
 +  utilities.
 +
 +2012-02-06 - xxxxxxx - lavu 51.38.100
 +  Add av_parse_ratio() function to parseutils.h.
 +
 +2012-02-06 - xxxxxxx - lavu 51.38.100
 +  Add AV_LOG_MAX_OFFSET macro to log.h.
 +
 +2012-02-02 - xxxxxxx - lavu 51.37.100
 +  Add public timecode helpers.
 +
 +2012-01-24 - xxxxxxx - lavfi 2.60.100
 +  Add avfilter_graph_dump.
 +
+ 2012-02-25 - c9bca80 - lavu 51.24.0 - error.h
    Add AVERROR_UNKNOWN
  
- 2012-xx-xx - xxxxxxx - lavc 54.x.x
+ 2012-02-20 - e9cda85 - lavc 54.2.0
    Add duration field to AVCodecParserContext
  
- 2012-02-xx - xxxxxxx - lavu 51.23.1 - mathematics.h
+ 2012-02-20 - 0b42a93 - lavu 51.23.1 - mathematics.h
    Add av_rescale_q_rnd()
  
- 2012-02-xx - xxxxxxx - lavu 51.22.1 - pixdesc.h
+ 2012-02-08 - 38d5533 - lavu 51.22.1 - pixdesc.h
    Add PIX_FMT_PSEUDOPAL flag.
  
- 2012-02-01 - xxxxxxx - lavc 54.01.0
+ 2012-02-08 - 52f82a1 - lavc 54.01.0
    Add avcodec_encode_video2() and deprecate avcodec_encode_video().
  
  2012-02-01 - 316fc74 - lavc 54.01.0
@@@ -1134,73 -1145,12 +1177,30 @@@ typedef struct AVFrame 
      void *thread_opaque;
  
      /**
-      * number of audio samples (per channel) described by this frame
-      * - encoding: Set by user
-      * - decoding: Set by libavcodec
-      */
-     int nb_samples;
-     /**
-      * pointers to the data planes/channels.
-      *
-      * For video, this should simply point to data[].
-      *
-      * For planar audio, each channel has a separate data pointer, and
-      * linesize[0] contains the size of each channel buffer.
-      * For packed audio, there is just one data pointer, and linesize[0]
-      * contains the total size of the buffer for all channels.
-      *
-      * Note: Both data and extended_data will always be set by get_buffer(),
-      * but for planar audio with more channels that can fit in data,
-      * extended_data must be used by the decoder in order to access all
-      * channels.
-      *
-      * encoding: unused
-      * decoding: set by AVCodecContext.get_buffer()
-      */
-     uint8_t **extended_data;
-     /**
-      * 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
-      * Values correspond to enum PixelFormat for video frames,
-      * enum AVSampleFormat for audio)
+      * log2 of the size of the block which a single vector in motion_val represents:
+      * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
       * - encoding: unused
-      * - decoding: Read by user.
+      * - decoding: Set by libavcodec.
       */
-     int format;
+     uint8_t motion_subsample_log2;
 +
 +    /**
 +     * frame timestamp estimated using various heuristics, in stream time base
 +     * Code outside libavcodec should access this field using:
 +     *  av_opt_ptr(avcodec_get_frame_class(), frame, "best_effort_timestamp");
 +     * - 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
 +     * Code outside libavcodec should access this field using:
 +     *  av_opt_ptr(avcodec_get_frame_class(), frame, "pkt_pos");
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    int64_t pkt_pos;
  } AVFrame;
  
  struct AVCodecInternal;
@@@ -1310,68 -1261,58 +1313,61 @@@ typedef struct AVCodecContext 
       * - encoding: Set by user.
       * - decoding: unused
       */
-     int gop_size;
+     int compression_level;
+ #define FF_COMPRESSION_DEFAULT -1
  
      /**
-      * Pixel format, see PIX_FMT_xxx.
-      * May be set by the demuxer if known from headers.
-      * May be overriden by the decoder if it knows better.
+      * CODEC_FLAG_*.
       * - encoding: Set by user.
-      * - decoding: Set by user if known, overridden by libavcodec if known
+      * - decoding: Set by user.
       */
-     enum PixelFormat pix_fmt;
+     int flags;
  
      /**
-      * If non NULL, 'draw_horiz_band' is called by the libavcodec
-      * decoder to draw a horizontal band. It improves cache usage. Not
-      * all codecs can do that. You must check the codec capabilities
-      * beforehand.
-      * When multithreading is used, it may be called from multiple threads
-      * at the same time; threads might draw different parts of the same AVFrame,
-      * or multiple AVFrames, and there is no guarantee that slices will be drawn
-      * in order.
-      * The function is also used by hardware acceleration APIs.
-      * It is called at least once during frame decoding to pass
-      * the data needed for hardware render.
-      * In that mode instead of pixel data, AVFrame points to
-      * a structure specific to the acceleration API. The application
-      * reads the structure and can change some fields to indicate progress
-      * or mark state.
-      * - encoding: unused
+      * CODEC_FLAG2_*
+      * - encoding: Set by user.
       * - decoding: Set by user.
-      * @param height the height of the slice
-      * @param y the y position of the slice
-      * @param type 1->top field, 2->bottom field, 3->frame
-      * @param offset offset into the AVFrame.data from which the slice should be read
       */
-     void (*draw_horiz_band)(struct AVCodecContext *s,
-                             const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],
-                             int y, int type, int height);
+     int flags2;
  
-     /* audio only */
-     int sample_rate; ///< samples per second
-     int channels;    ///< number of audio channels
+     /**
+      * some codecs need / can use extradata like Huffman tables.
+      * mjpeg: Huffman tables
+      * rv10: additional flags
+      * mpeg4: global headers (they can be in the bitstream or here)
+      * The allocated memory should be FF_INPUT_BUFFER_PADDING_SIZE bytes larger
+      * than extradata_size to avoid prolems if it is read with the bitstream reader.
+      * The bytewise contents of extradata must not depend on the architecture or CPU endianness.
+      * - encoding: Set/allocated/freed by libavcodec.
+      * - decoding: Set/allocated/freed by user.
+      */
+     uint8_t *extradata;
+     int extradata_size;
  
      /**
-      * audio sample format
-      * - encoding: Set by user.
+      * This is the fundamental unit of time (in seconds) in terms
+      * of which frame timestamps are represented. For fixed-fps content,
+      * timebase should be 1/framerate and timestamp increments should be
+      * identically 1.
+      * - encoding: MUST be set by user.
       * - decoding: Set by libavcodec.
       */
-     enum AVSampleFormat sample_fmt;  ///< sample format
+     AVRational time_base;
  
-     /* The following data should not be initialized. */
      /**
-      * Samples per packet, initialized when calling 'init'.
+      * For some codecs, the time base is closer to the field rate than the frame rate.
+      * Most notably, H.264 and MPEG-2 specify time_base as half of frame duration
+      * if no telecine is used ...
+      *
+      * Set to time_base ticks per frame. Default 1, e.g., H.264/MPEG-2 set it to 2.
       */
-     int frame_size;
-     int frame_number;   ///< audio or video frame number
+     int ticks_per_frame;
  
      /**
 -     * Encoder delay.
 +     * Encoding: Number of frames delay there will be from the encoder input to
 +     *           the decoder output. (we assume the decoder matches the spec)
 +     * Decoding: Number of frames delay in addition to what a standard decoder
 +     *           as specified in the spec would produce.
       *
       * Video:
       *   Number of frames the decoded output will be delayed relative to the
       * - encoding: Set by user.
       * - decoding: unused
       */
-     int mb_decision;
- #define FF_MB_DECISION_SIMPLE 0        ///< uses mb_cmp
- #define FF_MB_DECISION_BITS   1        ///< chooses the one which needs the fewest bits
- #define FF_MB_DECISION_RD     2        ///< rate distortion
+     int cutoff;
  
+ #if FF_API_REQUEST_CHANNELS
      /**
-      * custom intra quantization matrix
-      * - encoding: Set by user, can be NULL.
-      * - decoding: Set by libavcodec.
+      * Decoder should decode to this many channels if it can (0 for default)
+      * - encoding: unused
+      * - decoding: Set by user.
+      * @deprecated Deprecated in favor of request_channel_layout.
       */
-     uint16_t *intra_matrix;
+     int request_channels;
+ #endif
  
      /**
-      * custom inter quantization matrix
-      * - encoding: Set by user, can be NULL.
-      * - decoding: Set by libavcodec.
+      * Audio channel layout.
+      * - encoding: set by user.
 -     * - decoding: set by libavcodec.
++     * - decoding: set by user, may be overwritten by libavcodec.
       */
-     uint16_t *inter_matrix;
+     uint64_t channel_layout;
  
      /**
-      * fourcc from the AVI stream header (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
-      * This is used to work around some encoder bugs.
+      * Request decoder to use this channel layout if it can (0 for default)
       * - encoding: unused
-      * - decoding: Set by user, will be converted to uppercase by libavcodec during init.
+      * - decoding: Set by user.
       */
-     unsigned int stream_codec_tag;
+     uint64_t request_channel_layout;
  
      /**
-      * scene change detection threshold
-      * 0 is default, larger means fewer detected scene changes.
+      * Type of service that the audio stream conveys.
       * - encoding: Set by user.
-      * - decoding: unused
+      * - decoding: Set by libavcodec.
       */
-     int scenechange_threshold;
+     enum AVAudioServiceType audio_service_type;
  
      /**
-      * minimum Lagrange multipler
-      * - encoding: Set by user.
-      * - decoding: unused
 -     * 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.
       */
-     int lmin;
+     enum AVSampleFormat request_sample_fmt;
  
      /**
-      * maximum Lagrange multipler
-      * - encoding: Set by user.
-      * - decoding: unused
+      * Called at the beginning of each frame to get a buffer for it.
+      *
+      * The function will set AVFrame.data[], AVFrame.linesize[].
+      * AVFrame.extended_data[] must also be set, but it should be the same as
+      * AVFrame.data[] except for planar audio with more channels than can fit
+      * in AVFrame.data[]. In that case, AVFrame.data[] shall still contain as
+      * many data pointers as it can hold.
+      *
+      * if CODEC_CAP_DR1 is not set then get_buffer() must call
+      * avcodec_default_get_buffer() instead of providing buffers allocated by
+      * some other means.
+      *
+      * AVFrame.data[] should be 32- or 16-byte-aligned unless the CPU doesn't
+      * need it. avcodec_default_get_buffer() aligns the output buffer properly,
+      * but if get_buffer() is overridden then alignment considerations should
+      * be taken into account.
+      *
+      * @see avcodec_default_get_buffer()
+      *
+      * Video:
+      *
+      * If pic.reference is set then the frame will be read later by libavcodec.
+      * avcodec_align_dimensions2() should be used to find the required width and
+      * height, as they normally need to be rounded up to the next multiple of 16.
+      *
+      * If frame multithreading is used and thread_safe_callbacks is set,
+      * it may be called from a different thread, but not from more than one at
+      * once. Does not need to be reentrant.
+      *
+      * @see release_buffer(), reget_buffer()
+      * @see avcodec_align_dimensions2()
+      *
+      * Audio:
+      *
+      * Decoders request a buffer of a particular size by setting
+      * AVFrame.nb_samples prior to calling get_buffer(). The decoder may,
+      * however, utilize only part of the buffer by setting AVFrame.nb_samples
+      * to a smaller value in the output frame.
+      *
+      * Decoders cannot use the buffer after returning from
+      * avcodec_decode_audio4(), so they will not call release_buffer(), as it
+      * is assumed to be released immediately upon return.
+      *
+      * As a convenience, av_samples_get_buffer_size() and
+      * av_samples_fill_arrays() in libavutil may be used by custom get_buffer()
+      * functions to find the required data size and to fill data pointers and
+      * linesize. In AVFrame.linesize, only linesize[0] may be set for audio
+      * since all planes must be the same size.
+      *
+      * @see av_samples_get_buffer_size(), av_samples_fill_arrays()
+      *
+      * - encoding: unused
+      * - decoding: Set by libavcodec, user can override.
       */
-     int lmax;
+     int (*get_buffer)(struct AVCodecContext *c, AVFrame *pic);
  
      /**
-      * noise reduction strength
-      * - encoding: Set by user.
-      * - decoding: unused
+      * Called to release buffers which were allocated with get_buffer.
+      * A released buffer can be reused in get_buffer().
+      * pic.data[*] must be set to NULL.
+      * May be called from a different thread if frame multithreading is used,
+      * but not by more than one thread at once, so does not need to be reentrant.
+      * - encoding: unused
+      * - decoding: Set by libavcodec, user can override.
       */
-     int noise_reduction;
+     void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic);
  
      /**
       * Called at the beginning of a frame to get cr buffer for it.
       * - encoding: Set by user.
       * - decoding: unused
       */
-     int mb_lmax;
+     int max_prediction_order;
  
      /**
-      *
 -     * GOP timecode frame start number, in non drop frame format
--     * - encoding: Set by user.
--     * - decoding: unused
++     * GOP timecode frame start number
++     * - encoding: Set by user, in non drop frame format
++     * - decoding: Set by libavcodec (timecode in the 25 bits format, -1 if unset)
       */
-     int me_penalty_compensation;
+     int64_t timecode_frame_start;
  
-     /**
-      *
-      * - encoding: unused
-      * - decoding: Set by user.
-      */
-     enum AVDiscard skip_loop_filter;
+     /* The RTP callback: This function is called    */
+     /* every time the encoder has a packet to send. */
+     /* It depends on the encoder if the data starts */
+     /* with a Start Code (it should). H.263 does.   */
+     /* mb_nb contains the number of macroblocks     */
+     /* encoded in the RTP payload.                  */
+     void (*rtp_callback)(struct AVCodecContext *avctx, void *data, int size, int mb_nb);
  
-     /**
-      *
-      * - encoding: unused
-      * - decoding: Set by user.
-      */
-     enum AVDiscard skip_idct;
+     int rtp_payload_size;   /* The size of the RTP payload: the coder will  */
+                             /* do its best to deliver a chunk with size     */
+                             /* below rtp_payload_size, the chunk will start */
+                             /* with a start code on some codecs like H.263. */
+                             /* This doesn't take account of any particular  */
+                             /* headers inside the transmitted RTP payload.  */
  
-     /**
-      *
-      * - encoding: unused
-      * - decoding: Set by user.
-      */
-     enum AVDiscard skip_frame;
+     /* statistics, used for 2-pass encoding */
+     int mv_bits;
+     int header_bits;
+     int i_tex_bits;
+     int p_tex_bits;
+     int i_count;
+     int p_count;
+     int skip_count;
+     int misc_bits;
  
      /**
-      *
-      * - encoding: Set by user.
+      * number of bits used for the previously encoded frame
+      * - encoding: Set by libavcodec.
       * - decoding: unused
       */
-     int bidir_refine;
+     int frame_bits;
  
      /**
-      *
-      * - encoding: Set by user.
+      * pass1 encoding statistics output buffer
+      * - encoding: Set by libavcodec.
       * - decoding: unused
       */
-     int brd_scale;
+     char *stats_out;
  
      /**
-      * minimum GOP size
-      * - encoding: Set by user.
+      * pass2 encoding statistics input buffer
+      * Concatenated stuff from stats_out of pass1 should be placed here.
+      * - encoding: Allocated/set/freed by user.
       * - decoding: unused
       */
-     int keyint_min;
+     char *stats_in;
  
      /**
-      * number of reference frames
-      * - encoding: Set by user.
-      * - decoding: Set by lavc.
+      * Work around bugs in encoders which sometimes cannot be detected automatically.
+      * - encoding: Set by user
+      * - decoding: Set by user
       */
-     int refs;
+     int workaround_bugs;
+ #define FF_BUG_AUTODETECT       1  ///< autodetection
+ #define FF_BUG_OLD_MSMPEG4      2
+ #define FF_BUG_XVID_ILACE       4
+ #define FF_BUG_UMP4             8
+ #define FF_BUG_NO_PADDING       16
+ #define FF_BUG_AMV              32
+ #define FF_BUG_AC_VLC           0  ///< Will be removed, libavcodec can now handle these non-compliant files by default.
+ #define FF_BUG_QPEL_CHROMA      64
+ #define FF_BUG_STD_QPEL         128
+ #define FF_BUG_QPEL_CHROMA2     256
+ #define FF_BUG_DIRECT_BLOCKSIZE 512
+ #define FF_BUG_EDGE             1024
+ #define FF_BUG_HPEL_CHROMA      2048
+ #define FF_BUG_DC_CLIP          4096
+ #define FF_BUG_MS               8192 ///< Work around various bugs in Microsoft's broken decoders.
+ #define FF_BUG_TRUNCATED       16384
  
      /**
-      * chroma qp offset from luma
+      * strictly follow the standard (MPEG4, ...).
       * - encoding: Set by user.
-      * - decoding: unused
+      * - decoding: Set by user.
+      * Setting this to STRICT or higher means the encoder and decoder will
+      * generally do stupid things, whereas setting it to unofficial or lower
+      * will mean the encoder might produce output that is not supported by all
+      * spec-compliant decoders. Decoders don't differentiate between normal,
+      * unofficial and experimental (that is, they always try to decode things
+      * when they can) unless they are explicitly asked to behave stupidly
+      * (=strictly conform to the specs)
       */
-     int chromaoffset;
+     int strict_std_compliance;
+ #define FF_COMPLIANCE_VERY_STRICT   2 ///< Strictly conform to an older more strict version of the spec or reference software.
+ #define FF_COMPLIANCE_STRICT        1 ///< Strictly conform to all the things in the spec no matter what consequences.
+ #define FF_COMPLIANCE_NORMAL        0
+ #define FF_COMPLIANCE_UNOFFICIAL   -1 ///< Allow unofficial extensions
+ #define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.
  
      /**
-      * trellis RD quantization
-      * - encoding: Set by user.
-      * - decoding: unused
+      * error concealment flags
+      * - encoding: unused
+      * - decoding: Set by user.
       */
-     int trellis;
+     int error_concealment;
+ #define FF_EC_GUESS_MVS   1
+ #define FF_EC_DEBLOCK     2
  
      /**
-      * Audio cutoff bandwidth (0 means "automatic")
+      * debug
       * - encoding: Set by user.
-      * - decoding: unused
+      * - decoding: Set by user.
       */
-     int cutoff;
+     int debug;
+ #define FF_DEBUG_PICT_INFO   1
+ #define FF_DEBUG_RC          2
+ #define FF_DEBUG_BITSTREAM   4
+ #define FF_DEBUG_MB_TYPE     8
+ #define FF_DEBUG_QP          16
+ #define FF_DEBUG_MV          32
+ #define FF_DEBUG_DCT_COEFF   0x00000040
+ #define FF_DEBUG_SKIP        0x00000080
+ #define FF_DEBUG_STARTCODE   0x00000100
+ #define FF_DEBUG_PTS         0x00000200
+ #define FF_DEBUG_ER          0x00000400
+ #define FF_DEBUG_MMCO        0x00000800
+ #define FF_DEBUG_BUGS        0x00001000
+ #define FF_DEBUG_VIS_QP      0x00002000
+ #define FF_DEBUG_VIS_MB_TYPE 0x00004000
+ #define FF_DEBUG_BUFFERS     0x00008000
+ #define FF_DEBUG_THREADS     0x00010000
  
      /**
-      * Multiplied by qscale for each frame and added to scene_change_score.
+      * debug
       * - encoding: Set by user.
-      * - decoding: unused
+      * - decoding: Set by user.
       */
-     int scenechange_factor;
+     int debug_mv;
+ #define FF_DEBUG_VIS_MV_P_FOR  0x00000001 //visualize forward predicted MVs of P frames
+ #define FF_DEBUG_VIS_MV_B_FOR  0x00000002 //visualize forward predicted MVs of B frames
+ #define FF_DEBUG_VIS_MV_B_BACK 0x00000004 //visualize backward predicted MVs of B frames
  
      /**
-      *
-      * Note: Value depends upon the compare function used for fullpel ME.
-      * - encoding: Set by user.
-      * - decoding: unused
+      * Error recognition; may misdetect some more or less valid parts as errors.
+      * - encoding: unused
+      * - decoding: Set by user.
       */
-     int mv0_threshold;
+     int err_recognition;
+ #define AV_EF_CRCCHECK  (1<<0)
+ #define AV_EF_BITSTREAM (1<<1)
+ #define AV_EF_BUFFER    (1<<2)
+ #define AV_EF_EXPLODE   (1<<3)
++#define AV_EF_CAREFUL    (1<<16)
++#define AV_EF_COMPLIANT  (1<<17)
++#define AV_EF_AGGRESSIVE (1<<18)
++
 +
      /**
-      * Adjust sensitivity of b_frame_strategy 1.
-      * - encoding: Set by user.
-      * - decoding: unused
+      * opaque 64bit number (generally a PTS) that will be reordered and
+      * output in AVFrame.reordered_opaque
+      * @deprecated in favor of pkt_pts
+      * - encoding: unused
+      * - decoding: Set by user.
       */
-     int b_sensitivity;
+     int64_t reordered_opaque;
  
      /**
-      * - encoding: Set by user.
-      * - decoding: unused
+      * Hardware accelerator in use
+      * - encoding: unused.
+      * - decoding: Set by libavcodec
       */
-     int compression_level;
- #define FF_COMPRESSION_DEFAULT -1
+     struct AVHWAccel *hwaccel;
  
      /**
-      * - encoding: Set by user.
+      * 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
+      */
+     void *hwaccel_context;
+     /**
+      * error
+      * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR.
       * - decoding: unused
       */
-     int min_prediction_order;
+     uint64_t error[AV_NUM_DATA_POINTERS];
  
      /**
+      * DCT algorithm, see FF_DCT_* below
       * - encoding: Set by user.
       * - decoding: unused
       */
       */
      int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);
  
-     int log_level_offset;
+     /**
+      * thread opaque
+      * Can be used by execute() to store some per AVCodecContext stuff.
+      * - encoding: set by execute()
+      * - decoding: set by execute()
+      */
+     void *thread_opaque;
  
      /**
-      * Number of slices.
-      * Indicates number of picture subdivisions. Used for parallelized
-      * decoding.
-      * - encoding: Set by user
+      * noise vs. sse weight for the nsse comparsion function
+      * - encoding: Set by user.
       * - decoding: unused
       */
-     int slices;
+      int nsse_weight;
  
      /**
-      * Header containing style information for text subtitles.
-      * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
-      * [Script Info] and [V4+ Styles] section, plus the [Events] line and
-      * the Format line following. It shouldn't include any Dialogue line.
-      * - encoding: Set/allocated/freed by user (before avcodec_open2())
-      * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
+      * profile
+      * - encoding: Set by user.
+      * - decoding: Set by libavcodec.
       */
-     uint8_t *subtitle_header;
-     int subtitle_header_size;
+      int profile;
+ #define FF_PROFILE_UNKNOWN -99
+ #define FF_PROFILE_RESERVED -100
+ #define FF_PROFILE_AAC_MAIN 0
+ #define FF_PROFILE_AAC_LOW  1
+ #define FF_PROFILE_AAC_SSR  2
+ #define FF_PROFILE_AAC_LTP  3
+ #define FF_PROFILE_DTS         20
+ #define FF_PROFILE_DTS_ES      30
+ #define FF_PROFILE_DTS_96_24   40
+ #define FF_PROFILE_DTS_HD_HRA  50
+ #define FF_PROFILE_DTS_HD_MA   60
+ #define FF_PROFILE_MPEG2_422    0
+ #define FF_PROFILE_MPEG2_HIGH   1
+ #define FF_PROFILE_MPEG2_SS     2
+ #define FF_PROFILE_MPEG2_SNR_SCALABLE  3
+ #define FF_PROFILE_MPEG2_MAIN   4
+ #define FF_PROFILE_MPEG2_SIMPLE 5
+ #define FF_PROFILE_H264_CONSTRAINED  (1<<9)  // 8+1; constraint_set1_flag
+ #define FF_PROFILE_H264_INTRA        (1<<11) // 8+3; constraint_set3_flag
+ #define FF_PROFILE_H264_BASELINE             66
+ #define FF_PROFILE_H264_CONSTRAINED_BASELINE (66|FF_PROFILE_H264_CONSTRAINED)
+ #define FF_PROFILE_H264_MAIN                 77
+ #define FF_PROFILE_H264_EXTENDED             88
+ #define FF_PROFILE_H264_HIGH                 100
+ #define FF_PROFILE_H264_HIGH_10              110
+ #define FF_PROFILE_H264_HIGH_10_INTRA        (110|FF_PROFILE_H264_INTRA)
+ #define FF_PROFILE_H264_HIGH_422             122
+ #define FF_PROFILE_H264_HIGH_422_INTRA       (122|FF_PROFILE_H264_INTRA)
+ #define FF_PROFILE_H264_HIGH_444             144
+ #define FF_PROFILE_H264_HIGH_444_PREDICTIVE  244
+ #define FF_PROFILE_H264_HIGH_444_INTRA       (244|FF_PROFILE_H264_INTRA)
+ #define FF_PROFILE_H264_CAVLC_444            44
+ #define FF_PROFILE_VC1_SIMPLE   0
+ #define FF_PROFILE_VC1_MAIN     1
+ #define FF_PROFILE_VC1_COMPLEX  2
+ #define FF_PROFILE_VC1_ADVANCED 3
+ #define FF_PROFILE_MPEG4_SIMPLE                     0
+ #define FF_PROFILE_MPEG4_SIMPLE_SCALABLE            1
+ #define FF_PROFILE_MPEG4_CORE                       2
+ #define FF_PROFILE_MPEG4_MAIN                       3
+ #define FF_PROFILE_MPEG4_N_BIT                      4
+ #define FF_PROFILE_MPEG4_SCALABLE_TEXTURE           5
+ #define FF_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION      6
+ #define FF_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE     7
+ #define FF_PROFILE_MPEG4_HYBRID                     8
+ #define FF_PROFILE_MPEG4_ADVANCED_REAL_TIME         9
+ #define FF_PROFILE_MPEG4_CORE_SCALABLE             10
+ #define FF_PROFILE_MPEG4_ADVANCED_CODING           11
+ #define FF_PROFILE_MPEG4_ADVANCED_CORE             12
+ #define FF_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13
+ #define FF_PROFILE_MPEG4_SIMPLE_STUDIO             14
+ #define FF_PROFILE_MPEG4_ADVANCED_SIMPLE           15
  
      /**
-      * Current packet as passed into the decoder, to avoid having
-      * to pass the packet into every function. Currently only valid
-      * inside lavc and get/release_buffer callbacks.
-      * - decoding: set by avcodec_decode_*, read by get_buffer() for setting pkt_pts
-      * - encoding: unused
+      * level
+      * - encoding: Set by user.
+      * - decoding: Set by libavcodec.
       */
-     AVPacket *pkt;
+      int level;
+ #define FF_LEVEL_UNKNOWN -99
  
      /**
-      * Which multithreading methods to use.
-      * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread,
-      * so clients which cannot provide future frames should not use it.
       *
-      * - encoding: Set by user, otherwise the default is used.
-      * - decoding: Set by user, otherwise the default is used.
+      * - encoding: unused
+      * - decoding: Set by user.
       */
-     int thread_type;
- #define FF_THREAD_FRAME   1 ///< Decode more than one frame at once
- #define FF_THREAD_SLICE   2 ///< Decode more than one part of a single frame at once
+     enum AVDiscard skip_loop_filter;
  
      /**
-      * Which multithreading methods are in use by the codec.
-      * - encoding: Set by libavcodec.
-      * - decoding: Set by libavcodec.
+      *
+      * - encoding: unused
+      * - decoding: Set by user.
       */
-     int active_thread_type;
+     enum AVDiscard skip_idct;
  
      /**
-      * Set by the client if its custom get_buffer() callback can be called
-      * from another thread, which allows faster multithreaded decoding.
-      * draw_horiz_band() will be called from other threads regardless of this setting.
-      * Ignored if the default get_buffer() is used.
-      * - encoding: Set by user.
+      *
+      * - encoding: unused
       * - decoding: Set by user.
       */
-     int thread_safe_callbacks;
+     enum AVDiscard skip_frame;
  
      /**
-      * VBV delay coded in the last frame (in periods of a 27 MHz clock).
-      * Used for compliant TS muxing.
-      * - encoding: Set by libavcodec.
-      * - decoding: unused.
+      * Header containing style information for text subtitles.
+      * For SUBTITLE_ASS subtitle type, it should contain the whole ASS
+      * [Script Info] and [V4+ Styles] section, plus the [Events] line and
+      * the Format line following. It shouldn't include any Dialogue line.
+      * - encoding: Set/allocated/freed by user (before avcodec_open2())
+      * - decoding: Set/allocated/freed by libavcodec (by avcodec_open2())
       */
-     uint64_t vbv_delay;
+     uint8_t *subtitle_header;
+     int subtitle_header_size;
  
      /**
-      * Type of service that the audio stream conveys.
+      * Simulates errors in the bitstream to test error concealment.
       * - encoding: Set by user.
-      * - decoding: Set by libavcodec.
-      */
-     enum AVAudioServiceType audio_service_type;
-     /**
-      * desired sample format
-      * - encoding: Not used.
-      * - decoding: Set by user.
-      * Decoder will decode to this format if it can.
+      * - decoding: unused
       */
-     enum AVSampleFormat request_sample_fmt;
+     int error_rate;
  
      /**
-      * Error recognition; may misdetect some more or less valid parts as errors.
+      * Current packet as passed into the decoder, to avoid having
+      * to pass the packet into every function. Currently only valid
+      * inside lavc and get/release_buffer callbacks.
+      * - decoding: set by avcodec_decode_*, read by get_buffer() for setting pkt_pts
       * - encoding: unused
-      * - decoding: Set by user.
       */
-     int err_recognition;
- #define AV_EF_CRCCHECK  (1<<0)
- #define AV_EF_BITSTREAM (1<<1)
- #define AV_EF_BUFFER    (1<<2)
- #define AV_EF_EXPLODE   (1<<3)
- #define AV_EF_CAREFUL    (1<<16)
- #define AV_EF_COMPLIANT  (1<<17)
- #define AV_EF_AGGRESSIVE (1<<18)
+     AVPacket *pkt;
  
      /**
-      * Private context used for internal data.
-      *
-      * Unlike priv_data, this is not codec-specific. It is used in general
-      * libavcodec functions.
-      */
-     struct AVCodecInternal *internal;
-     /** Field order
-      * - encoding: set by libavcodec
-      * - decoding: Set by libavcodec
+      * VBV delay coded in the last frame (in periods of a 27 MHz clock).
+      * Used for compliant TS muxing.
+      * - encoding: Set by libavcodec.
+      * - decoding: unused.
       */
-     enum AVFieldOrder field_order;
+     uint64_t vbv_delay;
 +
 +    /**
 +     * 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;
  
  /**
Simple merge
Simple merge
Simple merge
  #include "avio_internal.h"
  #include "flv.h"
  
 -#define KEYFRAMES_TAG            "keyframes"
 -#define KEYFRAMES_TIMESTAMP_TAG  "times"
 -#define KEYFRAMES_BYTEOFFSET_TAG "filepositions"
 -
+ #define VALIDATE_INDEX_TS_THRESH 2500
  typedef struct {
      int wrong_dts; ///< wrong dts due to negative cts
 -    uint8_t *new_extradata[2];
 -    int      new_extradata_size[2];
 +    uint8_t *new_extradata[FLV_STREAM_TYPE_NB];
 +    int      new_extradata_size[FLV_STREAM_TYPE_NB];
      int      last_sample_rate;
      int      last_channels;
+     struct {
+         int64_t dts;
+         int64_t pos;
+     } validate_index[2];
+     int validate_next;
+     int validate_count;
  } FLVContext;
  
  static int flv_probe(AVProbeData *p)
@@@ -137,7 -145,9 +145,8 @@@ static int amf_get_string(AVIOContext *
  }
  
  static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream *vstream, int64_t max_pos) {
 -    unsigned int arraylen = 0, timeslen = 0, fileposlen = 0, i;
 -    double num_val;
+     FLVContext *flv = s->priv_data;
 +    unsigned int timeslen = 0, fileposlen = 0, i;
      char str_val[256];
      int64_t *times = NULL;
      int64_t *filepositions = NULL;
          }
      }
  
 -    if (!ret && timeslen == fileposlen) {
 +    if (timeslen == fileposlen && fileposlen>1 && max_pos <= filepositions[0]) {
-         int64_t av_unused dts, size0, size1;
-         avio_seek(ioc, filepositions[1]-4, SEEK_SET);
-         size0 = avio_rb32(ioc);
-                 avio_r8(ioc);
-         size1 = avio_rb24(ioc);
-         dts   = avio_rb24(ioc);
-         dts  |= avio_r8(ioc) << 24;
-         if (size0 > filepositions[1] || FFABS(dts - times[1]*1000)>5000/*arbitraray threshold to detect invalid index*/)
-             goto invalid;
-         for(i = 0; i < timeslen; i++)
+         for (i = 0; i < fileposlen; i++) {
              av_add_index_entry(vstream, filepositions[i], times[i]*1000,
                                 0, 0, AVINDEX_KEYFRAME);
 -    } else
+             if (i < 2) {
+                 flv->validate_index[i].pos = filepositions[i];
+                 flv->validate_index[i].dts = times[i] * 1000;
+                 flv->validate_count = i + 1;
+             }
+         }
 +    } else {
 +invalid:
          av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n");
 +    }
  
  finish:
      av_freep(&times);
@@@ -565,6 -551,40 +565,42 @@@ static int mov_get_lpcm_flags(enum Code
      }
  }
  
+ static int get_cluster_duration(MOVTrack *track, int cluster_idx)
+ {
+     int64_t next_dts;
+     if (cluster_idx >= track->entry)
+         return 0;
+     if (cluster_idx + 1 == track->entry)
+         next_dts = track->track_duration + track->start_dts;
+     else
+         next_dts = track->cluster[cluster_idx + 1].dts;
+     return next_dts - track->cluster[cluster_idx].dts;
+ }
+ static int get_samples_per_packet(MOVTrack *track)
+ {
+     int i, first_duration;
++// return track->enc->frame_size;
++
+     /* use 1 for raw PCM */
+     if (!track->audio_vbr)
+         return 1;
+     /* check to see if duration is constant for all clusters */
+     if (!track->entry)
+         return 0;
+     first_duration = get_cluster_duration(track, 0);
+     for (i = 1; i < track->entry; i++) {
+         if (get_cluster_duration(track, i) != first_duration)
+             return 0;
+     }
+     return first_duration;
+ }
  static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track)
  {
      int64_t pos = avio_tell(pb);
          avio_wb32(pb, av_get_bits_per_sample(track->enc->codec_id));
          avio_wb32(pb, mov_get_lpcm_flags(track->enc->codec_id));
          avio_wb32(pb, track->sample_size);
-         avio_wb32(pb, track->enc->frame_size);
+         avio_wb32(pb, get_samples_per_packet(track));
      } else {
 -        /* reserved for mp4/3gp */
 -        avio_wb16(pb, 2);
 -        avio_wb16(pb, 16);
 -        avio_wb16(pb, 0);
 +        if (track->mode == MODE_MOV) {
 +            avio_wb16(pb, track->enc->channels);
 +            if (track->enc->codec_id == CODEC_ID_PCM_U8 ||
 +                track->enc->codec_id == CODEC_ID_PCM_S8)
 +                avio_wb16(pb, 8); /* bits per sample */
 +            else
 +                avio_wb16(pb, 16);
 +            avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */
 +        } else { /* reserved for mp4/3gp */
 +            avio_wb16(pb, 2);
 +            avio_wb16(pb, 16);
 +            avio_wb16(pb, 0);
 +        }
  
          avio_wb16(pb, 0); /* packet size (= 0) */
          avio_wb16(pb, track->enc->sample_rate);
Simple merge
@@@ -1,17 -1,14 +1,18 @@@
 -FATE_TESTS += fate-lossless-alac
 +FATE_LOSSLESS_AUDIO += fate-lossless-alac
  fate-lossless-alac: CMD = md5 -i $(SAMPLES)/lossless-audio/inside.m4a -f s16le
  
 -FATE_TESTS += fate-lossless-meridianaudio
 +FATE_LOSSLESS_AUDIO += fate-lossless-meridianaudio
  fate-lossless-meridianaudio: CMD = md5 -i $(SAMPLES)/lossless-audio/luckynight-partial.mlp -f s16le
  
 -FATE_TESTS += fate-lossless-monkeysaudio
 +FATE_LOSSLESS_AUDIO += fate-lossless-monkeysaudio
  fate-lossless-monkeysaudio: CMD = md5 -i $(SAMPLES)/lossless-audio/luckynight-partial.ape -f s16le
  
 -FATE_TESTS += fate-lossless-shorten
 +FATE_LOSSLESS_AUDIO += fate-lossless-shorten
  fate-lossless-shorten: CMD = md5 -i $(SAMPLES)/lossless-audio/luckynight-partial.shn -f s16le
  
 -FATE_TESTS += fate-lossless-tta
 +FATE_LOSSLESS_AUDIO += fate-lossless-tta
  fate-lossless-tta: CMD = crc -i $(SAMPLES)/lossless-audio/inside.tta
 +
 +FATE_TESTS += $(FATE_LOSSLESS_AUDIO)
 +fate-lossless-audio: $(FATE_LOSSLESS_AUDIO)
++