From 0a7a94f2e53bcdb8ac5857eb8c67c16f6f1d0f2f Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Thu, 2 Aug 2012 00:55:34 +0200 Subject: x86: Refactor PSWAPD fallback implementations and port to cpuflags --- libavcodec/x86/fft.asm | 16 ++-------------- libavcodec/x86/fmtconvert.asm | 17 ++--------------- libavutil/x86/x86util.asm | 12 ++++++++++++ 3 files changed, 16 insertions(+), 29 deletions(-) diff --git a/libavcodec/x86/fft.asm b/libavcodec/x86/fft.asm index 8c69f1f771..111f3229b4 100644 --- a/libavcodec/x86/fft.asm +++ b/libavcodec/x86/fft.asm @@ -105,7 +105,8 @@ SECTION_TEXT pfadd %5, %4 ; {t6,t5} pxor %3, [ps_m1p1] ; {t8,t7} mova %6, %1 - PSWAPD %3, %3 + movd [r0+12], %3 + punpckhdq %3, [r0+8] pfadd %1, %5 ; {r0,i0} pfsub %6, %5 ; {r2,i2} mova %4, %2 @@ -498,19 +499,6 @@ fft8 %+ SUFFIX: %endmacro %if ARCH_X86_32 -%macro PSWAPD 2 -%if cpuflag(3dnowext) - pswapd %1, %2 -%elifidn %1, %2 - movd [r0+12], %1 - punpckhdq %1, [r0+8] -%else - movq %1, %2 - psrlq %1, 32 - punpckldq %1, %2 -%endif -%endmacro - INIT_MMX 3dnowext FFT48_3DNOW diff --git a/libavcodec/x86/fmtconvert.asm b/libavcodec/x86/fmtconvert.asm index fb183ce9a6..77b8bd7069 100644 --- a/libavcodec/x86/fmtconvert.asm +++ b/libavcodec/x86/fmtconvert.asm @@ -246,16 +246,6 @@ FLOAT_TO_INT16_INTERLEAVE2 INIT_XMM sse2 FLOAT_TO_INT16_INTERLEAVE2 - -%macro PSWAPD_SSE 2 - pshufw %1, %2, 0x4e -%endmacro -%macro PSWAPD_3DNOW 2 - movq %1, %2 - psrlq %1, 32 - punpckldq %1, %2 -%endmacro - %macro FLOAT_TO_INT16_INTERLEAVE6 0 ; void float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len) cglobal float_to_int16_interleave6, 2, 8, 0, dst, src, src1, src2, src3, src4, src5, len @@ -285,11 +275,11 @@ cglobal float_to_int16_interleave6, 2, 8, 0, dst, src, src1, src2, src3, src4, s packssdw mm0, mm3 packssdw mm1, mm4 packssdw mm2, mm5 - pswapd mm3, mm0 + PSWAPD mm3, mm0 punpcklwd mm0, mm1 punpckhwd mm1, mm2 punpcklwd mm2, mm3 - pswapd mm3, mm0 + PSWAPD mm3, mm0 punpckldq mm0, mm2 punpckhdq mm2, mm1 punpckldq mm1, mm3 @@ -305,12 +295,9 @@ cglobal float_to_int16_interleave6, 2, 8, 0, dst, src, src1, src2, src3, src4, s %endmacro ; FLOAT_TO_INT16_INTERLEAVE6 INIT_MMX sse -%define pswapd PSWAPD_SSE FLOAT_TO_INT16_INTERLEAVE6 INIT_MMX 3dnow -%define pswapd PSWAPD_3DNOW FLOAT_TO_INT16_INTERLEAVE6 -%undef pswapd INIT_MMX 3dnowext FLOAT_TO_INT16_INTERLEAVE6 diff --git a/libavutil/x86/x86util.asm b/libavutil/x86/x86util.asm index ca0041acf7..9183d38595 100644 --- a/libavutil/x86/x86util.asm +++ b/libavutil/x86/x86util.asm @@ -319,6 +319,18 @@ %endif %endmacro +%macro PSWAPD 2 +%if cpuflag(mmxext) + pshufw %1, %2, q1032 +%elif cpuflag(3dnowext) + pswapd %1, %2 +%elif cpuflag(3dnow) + movq %1, %2 + psrlq %1, 32 + punpckldq %1, %2 +%endif +%endmacro + %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from %ifnum %5 pand m%3, m%5, m%4 ; src .. y6 .. y4 -- cgit v1.2.3 From b68aac7ea34ec92321508f7365b5f2813766be79 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 2 Nov 2012 10:56:30 +0100 Subject: vf_drawtext: do not use deprecated av_tree_node_size --- libavfilter/vf_drawtext.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index ecc789c7f7..43a42d8e26 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -263,7 +263,7 @@ static int load_glyph(AVFilterContext *ctx, Glyph **glyph_ptr, uint32_t code) FT_Glyph_Get_CBox(*glyph->glyph, ft_glyph_bbox_pixels, &glyph->bbox); /* cache the newly created glyph */ - if (!(node = av_mallocz(av_tree_node_size))) { + if (!(node = av_tree_node_alloc())) { ret = AVERROR(ENOMEM); goto error; } -- cgit v1.2.3 From b4dc6dccbaea08fc0d41e99b020ee1e0e9ff301b Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 2 Nov 2012 10:58:36 +0100 Subject: crc: move doxy to the header --- libavutil/crc.c | 28 ---------------------------- libavutil/crc.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/libavutil/crc.c b/libavutil/crc.c index ee925d6b8a..47520e5cf4 100644 --- a/libavutil/crc.c +++ b/libavutil/crc.c @@ -40,22 +40,6 @@ static struct { static AVCRC av_crc_table[AV_CRC_MAX][257]; #endif -/** - * Initialize a CRC table. - * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 - * @param le If 1, the lowest bit represents the coefficient for the highest - * exponent of the corresponding polynomial (both for poly and - * actual CRC). - * If 0, you must swap the CRC parameter and the result of av_crc - * if you need the standard representation (can be simplified in - * most cases to e.g. bswap16): - * av_bswap32(crc << (32-bits)) - * @param bits number of bits for the CRC - * @param poly generator polynomial without the x**bits coefficient, in the - * representation as specified by le - * @param ctx_size size of ctx in bytes - * @return <0 on failure - */ int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size) { unsigned i, j; @@ -89,11 +73,6 @@ int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size) return 0; } -/** - * Get an initialized standard CRC table. - * @param crc_id ID of a standard CRC - * @return a pointer to the CRC table or NULL on failure - */ const AVCRC *av_crc_get_table(AVCRCId crc_id) { #if !CONFIG_HARDCODED_TABLES @@ -108,13 +87,6 @@ const AVCRC *av_crc_get_table(AVCRCId crc_id) return av_crc_table[crc_id]; } -/** - * Calculate the CRC of a block. - * @param crc CRC of previous blocks if any or initial value for CRC - * @return CRC updated with the data from the given block - * - * @see av_crc_init() "le" parameter - */ uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) { diff --git a/libavutil/crc.h b/libavutil/crc.h index 5c25607bbc..142a5b5e8f 100644 --- a/libavutil/crc.h +++ b/libavutil/crc.h @@ -36,8 +36,38 @@ typedef enum { AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ }AVCRCId; +/** + * Initialize a CRC table. + * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024 + * @param le If 1, the lowest bit represents the coefficient for the highest + * exponent of the corresponding polynomial (both for poly and + * actual CRC). + * If 0, you must swap the CRC parameter and the result of av_crc + * if you need the standard representation (can be simplified in + * most cases to e.g. bswap16): + * av_bswap32(crc << (32-bits)) + * @param bits number of bits for the CRC + * @param poly generator polynomial without the x**bits coefficient, in the + * representation as specified by le + * @param ctx_size size of ctx in bytes + * @return <0 on failure + */ int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size); + +/** + * Get an initialized standard CRC table. + * @param crc_id ID of a standard CRC + * @return a pointer to the CRC table or NULL on failure + */ const AVCRC *av_crc_get_table(AVCRCId crc_id); + +/** + * Calculate the CRC of a block. + * @param crc CRC of previous blocks if any or initial value for CRC + * @return CRC updated with the data from the given block + * + * @see av_crc_init() "le" parameter + */ uint32_t av_crc(const AVCRC *ctx, uint32_t start_crc, const uint8_t *buffer, size_t length) av_pure; #endif /* AVUTIL_CRC_H */ -- cgit v1.2.3 From c8977f6d268462e237cee38be6159c7bb701c62e Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 31 Oct 2012 21:15:41 +0100 Subject: avconv: do not free muxed packet on streamcopy. The packet belongs to lavf, the caller must not free it or access it in any other way. No change in practice, since destruct is set to NULL anyway. --- avconv.c | 1 - 1 file changed, 1 deletion(-) diff --git a/avconv.c b/avconv.c index d0902a6c9f..964847a488 100644 --- a/avconv.c +++ b/avconv.c @@ -1045,7 +1045,6 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p write_frame(of->ctx, &opkt, ost); ost->st->codec->frame_number++; - av_free_packet(&opkt); } static void rate_emu_sleep(InputStream *ist) -- cgit v1.2.3 From 717a4509930854081deea54a3bfcdb547161fecf Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 31 Oct 2012 19:59:53 +0100 Subject: lavf: clarify the lifetime of demuxed packets. --- libavformat/avformat.h | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 8af007e640..0961308028 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -158,9 +158,15 @@ * information will be in AVStream.time_base units, i.e. it has to be * multiplied by the timebase to convert them to seconds. * - * The packet data belongs to the demuxer and is invalid after the next call to - * av_read_frame(). The user must free the packet with av_free_packet() before - * calling av_read_frame() again or closing the file. + * If AVPacket.destruct is set on the returned packet, then the packet is + * allocated dynamically and the user may keep it indefinitely. + * Otherwise, if AVPacket.destruct is NULL, the packet data is backed by a + * static storage somewhere inside the demuxer and the packet is only valid + * until the next av_read_frame() call or closing the file. If the caller + * requires a longer lifetime, av_dup_packet() will make an av_malloc()ed copy + * of it. + * In both cases, the packet must be freed with av_free_packet() when it is no + * longer needed. * * @section lavf_decoding_seek Seeking * @} @@ -1307,13 +1313,13 @@ int av_read_packet(AVFormatContext *s, AVPacket *pkt); * omit invalid data between valid frames so as to give the decoder the maximum * information possible for decoding. * - * The returned packet is valid - * until the next av_read_frame() or until av_close_input_file() and - * must be freed with av_free_packet. For video, the packet contains - * exactly one frame. For audio, it contains an integer number of - * frames if each frame has a known fixed size (e.g. PCM or ADPCM - * data). If the audio frames have a variable size (e.g. MPEG audio), - * then it contains one frame. + * If pkt->destruct is NULL, then the packet is valid until the next + * av_read_frame() or until av_close_input_file(). Otherwise the packet is valid + * indefinitely. In both cases the packet must be freed with + * av_free_packet when it is no longer needed. For video, the packet contains + * exactly one frame. For audio, it contains an integer number of frames if each + * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames + * have a variable size (e.g. MPEG audio), then it contains one frame. * * pkt->pts, pkt->dts and pkt->duration are always set to correct * values in AVStream.time_base units (and guessed if the format cannot -- cgit v1.2.3 From 9221efef7968463f3e3d9ce79ea72eaca082e73f Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Wed, 31 Oct 2012 16:54:16 +0100 Subject: lavf: fix av_interleaved_write_frame() doxy. A sentence was mistakenly inserted in the middle of another sentence. --- libavformat/avformat.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 0961308028..3e10496bee 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1463,10 +1463,10 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt); * @param s media file handle * @param pkt The packet containing the data to be written. Libavformat takes * ownership of the data and will free it when it sees fit using the packet's - * This can be NULL (at any time, not just at the end), to flush the - * interleaving queues. * @ref AVPacket.destruct "destruct" field. The caller must not access the data * after this function returns, as it may already be freed. + * This can be NULL (at any time, not just at the end), to flush the + * interleaving queues. * Packet's @ref AVPacket.stream_index "stream_index" field must be set to the * index of the corresponding stream in @ref AVFormatContext.streams * "s.streams". -- cgit v1.2.3