From 1d428004c6bf83e16628af022d1684acd069b1ed Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 26 Feb 2012 10:01:08 +0100 Subject: [PATCH 01/12] lavc: reorder AVFrame fields. Put related fields together, move the important ones closer to the beginning, try to eliminate holes. --- libavcodec/avcodec.h | 181 ++++++++++++++++++++++--------------------- 1 file changed, 91 insertions(+), 90 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index d1df5b4168..c7cea4e2e3 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -859,12 +859,48 @@ typedef struct AVFrame { int linesize[AV_NUM_DATA_POINTERS]; /** - * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer. - * This isn't used by libavcodec unless the default get/release_buffer() is used. - * - encoding: - * - decoding: + * 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 *base[AV_NUM_DATA_POINTERS]; + uint8_t **extended_data; + + /** + * width and height of the video frame + * - encoding: unused + * - decoding: Read by user. + */ + int width, height; + + /** + * number of audio samples (per channel) described by this frame + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + int nb_samples; + + /** + * format of the frame, -1 if unknown or unset + * Values correspond to enum PixelFormat for video frames, + * enum AVSampleFormat for audio) + * - encoding: unused + * - decoding: Read by user. + */ + int format; + /** * 1 -> keyframe, 0-> not * - encoding: Set by libavcodec. @@ -879,6 +915,21 @@ typedef struct AVFrame { */ enum AVPictureType pict_type; + /** + * pointer to the first allocated byte of the picture. Can be used in get_buffer/release_buffer. + * This isn't used by libavcodec unless the default get/release_buffer() is used. + * - encoding: + * - decoding: + */ + uint8_t *base[AV_NUM_DATA_POINTERS]; + + /** + * sample aspect ratio for the video frame, 0/1 if unknown\unspecified + * - encoding: unused + * - decoding: Read by user. + */ + AVRational sample_aspect_ratio; + /** * presentation timestamp in time_base units (time when frame should be shown to user) * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed. @@ -887,6 +938,20 @@ typedef struct AVFrame { */ int64_t pts; + /** + * reordered pts from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_pts; + + /** + * dts from the last AVPacket that has been input into the decoder + * - encoding: unused + * - decoding: Read by user. + */ + int64_t pkt_dts; + /** * picture number in bitstream order * - encoding: set by @@ -930,6 +995,11 @@ typedef struct AVFrame { */ int qstride; + /** + * + */ + int qscale_type; + /** * mbskip_table[mb]>=1 if MB didn't change * stride= mb_width = (width+15)>>4 @@ -961,12 +1031,19 @@ typedef struct AVFrame { uint32_t *mb_type; /** - * log2 of the size of the block which a single vector in motion_val represents: - * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2) + * DCT coefficients * - encoding: unused * - decoding: Set by libavcodec. */ - uint8_t motion_subsample_log2; + short *dct_coeff; + + /** + * motion reference frame index + * the order in which these are stored can depend on the codec. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + int8_t *ref_index[2]; /** * for some private data of the user @@ -998,11 +1075,6 @@ typedef struct AVFrame { */ int repeat_pict; - /** - * - */ - int qscale_type; - /** * The content of the picture is interlaced. * - encoding: Set by user. @@ -1017,13 +1089,6 @@ typedef struct AVFrame { */ int top_field_first; - /** - * Pan scan. - * - encoding: Set by user. - * - decoding: Set by libavcodec. - */ - AVPanScan *pan_scan; - /** * Tell user application that palette has changed from previous frame. * - encoding: ??? (no palette-enabled encoder yet) @@ -1039,19 +1104,11 @@ typedef struct AVFrame { int buffer_hints; /** - * DCT coefficients - * - encoding: unused - * - decoding: Set by libavcodec. - */ - short *dct_coeff; - - /** - * motion reference frame index - * the order in which these are stored can depend on the codec. + * Pan scan. * - encoding: Set by user. * - decoding: Set by libavcodec. */ - int8_t *ref_index[2]; + AVPanScan *pan_scan; /** * reordered opaque 64bit (generally an integer or a double precision float @@ -1073,20 +1130,6 @@ typedef struct AVFrame { */ void *hwaccel_picture_private; - /** - * reordered pts from the last AVPacket that has been input into the decoder - * - encoding: unused - * - decoding: Read by user. - */ - int64_t pkt_pts; - - /** - * dts from the last AVPacket that has been input into the decoder - * - encoding: unused - * - decoding: Read by user. - */ - int64_t pkt_dts; - /** * the AVCodecContext which ff_thread_get_buffer() was last called on * - encoding: Set by libavcodec. @@ -1102,54 +1145,12 @@ 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 + * 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. */ - 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) - * - encoding: unused - * - decoding: Read by user. - */ - int format; + uint8_t motion_subsample_log2; } AVFrame; struct AVCodecInternal; From b1edfce08aac6dae90042b8f7269b9f932bac4e8 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 26 Feb 2012 10:01:08 +0100 Subject: [PATCH 02/12] lavc: reorder AVCodecContext fields. Put related fields together, move the important ones closer to the beginning, try to eliminate holes. --- libavcodec/avcodec.h | 1901 +++++++++++++++++++++--------------------- libavcodec/pthread.c | 2 +- 2 files changed, 952 insertions(+), 951 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index c7cea4e2e3..cd86856d32 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1177,6 +1177,63 @@ typedef struct AVCodecContext { * - set by avcodec_alloc_context3 */ const AVClass *av_class; + int log_level_offset; + + enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ + struct AVCodec *codec; + char codec_name[32]; + enum CodecID codec_id; /* see CODEC_ID_xxx */ + + /** + * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). + * This is used to work around some encoder bugs. + * A demuxer should set this to what is stored in the field used to identify the codec. + * If there are multiple such fields in a container then the demuxer should choose the one + * which maximizes the information about the used codec. + * If the codec tag field in a container is larger than 32 bits then the demuxer should + * remap the longer ID to 32 bits with a table or other structure. Alternatively a new + * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated + * first. + * - encoding: Set by user, if not then the default based on codec_id will be used. + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int codec_tag; + + /** + * 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. + * - encoding: unused + * - decoding: Set by user, will be converted to uppercase by libavcodec during init. + */ + unsigned int stream_codec_tag; + + /** + * Some codecs need additional format info. It is stored here. + * If any muxer uses this then ALL demuxers/parsers AND encoders for the + * specific codec MUST set it correctly otherwise stream copy breaks. + * In general use of this field by muxers is not recommended. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. (FIXME: Is this OK?) + */ + int sub_id; + + void *priv_data; + + /** + * Private context used for internal data. + * + * Unlike priv_data, this is not codec-specific. It is used in general + * libavcodec functions. + */ + struct AVCodecInternal *internal; + + /** + * Private data of the user, can be used to carry app specific stuff. + * - encoding: Set by user. + * - decoding: Set by user. + */ + void *opaque; + /** * the average bitrate * - encoding: Set by user; unused for constant quantizer encoding. @@ -1192,6 +1249,21 @@ typedef struct AVCodecContext { */ int bit_rate_tolerance; + /** + * Global quality for codecs which cannot change it per frame. + * This should be proportional to MPEG-1/2/4 qscale. + * - encoding: Set by user. + * - decoding: unused + */ + int global_quality; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int compression_level; +#define FF_COMPRESSION_DEFAULT -1 + /** * CODEC_FLAG_*. * - encoding: Set by user. @@ -1200,23 +1272,11 @@ typedef struct AVCodecContext { int flags; /** - * Some codecs need additional format info. It is stored here. - * If any muxer uses this then ALL demuxers/parsers AND encoders for the - * specific codec MUST set it correctly otherwise stream copy breaks. - * In general use of this field by muxers is not recommended. - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. (FIXME: Is this OK?) + * CODEC_FLAG2_* + * - encoding: Set by user. + * - decoding: Set by user. */ - int sub_id; - - /** - * Motion estimation algorithm used for video coding. - * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex), - * 8 (umh), 9 (iter), 10 (tesa) [7, 8, 10 are x264 specific, 9 is snow specific] - * - encoding: MUST be set by user. - * - decoding: unused - */ - int me_method; + int flags2; /** * some codecs need / can use extradata like Huffman tables. @@ -1242,6 +1302,36 @@ typedef struct AVCodecContext { */ AVRational time_base; + /** + * 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 ticks_per_frame; + + /** + * Encoder delay. + * + * Video: + * Number of frames the decoded output will be delayed relative to the + * encoded input. + * + * Audio: + * Number of "priming" samples added to the beginning of the stream + * during encoding. The decoded output will be delayed by this many + * samples relative to the input to the encoder. Note that this field is + * purely informational and does not directly affect the pts output by + * the encoder, which should always be based on the actual presentation + * time, including any delay. + * + * - encoding: Set by libavcodec. + * - decoding: unused + */ + int delay; + + /* video only */ /** * picture width / height. @@ -1252,6 +1342,13 @@ typedef struct AVCodecContext { */ int width, height; + /** + * Bitstream width / height, may be different from width/height if lowres enabled. + * - encoding: unused + * - decoding: Set by user before init if known. Codec should override / dynamically change if needed. + */ + int coded_width, coded_height; + #define FF_ASPECT_EXTENDED 15 /** @@ -1270,6 +1367,15 @@ typedef struct AVCodecContext { */ enum PixelFormat pix_fmt; + /** + * Motion estimation algorithm used for video coding. + * 1 (zero), 2 (full), 3 (log), 4 (phods), 5 (epzs), 6 (x1), 7 (hex), + * 8 (umh), 9 (iter), 10 (tesa) [7, 8, 10 are x264 specific, 9 is snow specific] + * - encoding: MUST be set by user. + * - decoding: unused + */ + int me_method; + /** * If non NULL, 'draw_horiz_band' is called by the libavcodec * decoder to draw a horizontal band. It improves cache usage. Not @@ -1297,68 +1403,16 @@ typedef struct AVCodecContext { const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], int y, int type, int height); - /* audio only */ - int sample_rate; ///< samples per second - int channels; ///< number of audio channels - /** - * audio sample format - * - encoding: Set by user. - * - decoding: Set by libavcodec. + * callback to negotiate the pixelFormat + * @param fmt is the list of formats which are supported by the codec, + * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. + * The first is always the native one. + * @return the chosen format + * - encoding: unused + * - decoding: Set by user, if not set the native format will be chosen. */ - enum AVSampleFormat sample_fmt; ///< sample format - - /* The following data should not be initialized. */ - /** - * Samples per packet, initialized when calling 'init'. - */ - int frame_size; - int frame_number; ///< audio or video frame number - - /** - * Encoder delay. - * - * Video: - * Number of frames the decoded output will be delayed relative to the - * encoded input. - * - * Audio: - * Number of "priming" samples added to the beginning of the stream - * during encoding. The decoded output will be delayed by this many - * samples relative to the input to the encoder. Note that this field is - * purely informational and does not directly affect the pts output by - * the encoder, which should always be based on the actual presentation - * time, including any delay. - * - * - encoding: Set by libavcodec. - * - decoding: unused - */ - int delay; - - /* - encoding parameters */ - float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) - float qblur; ///< amount of qscale smoothing over time (0.0-1.0) - - /** - * minimum quantizer - * - encoding: Set by user. - * - decoding: unused - */ - int qmin; - - /** - * maximum quantizer - * - encoding: Set by user. - * - decoding: unused - */ - int qmax; - - /** - * maximum quantizer difference between frames - * - encoding: Set by user. - * - decoding: unused - */ - int max_qdiff; + enum PixelFormat (*get_format)(struct AVCodecContext *s, const enum PixelFormat * fmt); /** * maximum number of B-frames between non-B-frames @@ -1383,92 +1437,6 @@ typedef struct AVCodecContext { int b_frame_strategy; - struct AVCodec *codec; - - void *priv_data; - - 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. */ - - - /* 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); - - /* 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; - - /** - * number of bits used for the previously encoded frame - * - encoding: Set by libavcodec. - * - decoding: unused - */ - int frame_bits; - - /** - * Private data of the user, can be used to carry app specific stuff. - * - encoding: Set by user. - * - decoding: Set by user. - */ - void *opaque; - - char codec_name[32]; - enum AVMediaType codec_type; /* see AVMEDIA_TYPE_xxx */ - enum CodecID codec_id; /* see CODEC_ID_xxx */ - - /** - * fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A'). - * This is used to work around some encoder bugs. - * A demuxer should set this to what is stored in the field used to identify the codec. - * If there are multiple such fields in a container then the demuxer should choose the one - * which maximizes the information about the used codec. - * If the codec tag field in a container is larger than 32 bits then the demuxer should - * remap the longer ID to 32 bits with a table or other structure. Alternatively a new - * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated - * first. - * - encoding: Set by user, if not then the default based on codec_id will be used. - * - decoding: Set by user, will be converted to uppercase by libavcodec during init. - */ - unsigned int codec_tag; - - /** - * Work around bugs in encoders which sometimes cannot be detected automatically. - * - encoding: Set by user - * - decoding: Set by user - */ - 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 - /** * luma single coefficient elimination threshold * - encoding: Set by user. @@ -1483,25 +1451,6 @@ typedef struct AVCodecContext { */ int chroma_elim_threshold; - /** - * strictly follow the standard (MPEG4, ...). - * - encoding: Set by user. - * - 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 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. - /** * qscale offset between IP and B-frames * - encoding: Set by user. @@ -1509,74 +1458,6 @@ typedef struct AVCodecContext { */ float b_quant_offset; - /** - * 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 (*get_buffer)(struct AVCodecContext *c, AVFrame *pic); - - /** - * 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. - */ - void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic); - /** * Size of the frame reordering buffer in the decoder. * For MPEG-2 it is 1 IPB or 0 low delay IP. @@ -1585,12 +1466,6 @@ typedef struct AVCodecContext { */ int has_b_frames; - /** - * number of bytes per packet if constant and known or 0 - * Used by some WAV based audio codecs. - */ - int block_align; - /** * 0-> h263 quant 1-> mpeg quant * - encoding: Set by user. @@ -1598,69 +1473,6 @@ typedef struct AVCodecContext { */ int mpeg_quant; - /** - * pass1 encoding statistics output buffer - * - encoding: Set by libavcodec. - * - decoding: unused - */ - char *stats_out; - - /** - * pass2 encoding statistics input buffer - * Concatenated stuff from stats_out of pass1 should be placed here. - * - encoding: Allocated/set/freed by user. - * - decoding: unused - */ - char *stats_in; - - /** - * ratecontrol qmin qmax limiting method - * 0-> clipping, 1-> use a nice continous function to limit qscale wthin qmin/qmax. - * - encoding: Set by user. - * - decoding: unused - */ - float rc_qsquish; - - float rc_qmod_amp; - int rc_qmod_freq; - - /** - * ratecontrol override, see RcOverride - * - encoding: Allocated/set/freed by user. - * - decoding: unused - */ - RcOverride *rc_override; - int rc_override_count; - - /** - * rate control equation - * - encoding: Set by user - * - decoding: unused - */ - const char *rc_eq; - - /** - * maximum bitrate - * - encoding: Set by user. - * - decoding: unused - */ - int rc_max_rate; - - /** - * minimum bitrate - * - encoding: Set by user. - * - decoding: unused - */ - int rc_min_rate; - - /** - * decoder bitstream buffer size - * - encoding: Set by user. - * - decoding: unused - */ - int rc_buffer_size; - float rc_buffer_aggressivity; - /** * qscale factor between P and I-frames * If > 0 then the last p frame quantizer will be used (q= lastp_q*factor+offset). @@ -1677,26 +1489,6 @@ typedef struct AVCodecContext { */ float i_quant_offset; - /** - * initial complexity for pass1 ratecontrol - * - encoding: Set by user. - * - decoding: unused - */ - float rc_initial_cplx; - - /** - * DCT algorithm, see FF_DCT_* below - * - encoding: Set by user. - * - decoding: unused - */ - int dct_algo; -#define FF_DCT_AUTO 0 -#define FF_DCT_FASTINT 1 -#define FF_DCT_INT 2 -#define FF_DCT_MMX 3 -#define FF_DCT_ALTIVEC 5 -#define FF_DCT_FAAN 6 - /** * luminance masking (0-> disabled) * - encoding: Set by user. @@ -1732,76 +1524,12 @@ typedef struct AVCodecContext { */ float dark_masking; - /** - * IDCT algorithm, see FF_IDCT_* below. - * - encoding: Set by user. - * - decoding: Set by user. - */ - int idct_algo; -#define FF_IDCT_AUTO 0 -#define FF_IDCT_INT 1 -#define FF_IDCT_SIMPLE 2 -#define FF_IDCT_SIMPLEMMX 3 -#define FF_IDCT_LIBMPEG2MMX 4 -#define FF_IDCT_MMI 5 -#define FF_IDCT_ARM 7 -#define FF_IDCT_ALTIVEC 8 -#define FF_IDCT_SH4 9 -#define FF_IDCT_SIMPLEARM 10 -#define FF_IDCT_H264 11 -#define FF_IDCT_VP3 12 -#define FF_IDCT_IPP 13 -#define FF_IDCT_XVIDMMX 14 -#define FF_IDCT_CAVS 15 -#define FF_IDCT_SIMPLEARMV5TE 16 -#define FF_IDCT_SIMPLEARMV6 17 -#define FF_IDCT_SIMPLEVIS 18 -#define FF_IDCT_WMV2 19 -#define FF_IDCT_FAAN 20 -#define FF_IDCT_EA 21 -#define FF_IDCT_SIMPLENEON 22 -#define FF_IDCT_SIMPLEALPHA 23 -#define FF_IDCT_BINK 24 - /** * slice count * - encoding: Set by libavcodec. * - decoding: Set by user (or 0). */ int slice_count; - /** - * slice offsets in the frame in bytes - * - encoding: Set/allocated by libavcodec. - * - decoding: Set/allocated by user (or NULL). - */ - int *slice_offset; - - /** - * error concealment flags - * - encoding: unused - * - decoding: Set by user. - */ - int error_concealment; -#define FF_EC_GUESS_MVS 1 -#define FF_EC_DEBLOCK 2 - - /** - * dsp_mask could be add used to disable unwanted CPU features - * CPU features (i.e. MMX, SSE. ...) - * - * With the FORCE flag you may instead enable given CPU features. - * (Dangerous: Usable in case of misdetection, improper usage however will - * result into program crash.) - */ - unsigned dsp_mask; - - /** - * bits per sample/pixel from the demuxer (needed for huffyuv). - * - encoding: Set by libavcodec. - * - decoding: Set by user. - */ - int bits_per_coded_sample; - /** * prediction method (needed for huffyuv) * - encoding: Set by user. @@ -1812,6 +1540,13 @@ typedef struct AVCodecContext { #define FF_PRED_PLANE 1 #define FF_PRED_MEDIAN 2 + /** + * slice offsets in the frame in bytes + * - encoding: Set/allocated by libavcodec. + * - decoding: Set/allocated by user (or NULL). + */ + int *slice_offset; + /** * sample aspect ratio (0 if unknown) * That is the width of a pixel divided by the height of the pixel. @@ -1821,54 +1556,6 @@ typedef struct AVCodecContext { */ AVRational sample_aspect_ratio; - /** - * the picture in the bitstream - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. - */ - AVFrame *coded_frame; - - /** - * debug - * - encoding: Set by user. - * - decoding: Set by user. - */ - 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 - - /** - * debug - * - encoding: Set by user. - * - decoding: Set by user. - */ - 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 - - /** - * error - * - encoding: Set by libavcodec if flags&CODEC_FLAG_PSNR. - * - decoding: unused - */ - uint64_t error[AV_NUM_DATA_POINTERS]; - /** * motion estimation comparison function * - encoding: Set by user. @@ -1952,17 +1639,6 @@ typedef struct AVCodecContext { */ int me_subpel_quality; - /** - * callback to negotiate the pixelFormat - * @param fmt is the list of formats which are supported by the codec, - * it is terminated by -1 as 0 is a valid format, the formats are ordered by quality. - * The first is always the native one. - * @return the chosen format - * - encoding: unused - * - decoding: Set by user, if not set the native format will be chosen. - */ - enum PixelFormat (*get_format)(struct AVCodecContext *s, const enum PixelFormat * fmt); - /** * DTG active format information (additional aspect ratio * information only used in DVB MPEG-2 transport streams) @@ -2012,33 +1688,6 @@ typedef struct AVCodecContext { */ int color_table_id; - /** - * Global quality for codecs which cannot change it per frame. - * This should be proportional to MPEG-1/2/4 qscale. - * - encoding: Set by user. - * - decoding: unused - */ - int global_quality; - -#define FF_CODER_TYPE_VLC 0 -#define FF_CODER_TYPE_AC 1 -#define FF_CODER_TYPE_RAW 2 -#define FF_CODER_TYPE_RLE 3 -#define FF_CODER_TYPE_DEFLATE 4 - /** - * coder type - * - encoding: Set by user. - * - decoding: unused - */ - int coder_type; - - /** - * context model - * - encoding: Set by user. - * - decoding: unused - */ - int context_model; - /** * slice flags * - encoding: unused @@ -2080,14 +1729,6 @@ typedef struct AVCodecContext { */ uint16_t *inter_matrix; - /** - * 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. - * - encoding: unused - * - decoding: Set by user, will be converted to uppercase by libavcodec during init. - */ - unsigned int stream_codec_tag; - /** * scene change detection threshold * 0 is default, larger means fewer detected scene changes. @@ -2096,6 +1737,473 @@ typedef struct AVCodecContext { */ int scenechange_threshold; + /** + * noise reduction strength + * - encoding: Set by user. + * - decoding: unused + */ + int noise_reduction; + + /** + * + * - encoding: Set by user. + * - decoding: unused + */ + int inter_threshold; + + /** + * quantizer noise shaping + * - encoding: Set by user. + * - decoding: unused + */ + int quantizer_noise_shaping; + + /** + * Motion estimation threshold below which no motion estimation is + * performed, but instead the user specified motion vectors are used. + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_threshold; + + /** + * Macroblock threshold below which the user specified macroblock types will be used. + * - encoding: Set by user. + * - decoding: unused + */ + int mb_threshold; + + /** + * precision of the intra DC coefficient - 8 + * - encoding: Set by user. + * - decoding: unused + */ + int intra_dc_precision; + + /** + * Number of macroblock rows at the top which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_top; + + /** + * Number of macroblock rows at the bottom which are skipped. + * - encoding: unused + * - decoding: Set by user. + */ + int skip_bottom; + + /** + * Border processing masking, raises the quantizer for mbs on the borders + * of the picture. + * - encoding: Set by user. + * - decoding: unused + */ + float border_masking; + + /** + * minimum MB lagrange multipler + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmin; + + /** + * maximum MB lagrange multipler + * - encoding: Set by user. + * - decoding: unused + */ + int mb_lmax; + + /** + * + * - encoding: Set by user. + * - decoding: unused + */ + int me_penalty_compensation; + + /** + * + * - encoding: Set by user. + * - decoding: unused + */ + int bidir_refine; + + /** + * + * - encoding: Set by user. + * - decoding: unused + */ + int brd_scale; + + /** + * minimum GOP size + * - encoding: Set by user. + * - decoding: unused + */ + int keyint_min; + + /** + * number of reference frames + * - encoding: Set by user. + * - decoding: Set by lavc. + */ + int refs; + + /** + * chroma qp offset from luma + * - encoding: Set by user. + * - decoding: unused + */ + int chromaoffset; + + /** + * Multiplied by qscale for each frame and added to scene_change_score. + * - encoding: Set by user. + * - decoding: unused + */ + int scenechange_factor; + + /** + * + * Note: Value depends upon the compare function used for fullpel ME. + * - encoding: Set by user. + * - decoding: unused + */ + int mv0_threshold; + + /** + * Adjust sensitivity of b_frame_strategy 1. + * - encoding: Set by user. + * - decoding: unused + */ + int b_sensitivity; + + /** + * Chromaticity coordinates of the source primaries. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorPrimaries color_primaries; + + /** + * Color Transfer Characteristic. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorTransferCharacteristic color_trc; + + /** + * YUV colorspace type. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorSpace colorspace; + + /** + * MPEG vs JPEG YUV range. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVColorRange color_range; + + /** + * This defines the location of chroma samples. + * - encoding: Set by user + * - decoding: Set by libavcodec + */ + enum AVChromaLocation chroma_sample_location; + + /** + * Number of slices. + * Indicates number of picture subdivisions. Used for parallelized + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; + + /** Field order + * - encoding: set by libavcodec + * - decoding: Set by libavcodec + */ + enum AVFieldOrder field_order; + + /* audio only */ + int sample_rate; ///< samples per second + int channels; ///< number of audio channels + + /** + * audio sample format + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVSampleFormat sample_fmt; ///< sample format + + /* The following data should not be initialized. */ + /** + * Samples per packet, initialized when calling 'init'. + */ + int frame_size; + int frame_number; ///< audio or video frame number + + /** + * number of bytes per packet if constant and known or 0 + * Used by some WAV based audio codecs. + */ + int block_align; + + /** + * Audio cutoff bandwidth (0 means "automatic") + * - encoding: Set by user. + * - decoding: unused + */ + int cutoff; + +#if FF_API_REQUEST_CHANNELS + /** + * 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. + */ + int request_channels; +#endif + + /** + * Audio channel layout. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + uint64_t channel_layout; + + /** + * Request decoder to use this channel layout if it can (0 for default) + * - encoding: unused + * - decoding: Set by user. + */ + uint64_t request_channel_layout; + + /** + * Type of service that the audio stream conveys. + * - encoding: Set by user. + * - decoding: Set by libavcodec. + */ + enum AVAudioServiceType audio_service_type; + + /** + * Used to request a sample format from the decoder. + * - encoding: unused. + * - decoding: Set by user. + */ + enum AVSampleFormat request_sample_fmt; + + /** + * 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 (*get_buffer)(struct AVCodecContext *c, AVFrame *pic); + + /** + * 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. + */ + void (*release_buffer)(struct AVCodecContext *c, AVFrame *pic); + + /** + * Called at the beginning of a frame to get cr buffer for it. + * Buffer type (size, hints) must be the same. libavcodec won't check it. + * libavcodec will pass previous buffer in pic, function should return + * same buffer or new buffer with old frame "painted" into it. + * If pic.data[0] == NULL must behave like get_buffer(). + * if CODEC_CAP_DR1 is not set then reget_buffer() must call + * avcodec_default_reget_buffer() instead of providing buffers allocated by + * some other means. + * - encoding: unused + * - decoding: Set by libavcodec, user can override. + */ + int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic); + + + /* - encoding parameters */ + float qcompress; ///< amount of qscale change between easy & hard scenes (0.0-1.0) + float qblur; ///< amount of qscale smoothing over time (0.0-1.0) + + /** + * minimum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmin; + + /** + * maximum quantizer + * - encoding: Set by user. + * - decoding: unused + */ + int qmax; + + /** + * maximum quantizer difference between frames + * - encoding: Set by user. + * - decoding: unused + */ + int max_qdiff; + + /** + * ratecontrol qmin qmax limiting method + * 0-> clipping, 1-> use a nice continous function to limit qscale wthin qmin/qmax. + * - encoding: Set by user. + * - decoding: unused + */ + float rc_qsquish; + + float rc_qmod_amp; + int rc_qmod_freq; + + /** + * decoder bitstream buffer size + * - encoding: Set by user. + * - decoding: unused + */ + int rc_buffer_size; + + /** + * ratecontrol override, see RcOverride + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + int rc_override_count; + RcOverride *rc_override; + + /** + * rate control equation + * - encoding: Set by user + * - decoding: unused + */ + const char *rc_eq; + + /** + * maximum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int rc_max_rate; + + /** + * minimum bitrate + * - encoding: Set by user. + * - decoding: unused + */ + int rc_min_rate; + + float rc_buffer_aggressivity; + + /** + * initial complexity for pass1 ratecontrol + * - encoding: Set by user. + * - decoding: unused + */ + float rc_initial_cplx; + + /** + * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_max_available_vbv_use; + + /** + * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. + * - encoding: Set by user. + * - decoding: unused. + */ + float rc_min_vbv_overflow_use; + + /** + * Number of bits which should be loaded into the rc buffer before decoding starts. + * - encoding: Set by user. + * - decoding: unused + */ + int rc_initial_buffer_occupancy; + +#define FF_CODER_TYPE_VLC 0 +#define FF_CODER_TYPE_AC 1 +#define FF_CODER_TYPE_RAW 2 +#define FF_CODER_TYPE_RLE 3 +#define FF_CODER_TYPE_DEFLATE 4 + /** + * coder type + * - encoding: Set by user. + * - decoding: unused + */ + int coder_type; + + /** + * context model + * - encoding: Set by user. + * - decoding: unused + */ + int context_model; + /** * minimum Lagrange multipler * - encoding: Set by user. @@ -2111,60 +2219,318 @@ typedef struct AVCodecContext { int lmax; /** - * noise reduction strength + * frame skip threshold * - encoding: Set by user. * - decoding: unused */ - int noise_reduction; + int frame_skip_threshold; /** - * Called at the beginning of a frame to get cr buffer for it. - * Buffer type (size, hints) must be the same. libavcodec won't check it. - * libavcodec will pass previous buffer in pic, function should return - * same buffer or new buffer with old frame "painted" into it. - * If pic.data[0] == NULL must behave like get_buffer(). - * if CODEC_CAP_DR1 is not set then reget_buffer() must call - * avcodec_default_reget_buffer() instead of providing buffers allocated by - * some other means. + * frame skip factor + * - encoding: Set by user. + * - decoding: unused + */ + int frame_skip_factor; + + /** + * frame skip exponent + * - encoding: Set by user. + * - decoding: unused + */ + int frame_skip_exp; + + /** + * frame skip comparison function + * - encoding: Set by user. + * - decoding: unused + */ + int frame_skip_cmp; + + /** + * trellis RD quantization + * - encoding: Set by user. + * - decoding: unused + */ + int trellis; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int min_prediction_order; + + /** + * - encoding: Set by user. + * - decoding: unused + */ + int max_prediction_order; + + /** + * GOP timecode frame start number, in non drop frame format + * - encoding: Set by user. + * - decoding: unused + */ + int64_t timecode_frame_start; + + /* 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); + + 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. */ + + /* 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; + + /** + * number of bits used for the previously encoded frame + * - encoding: Set by libavcodec. + * - decoding: unused + */ + int frame_bits; + + /** + * pass1 encoding statistics output buffer + * - encoding: Set by libavcodec. + * - decoding: unused + */ + char *stats_out; + + /** + * pass2 encoding statistics input buffer + * Concatenated stuff from stats_out of pass1 should be placed here. + * - encoding: Allocated/set/freed by user. + * - decoding: unused + */ + char *stats_in; + + /** + * Work around bugs in encoders which sometimes cannot be detected automatically. + * - encoding: Set by user + * - decoding: Set by user + */ + 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 + + /** + * strictly follow the standard (MPEG4, ...). + * - encoding: Set by user. + * - 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 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. + + /** + * error concealment flags * - encoding: unused - * - decoding: Set by libavcodec, user can override. + * - decoding: Set by user. */ - int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic); + int error_concealment; +#define FF_EC_GUESS_MVS 1 +#define FF_EC_DEBLOCK 2 /** - * Number of bits which should be loaded into the rc buffer before decoding starts. - * - encoding: Set by user. - * - decoding: unused - */ - int rc_initial_buffer_occupancy; - - /** - * - * - encoding: Set by user. - * - decoding: unused - */ - int inter_threshold; - - /** - * CODEC_FLAG2_* + * debug * - encoding: Set by user. * - decoding: Set by user. */ - int flags2; + 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 /** - * Simulates errors in the bitstream to test error concealment. + * debug + * - encoding: Set by user. + * - decoding: Set by user. + */ + 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 + + /** + * Error recognition; may misdetect some more or less valid parts as errors. + * - 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) + + /** + * 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. + */ + int64_t reordered_opaque; + + /** + * Hardware accelerator in use + * - encoding: unused. + * - decoding: Set by libavcodec + */ + struct AVHWAccel *hwaccel; + + /** + * 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 + * 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 + */ + uint64_t error[AV_NUM_DATA_POINTERS]; + + /** + * DCT algorithm, see FF_DCT_* below * - encoding: Set by user. * - decoding: unused */ - int error_rate; + int dct_algo; +#define FF_DCT_AUTO 0 +#define FF_DCT_FASTINT 1 +#define FF_DCT_INT 2 +#define FF_DCT_MMX 3 +#define FF_DCT_ALTIVEC 5 +#define FF_DCT_FAAN 6 /** - * quantizer noise shaping + * IDCT algorithm, see FF_IDCT_* below. * - encoding: Set by user. - * - decoding: unused + * - decoding: Set by user. */ - int quantizer_noise_shaping; + int idct_algo; +#define FF_IDCT_AUTO 0 +#define FF_IDCT_INT 1 +#define FF_IDCT_SIMPLE 2 +#define FF_IDCT_SIMPLEMMX 3 +#define FF_IDCT_LIBMPEG2MMX 4 +#define FF_IDCT_MMI 5 +#define FF_IDCT_ARM 7 +#define FF_IDCT_ALTIVEC 8 +#define FF_IDCT_SH4 9 +#define FF_IDCT_SIMPLEARM 10 +#define FF_IDCT_H264 11 +#define FF_IDCT_VP3 12 +#define FF_IDCT_IPP 13 +#define FF_IDCT_XVIDMMX 14 +#define FF_IDCT_CAVS 15 +#define FF_IDCT_SIMPLEARMV5TE 16 +#define FF_IDCT_SIMPLEARMV6 17 +#define FF_IDCT_SIMPLEVIS 18 +#define FF_IDCT_WMV2 19 +#define FF_IDCT_FAAN 20 +#define FF_IDCT_EA 21 +#define FF_IDCT_SIMPLENEON 22 +#define FF_IDCT_SIMPLEALPHA 23 +#define FF_IDCT_BINK 24 + + /** + * dsp_mask could be add used to disable unwanted CPU features + * CPU features (i.e. MMX, SSE. ...) + * + * With the FORCE flag you may instead enable given CPU features. + * (Dangerous: Usable in case of misdetection, improper usage however will + * result into program crash.) + */ + unsigned dsp_mask; + + /** + * bits per sample/pixel from the demuxer (needed for huffyuv). + * - encoding: Set by libavcodec. + * - decoding: Set by user. + */ + int bits_per_coded_sample; + + /** + * Bits per sample/pixel of internal libavcodec pixel/sample format. + * - encoding: set by user. + * - decoding: set by libavcodec. + */ + int bits_per_raw_sample; + + /** + * low resolution decoding, 1-> 1/2 size, 2->1/4 size + * - encoding: unused + * - decoding: Set by user. + */ + int lowres; + + /** + * the picture in the bitstream + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + AVFrame *coded_frame; /** * thread count @@ -2174,6 +2540,35 @@ typedef struct AVCodecContext { */ int thread_count; + /** + * 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. + */ + 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 + + /** + * Which multithreading methods are in use by the codec. + * - encoding: Set by libavcodec. + * - decoding: Set by libavcodec. + */ + int active_thread_type; + + /** + * 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. + * - decoding: Set by user. + */ + int thread_safe_callbacks; + /** * The codec may call this to execute several independent things. * It will return only after finishing all tasks. @@ -2185,6 +2580,26 @@ typedef struct AVCodecContext { */ int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size); + /** + * The codec may call this to execute several independent things. + * It will return only after finishing all tasks. + * The user may replace this with some multithreaded implementation, + * the default implementation will execute the parts serially. + * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. + * @param c context passed also to func + * @param count the number of things to execute + * @param arg2 argument passed unchanged to func + * @param ret return values of executed functions, must have space for "count" values. May be NULL. + * @param func function that will be called count times, with jobnr from 0 to count-1. + * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no + * two instances of func executing at the same time will have the same threadnr. + * @return always 0 currently, but code should handle a future improvement where when any call to func + * returns < 0 no further calls to func may be done and < 0 is returned. + * - encoding: Set by libavcodec, user can override. + * - decoding: Set by libavcodec, user can override. + */ + int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); + /** * thread opaque * Can be used by execute() to store some per AVCodecContext stuff. @@ -2193,29 +2608,6 @@ typedef struct AVCodecContext { */ void *thread_opaque; - /** - * Motion estimation threshold below which no motion estimation is - * performed, but instead the user specified motion vectors are used. - * - * - encoding: Set by user. - * - decoding: unused - */ - int me_threshold; - - /** - * Macroblock threshold below which the user specified macroblock types will be used. - * - encoding: Set by user. - * - decoding: unused - */ - int mb_threshold; - - /** - * precision of the intra DC coefficient - 8 - * - encoding: Set by user. - * - decoding: unused - */ - int intra_dc_precision; - /** * noise vs. sse weight for the nsse comparsion function * - encoding: Set by user. @@ -2223,20 +2615,6 @@ typedef struct AVCodecContext { */ int nsse_weight; - /** - * Number of macroblock rows at the top which are skipped. - * - encoding: unused - * - decoding: Set by user. - */ - int skip_top; - - /** - * Number of macroblock rows at the bottom which are skipped. - * - encoding: unused - * - decoding: Set by user. - */ - int skip_bottom; - /** * profile * - encoding: Set by user. @@ -2311,77 +2689,6 @@ typedef struct AVCodecContext { int level; #define FF_LEVEL_UNKNOWN -99 - /** - * low resolution decoding, 1-> 1/2 size, 2->1/4 size - * - encoding: unused - * - decoding: Set by user. - */ - int lowres; - - /** - * Bitstream width / height, may be different from width/height if lowres enabled. - * - encoding: unused - * - decoding: Set by user before init if known. Codec should override / dynamically change if needed. - */ - int coded_width, coded_height; - - /** - * frame skip threshold - * - encoding: Set by user. - * - decoding: unused - */ - int frame_skip_threshold; - - /** - * frame skip factor - * - encoding: Set by user. - * - decoding: unused - */ - int frame_skip_factor; - - /** - * frame skip exponent - * - encoding: Set by user. - * - decoding: unused - */ - int frame_skip_exp; - - /** - * frame skip comparison function - * - encoding: Set by user. - * - decoding: unused - */ - int frame_skip_cmp; - - /** - * Border processing masking, raises the quantizer for mbs on the borders - * of the picture. - * - encoding: Set by user. - * - decoding: unused - */ - float border_masking; - - /** - * minimum MB lagrange multipler - * - encoding: Set by user. - * - decoding: unused - */ - int mb_lmin; - - /** - * maximum MB lagrange multipler - * - encoding: Set by user. - * - decoding: unused - */ - int mb_lmax; - - /** - * - * - encoding: Set by user. - * - decoding: unused - */ - int me_penalty_compensation; - /** * * - encoding: unused @@ -2403,251 +2710,6 @@ typedef struct AVCodecContext { */ enum AVDiscard skip_frame; - /** - * - * - encoding: Set by user. - * - decoding: unused - */ - int bidir_refine; - - /** - * - * - encoding: Set by user. - * - decoding: unused - */ - int brd_scale; - - /** - * minimum GOP size - * - encoding: Set by user. - * - decoding: unused - */ - int keyint_min; - - /** - * number of reference frames - * - encoding: Set by user. - * - decoding: Set by lavc. - */ - int refs; - - /** - * chroma qp offset from luma - * - encoding: Set by user. - * - decoding: unused - */ - int chromaoffset; - - /** - * trellis RD quantization - * - encoding: Set by user. - * - decoding: unused - */ - int trellis; - - /** - * Audio cutoff bandwidth (0 means "automatic") - * - encoding: Set by user. - * - decoding: unused - */ - int cutoff; - - /** - * Multiplied by qscale for each frame and added to scene_change_score. - * - encoding: Set by user. - * - decoding: unused - */ - int scenechange_factor; - - /** - * - * Note: Value depends upon the compare function used for fullpel ME. - * - encoding: Set by user. - * - decoding: unused - */ - int mv0_threshold; - - /** - * Adjust sensitivity of b_frame_strategy 1. - * - encoding: Set by user. - * - decoding: unused - */ - int b_sensitivity; - - /** - * - encoding: Set by user. - * - decoding: unused - */ - int compression_level; -#define FF_COMPRESSION_DEFAULT -1 - - /** - * - encoding: Set by user. - * - decoding: unused - */ - int min_prediction_order; - - /** - * - encoding: Set by user. - * - decoding: unused - */ - int max_prediction_order; - - /** - * GOP timecode frame start number, in non drop frame format - * - encoding: Set by user. - * - decoding: unused - */ - int64_t timecode_frame_start; - -#if FF_API_REQUEST_CHANNELS - /** - * 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. - */ - int request_channels; -#endif - - /** - * 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. - */ - int64_t reordered_opaque; - - /** - * Bits per sample/pixel of internal libavcodec pixel/sample format. - * - encoding: set by user. - * - decoding: set by libavcodec. - */ - int bits_per_raw_sample; - - /** - * Audio channel layout. - * - encoding: set by user. - * - decoding: set by libavcodec. - */ - uint64_t channel_layout; - - /** - * Request decoder to use this channel layout if it can (0 for default) - * - encoding: unused - * - decoding: Set by user. - */ - uint64_t request_channel_layout; - - /** - * Ratecontrol attempt to use, at maximum, of what can be used without an underflow. - * - encoding: Set by user. - * - decoding: unused. - */ - float rc_max_available_vbv_use; - - /** - * Ratecontrol attempt to use, at least, times the amount needed to prevent a vbv overflow. - * - encoding: Set by user. - * - decoding: unused. - */ - float rc_min_vbv_overflow_use; - - /** - * Hardware accelerator in use - * - encoding: unused. - * - decoding: Set by libavcodec - */ - struct AVHWAccel *hwaccel; - - /** - * 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 ticks_per_frame; - - /** - * 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 - * is. e.g. for VA API, this is a struct vaapi_context. - * - encoding: unused - * - decoding: Set by user - */ - void *hwaccel_context; - - /** - * Chromaticity coordinates of the source primaries. - * - encoding: Set by user - * - decoding: Set by libavcodec - */ - enum AVColorPrimaries color_primaries; - - /** - * Color Transfer Characteristic. - * - encoding: Set by user - * - decoding: Set by libavcodec - */ - enum AVColorTransferCharacteristic color_trc; - - /** - * YUV colorspace type. - * - encoding: Set by user - * - decoding: Set by libavcodec - */ - enum AVColorSpace colorspace; - - /** - * MPEG vs JPEG YUV range. - * - encoding: Set by user - * - decoding: Set by libavcodec - */ - enum AVColorRange color_range; - - /** - * This defines the location of chroma samples. - * - encoding: Set by user - * - decoding: Set by libavcodec - */ - enum AVChromaLocation chroma_sample_location; - - /** - * The codec may call this to execute several independent things. - * It will return only after finishing all tasks. - * The user may replace this with some multithreaded implementation, - * the default implementation will execute the parts serially. - * Also see avcodec_thread_init and e.g. the --enable-pthread configure option. - * @param c context passed also to func - * @param count the number of things to execute - * @param arg2 argument passed unchanged to func - * @param ret return values of executed functions, must have space for "count" values. May be NULL. - * @param func function that will be called count times, with jobnr from 0 to count-1. - * threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no - * two instances of func executing at the same time will have the same threadnr. - * @return always 0 currently, but code should handle a future improvement where when any call to func - * returns < 0 no further calls to func may be done and < 0 is returned. - * - encoding: Set by libavcodec, user can override. - * - decoding: Set by libavcodec, user can override. - */ - 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; - - /** - * Number of slices. - * Indicates number of picture subdivisions. Used for parallelized - * decoding. - * - encoding: Set by user - * - decoding: unused - */ - int slices; - /** * Header containing style information for text subtitles. * For SUBTITLE_ASS subtitle type, it should contain the whole ASS @@ -2659,6 +2721,13 @@ typedef struct AVCodecContext { uint8_t *subtitle_header; int subtitle_header_size; + /** + * Simulates errors in the bitstream to test error concealment. + * - encoding: Set by user. + * - decoding: unused + */ + int error_rate; + /** * Current packet as passed into the decoder, to avoid having * to pass the packet into every function. Currently only valid @@ -2668,35 +2737,6 @@ typedef struct AVCodecContext { */ AVPacket *pkt; - /** - * 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. - */ - 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 - - /** - * Which multithreading methods are in use by the codec. - * - encoding: Set by libavcodec. - * - decoding: Set by libavcodec. - */ - int active_thread_type; - - /** - * 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. - * - decoding: Set by user. - */ - int thread_safe_callbacks; - /** * VBV delay coded in the last frame (in periods of a 27 MHz clock). * Used for compliant TS muxing. @@ -2704,45 +2744,6 @@ typedef struct AVCodecContext { * - decoding: unused. */ uint64_t vbv_delay; - - /** - * Type of service that the audio stream conveys. - * - encoding: Set by user. - * - decoding: Set by libavcodec. - */ - enum AVAudioServiceType audio_service_type; - - /** - * Used to request a sample format from the decoder. - * - encoding: unused. - * - decoding: Set by user. - */ - enum AVSampleFormat request_sample_fmt; - - /** - * Error recognition; may misdetect some more or less valid parts as errors. - * - 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) - - /** - * 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 - */ - enum AVFieldOrder field_order; } AVCodecContext; /** diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index a4e3081272..f17f34e8e1 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -465,7 +465,7 @@ static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src) dst->slice_flags = src->slice_flags; dst->flags2 = src->flags2; - copy_fields(skip_loop_filter, bidir_refine); + copy_fields(skip_loop_filter, subtitle_header); dst->frame_number = src->frame_number; dst->reordered_opaque = src->reordered_opaque; From f5f5b154e7948c7bc94e43c46b5e5bef6f6d60da Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sun, 26 Feb 2012 11:52:24 +0100 Subject: [PATCH 03/12] doc/APIchanges: fill in missing dates and hashes. --- doc/APIchanges | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 0cdb3be158..8b12de0bad 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -12,19 +12,19 @@ libavutil: 2011-04-18 API changes, most recent first: -2012-xx-xx - xxxxxxx - lavu 51.24.0 - error.h +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 From 681d17264f8ae069d43d5fe5369b4b17e225ea9f Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 26 Feb 2012 17:17:13 -0500 Subject: [PATCH 04/12] movenc: factorize calculation of cluster duration into a separate function --- libavformat/movenc.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 2c6a6e1864..e2781accbe 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -551,6 +551,21 @@ static int mov_get_lpcm_flags(enum CodecID codec_id) } } +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 mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -1107,9 +1122,7 @@ static int mov_write_stts_tag(AVIOContext *pb, MOVTrack *track) av_malloc(track->entry * sizeof(*stts_entries)) : /* worst case */ NULL; for (i=0; ientry; i++) { - int64_t duration = i + 1 == track->entry ? - track->track_duration - track->cluster[i].dts + track->start_dts : /* readjusting */ - track->cluster[i+1].dts - track->cluster[i].dts; + int duration = get_cluster_duration(track, i); if (i && duration == stts_entries[entries].duration) { stts_entries[entries].count++; /* compress */ } else { @@ -2235,10 +2248,7 @@ static int mov_write_trun_tag(AVIOContext *pb, MOVTrack *track) int i; for (i = 0; i < track->entry; i++) { - int64_t duration = i + 1 == track->entry ? - track->track_duration - track->cluster[i].dts + track->start_dts : - track->cluster[i + 1].dts - track->cluster[i].dts; - if (duration != track->default_duration) + if (get_cluster_duration(track, i) != track->default_duration) flags |= MOV_TRUN_SAMPLE_DURATION; if (track->cluster[i].size != track->default_size) flags |= MOV_TRUN_SAMPLE_SIZE; @@ -2262,11 +2272,8 @@ static int mov_write_trun_tag(AVIOContext *pb, MOVTrack *track) avio_wb32(pb, get_sample_flags(track, &track->cluster[0])); for (i = 0; i < track->entry; i++) { - int64_t duration = i + 1 == track->entry ? - track->track_duration - track->cluster[i].dts + track->start_dts : - track->cluster[i + 1].dts - track->cluster[i].dts; if (flags & MOV_TRUN_SAMPLE_DURATION) - avio_wb32(pb, duration); + avio_wb32(pb, get_cluster_duration(track, i)); if (flags & MOV_TRUN_SAMPLE_SIZE) avio_wb32(pb, track->cluster[i].size); if (flags & MOV_TRUN_SAMPLE_FLAGS) From f3dab5fb6d6290721038dea2e5b1778abecd232d Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 26 Feb 2012 17:21:07 -0500 Subject: [PATCH 05/12] movenc: use the first cluster duration as the tfhd default duration --- libavformat/movenc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index e2781accbe..a74dd2e683 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2215,7 +2215,7 @@ static int mov_write_tfhd_tag(AVIOContext *pb, MOVTrack *track, if (flags & MOV_TFHD_BASE_DATA_OFFSET) avio_wb64(pb, moof_offset); if (flags & MOV_TFHD_DEFAULT_DURATION) { - track->default_duration = track->audio_vbr ? track->enc->frame_size : 1; + track->default_duration = get_cluster_duration(track, 0); avio_wb32(pb, track->default_duration); } if (flags & MOV_TFHD_DEFAULT_SIZE) { From f234e8a32e6c69d7b63f8627f278be7c2c987f43 Mon Sep 17 00:00:00 2001 From: Justin Ruggles Date: Sun, 26 Feb 2012 16:25:46 -0500 Subject: [PATCH 06/12] movenc: use timestamps instead of frame_size for samples-per-packet For encoding, AVCodecContext.frame_size is the number of input samples to send to the encoder and does not necessarily correspond directly to the timestamps of the output packets. --- libavformat/movenc.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index a74dd2e683..10bcedc66a 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -566,6 +566,25 @@ static int get_cluster_duration(MOVTrack *track, int cluster_idx) return next_dts - track->cluster[cluster_idx].dts; } +static int get_samples_per_packet(MOVTrack *track) +{ + int i, first_duration; + + /* 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); @@ -602,7 +621,7 @@ static int mov_write_audio_tag(AVIOContext *pb, MOVTrack *track) 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->audio_vbr ? track->enc->frame_size : 1); + avio_wb32(pb, get_samples_per_packet(track)); } else { /* reserved for mp4/3gp */ avio_wb16(pb, 2); @@ -3112,10 +3131,6 @@ static int mov_write_header(AVFormatContext *s) } /* set audio_vbr for compressed audio */ if (av_get_bits_per_sample(st->codec->codec_id) < 8) { - if (!st->codec->frame_size && track->mode == MODE_MOV) { - av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i); - goto error; - } track->audio_vbr = 1; } if (track->mode != MODE_MOV) { From 1a6b9a98ceacc3aca35ab354f9e97e3ac01b0ded Mon Sep 17 00:00:00 2001 From: Tommy Winther Date: Wed, 12 Oct 2011 12:26:45 +0300 Subject: [PATCH 07/12] rtsp: Handle requests from server to client MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This returns 200 OK for OPTIONS requests and 501 Not Implemented for all other requests. Even though this doesn't do much actual handling of the requests, it makes the code properly identify server requests as such, instead of interpreting it as a reply to the client's request as it did before. Signed-off-by: Martin Storsjö --- libavformat/rtsp.c | 58 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index 29994e4eb3..dd79407036 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -900,9 +900,13 @@ int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply, char buf[4096], buf1[1024], *q; unsigned char ch; const char *p; - int ret, content_length, line_count = 0; + int ret, content_length, line_count = 0, request = 0; unsigned char *content = NULL; +start: + line_count = 0; + request = 0; + content = NULL; memset(reply, 0, sizeof(*reply)); /* parse reply (XXX: use buffers) */ @@ -938,9 +942,15 @@ int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply, if (line_count == 0) { /* get reply code */ get_word(buf1, sizeof(buf1), &p); - get_word(buf1, sizeof(buf1), &p); - reply->status_code = atoi(buf1); - av_strlcpy(reply->reason, p, sizeof(reply->reason)); + if (!strncmp(buf1, "RTSP/", 5)) { + get_word(buf1, sizeof(buf1), &p); + reply->status_code = atoi(buf1); + av_strlcpy(reply->reason, p, sizeof(reply->reason)); + } else { + av_strlcpy(reply->reason, buf1, sizeof(reply->reason)); // method + get_word(buf1, sizeof(buf1), &p); // object + request = 1; + } } else { ff_rtsp_parse_line(reply, p, rt, method); av_strlcat(rt->last_reply, p, sizeof(rt->last_reply)); @@ -949,7 +959,7 @@ int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply, line_count++; } - if (rt->session_id[0] == '\0' && reply->session_id[0] != '\0') + if (rt->session_id[0] == '\0' && reply->session_id[0] != '\0' && !request) av_strlcpy(rt->session_id, reply->session_id, sizeof(rt->session_id)); content_length = reply->content_length; @@ -964,6 +974,44 @@ int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply, else av_free(content); + if (request) { + char buf[1024]; + char base64buf[AV_BASE64_SIZE(sizeof(buf))]; + const char* ptr = buf; + + if (!strcmp(reply->reason, "OPTIONS")) { + snprintf(buf, sizeof(buf), "RTSP/1.0 200 OK\r\n"); + if (reply->seq) + av_strlcatf(buf, sizeof(buf), "CSeq: %d\r\n", reply->seq); + if (reply->session_id[0]) + av_strlcatf(buf, sizeof(buf), "Session: %s\r\n", + reply->session_id); + } else { + snprintf(buf, sizeof(buf), "RTSP/1.0 501 Not Implemented\r\n"); + } + av_strlcat(buf, "\r\n", sizeof(buf)); + + if (rt->control_transport == RTSP_MODE_TUNNEL) { + av_base64_encode(base64buf, sizeof(base64buf), buf, strlen(buf)); + ptr = base64buf; + } + ffurl_write(rt->rtsp_hd_out, ptr, strlen(ptr)); + + rt->last_cmd_time = av_gettime(); + /* Even if the request from the server had data, it is not the data + * that the caller wants or expects. The memory could also be leaked + * if the actual following reply has content data. */ + if (content_ptr) + av_freep(content_ptr); + /* If method is set, this is called from ff_rtsp_send_cmd, + * where a reply to exactly this request is awaited. For + * callers from within packet reciving, we just want to + * return to the caller and go back to receiving packets. */ + if (method) + goto start; + return 0; + } + if (rt->seq != reply->seq) { av_log(s, AV_LOG_WARNING, "CSeq %d expected, %d received.\n", rt->seq, reply->seq); From 7e297a46dba68f55b4d83cac5e5646c6485e096a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sat, 25 Feb 2012 16:08:06 +0200 Subject: [PATCH 08/12] flvdec: Validate index entries added from metadata while reading MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By validating the index entries while reading, we don't need to seek at startup to validate the entries. If the error in the index entries is not pointing to (our definition of) the start of packets, and there is an index entry pointing at some of the first packets after the metadata, the invalid index can be discarded almost immediately. Signed-off-by: Martin Storsjö --- libavformat/flvdec.c | 55 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index 01c67b48a5..d2b09b27e5 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -39,12 +39,20 @@ #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]; 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,6 +145,7 @@ static int amf_get_string(AVIOContext *ioc, char *buffer, int buffsize) { } static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream *vstream, int64_t max_pos) { + FLVContext *flv = s->priv_data; unsigned int arraylen = 0, timeslen = 0, fileposlen = 0, i; double num_val; char str_val[256]; @@ -206,11 +215,17 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream } } - if (!ret && timeslen == fileposlen) - for (i = 0; i < fileposlen; i++) + if (!ret && timeslen == fileposlen) { + 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 av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n"); finish: @@ -434,6 +449,22 @@ static int flv_queue_extradata(FLVContext *flv, AVIOContext *pb, int stream, return 0; } +static void clear_index_entries(AVFormatContext *s, int64_t pos) +{ + int i, j, out; + av_log(s, AV_LOG_WARNING, "Found invalid index entries, clearing the index.\n"); + for (i = 0; i < s->nb_streams; i++) { + AVStream *st = s->streams[i]; + /* Remove all index entries that point to >= pos */ + out = 0; + for (j = 0; j < st->nb_index_entries; j++) { + if (st->index_entries[j].pos < pos) + st->index_entries[out++] = st->index_entries[j]; + } + st->nb_index_entries = out; + } +} + static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) { FLVContext *flv = s->priv_data; @@ -455,6 +486,22 @@ static int flv_read_packet(AVFormatContext *s, AVPacket *pkt) avio_skip(s->pb, 3); /* stream id, always 0 */ flags = 0; + if (flv->validate_next < flv->validate_count) { + int64_t validate_pos = flv->validate_index[flv->validate_next].pos; + if (pos == validate_pos) { + if (FFABS(dts - flv->validate_index[flv->validate_next].dts) <= + VALIDATE_INDEX_TS_THRESH) { + flv->validate_next++; + } else { + clear_index_entries(s, validate_pos); + flv->validate_count = 0; + } + } else if (pos > validate_pos) { + clear_index_entries(s, validate_pos); + flv->validate_count = 0; + } + } + if(size == 0) continue; @@ -633,6 +680,8 @@ leave: static int flv_read_seek(AVFormatContext *s, int stream_index, int64_t ts, int flags) { + FLVContext *flv = s->priv_data; + flv->validate_count = 0; return avio_seek_time(s->pb, stream_index, ts, flags); } From e60bdb7e5ce55505599fe13238ae54d98c2cc0f7 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Thu, 29 Dec 2011 23:23:34 +0100 Subject: [PATCH 09/12] flvdec: Remove the now redundant check for known broken metadata creator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The index validation identifies these indexes as broken. Signed-off-by: Martin Storsjö --- libavformat/flvdec.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/libavformat/flvdec.c b/libavformat/flvdec.c index d2b09b27e5..55ac9dab3f 100644 --- a/libavformat/flvdec.c +++ b/libavformat/flvdec.c @@ -153,18 +153,6 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream int64_t *filepositions = NULL; int ret = AVERROR(ENOSYS); int64_t initial_pos = avio_tell(ioc); - AVDictionaryEntry *creator = av_dict_get(s->metadata, "metadatacreator", - NULL, 0); - - if (creator && !strcmp(creator->value, "MEGA")) { - /* Files with this metadatacreator tag seem to have filepositions - * pointing at the 4 trailer bytes of the previous packet, - * which isn't the norm (nor what we expect here, nor what - * jwplayer + lighttpd expect, nor what flvtool2 produces). - * Just ignore the index in this case, instead of risking trying - * to adjust it to something that might or might not work. */ - return 0; - } if (s->flags & AVFMT_FLAG_IGNIDX) return 0; From b0c4f04338234ee011d7b704621347ef232294fe Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Sun, 26 Feb 2012 08:57:14 -0800 Subject: [PATCH 10/12] h264: fix mmxext chroma deblock to use correct TC values. --- libavcodec/x86/h264_deblock_10bit.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/x86/h264_deblock_10bit.asm b/libavcodec/x86/h264_deblock_10bit.asm index a4ccafc68f..ae385e0224 100644 --- a/libavcodec/x86/h264_deblock_10bit.asm +++ b/libavcodec/x86/h264_deblock_10bit.asm @@ -870,7 +870,7 @@ cglobal deblock_v_chroma_10_%1, 5,7-(mmsize/16),8*(mmsize/16) %if mmsize < 16 add r0, mmsize add r5, mmsize - add r4, mmsize/8 + add r4, mmsize/4 dec r6 jg .loop REP_RET From 273f4b39fcc624a3a1cf79fe6d1bfc6d977b4a05 Mon Sep 17 00:00:00 2001 From: Derek Buitenhuis Date: Fri, 24 Feb 2012 11:41:06 -0500 Subject: [PATCH 11/12] fate: Overhaul WavPack coverage WavPack has a comprehensive test suite, and a bunch of corner cases. Signed-off-by: Derek Buitenhuis Signed-off-by: Ronald S. Bultje --- tests/Makefile | 1 + tests/fate/lossless-audio.mak | 3 - tests/fate/wavpack.mak | 87 +++++++++++++++++++++++ tests/ref/fate/lossless-wavpack | 1 - tests/ref/fate/wavpack-channels-4.0 | 1 + tests/ref/fate/wavpack-channels-5.1 | 1 + tests/ref/fate/wavpack-channels-6.1 | 1 + tests/ref/fate/wavpack-channels-7.1 | 1 + tests/ref/fate/wavpack-channels-monofloat | 1 + tests/ref/fate/wavpack-channels-monoint | 1 + tests/ref/fate/wavpack-clipping | 1 + tests/ref/fate/wavpack-cuesheet | 1 + tests/ref/fate/wavpack-falsestereo | 1 + tests/ref/fate/wavpack-lossless-12bit | 1 + tests/ref/fate/wavpack-lossless-16bit | 1 + tests/ref/fate/wavpack-lossless-24bit | 1 + tests/ref/fate/wavpack-lossless-32bit | 1 + tests/ref/fate/wavpack-lossless-8bit | 1 + tests/ref/fate/wavpack-lossless-float | 1 + tests/ref/fate/wavpack-lossy-16bit | 1 + tests/ref/fate/wavpack-lossy-24bit | 1 + tests/ref/fate/wavpack-lossy-32bit | 1 + tests/ref/fate/wavpack-lossy-8bit | 1 + tests/ref/fate/wavpack-lossy-float | 1 + tests/ref/fate/wavpack-matroskamode | 1 + tests/ref/fate/wavpack-speed-default | 1 + tests/ref/fate/wavpack-speed-fast | 1 + tests/ref/fate/wavpack-speed-high | 1 + tests/ref/fate/wavpack-speed-vhigh | 1 + tests/ref/fate/wavpack-zerolsbs | 1 + 30 files changed, 114 insertions(+), 4 deletions(-) create mode 100644 tests/fate/wavpack.mak delete mode 100644 tests/ref/fate/lossless-wavpack create mode 100644 tests/ref/fate/wavpack-channels-4.0 create mode 100644 tests/ref/fate/wavpack-channels-5.1 create mode 100644 tests/ref/fate/wavpack-channels-6.1 create mode 100644 tests/ref/fate/wavpack-channels-7.1 create mode 100644 tests/ref/fate/wavpack-channels-monofloat create mode 100644 tests/ref/fate/wavpack-channels-monoint create mode 100644 tests/ref/fate/wavpack-clipping create mode 100644 tests/ref/fate/wavpack-cuesheet create mode 100644 tests/ref/fate/wavpack-falsestereo create mode 100644 tests/ref/fate/wavpack-lossless-12bit create mode 100644 tests/ref/fate/wavpack-lossless-16bit create mode 100644 tests/ref/fate/wavpack-lossless-24bit create mode 100644 tests/ref/fate/wavpack-lossless-32bit create mode 100644 tests/ref/fate/wavpack-lossless-8bit create mode 100644 tests/ref/fate/wavpack-lossless-float create mode 100644 tests/ref/fate/wavpack-lossy-16bit create mode 100644 tests/ref/fate/wavpack-lossy-24bit create mode 100644 tests/ref/fate/wavpack-lossy-32bit create mode 100644 tests/ref/fate/wavpack-lossy-8bit create mode 100644 tests/ref/fate/wavpack-lossy-float create mode 100644 tests/ref/fate/wavpack-matroskamode create mode 100644 tests/ref/fate/wavpack-speed-default create mode 100644 tests/ref/fate/wavpack-speed-fast create mode 100644 tests/ref/fate/wavpack-speed-high create mode 100644 tests/ref/fate/wavpack-speed-vhigh create mode 100644 tests/ref/fate/wavpack-zerolsbs diff --git a/tests/Makefile b/tests/Makefile index fcbb55eccf..6fed995e0a 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -58,6 +58,7 @@ include $(SRC_PATH)/tests/fate/voice.mak include $(SRC_PATH)/tests/fate/vorbis.mak include $(SRC_PATH)/tests/fate/vpx.mak include $(SRC_PATH)/tests/fate/vqf.mak +include $(SRC_PATH)/tests/fate/wavpack.mak include $(SRC_PATH)/tests/fate/wma.mak FATE_ACODEC = $(ACODEC_TESTS:%=fate-acodec-%) diff --git a/tests/fate/lossless-audio.mak b/tests/fate/lossless-audio.mak index 0a81b78677..f35d659264 100644 --- a/tests/fate/lossless-audio.mak +++ b/tests/fate/lossless-audio.mak @@ -12,6 +12,3 @@ fate-lossless-shorten: CMD = md5 -i $(SAMPLES)/lossless-audio/luckynight-partial FATE_TESTS += fate-lossless-tta fate-lossless-tta: CMD = crc -i $(SAMPLES)/lossless-audio/inside.tta - -FATE_TESTS += fate-lossless-wavpack -fate-lossless-wavpack: CMD = md5 -i $(SAMPLES)/lossless-audio/luckynight-partial.wv -f s16le diff --git a/tests/fate/wavpack.mak b/tests/fate/wavpack.mak new file mode 100644 index 0000000000..2807b26e95 --- /dev/null +++ b/tests/fate/wavpack.mak @@ -0,0 +1,87 @@ +# Lossless + +FATE_TESTS += fate-wavpack-lossless-float +fate-wavpack-lossless-float: CMD = md5 -i $(SAMPLES)/wavpack/lossless/32bit_float-partial.wv -f f32le + +FATE_TESTS += fate-wavpack-lossless-8bit +fate-wavpack-lossless-8bit: CMD = md5 -i $(SAMPLES)/wavpack/lossless/8bit-partial.wv -f s8 + +FATE_TESTS += fate-wavpack-lossless-12bit +fate-wavpack-lossless-12bit: CMD = md5 -i $(SAMPLES)/wavpack/lossless/12bit-partial.wv -f s16le + +FATE_TESTS += fate-wavpack-lossless-16bit +fate-wavpack-lossless-16bit: CMD = md5 -i $(SAMPLES)/wavpack/lossless/16bit-partial.wv -f s16le + +FATE_TESTS += fate-wavpack-lossless-24bit +fate-wavpack-lossless-24bit: CMD = md5 -i $(SAMPLES)/wavpack/lossless/24bit-partial.wv -f s24le + +FATE_TESTS += fate-wavpack-lossless-32bit +fate-wavpack-lossless-32bit: CMD = md5 -i $(SAMPLES)/wavpack/lossless/32bit_int-partial.wv -f s32le + +# Lossy + +FATE_TESTS += fate-wavpack-lossy-float +fate-wavpack-lossy-float: CMD = md5 -i $(SAMPLES)/wavpack/lossy/2.0_32-bit_float.wv -f f32le + +FATE_TESTS += fate-wavpack-lossy-8bit +fate-wavpack-lossy-8bit: CMD = md5 -i $(SAMPLES)/wavpack/lossy/4.0_8-bit.wv -f s8 + +FATE_TESTS += fate-wavpack-lossy-16bit +fate-wavpack-lossy-16bit: CMD = md5 -i $(SAMPLES)/wavpack/lossy/4.0_16-bit.wv -f s16le + +FATE_TESTS += fate-wavpack-lossy-24bit +fate-wavpack-lossy-24bit: CMD = md5 -i $(SAMPLES)/wavpack/lossy/4.0_24-bit.wv -f s24le + +FATE_TESTS += fate-wavpack-lossy-32bit +fate-wavpack-lossy-32bit: CMD = md5 -i $(SAMPLES)/wavpack/lossy/4.0_32-bit_int.wv -f s32le + +# Channel configurations + +FATE_TESTS += fate-wavpack-channels-monofloat +fate-wavpack-channels-monofloat: CMD = md5 -i $(SAMPLES)/wavpack/num_channels/mono_float-partial.wv -f f32le + +FATE_TESTS += fate-wavpack-channels-monoint +fate-wavpack-channels-monoint: CMD = md5 -i $(SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -f s16le + +FATE_TESTS += fate-wavpack-channels-4.0 +fate-wavpack-channels-4.0: CMD = md5 -i $(SAMPLES)/wavpack/num_channels/edward_4.0_16bit-partial.wv -f s16le + +FATE_TESTS += fate-wavpack-channels-5.1 +fate-wavpack-channels-5.1: CMD = md5 -i $(SAMPLES)/wavpack/num_channels/panslab_sample_5.1_16bit-partial.wv -f s16le + +FATE_TESTS += fate-wavpack-channels-6.1 +fate-wavpack-channels-6.1: CMD = md5 -i $(SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -f s16le + +FATE_TESTS += fate-wavpack-channels-7.1 +fate-wavpack-channels-7.1: CMD = md5 -i $(SAMPLES)/wavpack/num_channels/panslab_sample_7.1_16bit-partial.wv -f s16le + +# Speed modes + +FATE_TESTS += fate-wavpack-speed-default +fate-wavpack-speed-default: CMD = md5 -i $(SAMPLES)/wavpack/speed_modes/default-partial.wv -f s16le + +FATE_TESTS += fate-wavpack-speed-fast +fate-wavpack-speed-fast: CMD = md5 -i $(SAMPLES)/wavpack/speed_modes/fast-partial.wv -f s16le + +FATE_TESTS += fate-wavpack-speed-high +fate-wavpack-speed-high: CMD = md5 -i $(SAMPLES)/wavpack/speed_modes/high-partial.wv -f s16le + +FATE_TESTS += fate-wavpack-speed-vhigh +fate-wavpack-speed-vhigh: CMD = md5 -i $(SAMPLES)/wavpack/speed_modes/vhigh-partial.wv -f s16le + +# Special Cases + +FATE_TESTS += fate-wavpack-cuesheet +fate-wavpack-cuesheet: CMD = md5 -i $(SAMPLES)/wavpack/special/cue_sheet.wv -f s16le + +FATE_TESTS += fate-wavpack-zerolsbs +fate-wavpack-zerolsbs: CMD = md5 -i $(SAMPLES)/wavpack/special/zero_lsbs.wv -f s16le + +FATE_TESTS += fate-wavpack-clipping +fate-wavpack-clipping: CMD = md5 -i $(SAMPLES)/wavpack/special/clipping.wv -f s16le + +FATE_TESTS += fate-wavpack-falsestereo +fate-wavpack-falsestereo: CMD = md5 -i $(SAMPLES)/wavpack/special/false_stereo.wv -f s16le + +FATE_TESTS += fate-wavpack-matroskamode +fate-wavpack-matroskamode: CMD = md5 -i $(SAMPLES)/wavpack/special/matroska_mode.mka -f s16le diff --git a/tests/ref/fate/lossless-wavpack b/tests/ref/fate/lossless-wavpack deleted file mode 100644 index 6281924c41..0000000000 --- a/tests/ref/fate/lossless-wavpack +++ /dev/null @@ -1 +0,0 @@ -97223f65c91213694a660d52f87f35aa diff --git a/tests/ref/fate/wavpack-channels-4.0 b/tests/ref/fate/wavpack-channels-4.0 new file mode 100644 index 0000000000..4cf67642b5 --- /dev/null +++ b/tests/ref/fate/wavpack-channels-4.0 @@ -0,0 +1 @@ +a03999c3ad17423f3a7e3d537fea8589 diff --git a/tests/ref/fate/wavpack-channels-5.1 b/tests/ref/fate/wavpack-channels-5.1 new file mode 100644 index 0000000000..49fe876f43 --- /dev/null +++ b/tests/ref/fate/wavpack-channels-5.1 @@ -0,0 +1 @@ +4ab874ad4a47141073f6db9aeec422a8 diff --git a/tests/ref/fate/wavpack-channels-6.1 b/tests/ref/fate/wavpack-channels-6.1 new file mode 100644 index 0000000000..ed46b7ce3d --- /dev/null +++ b/tests/ref/fate/wavpack-channels-6.1 @@ -0,0 +1 @@ +a524a76c85f55b7d63914fc1543a5268 diff --git a/tests/ref/fate/wavpack-channels-7.1 b/tests/ref/fate/wavpack-channels-7.1 new file mode 100644 index 0000000000..1f54afe8ef --- /dev/null +++ b/tests/ref/fate/wavpack-channels-7.1 @@ -0,0 +1 @@ +cffe4d47290ff3cef974e5aa6bc32559 diff --git a/tests/ref/fate/wavpack-channels-monofloat b/tests/ref/fate/wavpack-channels-monofloat new file mode 100644 index 0000000000..41d94fab7f --- /dev/null +++ b/tests/ref/fate/wavpack-channels-monofloat @@ -0,0 +1 @@ +71386c0f63105e414220f0f0d369a0e6 diff --git a/tests/ref/fate/wavpack-channels-monoint b/tests/ref/fate/wavpack-channels-monoint new file mode 100644 index 0000000000..204ab6d322 --- /dev/null +++ b/tests/ref/fate/wavpack-channels-monoint @@ -0,0 +1 @@ +931f27e3ec69fae0952548504461d97c diff --git a/tests/ref/fate/wavpack-clipping b/tests/ref/fate/wavpack-clipping new file mode 100644 index 0000000000..fd19f9347c --- /dev/null +++ b/tests/ref/fate/wavpack-clipping @@ -0,0 +1 @@ +d18d0b2dc7d329aefcbb889dc99383ab diff --git a/tests/ref/fate/wavpack-cuesheet b/tests/ref/fate/wavpack-cuesheet new file mode 100644 index 0000000000..e013bb0a7f --- /dev/null +++ b/tests/ref/fate/wavpack-cuesheet @@ -0,0 +1 @@ +85eb2940491442ca25c2a702a6f30e5f diff --git a/tests/ref/fate/wavpack-falsestereo b/tests/ref/fate/wavpack-falsestereo new file mode 100644 index 0000000000..458ce65084 --- /dev/null +++ b/tests/ref/fate/wavpack-falsestereo @@ -0,0 +1 @@ +e3fdd584bef84e85f4ca84e2769306f8 diff --git a/tests/ref/fate/wavpack-lossless-12bit b/tests/ref/fate/wavpack-lossless-12bit new file mode 100644 index 0000000000..2adf043e22 --- /dev/null +++ b/tests/ref/fate/wavpack-lossless-12bit @@ -0,0 +1 @@ +925e047ac0d4c874a9cff3cc9117ac91 diff --git a/tests/ref/fate/wavpack-lossless-16bit b/tests/ref/fate/wavpack-lossless-16bit new file mode 100644 index 0000000000..04fc2805a4 --- /dev/null +++ b/tests/ref/fate/wavpack-lossless-16bit @@ -0,0 +1 @@ +e2dc4b85377b275a48c8bd2a4f5b91fd diff --git a/tests/ref/fate/wavpack-lossless-24bit b/tests/ref/fate/wavpack-lossless-24bit new file mode 100644 index 0000000000..1fd8dca948 --- /dev/null +++ b/tests/ref/fate/wavpack-lossless-24bit @@ -0,0 +1 @@ +9d7bc1a45bd3ba9d1eb5706f0dfc3e47 diff --git a/tests/ref/fate/wavpack-lossless-32bit b/tests/ref/fate/wavpack-lossless-32bit new file mode 100644 index 0000000000..cef05f37d6 --- /dev/null +++ b/tests/ref/fate/wavpack-lossless-32bit @@ -0,0 +1 @@ +c35f539bb5796ed93908c987fab1c26c diff --git a/tests/ref/fate/wavpack-lossless-8bit b/tests/ref/fate/wavpack-lossless-8bit new file mode 100644 index 0000000000..58cdb99dcd --- /dev/null +++ b/tests/ref/fate/wavpack-lossless-8bit @@ -0,0 +1 @@ +e4e65e2048ba373d89836907328cfb27 diff --git a/tests/ref/fate/wavpack-lossless-float b/tests/ref/fate/wavpack-lossless-float new file mode 100644 index 0000000000..6081ae1cc5 --- /dev/null +++ b/tests/ref/fate/wavpack-lossless-float @@ -0,0 +1 @@ +04b860cf4f9ecba36c053fdf83dac14a diff --git a/tests/ref/fate/wavpack-lossy-16bit b/tests/ref/fate/wavpack-lossy-16bit new file mode 100644 index 0000000000..3adeaa074b --- /dev/null +++ b/tests/ref/fate/wavpack-lossy-16bit @@ -0,0 +1 @@ +c2aa8d83d14f799a9289b73bb6263fbc diff --git a/tests/ref/fate/wavpack-lossy-24bit b/tests/ref/fate/wavpack-lossy-24bit new file mode 100644 index 0000000000..566ec6d830 --- /dev/null +++ b/tests/ref/fate/wavpack-lossy-24bit @@ -0,0 +1 @@ +0c04941424ba0981eac0e681130788f7 diff --git a/tests/ref/fate/wavpack-lossy-32bit b/tests/ref/fate/wavpack-lossy-32bit new file mode 100644 index 0000000000..6b66d0ab0b --- /dev/null +++ b/tests/ref/fate/wavpack-lossy-32bit @@ -0,0 +1 @@ +7b94c7ab8ec78ddf59bd7967199cdc8e diff --git a/tests/ref/fate/wavpack-lossy-8bit b/tests/ref/fate/wavpack-lossy-8bit new file mode 100644 index 0000000000..d921ea6a34 --- /dev/null +++ b/tests/ref/fate/wavpack-lossy-8bit @@ -0,0 +1 @@ +f0e452d762d5e7b675970e6e67b781e7 diff --git a/tests/ref/fate/wavpack-lossy-float b/tests/ref/fate/wavpack-lossy-float new file mode 100644 index 0000000000..9f984acd49 --- /dev/null +++ b/tests/ref/fate/wavpack-lossy-float @@ -0,0 +1 @@ +d4733e795e5af80da9a265cf83a6da69 diff --git a/tests/ref/fate/wavpack-matroskamode b/tests/ref/fate/wavpack-matroskamode new file mode 100644 index 0000000000..1f54afe8ef --- /dev/null +++ b/tests/ref/fate/wavpack-matroskamode @@ -0,0 +1 @@ +cffe4d47290ff3cef974e5aa6bc32559 diff --git a/tests/ref/fate/wavpack-speed-default b/tests/ref/fate/wavpack-speed-default new file mode 100644 index 0000000000..9dc559fc72 --- /dev/null +++ b/tests/ref/fate/wavpack-speed-default @@ -0,0 +1 @@ +a57bec3f270c3b294d1e5ea07760514c diff --git a/tests/ref/fate/wavpack-speed-fast b/tests/ref/fate/wavpack-speed-fast new file mode 100644 index 0000000000..181d7dde61 --- /dev/null +++ b/tests/ref/fate/wavpack-speed-fast @@ -0,0 +1 @@ +ebff08f89073e3f662f822df428711d5 diff --git a/tests/ref/fate/wavpack-speed-high b/tests/ref/fate/wavpack-speed-high new file mode 100644 index 0000000000..3d852013d3 --- /dev/null +++ b/tests/ref/fate/wavpack-speed-high @@ -0,0 +1 @@ +a28c4d0f1d0c6ac7739e05150a8c401a diff --git a/tests/ref/fate/wavpack-speed-vhigh b/tests/ref/fate/wavpack-speed-vhigh new file mode 100644 index 0000000000..3d852013d3 --- /dev/null +++ b/tests/ref/fate/wavpack-speed-vhigh @@ -0,0 +1 @@ +a28c4d0f1d0c6ac7739e05150a8c401a diff --git a/tests/ref/fate/wavpack-zerolsbs b/tests/ref/fate/wavpack-zerolsbs new file mode 100644 index 0000000000..cc16fb9c73 --- /dev/null +++ b/tests/ref/fate/wavpack-zerolsbs @@ -0,0 +1 @@ +33c09fedba88693f6cc423ca3763e7fe From d10319d87f7f408dc69e1540498e87e2860e945d Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Mon, 27 Feb 2012 20:52:06 +0100 Subject: [PATCH 12/12] avcodec_default_reget_buffer(): fix compilation in DEBUG mode --- libavcodec/utils.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/utils.c b/libavcodec/utils.c index e57f7ef130..2d79f66e35 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -553,7 +553,7 @@ int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic){ return s->get_buffer(s, pic); } - assert(s->pix_fmt == pic->pix_fmt); + assert(s->pix_fmt == pic->format); /* If internal buffer type return the same buffer */ if(pic->type == FF_BUFFER_TYPE_INTERNAL) {