Commit 37e81996 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '9221efef'

* commit '9221efef':
  lavf: fix av_interleaved_write_frame() doxy.
  lavf: clarify the lifetime of demuxed packets.
  avconv: do not free muxed packet on streamcopy.
  crc: move doxy to the header
  vf_drawtext: do not use deprecated av_tree_node_size
  x86: Refactor PSWAPD fallback implementations and port to cpuflags
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 1885ffb0 9221efef
...@@ -1394,7 +1394,6 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p ...@@ -1394,7 +1394,6 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
write_frame(of->ctx, &opkt, ost); write_frame(of->ctx, &opkt, ost);
ost->st->codec->frame_number++; ost->st->codec->frame_number++;
av_free_packet(&opkt);
} }
static void rate_emu_sleep(InputStream *ist) static void rate_emu_sleep(InputStream *ist)
......
...@@ -105,7 +105,8 @@ SECTION_TEXT ...@@ -105,7 +105,8 @@ SECTION_TEXT
pfadd %5, %4 ; {t6,t5} pfadd %5, %4 ; {t6,t5}
pxor %3, [ps_m1p1] ; {t8,t7} pxor %3, [ps_m1p1] ; {t8,t7}
mova %6, %1 mova %6, %1
PSWAPD %3, %3 movd [r0+12], %3
punpckhdq %3, [r0+8]
pfadd %1, %5 ; {r0,i0} pfadd %1, %5 ; {r0,i0}
pfsub %6, %5 ; {r2,i2} pfsub %6, %5 ; {r2,i2}
mova %4, %2 mova %4, %2
...@@ -499,19 +500,6 @@ fft8 %+ SUFFIX: ...@@ -499,19 +500,6 @@ fft8 %+ SUFFIX:
%endmacro %endmacro
%if ARCH_X86_32 %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 INIT_MMX 3dnowext
FFT48_3DNOW FFT48_3DNOW
......
...@@ -246,16 +246,6 @@ FLOAT_TO_INT16_INTERLEAVE2 ...@@ -246,16 +246,6 @@ FLOAT_TO_INT16_INTERLEAVE2
INIT_XMM sse2 INIT_XMM sse2
FLOAT_TO_INT16_INTERLEAVE2 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 %macro FLOAT_TO_INT16_INTERLEAVE6 0
; void float_to_int16_interleave6_sse(int16_t *dst, const float **src, int len) ; 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 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 ...@@ -285,11 +275,11 @@ cglobal float_to_int16_interleave6, 2, 8, 0, dst, src, src1, src2, src3, src4, s
packssdw mm0, mm3 packssdw mm0, mm3
packssdw mm1, mm4 packssdw mm1, mm4
packssdw mm2, mm5 packssdw mm2, mm5
pswapd mm3, mm0 PSWAPD mm3, mm0
punpcklwd mm0, mm1 punpcklwd mm0, mm1
punpckhwd mm1, mm2 punpckhwd mm1, mm2
punpcklwd mm2, mm3 punpcklwd mm2, mm3
pswapd mm3, mm0 PSWAPD mm3, mm0
punpckldq mm0, mm2 punpckldq mm0, mm2
punpckhdq mm2, mm1 punpckhdq mm2, mm1
punpckldq mm1, mm3 punpckldq mm1, mm3
...@@ -305,12 +295,9 @@ cglobal float_to_int16_interleave6, 2, 8, 0, dst, src, src1, src2, src3, src4, s ...@@ -305,12 +295,9 @@ cglobal float_to_int16_interleave6, 2, 8, 0, dst, src, src1, src2, src3, src4, s
%endmacro ; FLOAT_TO_INT16_INTERLEAVE6 %endmacro ; FLOAT_TO_INT16_INTERLEAVE6
INIT_MMX sse INIT_MMX sse
%define pswapd PSWAPD_SSE
FLOAT_TO_INT16_INTERLEAVE6 FLOAT_TO_INT16_INTERLEAVE6
INIT_MMX 3dnow INIT_MMX 3dnow
%define pswapd PSWAPD_3DNOW
FLOAT_TO_INT16_INTERLEAVE6 FLOAT_TO_INT16_INTERLEAVE6
%undef pswapd
INIT_MMX 3dnowext INIT_MMX 3dnowext
FLOAT_TO_INT16_INTERLEAVE6 FLOAT_TO_INT16_INTERLEAVE6
......
...@@ -277,7 +277,7 @@ static int load_glyph(AVFilterContext *ctx, Glyph **glyph_ptr, uint32_t code) ...@@ -277,7 +277,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); FT_Glyph_Get_CBox(*glyph->glyph, ft_glyph_bbox_pixels, &glyph->bbox);
/* cache the newly created glyph */ /* cache the newly created glyph */
if (!(node = av_mallocz(av_tree_node_size))) { if (!(node = av_tree_node_alloc())) {
ret = AVERROR(ENOMEM); ret = AVERROR(ENOMEM);
goto error; goto error;
} }
......
...@@ -158,9 +158,15 @@ ...@@ -158,9 +158,15 @@
* information will be in AVStream.time_base units, i.e. it has to be * information will be in AVStream.time_base units, i.e. it has to be
* multiplied by the timebase to convert them to seconds. * multiplied by the timebase to convert them to seconds.
* *
* The packet data belongs to the demuxer and is invalid after the next call to * If AVPacket.destruct is set on the returned packet, then the packet is
* av_read_frame(). The user must free the packet with av_free_packet() before * allocated dynamically and the user may keep it indefinitely.
* calling av_read_frame() again or closing the file. * 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 * @section lavf_decoding_seek Seeking
* @} * @}
...@@ -1550,13 +1556,13 @@ int av_read_packet(AVFormatContext *s, AVPacket *pkt); ...@@ -1550,13 +1556,13 @@ int av_read_packet(AVFormatContext *s, AVPacket *pkt);
* omit invalid data between valid frames so as to give the decoder the maximum * omit invalid data between valid frames so as to give the decoder the maximum
* information possible for decoding. * information possible for decoding.
* *
* The returned packet is valid * If pkt->destruct is NULL, then the packet is valid until the next
* until the next av_read_frame() or until av_close_input_file() and * av_read_frame() or until av_close_input_file(). Otherwise the packet is valid
* must be freed with av_free_packet. For video, the packet contains * indefinitely. In both cases the packet must be freed with
* exactly one frame. For audio, it contains an integer number of * av_free_packet when it is no longer needed. For video, the packet contains
* frames if each frame has a known fixed size (e.g. PCM or ADPCM * exactly one frame. For audio, it contains an integer number of frames if each
* data). If the audio frames have a variable size (e.g. MPEG audio), * frame has a known fixed size (e.g. PCM or ADPCM data). If the audio frames
* then it contains one frame. * 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 * pkt->pts, pkt->dts and pkt->duration are always set to correct
* values in AVStream.time_base units (and guessed if the format cannot * values in AVStream.time_base units (and guessed if the format cannot
...@@ -1724,10 +1730,10 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt); ...@@ -1724,10 +1730,10 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt);
* @param s media file handle * @param s media file handle
* @param pkt The packet containing the data to be written. Libavformat takes * @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 * 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 * @ref AVPacket.destruct "destruct" field. The caller must not access the data
* after this function returns, as it may already be freed. * 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 * Packet's @ref AVPacket.stream_index "stream_index" field must be set to the
* index of the corresponding stream in @ref AVFormatContext.streams * index of the corresponding stream in @ref AVFormatContext.streams
* "s.streams". * "s.streams".
......
...@@ -40,22 +40,6 @@ static struct { ...@@ -40,22 +40,6 @@ static struct {
static AVCRC av_crc_table[AV_CRC_MAX][257]; static AVCRC av_crc_table[AV_CRC_MAX][257];
#endif #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) int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size)
{ {
unsigned i, j; unsigned i, j;
...@@ -89,11 +73,6 @@ int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size) ...@@ -89,11 +73,6 @@ int av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size)
return 0; 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) const AVCRC *av_crc_get_table(AVCRCId crc_id)
{ {
#if !CONFIG_HARDCODED_TABLES #if !CONFIG_HARDCODED_TABLES
...@@ -108,13 +87,6 @@ const AVCRC *av_crc_get_table(AVCRCId crc_id) ...@@ -108,13 +87,6 @@ const AVCRC *av_crc_get_table(AVCRCId crc_id)
return av_crc_table[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, uint32_t av_crc(const AVCRC *ctx, uint32_t crc,
const uint8_t *buffer, size_t length) const uint8_t *buffer, size_t length)
{ {
......
...@@ -36,8 +36,38 @@ typedef enum { ...@@ -36,8 +36,38 @@ typedef enum {
AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */ AV_CRC_MAX, /*< Not part of public API! Do not use outside libavutil. */
}AVCRCId; }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); 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); 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; uint32_t av_crc(const AVCRC *ctx, uint32_t start_crc, const uint8_t *buffer, size_t length) av_pure;
#endif /* AVUTIL_CRC_H */ #endif /* AVUTIL_CRC_H */
...@@ -319,6 +319,18 @@ ...@@ -319,6 +319,18 @@
%endif %endif
%endmacro %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 %macro DEINTB 5 ; mask, reg1, mask, reg2, optional src to fill masks from
%ifnum %5 %ifnum %5
pand m%3, m%5, m%4 ; src .. y6 .. y4 pand m%3, m%5, m%4 ; src .. y6 .. y4
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment