[FFmpeg-devel] [PATCH] avcodec/utils/avpriv_find_start_code: optimization. If HAVE_FAST_UNALIGNED is true, handle "1 + sizeof(long)" bytes per step.
libavcodec/utils.c | 68 -- 1 file changed, 56 insertions(+), 12 deletions(-) diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 1ec5cae..14a43e2 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -3772,30 +3772,74 @@ const uint8_t *avpriv_find_start_code(const uint8_t *av_restrict p, uint32_t *av_restrict state) { int i; +uint32_t stat; av_assert0(p <= end); if (p >= end) return end; +stat = *state; for (i = 0; i < 3; i++) { -uint32_t tmp = *state << 8; -*state = tmp + *(p++); -if (tmp == 0x100 || p == end) +uint32_t tmp = stat << 8; +stat = tmp + *(p++); +if (tmp == 0x100 || p == end) { +*state = stat; return p; +} } -while (p < end) { -if (p[-1] > 1 ) p += 3; -else if (p[-2] ) p += 2; -else if (p[-3]|(p[-1]-1)) p++; -else { +#if HAVE_FAST_UNALIGNED +#if HAVE_FAST_64BIT +for (; p + 6 <= end; p += 9) { +uint64_t t = AV_RN64A(p - 2); +if (!((t - 0x0100010001000101ULL) & ~(t | 0x7fff7fff7fff7f7fULL))) +continue; +#else +for (; p + 2 <= end; p += 5) { +uint32_t t = AV_RN32A(p - 2); +if (!((t - 0x01000101U) & ~(t | 0x7fff7f7fU))) +continue; +#endif +/* find the first zero byte in t */ +#if HAVE_BIGENDIAN +while (t >> (sizeof(t) * 8 - 8)) { +t <<= 8; +p++; +} +#else +while (t & 0xff) { +t >>= 8; +p++; +} +#endif +/* the first zero is p[-2], goto the end of continuous zero */ +for (;;) { +if (p >= end) +goto _out; +if (p[-1]) +break; p++; -break; } +if (p[-3] == 0 && /*p[-2] == 0 &&*/ p[-1] == 1) { +*state = 0x100 + *(p++); +return p; +} +p -= sizeof(t) - 1; } +#endif -p = FFMIN(p, end) - 4; -*state = AV_RB32(p); +while (p < end) { +if (p[-1] > 1 ) p += 3; +else if (p[-2] ) p += 2 + p[-1]; +else if (p[-3] ) p += 1 + p[-1] * 2; +else if (p[-1] != 1) p += 1; +else { +*state = 0x100 + *(p++); +return p; +} +} -return p + 4; +_out: +*state = AV_RB32(end - 4); +return end; } ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avcodec/utils/avpriv_find_start_code: optimization. If HAVE_FAST_UNALIGNED is true, handle "1 + sizeof(long)" bytes per step.
在 2015/1/1 11:49, Michael Niedermayer 写道: > On Thu, Jan 01, 2015 at 10:13:58AM +0800, zhaoxiu.zeng wrote: >> libavcodec/utils.c | 68 >> -- >> 1 file changed, 56 insertions(+), 12 deletions(-) >> >> diff --git a/libavcodec/utils.c b/libavcodec/utils.c >> index 1ec5cae..14a43e2 100644 >> --- a/libavcodec/utils.c >> +++ b/libavcodec/utils.c >> @@ -3772,30 +3772,74 @@ const uint8_t *avpriv_find_start_code(const uint8_t >> *av_restrict p, >>uint32_t *av_restrict state) >> { >> int i; >> +uint32_t stat; >> >> av_assert0(p <= end); >> if (p >= end) >> return end; >> >> +stat = *state; >> for (i = 0; i < 3; i++) { >> -uint32_t tmp = *state << 8; >> -*state = tmp + *(p++); >> -if (tmp == 0x100 || p == end) >> +uint32_t tmp = stat << 8; >> +stat = tmp + *(p++); >> +if (tmp == 0x100 || p == end) { >> +*state = stat; >> return p; >> +} >> } >> >> -while (p < end) { >> -if (p[-1] > 1 ) p += 3; >> -else if (p[-2] ) p += 2; >> -else if (p[-3]|(p[-1]-1)) p++; >> -else { >> +#if HAVE_FAST_UNALIGNED >> +#if HAVE_FAST_64BIT >> +for (; p + 6 <= end; p += 9) { >> +uint64_t t = AV_RN64A(p - 2); >> +if (!((t - 0x0100010001000101ULL) & ~(t | 0x7fff7fff7fff7f7fULL))) >> +continue; >> +#else >> +for (; p + 2 <= end; p += 5) { >> +uint32_t t = AV_RN32A(p - 2); >> +if (!((t - 0x01000101U) & ~(t | 0x7fff7f7fU))) >> +continue; >> +#endif >> +/* find the first zero byte in t */ >> +#if HAVE_BIGENDIAN >> +while (t >> (sizeof(t) * 8 - 8)) { >> +t <<= 8; >> +p++; >> +} >> +#else >> +while (t & 0xff) { >> +t >>= 8; >> +p++; >> +} >> +#endif > > this maybe can be simplified by using ff_startcode_find_candidate_c() > There is a little different. ff_startcode_find_candidate_c find the first "0x00", but we only care "0x00 0x00". Use 0x0100010001000101ULL not 0x0101010101010101ULL to reduce the hit ratio of lonely "0x00", so it can be faster if there are some lonely "0x00" in the buffer. > > [...] > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 1/2] avcodec/vc1: simplify find_next_marker()
>From ae973955c4e8a16ad38843cef60639f9bd69abee Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Thu, 12 Feb 2015 23:22:59 +0800 Subject: [PATCH 1/2] avcodec/vc1: simplify find_next_marker() Signed-off-by: Zeng Zhaoxiu --- libavcodec/vc1_common.h | 10 -- 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libavcodec/vc1_common.h b/libavcodec/vc1_common.h index cd67b17..b46c33f 100644 --- a/libavcodec/vc1_common.h +++ b/libavcodec/vc1_common.h @@ -26,6 +26,7 @@ #include #include "libavutil/attributes.h" +#include "internal.h" /** Markers used in VC-1 AP frame data */ //@{ @@ -57,12 +58,9 @@ enum Profile { */ static av_always_inline const uint8_t* find_next_marker(const uint8_t *src, const uint8_t *end) { -uint32_t mrk = 0x; - -if (end-src < 4) -return end; -while (src < end) { -mrk = (mrk << 8) | *src++; +if (end - src >= 4) { +uint32_t mrk = 0x; +src = avpriv_find_start_code(src, end, &mrk); if (IS_MARKER(mrk)) return src - 4; } -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 2/2] avcodec/vc1: simplify vc1_split()
>From 1a89b725e31e7567ade7563fc67ebc5d80a7c20c Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Thu, 12 Feb 2015 23:30:08 +0800 Subject: [PATCH 2/2] avcodec/vc1: simplify vc1_split() Signed-off-by: Zeng Zhaoxiu --- libavcodec/vc1_parser.c | 23 +++ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/libavcodec/vc1_parser.c b/libavcodec/vc1_parser.c index 3a2308e..748c6bb 100644 --- a/libavcodec/vc1_parser.c +++ b/libavcodec/vc1_parser.c @@ -29,6 +29,7 @@ #include "parser.h" #include "vc1.h" #include "get_bits.h" +#include "internal.h" /** The maximum number of bytes of a sequence, entry point or * frame header whose values we pay any attention to */ @@ -250,20 +251,18 @@ static int vc1_parse(AVCodecParserContext *s, static int vc1_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { -int i; -uint32_t state= -1; -int charged=0; +uint32_t state = -1; +int charged = 0; +const uint8_t *ptr = buf, *end = buf + buf_size; -for(i=0; ihttp://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avcodec/wmv2: simplify cbp_table_index calculation
>From 232bb6fa60aeb02ae8ecd0b28e9785d4cfb2d7a0 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Thu, 12 Feb 2015 23:43:26 +0800 Subject: [PATCH] avcodec/wmv2: simplify cbp_table_index calculation Signed-off-by: Zeng Zhaoxiu --- libavcodec/wmv2.h| 11 +++ libavcodec/wmv2dec.c | 11 +-- libavcodec/wmv2enc.c | 11 +-- 3 files changed, 13 insertions(+), 20 deletions(-) diff --git a/libavcodec/wmv2.h b/libavcodec/wmv2.h index cb5b14e..cd18eca 100644 --- a/libavcodec/wmv2.h +++ b/libavcodec/wmv2.h @@ -56,4 +56,15 @@ typedef struct Wmv2Context { void ff_wmv2_common_init(Wmv2Context *w); +static av_always_inline int wmv2_get_cbp_table_index(MpegEncContext *s, int cbp_index) +{ +static const uint8_t map[3][3] = { +{ 0, 2, 1 }, +{ 1, 0, 2 }, +{ 2, 1, 0 }, +}; + +return map[(s->qscale > 10) + (s->qscale > 20)][cbp_index]; +} + #endif /* AVCODEC_WMV2_H */ diff --git a/libavcodec/wmv2dec.c b/libavcodec/wmv2dec.c index d9cbfd1..b1bcd09 100644 --- a/libavcodec/wmv2dec.c +++ b/libavcodec/wmv2dec.c @@ -173,16 +173,7 @@ int ff_wmv2_decode_secondary_picture_header(MpegEncContext *s) parse_mb_skip(w); cbp_index = decode012(&s->gb); -if (s->qscale <= 10) { -int map[3] = { 0, 2, 1 }; -w->cbp_table_index = map[cbp_index]; -} else if (s->qscale <= 20) { -int map[3] = { 1, 0, 2 }; -w->cbp_table_index = map[cbp_index]; -} else { -int map[3] = {2,1,0}; -w->cbp_table_index = map[cbp_index]; -} +w->cbp_table_index = wmv2_get_cbp_table_index(s, cbp_index); if (w->mspel_bit) s->mspel = get_bits1(&s->gb); diff --git a/libavcodec/wmv2enc.c b/libavcodec/wmv2enc.c index 62e99c0..55ee089 100644 --- a/libavcodec/wmv2enc.c +++ b/libavcodec/wmv2enc.c @@ -111,16 +111,7 @@ int ff_wmv2_encode_picture_header(MpegEncContext *s, int picture_number) put_bits(&s->pb, 2, SKIP_TYPE_NONE); ff_msmpeg4_code012(&s->pb, cbp_index = 0); -if (s->qscale <= 10) { -int map[3] = { 0, 2, 1 }; -w->cbp_table_index = map[cbp_index]; -} else if (s->qscale <= 20) { -int map[3] = { 1, 0, 2 }; -w->cbp_table_index = map[cbp_index]; -} else { -int map[3] = { 2, 1, 0 }; -w->cbp_table_index = map[cbp_index]; -} +w->cbp_table_index = wmv2_get_cbp_table_index(s, cbp_index); if (w->mspel_bit) put_bits(&s->pb, 1, s->mspel); -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 1/3] avcodec/wmalosslessdec: change type of acfilter_coeffs from int64_t to int16_t
>From f1ea8512460b62e802134f5894bfa274e8914f24 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Fri, 13 Feb 2015 23:37:13 +0800 Subject: [PATCH 1/3] avcodec/wmalosslessdec: change type of acfilter_coeffs from int64_t to int16_t Signed-off-by: Zeng Zhaoxiu --- libavcodec/wmalosslessdec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c index 557b6b9..9bd5e7b 100644 --- a/libavcodec/wmalosslessdec.c +++ b/libavcodec/wmalosslessdec.c @@ -127,7 +127,7 @@ typedef struct WmallDecodeCtx { int8_t acfilter_order; int8_t acfilter_scaling; -int64_t acfilter_coeffs[16]; +int16_t acfilter_coeffs[16]; int acfilter_prevvalues[WMALL_MAX_CHANNELS][16]; int8_t mclms_order; @@ -818,7 +818,7 @@ static void revert_inter_ch_decorr(WmallDecodeCtx *s, int tile_size) static void revert_acfilter(WmallDecodeCtx *s, int tile_size) { int ich, pred, i, j; -int64_t *filter_coeffs = s->acfilter_coeffs; +int16_t *filter_coeffs = s->acfilter_coeffs; int scaling= s->acfilter_scaling; int order = s->acfilter_order; -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 2/3] avcodec/wmalosslessdec: optimize sign operation
>From b08b4a38c87000fe5549de96f65de6ba77740b30 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Fri, 13 Feb 2015 23:52:29 +0800 Subject: [PATCH 2/3] avcodec/wmalosslessdec: optimize sign operation Signed-off-by: Zeng Zhaoxiu --- libavcodec/wmalosslessdec.c | 34 -- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c index 9bd5e7b..1916594 100644 --- a/libavcodec/wmalosslessdec.c +++ b/libavcodec/wmalosslessdec.c @@ -175,6 +175,8 @@ typedef struct WmallDecodeCtx { int channel_coeffs[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE]; } WmallDecodeCtx; +/** Get sign of integer (1 for positive, -1 for negative and 0 for zero) */ +#define WMASIGN(x) ((x > 0) - (x < 0)) static av_cold int decode_init(AVCodecContext *avctx) { @@ -631,22 +633,14 @@ static void mclms_update(WmallDecodeCtx *s, int icoef, int *pred) for (i = 0; i < order * num_channels; i++) s->mclms_coeffs[i + ich * order * num_channels] += s->mclms_updates[s->mclms_recent + i]; -for (j = 0; j < ich; j++) { -if (s->channel_residues[j][icoef] > 0) -s->mclms_coeffs_cur[ich * num_channels + j] += 1; -else if (s->channel_residues[j][icoef] < 0) -s->mclms_coeffs_cur[ich * num_channels + j] -= 1; -} +for (j = 0; j < ich; j++) +s->mclms_coeffs_cur[ich * num_channels + j] += WMASIGN(s->channel_residues[j][icoef]); } else if (pred_error < 0) { for (i = 0; i < order * num_channels; i++) s->mclms_coeffs[i + ich * order * num_channels] -= s->mclms_updates[s->mclms_recent + i]; -for (j = 0; j < ich; j++) { -if (s->channel_residues[j][icoef] > 0) -s->mclms_coeffs_cur[ich * num_channels + j] -= 1; -else if (s->channel_residues[j][icoef] < 0) -s->mclms_coeffs_cur[ich * num_channels + j] += 1; -} +for (j = 0; j < ich; j++) +s->mclms_coeffs_cur[ich * num_channels + j] -= WMASIGN(s->channel_residues[j][icoef]); } } @@ -658,11 +652,7 @@ static void mclms_update(WmallDecodeCtx *s, int icoef, int *pred) else if (s->channel_residues[ich][icoef] < -range) s->mclms_prevvalues[s->mclms_recent] = -range; -s->mclms_updates[s->mclms_recent] = 0; -if (s->channel_residues[ich][icoef] > 0) -s->mclms_updates[s->mclms_recent] = 1; -else if (s->channel_residues[ich][icoef] < 0) -s->mclms_updates[s->mclms_recent] = -1; +s->mclms_updates[s->mclms_recent] = WMASIGN(s->channel_residues[ich][icoef]); } if (s->mclms_recent == 0) { @@ -724,12 +714,7 @@ static void lms_update(WmallDecodeCtx *s, int ich, int ilms, int input) } s->cdlms[ich][ilms].lms_prevvalues[recent] = av_clip(input, -range, range - 1); -if (!input) -s->cdlms[ich][ilms].lms_updates[recent] = 0; -else if (input < 0) -s->cdlms[ich][ilms].lms_updates[recent] = -s->update_speed[ich]; -else -s->cdlms[ich][ilms].lms_updates[recent] = s->update_speed[ich]; +s->cdlms[ich][ilms].lms_updates[recent] = WMASIGN(input) * s->update_speed[ich]; s->cdlms[ich][ilms].lms_updates[recent + (order >> 4)] >>= 2; s->cdlms[ich][ilms].lms_updates[recent + (order >> 3)] >>= 1; @@ -773,9 +758,6 @@ static void use_normal_update_speed(WmallDecodeCtx *s, int ich) s->update_speed[ich] = 8; } -/** Get sign of integer (1 for positive, -1 for negative and 0 for zero) */ -#define WMASIGN(x) ((x > 0) - (x < 0)) - static void revert_cdlms(WmallDecodeCtx *s, int ch, int coef_begin, int coef_end) { -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 3/3] avcodec/wmalosslessdec: cleanup
>From 4096d5565e55bdbc3dbe3b0aa3be920f73c00aa8 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 00:27:03 +0800 Subject: [PATCH 3/3] avcodec/wmalosslessdec: cleanup Signed-off-by: Zeng Zhaoxiu --- libavcodec/wmalosslessdec.c | 24 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c index 1916594..bce0d6a 100644 --- a/libavcodec/wmalosslessdec.c +++ b/libavcodec/wmalosslessdec.c @@ -553,10 +553,7 @@ static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size) s->ave_sum[ch] = residue + s->ave_sum[ch] - (s->ave_sum[ch] >> s->movave_scaling); -if (residue & 1) -residue = -(residue >> 1) - 1; -else -residue = residue >> 1; +residue = (residue >> 1) ^ -(residue & 1); s->channel_residues[ch][i] = residue; } @@ -644,14 +641,10 @@ static void mclms_update(WmallDecodeCtx *s, int icoef, int *pred) } } -for (ich = num_channels - 1; ich >= 0; ich--) { +for (ich = num_channels; ich-- > 0; ) { s->mclms_recent--; -s->mclms_prevvalues[s->mclms_recent] = s->channel_residues[ich][icoef]; -if (s->channel_residues[ich][icoef] > range - 1) -s->mclms_prevvalues[s->mclms_recent] = range - 1; -else if (s->channel_residues[ich][icoef] < -range) -s->mclms_prevvalues[s->mclms_recent] = -range; - +s->mclms_prevvalues[s->mclms_recent] = av_clip(s->channel_residues[ich][icoef], +-range, range - 1); s->mclms_updates[s->mclms_recent] = WMASIGN(s->channel_residues[ich][icoef]); } @@ -726,7 +719,7 @@ static void lms_update(WmallDecodeCtx *s, int ich, int ilms, int input) static void use_high_update_speed(WmallDecodeCtx *s, int ich) { int ilms, recent, icoef; -for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) { +for (ilms = s->cdlms_ttl[ich]; ilms-- > 0; ) { recent = s->cdlms[ich][ilms].recent; if (s->update_speed[ich] == 16) continue; @@ -744,7 +737,7 @@ static void use_high_update_speed(WmallDecodeCtx *s, int ich) static void use_normal_update_speed(WmallDecodeCtx *s, int ich) { int ilms, recent, icoef; -for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) { +for (ilms = s->cdlms_ttl[ich]; ilms-- > 0; ) { recent = s->cdlms[ich][ilms].recent; if (s->update_speed[ich] == 8) continue; @@ -764,7 +757,7 @@ static void revert_cdlms(WmallDecodeCtx *s, int ch, int icoef, pred, ilms, num_lms, residue, input; num_lms = s->cdlms_ttl[ch]; -for (ilms = num_lms - 1; ilms >= 0; ilms--) { +for (ilms = num_lms; ilms-- > 0; ) { for (icoef = coef_begin; icoef < coef_end; icoef++) { pred = 1 << (s->cdlms[ch][ilms].scaling - 1); residue = s->channel_residues[ch][icoef]; @@ -1073,8 +1066,7 @@ static int decode_frame(WmallDecodeCtx *s) av_dlog(s->avctx, "Frame done\n"); -if (s->skip_frame) -s->skip_frame = 0; +s->skip_frame = 0; if (s->len_prefix) { if (len != (get_bits_count(gb) - s->frame_offset) + 2) { -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 2/2] avcodec/apedec: simplify sign conversion
>From fcc874caec6aa2ae439b476559a7a1ee25aecc4e Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 00:37:25 +0800 Subject: [PATCH 2/2] avcodec/apedec: simplify sign conversion Signed-off-by: Zeng Zhaoxiu --- libavcodec/apedec.c | 23 +-- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index f1ddf80..536361c 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -505,10 +505,7 @@ static inline int ape_decode_value_3860(APEContext *ctx, GetBitContext *gb, rice->k++; /* Convert to signed */ -if (x & 1) -return (x >> 1) + 1; -else -return -(x >> 1); +return ((x >> 1) ^ ((x & 1) - 1)) + 1; } static inline int ape_decode_value_3900(APEContext *ctx, APERice *rice) @@ -542,10 +539,7 @@ static inline int ape_decode_value_3900(APEContext *ctx, APERice *rice) update_rice(rice, x); /* Convert to signed */ -if (x & 1) -return (x >> 1) + 1; -else -return -(x >> 1); +return ((x >> 1) ^ ((x & 1) - 1)) + 1; } static inline int ape_decode_value_3990(APEContext *ctx, APERice *rice) @@ -588,10 +582,7 @@ static inline int ape_decode_value_3990(APEContext *ctx, APERice *rice) update_rice(rice, x); /* Convert to signed */ -if (x & 1) -return (x >> 1) + 1; -else -return -(x >> 1); +return ((x >> 1) ^ ((x & 1) - 1)) + 1; } static void decode_array_(APEContext *ctx, GetBitContext *gb, @@ -634,12 +625,8 @@ static void decode_array_(APEContext *ctx, GetBitContext *gb, } } -for (i = 0; i < blockstodecode; i++) { -if (out[i] & 1) -out[i] = (out[i] >> 1) + 1; -else -out[i] = -(out[i] >> 1); -} +for (i = 0; i < blockstodecode; i++) +out[i] = ((out[i] >> 1) ^ ((out[i] & 1) - 1)) + 1; } static void entropy_decode_mono_(APEContext *ctx, int blockstodecode) -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 1/2] avcodec/apedec: move 'coeffs[256] and delay[256]' into, long_filter_high_3800
>From b6ab794e41c549509c3e2aad30c0fc67726dbd56 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 00:33:32 +0800 Subject: [PATCH 1/2] avcodec/apedec: move 'coeffs[256] and delay[256]' into long_filter_high_3800 Signed-off-by: Zeng Zhaoxiu --- libavcodec/apedec.c | 18 -- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c index 383b7fe..f1ddf80 100644 --- a/libavcodec/apedec.c +++ b/libavcodec/apedec.c @@ -899,11 +899,11 @@ static av_always_inline int filter_3800(APEPredictor *p, return p->filterA[filter]; } -static void long_filter_high_3800(int32_t *buffer, int order, int shift, - int32_t *coeffs, int32_t *delay, int length) +static void long_filter_high_3800(int32_t *buffer, int order, int shift, int length) { int i, j; int32_t dotprod, sign; +int32_t coeffs[256], delay[256]; memset(coeffs, 0, order * sizeof(*coeffs)); for (i = 0; i < order; i++) @@ -947,13 +947,12 @@ static void predictor_decode_stereo_3800(APEContext *ctx, int count) APEPredictor *p = &ctx->predictor; int32_t *decoded0 = ctx->decoded[0]; int32_t *decoded1 = ctx->decoded[1]; -int32_t coeffs[256], delay[256]; int start = 4, shift = 10; if (ctx->compression_level == COMPRESSION_LEVEL_HIGH) { start = 16; -long_filter_high_3800(decoded0, 16, 9, coeffs, delay, count); -long_filter_high_3800(decoded1, 16, 9, coeffs, delay, count); +long_filter_high_3800(decoded0, 16, 9, count); +long_filter_high_3800(decoded1, 16, 9, count); } else if (ctx->compression_level == COMPRESSION_LEVEL_EXTRA_HIGH) { int order = 128, shift2 = 11; @@ -965,8 +964,8 @@ static void predictor_decode_stereo_3800(APEContext *ctx, int count) long_filter_ehigh_3830(decoded1 + order, count - order); } start = order; -long_filter_high_3800(decoded0, order, shift2, coeffs, delay, count); -long_filter_high_3800(decoded1, order, shift2, coeffs, delay, count); +long_filter_high_3800(decoded0, order, shift2, count); +long_filter_high_3800(decoded1, order, shift2, count); } while (count--) { @@ -1002,12 +1001,11 @@ static void predictor_decode_mono_3800(APEContext *ctx, int count) { APEPredictor *p = &ctx->predictor; int32_t *decoded0 = ctx->decoded[0]; -int32_t coeffs[256], delay[256]; int start = 4, shift = 10; if (ctx->compression_level == COMPRESSION_LEVEL_HIGH) { start = 16; -long_filter_high_3800(decoded0, 16, 9, coeffs, delay, count); +long_filter_high_3800(decoded0, 16, 9, count); } else if (ctx->compression_level == COMPRESSION_LEVEL_EXTRA_HIGH) { int order = 128, shift2 = 11; @@ -1018,7 +1016,7 @@ static void predictor_decode_mono_3800(APEContext *ctx, int count) long_filter_ehigh_3830(decoded0 + order, count - order); } start = order; -long_filter_high_3800(decoded0, order, shift2, coeffs, delay, count); +long_filter_high_3800(decoded0, order, shift2, count); } while (count--) { -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avcodec/golomb: simplify sign conversion
>From 7d782e106cf485ca9a44d4283a18402bf0a84fb9 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 00:44:39 +0800 Subject: [PATCH] avcodec/golomb: simplify sign conversion Signed-off-by: Zeng Zhaoxiu --- libavcodec/golomb.h | 41 + 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h index c4b1354..1632ee3 100644 --- a/libavcodec/golomb.h +++ b/libavcodec/golomb.h @@ -195,7 +195,7 @@ static inline int get_se_golomb(GetBitContext *gb) return ff_se_golomb_vlc_code[buf]; } else { -int log = av_log2(buf); +int log = av_log2(buf), sign; LAST_SKIP_BITS(re, gb, 31 - log); UPDATE_CACHE(re, gb); buf = GET_CACHE(re, gb); @@ -205,10 +205,8 @@ static inline int get_se_golomb(GetBitContext *gb) LAST_SKIP_BITS(re, gb, 32 - log); CLOSE_READER(re, gb); -if (buf & 1) -buf = -(buf >> 1); -else -buf = (buf >> 1); +sign = -(buf & 1); +buf = ((buf >> 1) ^ sign) - sign; return buf; } @@ -217,13 +215,10 @@ static inline int get_se_golomb(GetBitContext *gb) static inline int get_se_golomb_long(GetBitContext *gb) { unsigned int buf = get_ue_golomb_long(gb); +int sign; -if (buf & 1) -buf = (buf + 1) >> 1; -else -buf = -(buf >> 1); - -return buf; +sign = (buf & 1) - 1; +return ((buf >> 1) ^ sign) + 1; } static inline int svq3_get_se_golomb(GetBitContext *gb) @@ -264,13 +259,9 @@ static inline int dirac_get_se_golomb(GetBitContext *gb) uint32_t ret = svq3_get_ue_golomb(gb); if (ret) { -uint32_t buf; -OPEN_READER(re, gb); -UPDATE_CACHE(re, gb); -buf = SHOW_SBITS(re, gb, 1); -LAST_SKIP_BITS(re, gb, 1); -ret = (ret ^ buf) - buf; -CLOSE_READER(re, gb); +int sign; +sign = -get_bits1(gb); +ret = (ret ^ sign) - sign; } return ret; @@ -372,14 +363,11 @@ static inline int get_sr_golomb(GetBitContext *gb, int k, int limit, int esc_len) { int v = get_ur_golomb(gb, k, limit, esc_len); +int sign; v++; -if (v & 1) -return v >> 1; -else -return -(v >> 1); - -//return (v>>1) ^ -(v&1); +sign = (v & 1) - 1; +return ((v >> 1) ^ sign) - sign; } /** @@ -406,10 +394,7 @@ static inline unsigned int get_ur_golomb_shorten(GetBitContext *gb, int k) static inline int get_sr_golomb_shorten(GetBitContext *gb, int k) { int uvar = get_ur_golomb_jpegls(gb, k + 1, INT_MAX, 0); -if (uvar & 1) -return ~(uvar >> 1); -else -return uvar >> 1; +return (uvar >> 1) ^ -(uvar & 1); } #ifdef TRACE -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH 2/3] avcodec/wmalosslessdec: optimize sign operation
在 2015/2/14 16:47, Reimar Döffinger 写道: > On 13.02.2015, at 17:51, "zhaoxiu.zeng" wrote: >> From b08b4a38c87000fe5549de96f65de6ba77740b30 Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Fri, 13 Feb 2015 23:52:29 +0800 >> Subject: [PATCH 2/3] avcodec/wmalosslessdec: optimize sign operation >> >> Signed-off-by: Zeng Zhaoxiu >> --- >> libavcodec/wmalosslessdec.c | 34 -- >> 1 file changed, 8 insertions(+), 26 deletions(-) >> >> diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c >> index 9bd5e7b..1916594 100644 >> --- a/libavcodec/wmalosslessdec.c >> +++ b/libavcodec/wmalosslessdec.c >> @@ -175,6 +175,8 @@ typedef struct WmallDecodeCtx { >> int channel_coeffs[WMALL_MAX_CHANNELS][WMALL_BLOCK_MAX_SIZE]; >> } WmallDecodeCtx; >> >> +/** Get sign of integer (1 for positive, -1 for negative and 0 for zero) */ >> +#define WMASIGN(x) ((x > 0) - (x < 0)) > > Don't we already have a helper function for this operation in avutil? > I haven't checked, but I think I remember one. I just move the definition from back. We have a FFSIGN definition in avutil, but it is "((a) > 0 ? 1 : -1)". > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avcodec/golomb: simplify sign conversion
在 2015/2/14 16:43, Reimar Döffinger 写道: > On 13.02.2015, at 17:58, "zhaoxiu.zeng" wrote: >> From 7d782e106cf485ca9a44d4283a18402bf0a84fb9 Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Sat, 14 Feb 2015 00:44:39 +0800 >> Subject: [PATCH] avcodec/golomb: simplify sign conversion > > This may be faster, but IMHO the term "simplify" is completely wrong. Yes. Actually, this patch make the conversions branchless. > Also in most cases the sign variable should be initialized right at its > declaration instead of splitting it into 2 lines. I will commit a patch later. > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH 1/2] avcodec/parser: simplify ff_mpeg4video_split()
在 2015/2/13 17:22, wm4 写道: > On Fri, 13 Feb 2015 13:50:23 +0800 > Zhaoxiu Zeng wrote: > >> From 3cac16572aee4425377e4bc9e496ab5844200a51 Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Fri, 13 Feb 2015 13:27:26 +0800 >> Subject: [PATCH 1/2] avcodec/parser: simplify ff_mpeg4video_split() >> >> Signed-off-by: Zeng Zhaoxiu >> --- >> libavcodec/parser.c | 10 ++ >> 1 file changed, 6 insertions(+), 4 deletions(-) >> >> diff --git a/libavcodec/parser.c b/libavcodec/parser.c >> index aa25481..83019e7 100644 >> --- a/libavcodec/parser.c >> +++ b/libavcodec/parser.c >> @@ -28,6 +28,7 @@ >> #include "libavutil/mem.h" >> >> #include "parser.h" >> +#include "internal.h" >> >> static AVCodecParser *av_first_parser = NULL; >> >> @@ -308,13 +309,14 @@ void ff_parse_close(AVCodecParserContext *s) >> >> int ff_mpeg4video_split(AVCodecContext *avctx, const uint8_t *buf, >> int buf_size) >> { >> -int i; >> uint32_t state = -1; >> +const uint8_t *ptr = buf, *end = buf + buf_size; >> >> -for (i = 0; i < buf_size; i++) { >> -state = state << 8 | buf[i]; >> +while (ptr < end) { >> +ptr = avpriv_find_start_code(ptr, end, &state); >> if (state == 0x1B3 || state == 0x1B6) >> -return i - 3; >> +return ptr - 4 - buf; >> } >> + >> return 0; >> } > > I don't know, it looks more complicated to me now. Following track of > an integer index is much easier than playing with pointer arithmetics. > Also, why this (apparently) can return a negative integer index just > fine, your pointer calculations can go out of the range [buf, > buf+buf_size], possibly leading to undefined behavior. The code No problem. In this case, if state is 0x01xx ptr must behind "buf + 4", else ptr equal to end. > introduces a function call, without actually reducing the number of > lines. avpriv_find_start_code is faster than the byte-by-byte version! Also, we would optimize avpriv_find_start_code in the future. > > Well, I know nothing about this code, so you don't need to listen to > me. These are just my impressions. > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 1/5] avcodec/vc1: cleanup
>From 72e2c3dcb89000a1e0737afdf17ed145bb760fb1 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 19:02:14 +0800 Subject: [PATCH 1/5] avcodec/vc1: cleanup --- libavcodec/vc1.c | 229 ++- 1 file changed, 107 insertions(+), 122 deletions(-) diff --git a/libavcodec/vc1.c b/libavcodec/vc1.c index 19657ed..69f6586 100644 --- a/libavcodec/vc1.c +++ b/libavcodec/vc1.c @@ -234,37 +234,34 @@ static int vop_dquant_decoding(VC1Context *v) int pqdiff; //variable size -if (v->dquant == 2) { -pqdiff = get_bits(gb, 3); -if (pqdiff == 7) -v->altpq = get_bits(gb, 5); -else -v->altpq = v->pq + pqdiff + 1; -} else { +if (v->dquant != 2) { v->dquantfrm = get_bits1(gb); -if (v->dquantfrm) { -v->dqprofile = get_bits(gb, 2); -switch (v->dqprofile) { -case DQPROFILE_SINGLE_EDGE: -case DQPROFILE_DOUBLE_EDGES: -v->dqsbedge = get_bits(gb, 2); -break; -case DQPROFILE_ALL_MBS: -v->dqbilevel = get_bits1(gb); -if (!v->dqbilevel) -v->halfpq = 0; -default: -break; //Forbidden ? -} -if (v->dqbilevel || v->dqprofile != DQPROFILE_ALL_MBS) { -pqdiff = get_bits(gb, 3); -if (pqdiff == 7) -v->altpq = get_bits(gb, 5); -else -v->altpq = v->pq + pqdiff + 1; +if (!v->dquantfrm) +return 0; + +v->dqprofile = get_bits(gb, 2); +switch (v->dqprofile) { +case DQPROFILE_SINGLE_EDGE: +case DQPROFILE_DOUBLE_EDGES: +v->dqsbedge = get_bits(gb, 2); +break; +case DQPROFILE_ALL_MBS: +v->dqbilevel = get_bits1(gb); +if (!v->dqbilevel) { +v->halfpq = 0; +return 0; } +default: +break; //Forbidden ? } } + +pqdiff = get_bits(gb, 3); +if (pqdiff == 7) +v->altpq = get_bits(gb, 5); +else +v->altpq = v->pq + pqdiff + 1; + return 0; } @@ -335,8 +332,7 @@ int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitCo return -1; } v->extended_mv = get_bits1(gb); //common -if (!v->profile && v->extended_mv) -{ +if (!v->profile && v->extended_mv) { av_log(avctx, AV_LOG_ERROR, "Extended MVs unavailable in Simple Profile\n"); return -1; @@ -345,8 +341,7 @@ int ff_vc1_decode_sequence_header(AVCodecContext *avctx, VC1Context *v, GetBitCo v->vstransform = get_bits1(gb); //common v->res_transtab= get_bits1(gb); -if (v->res_transtab) -{ +if (v->res_transtab) { av_log(avctx, AV_LOG_ERROR, "1 for reserved RES_TRANSTAB is forbidden\n"); return -1; @@ -646,20 +641,18 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) v->multires = get_bits(gb, 2) == 1; else skip_bits(gb, 2); //framecnt unused -v->rangeredfrm = 0; if (v->rangered) v->rangeredfrm = get_bits1(gb); -v->s.pict_type = get_bits1(gb); -if (v->s.avctx->max_b_frames) { -if (!v->s.pict_type) { -if (get_bits1(gb)) -v->s.pict_type = AV_PICTURE_TYPE_I; -else -v->s.pict_type = AV_PICTURE_TYPE_B; -} else -v->s.pict_type = AV_PICTURE_TYPE_P; -} else -v->s.pict_type = v->s.pict_type ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; +else +v->rangeredfrm = 0; +if (get_bits1(gb)) +v->s.pict_type = AV_PICTURE_TYPE_P; +else { +if (v->s.avctx->max_b_frames && !get_bits1(gb)) +v->s.pict_type = AV_PICTURE_TYPE_B; +else +v->s.pict_type = AV_PICTURE_TYPE_I; +} v->bi_type = 0; if (v->s.pict_type == AV_PICTURE_TYPE_B) { @@ -689,19 +682,25 @@ int ff_vc1_parse_frame_header(VC1Context *v, GetBitContext* gb) v->pq = ff_vc1_pquant_table[0][pqindex]; else v->pq = ff_vc1_pquant_table[1][pqindex]; - -v->pquantizer = 1; -if (v->quantizer_mode == QUANT_FRAME_IMPLICIT) -v->pquantizer = pqindex < 9; -if (v->quantizer_mode == QUANT_NON_UNIFORM) -v->pquantizer = 0; v->pqindex = pqindex; if (pqindex < 9) v->halfpq = get_bits1(gb); else v->halfpq = 0; -if (v->quantizer_mode == QUANT_FRAME_EXPLICIT) +switch (v->quantizer_mode) { +case QUANT_FRAME_IMPLICIT: +v->pquantizer = pqindex < 9; +break; +case QUANT_NON_UNIFORM: +v->pquantizer = 0; +break; +case QUANT_FRAME_EXPLICIT: v->pquantizer = get_bits1(gb); +break; +default: +v->pquantizer = 1; +break; +}
[FFmpeg-devel] [PATCH 2/5] avcodec/vc1: optimize block functions
>From 960eca51e6e65e6969f7d829e29ddc2387420733 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 19:46:51 +0800 Subject: [PATCH 2/5] avcodec/vc1: optimize block functions --- libavcodec/vc1_block.c | 352 - 1 file changed, 142 insertions(+), 210 deletions(-) diff --git a/libavcodec/vc1_block.c b/libavcodec/vc1_block.c index aa62ec2..4976685 100644 --- a/libavcodec/vc1_block.c +++ b/libavcodec/vc1_block.c @@ -585,7 +585,7 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, int i; int16_t *dc_val; int16_t *ac_val, *ac_val2; -int dcdiff; +int dcdiff, scale; /* Get DC differential */ if (n < 4) { @@ -598,16 +598,12 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, return -1; } if (dcdiff) { +int m = (v->pq == 1 || v->pq == 2) ? 3 - v->pq : 0; if (dcdiff == 119 /* ESC index value */) { -/* TODO: Optimize */ -if (v->pq == 1) dcdiff = get_bits(gb, 10); -else if (v->pq == 2) dcdiff = get_bits(gb, 9); -else dcdiff = get_bits(gb, 8); +dcdiff = get_bits(gb, 8 + m); } else { -if (v->pq == 1) -dcdiff = (dcdiff << 2) + get_bits(gb, 2) - 3; -else if (v->pq == 2) -dcdiff = (dcdiff << 1) + get_bits1(gb) - 1; +if (m) +dcdiff = (dcdiff << m) + get_bits(gb, m) - (2 * m - 1); } if (get_bits1(gb)) dcdiff = -dcdiff; @@ -623,21 +619,23 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, } else { block[0] = dcdiff * s->c_dc_scale; } -/* Skip ? */ -if (!coded) { -goto not_coded; -} -// AC Decoding -i = 1; +ac_val = s->ac_val[0][0] + s->block_index[n] * 16; +ac_val2 = ac_val; +if (dc_pred_dir) // left +ac_val -= 16; +else // top +ac_val -= 16 * s->block_wrap[n]; -{ +scale = v->pq * 2 + v->halfpq; + +if (coded) { int last = 0, skip, value; const uint8_t *zz_table; -int scale; int k; -scale = v->pq * 2 + v->halfpq; +// AC Decoding +i = 1; if (v->s.ac_pred) { if (!dc_pred_dir) @@ -647,13 +645,6 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, } else zz_table = v->zz_8x8[1]; -ac_val = s->ac_val[0][0] + s->block_index[n] * 16; -ac_val2 = ac_val; -if (dc_pred_dir) // left -ac_val -= 16; -else // top -ac_val -= 16 * s->block_wrap[n]; - while (!last) { vc1_decode_ac_coeff(v, &last, &skip, &value, codingset); i += skip; @@ -664,13 +655,15 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, /* apply AC prediction if needed */ if (s->ac_pred) { +int sh; if (dc_pred_dir) { // left -for (k = 1; k < 8; k++) -block[k << v->left_blk_sh] += ac_val[k]; +sh = v->left_blk_sh; } else { // top -for (k = 1; k < 8; k++) -block[k << v->top_blk_sh] += ac_val[k + 8]; +sh = v->top_blk_sh; +ac_val += 8; } +for (k = 1; k < 8; k++) +block[k << sh] += ac_val[k]; } /* save AC coeffs for further prediction */ for (k = 1; k < 8; k++) { @@ -687,42 +680,31 @@ static int vc1_decode_i_block(VC1Context *v, int16_t block[64], int n, } if (s->ac_pred) i = 63; -} -not_coded: -if (!coded) { -int k, scale; -ac_val = s->ac_val[0][0] + s->block_index[n] * 16; -ac_val2 = ac_val; +} else { +int k; i = 0; -scale = v->pq * 2 + v->halfpq; + memset(ac_val2, 0, 16 * 2); -if (dc_pred_dir) { // left -ac_val -= 16; -if (s->ac_pred) -memcpy(ac_val2, ac_val, 8 * 2); -} else { // top -ac_val -= 16 * s->block_wrap[n]; -if (s->ac_pred) -memcpy(ac_val2 + 8, ac_val + 8, 8 * 2); -} /* apply AC prediction if needed */ if (s->ac_pred) { -if (dc_pred_dir) { //left -for (k = 1; k < 8; k++) { -block[k << v->left_blk_sh] = ac_val[k] * scale; -if (!v->pquantizer && block[k << v->left_blk_sh]) -block[k << v->left_blk_sh] += (block[k << v->left_blk_sh] < 0) ? -v->pq : v->pq; -} +int sh; +if (dc_pred_dir) { // left +sh = v->left_blk_sh; } else { // top -for (k = 1; k < 8; k++) { -block[k << v->top_blk_
[FFmpeg-devel] [PATCH 3/5] avcodec/vc1_pred: few branchless optimizations
>From 7e4038fe1291b857261584e69323486fc955cfb2 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 20:08:48 +0800 Subject: [PATCH 3/5] avcodec/vc1_pred: few branchless optimizations --- libavcodec/vc1_pred.c | 68 +-- 1 file changed, 23 insertions(+), 45 deletions(-) diff --git a/libavcodec/vc1_pred.c b/libavcodec/vc1_pred.c index d0908ef..f74992b 100644 --- a/libavcodec/vc1_pred.c +++ b/libavcodec/vc1_pred.c @@ -392,17 +392,13 @@ void ff_vc1_pred_mv(VC1Context *v, int n, int dmv_x, int dmv_y, /* Pullback MV as specified in 8.3.5.3.4 */ if (!v->field_mode) { int qx, qy, X, Y; +int MV = mv1 ? -60 : -28; qx = (s->mb_x << 6) + ((n == 1 || n == 3) ? 32 : 0); qy = (s->mb_y << 6) + ((n == 2 || n == 3) ? 32 : 0); X = (s->mb_width << 6) - 4; Y = (s->mb_height << 6) - 4; -if (mv1) { -if (qx + px < -60) px = -60 - qx; -if (qy + py < -60) py = -60 - qy; -} else { -if (qx + px < -28) px = -28 - qx; -if (qy + py < -28) py = -28 - qy; -} +if (qx + px < MV) px = MV - qx; +if (qy + py < MV) py = MV - qy; if (qx + px > X) px = X - qx; if (qy + py > Y) py = Y - qy; } @@ -759,25 +755,16 @@ void ff_vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], /* Pullback MV as specified in 8.3.5.3.4 */ { int qx, qy, X, Y; -if (v->profile < PROFILE_ADVANCED) { -qx = (s->mb_x << 5); -qy = (s->mb_y << 5); -X = (s->mb_width << 5) - 4; -Y = (s->mb_height << 5) - 4; -if (qx + px < -28) px = -28 - qx; -if (qy + py < -28) py = -28 - qy; -if (qx + px > X) px = X - qx; -if (qy + py > Y) py = Y - qy; -} else { -qx = (s->mb_x << 6); -qy = (s->mb_y << 6); -X = (s->mb_width << 6) - 4; -Y = (s->mb_height << 6) - 4; -if (qx + px < -60) px = -60 - qx; -if (qy + py < -60) py = -60 - qy; -if (qx + px > X) px = X - qx; -if (qy + py > Y) py = Y - qy; -} +int sh = v->profile < PROFILE_ADVANCED ? 5 : 6; +int MV = 4 - (1 << sh); +qx = (s->mb_x << sh); +qy = (s->mb_y << sh); +X = (s->mb_width << sh) - 4; +Y = (s->mb_height << sh) - 4; +if (qx + px < MV) px = MV - qx; +if (qy + py < MV) py = MV - qy; +if (qx + px > X) px = X - qx; +if (qy + py > Y) py = Y - qy; } /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ if (0 && !s->first_slice_line && s->mb_x) { @@ -838,25 +825,16 @@ void ff_vc1_pred_b_mv(VC1Context *v, int dmv_x[2], int dmv_y[2], /* Pullback MV as specified in 8.3.5.3.4 */ { int qx, qy, X, Y; -if (v->profile < PROFILE_ADVANCED) { -qx = (s->mb_x << 5); -qy = (s->mb_y << 5); -X = (s->mb_width << 5) - 4; -Y = (s->mb_height << 5) - 4; -if (qx + px < -28) px = -28 - qx; -if (qy + py < -28) py = -28 - qy; -if (qx + px > X) px = X - qx; -if (qy + py > Y) py = Y - qy; -} else { -qx = (s->mb_x << 6); -qy = (s->mb_y << 6); -X = (s->mb_width << 6) - 4; -Y = (s->mb_height << 6) - 4; -if (qx + px < -60) px = -60 - qx; -if (qy + py < -60) py = -60 - qy; -if (qx + px > X) px = X - qx; -if (qy + py > Y) py = Y - qy; -} +int sh = v->profile < PROFILE_ADVANCED ? 5 : 6; +int MV = 4 - (1 << sh); +qx = (s->mb_x << sh); +qy = (s->mb_y << sh); +X = (s->mb_width << sh) - 4; +Y = (s->mb_height << sh) - 4; +if (qx + px < MV) px = MV - qx; +if (qy + py < MV) py = MV - qy; +if (qx + px > X) px = X - qx; +if (qy + py > Y) py = Y - qy; } /* Calculate hybrid prediction as specified in 8.3.5.3.5 */ if (0 && !s->first_slice_line && s->mb_x) { -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 4/5] avcodec/vc1_mc: create some helper functions for scaling blocks
>From a67cc93ea550ba2670003f5be024626a093a06fd Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 21:09:28 +0800 Subject: [PATCH 4/5] avcodec/vc1_mc: create some helper functions for scaling blocks --- libavcodec/vc1_mc.c | 254 +++- 1 file changed, 110 insertions(+), 144 deletions(-) diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c index 17800cb..15840fa 100644 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -32,6 +32,74 @@ #include "mpegvideo.h" #include "vc1.h" +static void vc1_scale_luma(uint8_t *srcY, int k, int linesize) +{ +int i, j; +for (j = 0; j < k; j++) { +for (i = 0; i < k; i++) +srcY[i] = ((srcY[i] - 128) >> 1) + 128; +srcY += linesize; +} +} + +static void vc1_scale_chroma(uint8_t *srcU, uint8_t *srcV, + int k, int uvlinesize) +{ +int i, j; +for (j = 0; j < k; j++) { +for (i = 0; i < k; i++) { +srcU[i] = ((srcU[i] - 128) >> 1) + 128; +srcV[i] = ((srcV[i] - 128) >> 1) + 128; +} +srcU += uvlinesize; +srcV += uvlinesize; +} +} + +static void vc1_lut_scale_luma(uint8_t *srcY, uint8_t *lut1, uint8_t *lut2, + int k, int linesize) +{ +int i, j; + +for (j = 0; j < k; j += 2) { +for (i = 0; i < k; i++) +srcY[i] = lut1[srcY[i]]; +srcY += linesize; + +if (j + 1 == k) +break; + +for (i = 0; i < k; i++) +srcY[i] = lut2[srcY[i]]; +srcY += linesize; +} +} + +static void vc1_lut_scale_chroma(uint8_t *srcU, uint8_t *srcV, uint8_t *lut1, + uint8_t *lut2, int k, int uvlinesize) +{ +int i, j; + +for (j = 0; j < k; j += 2) { +for (i = 0; i < k; i++) { +srcU[i] = lut1[srcU[i]]; +srcV[i] = lut1[srcV[i]]; +} +srcU += uvlinesize; +srcV += uvlinesize; + +if (j + 1 == k) +break; + +for (i = 0; i < k; i++) { +srcU[i] = lut2[srcU[i]]; +srcV[i] = lut2[srcV[i]]; +} +srcU += uvlinesize; +srcV += uvlinesize; +} +} + /** Do motion compensation over 1 macroblock * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c */ @@ -147,11 +215,12 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) || (unsigned)(src_y - 1)> v_edge_pos- (my&3) - 16 - 3) { uint8_t *ubuf = s->edge_emu_buffer + 19 * s->linesize; uint8_t *vbuf = ubuf + 9 * s->uvlinesize; +const int k = 17 + s->mspel * 2; srcY -= s->mspel * (1 + s->linesize); s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, s->linesize, - 17 + s->mspel * 2, 17 + s->mspel * 2, + k, k, src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, v_edge_pos); srcY = s->edge_emu_buffer; @@ -169,56 +238,26 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) srcV = vbuf; /* if we deal with range reduction we need to scale source blocks */ if (v->rangeredfrm) { -int i, j; -uint8_t *src, *src2; - -src = srcY; -for (j = 0; j < 17 + s->mspel * 2; j++) { -for (i = 0; i < 17 + s->mspel * 2; i++) -src[i] = ((src[i] - 128) >> 1) + 128; -src += s->linesize; -} -src = srcU; -src2 = srcV; -for (j = 0; j < 9; j++) { -for (i = 0; i < 9; i++) { -src[i] = ((src[i] - 128) >> 1) + 128; -src2[i] = ((src2[i] - 128) >> 1) + 128; -} -src += s->uvlinesize; -src2 += s->uvlinesize; -} +vc1_scale_luma(srcY, k, s->linesize); +vc1_scale_chroma(srcU, srcV, 9, s->uvlinesize); } /* if we deal with intensity compensation we need to scale source blocks */ if (use_ic) { -int i, j; -uint8_t *src, *src2; - -src = srcY; -for (j = 0; j < 17 + s->mspel * 2; j++) { -int f = v->field_mode ? v->ref_field_type[dir] : ((j + src_y - s->mspel) & 1) ; -for (i = 0; i < 17 + s->mspel * 2; i++) -src[i] = luty[f][src[i]]; -src += s->linesize; -} -src = srcU; -src2 = srcV; -for (j = 0; j < 9; j++) { -int f = v->field_mode ? v->ref_field_type[dir] : ((j + uvsrc_y) & 1); -for (i = 0; i < 9; i++) { -src[i] = lutuv[f][src[i]]; -src2[i] = lutuv[f][src2[i]]; -} -src += s->uvlinesize; -
[FFmpeg-devel] [PATCH 5/5] avcodec/vc1_mc: move median4() to mathops.h
>From 2f68090470ce1f4eb738e7a4af80c78a7b5d461a Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 14 Feb 2015 21:11:18 +0800 Subject: [PATCH 5/5] avcodec/vc1_mc: move median4() to mathops.h --- libavcodec/mathops.h | 14 ++ libavcodec/vc1_mc.c | 11 --- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/libavcodec/mathops.h b/libavcodec/mathops.h index 87fca0c..87d110b 100644 --- a/libavcodec/mathops.h +++ b/libavcodec/mathops.h @@ -121,6 +121,20 @@ static inline av_const int mid_pred(int a, int b, int c) } #endif +#ifndef median4 +#define median4 median4 +static inline av_const int median4(int a, int b, int c, int d) +{ +if (a < b) { +if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2; +else return (FFMIN(b, c) + FFMAX(a, d)) / 2; +} else { +if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2; +else return (FFMIN(a, c) + FFMAX(b, d)) / 2; +} +} +#endif + #ifndef sign_extend static inline av_const int sign_extend(int val, unsigned bits) { diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c index 15840fa..74f34a3 100644 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -279,17 +279,6 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) } } -static inline int median4(int a, int b, int c, int d) -{ -if (a < b) { -if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2; -else return (FFMIN(b, c) + FFMAX(a, d)) / 2; -} else { -if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2; -else return (FFMIN(a, c) + FFMAX(b, d)) / 2; -} -} - /** Do motion compensation for 4-MV macroblock - luminance block */ void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH 5/5] avcodec/vc1_mc: move median4() to mathops.h
在 2015/2/14 23:18, Paul B Mahol 写道: > On 2/14/15, zhaoxiu.zeng wrote: >> From 2f68090470ce1f4eb738e7a4af80c78a7b5d461a Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Sat, 14 Feb 2015 21:11:18 +0800 >> Subject: [PATCH 5/5] avcodec/vc1_mc: move median4() to mathops.h >> >> --- >> libavcodec/mathops.h | 14 ++ >> libavcodec/vc1_mc.c | 11 --- >> 2 files changed, 14 insertions(+), 11 deletions(-) >> >> diff --git a/libavcodec/mathops.h b/libavcodec/mathops.h >> index 87fca0c..87d110b 100644 >> --- a/libavcodec/mathops.h >> +++ b/libavcodec/mathops.h >> @@ -121,6 +121,20 @@ static inline av_const int mid_pred(int a, int b, int >> c) >> } >> #endif >> >> +#ifndef median4 >> +#define median4 median4 >> +static inline av_const int median4(int a, int b, int c, int d) >> +{ >> +if (a < b) { >> +if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2; >> +else return (FFMIN(b, c) + FFMAX(a, d)) / 2; >> +} else { >> +if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2; >> +else return (FFMIN(a, c) + FFMAX(b, d)) / 2; >> +} >> +} >> +#endif >> + >> #ifndef sign_extend >> static inline av_const int sign_extend(int val, unsigned bits) >> { >> diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c >> index 15840fa..74f34a3 100644 >> --- a/libavcodec/vc1_mc.c >> +++ b/libavcodec/vc1_mc.c >> @@ -279,17 +279,6 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) >> } >> } >> >> -static inline int median4(int a, int b, int c, int d) >> -{ >> -if (a < b) { >> -if (c < d) return (FFMIN(b, d) + FFMAX(a, c)) / 2; >> -else return (FFMIN(b, c) + FFMAX(a, d)) / 2; >> -} else { >> -if (c < d) return (FFMIN(a, d) + FFMAX(b, c)) / 2; >> -else return (FFMIN(a, c) + FFMAX(b, d)) / 2; >> -} >> -} >> - >> /** Do motion compensation for 4-MV macroblock - luminance block >> */ >> void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) >> -- >> 2.1.0 >> >> ___ >> ffmpeg-devel mailing list >> ffmpeg-devel@ffmpeg.org >> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel >> > > why? We may provide the architecture related optimization. > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH 4/5] avcodec/vc1_mc: create some helper functions for scaling blocks
在 2015/2/14 23:48, Hendrik Leppkes 写道: > On Sat, Feb 14, 2015 at 4:11 PM, zhaoxiu.zeng wrote: >> From a67cc93ea550ba2670003f5be024626a093a06fd Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Sat, 14 Feb 2015 21:09:28 +0800 >> Subject: [PATCH 4/5] avcodec/vc1_mc: create some helper functions for scaling >> blocks >> > > Shouldn't those functions get an inline tag, or even force-inline? > > - Hendrik > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > Should be inlined. --- libavcodec/vc1_mc.c | 257 +++- 1 file changed, 113 insertions(+), 144 deletions(-) diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c index 64f8854..683b620 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -32,6 +32,77 @@ #include "mpegvideo.h" #include "vc1.h" +static av_always_inline void vc1_scale_luma(uint8_t *srcY, +int k, int linesize) +{ +int i, j; +for (j = 0; j < k; j++) { +for (i = 0; i < k; i++) +srcY[i] = ((srcY[i] - 128) >> 1) + 128; +srcY += linesize; +} +} + +static av_always_inline void vc1_scale_chroma(uint8_t *srcU, uint8_t *srcV, + int k, int uvlinesize) +{ +int i, j; +for (j = 0; j < k; j++) { +for (i = 0; i < k; i++) { +srcU[i] = ((srcU[i] - 128) >> 1) + 128; +srcV[i] = ((srcV[i] - 128) >> 1) + 128; +} +srcU += uvlinesize; +srcV += uvlinesize; +} +} + +static av_always_inline void vc1_lut_scale_luma(uint8_t *srcY, +uint8_t *lut1, uint8_t *lut2, +int k, int linesize) +{ +int i, j; + +for (j = 0; j < k; j += 2) { +for (i = 0; i < k; i++) +srcY[i] = lut1[srcY[i]]; +srcY += linesize; + +if (j + 1 == k) +break; + +for (i = 0; i < k; i++) +srcY[i] = lut2[srcY[i]]; +srcY += linesize; +} +} + +static av_always_inline void vc1_lut_scale_chroma(uint8_t *srcU, uint8_t *srcV, + uint8_t *lut1, uint8_t *lut2, + int k, int uvlinesize) +{ +int i, j; + +for (j = 0; j < k; j += 2) { +for (i = 0; i < k; i++) { +srcU[i] = lut1[srcU[i]]; +srcV[i] = lut1[srcV[i]]; +} +srcU += uvlinesize; +srcV += uvlinesize; + +if (j + 1 == k) +break; + +for (i = 0; i < k; i++) { +srcU[i] = lut2[srcU[i]]; +srcV[i] = lut2[srcV[i]]; +} +srcU += uvlinesize; +srcV += uvlinesize; +} +} + /** Do motion compensation over 1 macroblock * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c */ @@ -147,11 +218,12 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) || (unsigned)(src_y - 1)> v_edge_pos- (my&3) - 16 - 3) { uint8_t *ubuf = s->edge_emu_buffer + 19 * s->linesize; uint8_t *vbuf = ubuf + 9 * s->uvlinesize; +const int k = 17 + s->mspel * 2; srcY -= s->mspel * (1 + s->linesize); s->vdsp.emulated_edge_mc(s->edge_emu_buffer, srcY, s->linesize, s->linesize, - 17 + s->mspel * 2, 17 + s->mspel * 2, + k, k, src_x - s->mspel, src_y - s->mspel, s->h_edge_pos, v_edge_pos); srcY = s->edge_emu_buffer; @@ -169,56 +241,26 @@ void ff_vc1_mc_1mv(VC1Context *v, int dir) srcV = vbuf; /* if we deal with range reduction we need to scale source blocks */ if (v->rangeredfrm) { -int i, j; -uint8_t *src, *src2; - -src = srcY; -for (j = 0; j < 17 + s->mspel * 2; j++) { -for (i = 0; i < 17 + s->mspel * 2; i++) -src[i] = ((src[i] - 128) >> 1) + 128; -src += s->linesize; -} -src = srcU; -src2 = srcV; -for (j = 0; j < 9; j++) { -for (i = 0; i < 9; i++) { -src[i] = ((src[i] - 128) >> 1) + 128; -src2[i] = ((src2[i] - 128) >> 1) + 128; -} -src += s->uvlinesize; -src2 += s->uvlinesize; -} +vc1_scale_luma(srcY, k, s->linesize); +vc1_scale_chroma(srcU, srcV, 9, s->uvlinesize);
Re: [FFmpeg-devel] [PATCH 2/2] avcodec/h264: simplify h264_split()
在 2015/2/15 8:38, Michael Niedermayer 写道: > On Fri, Feb 13, 2015 at 01:51:30PM +0800, Zhaoxiu Zeng wrote: >> From 52be21b15e078fb52a841aefcf78409a408fe8b4 Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Fri, 13 Feb 2015 13:37:46 +0800 >> Subject: [PATCH 2/2] avcodec/h264: simplify h264_split() >> >> Signed-off-by: Zeng Zhaoxiu >> --- >> libavcodec/h264_parser.c | 35 +++ >> 1 file changed, 19 insertions(+), 16 deletions(-) > > patch applied > > please make sure future patches you submit dont contain line wraps > like this: > > [...] >> + * nalu_type == 0x05) { >> * } >> */ >> -if ((state & 0xFF00) == 0x100 && ((state & 0xFF1F) != >> 0x106 || has_pps) && > > [...] > > > > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > OK. That happened when i copied text to web mail. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH 3/5] avcodec/vc1_pred: few branchless optimizations
在 2015/2/15 2:42, Christophe Gisquet 写道: > 2015-02-14 17:14 GMT+01:00 Michael Niedermayer : >> On Sat, Feb 14, 2015 at 11:03:13PM +0800, zhaoxiu.zeng wrote: >>> From 7e4038fe1291b857261584e69323486fc955cfb2 Mon Sep 17 00:00:00 2001 >>> From: Zeng Zhaoxiu >>> Date: Sat, 14 Feb 2015 20:08:48 +0800 >>> Subject: [PATCH 3/5] avcodec/vc1_pred: few branchless optimizations >> >> applied >> >> please include benchmark values in future optimization patches > > Yes, please, cf. START/STOP_TIMER macros. > OK. I will obey the rules! Thanks. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 1/5] avcodec/vc1_mc: remove useless variables
>From b448a6af018f8322c761571149d961853492a437 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 7 Mar 2015 16:24:42 +0800 Subject: [PATCH 1/5] avcodec/vc1_mc: remove useless variables Signed-off-by: Zeng Zhaoxiu --- libavcodec/vc1_mc.c | 18 +++--- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c index 683b620..18324c0 100644 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -778,7 +778,6 @@ void ff_vc1_interp_mc(VC1Context *v) H264ChromaContext *h264chroma = &v->h264chroma; uint8_t *srcY, *srcU, *srcV; int dxy, mx, my, uvmx, uvmy, src_x, src_y, uvsrc_x, uvsrc_y; -int off, off_uv; int v_edge_pos = s->v_edge_pos >> v->field_mode; int use_ic = v->next_use_ic; @@ -881,19 +880,16 @@ void ff_vc1_interp_mc(VC1Context *v) srcY += s->mspel * (1 + s->linesize); } -off= 0; -off_uv = 0; - if (s->mspel) { dxy = ((my & 3) << 2) | (mx & 3); -v->vc1dsp.avg_vc1_mspel_pixels_tab[0][dxy](s->dest[0] + off, srcY , s->linesize, v->rnd); +v->vc1dsp.avg_vc1_mspel_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, v->rnd); } else { // hpel mc dxy = (my & 2) | ((mx & 2) >> 1); if (!v->rnd) -s->hdsp.avg_pixels_tab[0][dxy](s->dest[0] + off, srcY, s->linesize, 16); +s->hdsp.avg_pixels_tab[0][dxy](s->dest[0], srcY, s->linesize, 16); else -s->hdsp.avg_no_rnd_pixels_tab[dxy](s->dest[0] + off, srcY, s->linesize, 16); +s->hdsp.avg_no_rnd_pixels_tab[dxy](s->dest[0], srcY, s->linesize, 16); } if (s->flags & CODEC_FLAG_GRAY) return; @@ -901,10 +897,10 @@ void ff_vc1_interp_mc(VC1Context *v) uvmx = (uvmx & 3) << 1; uvmy = (uvmy & 3) << 1; if (!v->rnd) { -h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy); -h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy); +h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); +h264chroma->avg_h264_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); } else { -v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1] + off_uv, srcU, s->uvlinesize, 8, uvmx, uvmy); -v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2] + off_uv, srcV, s->uvlinesize, 8, uvmx, uvmy); +v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[1], srcU, s->uvlinesize, 8, uvmx, uvmy); +v->vc1dsp.avg_no_rnd_vc1_chroma_pixels_tab[0](s->dest[2], srcV, s->uvlinesize, 8, uvmx, uvmy); } } -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 2/5] avcodec/vc1_mc: Simplify v_edge_pos and src_y correction when fieldmv is true
>From 1a57b4d3809710aeefc073a102a38e82f1d6e164 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 7 Mar 2015 17:36:33 +0800 Subject: [PATCH 2/5] avcodec/vc1_mc: Simplify v_edge_pos and src_y correction when fieldmv is true Signed-off-by: Zeng Zhaoxiu --- libavcodec/vc1_mc.c | 21 - 1 file changed, 12 insertions(+), 9 deletions(-) mode change 100644 => 100755 libavcodec/vc1_mc.c diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c old mode 100644 new mode 100755 index 18324c0..4b7f8b6 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -416,10 +416,12 @@ void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) if (v->field_mode && v->ref_field_type[dir]) srcY += s->current_picture_ptr->f->linesize[0]; -if (fieldmv && !(src_y & 1)) -v_edge_pos--; -if (fieldmv && (src_y & 1) && src_y < 4) -src_y--; +if (fieldmv) { +if (!(src_y & 1)) +v_edge_pos--; +else +src_y -= (src_y < 4); +} if (v->rangeredfrm || use_ic || s->h_edge_pos < 13 || v_edge_pos < 23 || (unsigned)(src_x - s->mspel) > s->h_edge_pos - (mx & 3) - 8 - s->mspel * 2 @@ -722,11 +724,12 @@ void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg) uvmx_field[i] = (uvmx_field[i] & 3) << 1; uvmy_field[i] = (uvmy_field[i] & 3) << 1; -if (fieldmv && !(uvsrc_y & 1)) -v_edge_pos = (s->v_edge_pos >> 1) - 1; - -if (fieldmv && (uvsrc_y & 1) && uvsrc_y < 2) -uvsrc_y--; +if (fieldmv) { +if (!(uvsrc_y & 1)) +v_edge_pos = (s->v_edge_pos >> 1) - 1; +else +uvsrc_y -= (uvsrc_y < 2); +} if (use_ic || s->h_edge_pos < 10 || v_edge_pos < (5 << fieldmv) || (unsigned)uvsrc_x > (s->h_edge_pos >> 1) - 5 -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 3/5] avcodec/vc1_mc: change the type of s_rndtblfield to uint8_t
>From 89d7ae20136a6d65cd72117dd367f60003a7391e Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 7 Mar 2015 17:38:54 +0800 Subject: [PATCH 3/5] avcodec/vc1_mc: change the type of s_rndtblfield to uint8_t Signed-off-by: Zeng Zhaoxiu --- libavcodec/vc1_mc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) mode change 100755 => 100644 libavcodec/vc1_mc.c diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c old mode 100755 new mode 100644 index 4b7f8b6..88473ea --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -679,7 +679,7 @@ void ff_vc1_mc_4mv_chroma4(VC1Context *v, int dir, int dir2, int avg) int uvmx_field[4], uvmy_field[4]; int i, off, tx, ty; int fieldmv = v->blk_mv_type[s->block_index[0]]; -static const int s_rndtblfield[16] = { 0, 0, 1, 2, 4, 4, 5, 6, 2, 2, 3, 8, 6, 6, 7, 12 }; +static const uint8_t s_rndtblfield[16] = { 0, 0, 1, 2, 4, 4, 5, 6, 2, 2, 3, 8, 6, 6, 7, 12 }; int v_dist = fieldmv ? 1 : 4; // vertical offset for lower sub-blocks int v_edge_pos = s->v_edge_pos >> 1; int use_ic; -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 4/5] avcodec/vc1_mc: simplifying
>From 5b695f07a5c62149bf2477efd02150e74ea12c36 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 7 Mar 2015 17:41:51 +0800 Subject: [PATCH 4/5] avcodec/vc1_mc: simplifying Signed-off-by: Zeng Zhaoxiu --- libavcodec/vc1_mc.c | 18 ++ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c index 88473ea..05d6e20 100644 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -403,13 +403,7 @@ void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) } else { src_x = av_clip(src_x, -17, s->avctx->coded_width); -if (v->fcm == ILACE_FRAME) { -if (src_y & 1) -src_y = av_clip(src_y, -17, s->avctx->coded_height + 1); -else -src_y = av_clip(src_y, -18, s->avctx->coded_height); -} else { -src_y = av_clip(src_y, -18, s->avctx->coded_height + 1); -} +src_y = av_clip(src_y, -17 - (v->fcm != ILACE_FRAME || !(src_y & 1)), + s->avctx->coded_height + (v->fcm != ILACE_FRAME || (src_y & 1))); } srcY += src_y * s->linesize + src_x; -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH 5/5] avcodec/vc1_mc: optimize get_chroma_mv, and add get_luma_mv
>From 8936ad9561a44fa71126a07efc2ca8096d209600 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 7 Mar 2015 22:08:35 +0800 Subject: [PATCH 5/5] avcodec/vc1_mc: optimize get_chroma_mv, and add get_luma_mv Test results: before: fate-suite/vc1/SA10091.vc1: 1062 decicycles in ff_vc1_mc_4mv_chroma's get mv, 4089 runs, 7 skips fate-suite/vc1/SA10143.vc1: 1112 decicycles in ff_vc1_mc_4mv_luma's get mv, 4096 runs, 0 skips fate-suite/vc1/SA20021.vc1: 991 decicycles in ff_vc1_mc_4mv_chroma get mv, 8192 runs, 0 skips after: fate-suite/vc1/SA10091.vc1: 940 decicycles in ff_vc1_mc_4mv_chroma's get mv, 4096 runs, 0 skips fate-suite/vc1/SA10143.vc1: 786 decicycles in ff_vc1_mc_4mv_luma's get mv, 4096 runs, 0 skips fate-suite/vc1/SA20021.vc1: 876 decicycles in ff_vc1_mc_4mv_chroma get mv, 8189 runs, 3 skips Signed-off-by: Zeng Zhaoxiu --- libavcodec/vc1_mc.c | 181 ++-- 1 file changed, 75 insertions(+), 106 deletions(-) diff --git a/libavcodec/vc1_mc.c b/libavcodec/vc1_mc.c index 05d6e20..f3f102e 100644 --- a/libavcodec/vc1_mc.c +++ b/libavcodec/vc1_mc.c @@ -103,6 +103,69 @@ static av_always_inline void vc1_lut_scale_chroma(uint8_t *srcU, uint8_t *srcV, } } +static const uint8_t popcount4[16] = { 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 }; + +static av_always_inline int get_luma_mv(VC1Context *v, int dir, int16_t *tx, int16_t *ty) +{ +MpegEncContext *s = &v->s; +int idx = v->mv_f[dir][s->block_index[0] + v->blocks_off] | + (v->mv_f[dir][s->block_index[1] + v->blocks_off] << 1) | + (v->mv_f[dir][s->block_index[2] + v->blocks_off] << 2) | + (v->mv_f[dir][s->block_index[3] + v->blocks_off] << 3); +static const uint8_t index2[16] = { 0, 0, 0, 0x23, 0, 0x13, 0x03, 0, 0, 0x12, 0x02, 0, 0x01, 0, 0, 0 }; +int opp_count = popcount4[idx]; + +switch (opp_count) { +case 0: +case 4: +*tx = median4(s->mv[dir][0][0], s->mv[dir][1][0], s->mv[dir][2][0], s->mv[dir][3][0]); +*ty = median4(s->mv[dir][0][1], s->mv[dir][1][1], s->mv[dir][2][1], s->mv[dir][3][1]); +break; +case 1: +*tx = mid_pred(s->mv[dir][idx < 2][0], s->mv[dir][1 + (idx < 4)][0], s->mv[dir][2 + (idx < 8)][0]); +*ty = mid_pred(s->mv[dir][idx < 2][1], s->mv[dir][1 + (idx < 4)][1], s->mv[dir][2 + (idx < 8)][1]); +break; +case 3: +*tx = mid_pred(s->mv[dir][idx > 0xd][0], s->mv[dir][1 + (idx > 0xb)][0], s->mv[dir][2 + (idx > 0x7)][0]); +*ty = mid_pred(s->mv[dir][idx > 0xd][1], s->mv[dir][1 + (idx > 0xb)][1], s->mv[dir][2 + (idx > 0x7)][1]); +break; +case 2: +*tx = (s->mv[dir][index2[idx] >> 4][0] + s->mv[dir][index2[idx] & 0xf][0]) / 2; +*ty = (s->mv[dir][index2[idx] >> 4][1] + s->mv[dir][index2[idx] & 0xf][1]) / 2; +break; +} +return opp_count; +} + +static av_always_inline int get_chroma_mv(VC1Context *v, int dir, int16_t *tx, int16_t *ty) +{ +MpegEncContext *s = &v->s; +int idx = !v->mb_type[0][s->block_index[0]] | + (!v->mb_type[0][s->block_index[1]] << 1) | + (!v->mb_type[0][s->block_index[2]] << 2) | + (!v->mb_type[0][s->block_index[3]] << 3); +static const uint8_t index2[16] = { 0, 0, 0, 0x01, 0, 0x02, 0x12, 0, 0, 0x03, 0x13, 0, 0x23, 0, 0, 0 }; +int valid_count = popcount4[idx]; + +switch (valid_count) { +case 4: +*tx = median4(s->mv[dir][0][0], s->mv[dir][1][0], s->mv[dir][2][0], s->mv[dir][3][0]); +*ty = median4(s->mv[dir][0][1], s->mv[dir][1][1], s->mv[dir][2][1], s->mv[dir][3][1]); +break; +case 3: +*tx = mid_pred(s->mv[dir][idx > 0xd][0], s->mv[dir][1 + (idx > 0xb)][0], s->mv[dir][2 + (idx > 0x7)][0]); +*ty = mid_pred(s->mv[dir][idx > 0xd][1], s->mv[dir][1 + (idx > 0xb)][1], s->mv[dir][2 + (idx > 0x7)][1]); +break; +case 2: +*tx = (s->mv[dir][index2[idx] >> 4][0] + s->mv[dir][index2[idx] & 0xf][0]) / 2; +*ty = (s->mv[dir][index2[idx] >> 4][1] + s->mv[dir][index2[idx] & 0xf][1]) / 2; +break; +default: +return 0; +} +return valid_count; +} + /** Do motion compensation over 1 macroblock * Mostly adapted hpel_motion and qpel_motion from mpegvideo.c */ @@ -330,37 +393,10 @@ void ff_vc1_mc_4mv_luma(VC1Context *v, int n, int dir, int avg) } if (s->pict_type == AV_PICTURE_TYPE_P && n == 3 && v->field_mode) { -int same_count = 0, opp_count = 0, k; -int chosen_mv[2][4][2], f; -int tx, ty; -for (k = 0; k < 4; k++) { -f = v->mv_f[0][s->block_index[k] + v->blocks_off]; -chosen_mv[f][f ? opp_count : same_count][0] = s->mv[0][k][0]; -chosen_mv[f][f ? opp_count : same_count][1] = s->mv[0][k][1]; -opp_count += f; -same_count += 1 - f; -} -f = opp_count > same_count; -switch (f ? opp_count : same_count) {
[FFmpeg-devel] [PATCH] avcodec/wmalossless: use av_clip_intp2
>From 47c997fa0623ab94a7a93b2d2e4cc4fa64c85d5f Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 7 Mar 2015 23:26:42 +0800 Subject: [PATCH 1/1] avcodec/wmalossless: use av_clip_intp2 Signed-off-by: Zeng Zhaoxiu --- libavcodec/wmalosslessdec.c | 8 +++- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/libavcodec/wmalosslessdec.c b/libavcodec/wmalosslessdec.c index fcadbc0..afe82a9 100644 --- a/libavcodec/wmalosslessdec.c +++ b/libavcodec/wmalosslessdec.c @@ -622,7 +622,6 @@ static void mclms_update(WmallDecodeCtx *s, int icoef, int *pred) int i, j, ich, pred_error; int order= s->mclms_order; int num_channels = s->num_channels; -int range= 1 << (s->bits_per_sample - 1); for (ich = 0; ich < num_channels; ich++) { pred_error = s->channel_residues[ich][icoef] - pred[ich]; @@ -643,8 +642,8 @@ static void mclms_update(WmallDecodeCtx *s, int icoef, int *pred) for (ich = num_channels - 1; ich >= 0; ich--) { s->mclms_recent--; -s->mclms_prevvalues[s->mclms_recent] = av_clip(s->channel_residues[ich][icoef], --range, range - 1); +s->mclms_prevvalues[s->mclms_recent] = av_clip_intp2(s->channel_residues[ich][icoef], +s->bits_per_sample - 1); s->mclms_updates[s->mclms_recent] = WMASIGN(s->channel_residues[ich][icoef]); } @@ -693,7 +692,6 @@ static void revert_mclms(WmallDecodeCtx *s, int tile_size) static void lms_update(WmallDecodeCtx *s, int ich, int ilms, int input) { int recent = s->cdlms[ich][ilms].recent; -int range = 1 << s->bits_per_sample - 1; int order = s->cdlms[ich][ilms].order; if (recent) @@ -706,7 +704,7 @@ static void lms_update(WmallDecodeCtx *s, int ich, int ilms, int input) recent = order - 1; } -s->cdlms[ich][ilms].lms_prevvalues[recent] = av_clip(input, -range, range - 1); +s->cdlms[ich][ilms].lms_prevvalues[recent] = av_clip_intp2(input, s->bits_per_sample - 1); s->cdlms[ich][ilms].lms_updates[recent] = WMASIGN(input) * s->update_speed[ich]; s->cdlms[ich][ilms].lms_updates[recent + (order >> 4)] >>= 2; -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avcodec/hevc_parser: use avpriv_find_start_code in hevc_split()
>From ab12e3081ba987c2e05d819be97cde96952f1c2a Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 7 Mar 2015 23:29:46 +0800 Subject: [PATCH 1/1] avcodec/hevc_parser: use avpriv_find_start_code in hevc_split() Signed-off-by: Zeng Zhaoxiu --- libavcodec/hevc_parser.c | 26 +- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index a6fdbb7..91fc0d4 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -286,21 +286,21 @@ static int hevc_parse(AVCodecParserContext *s, // Split after the parameter sets at the beginning of the stream if they exist. static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { -int i; +const uint8_t *ptr = buf, end = buf + buf_size; uint32_t state = -1; -int has_ps = 0; +int has_ps = 0, nut; -for (i = 0; i < buf_size; i++) { -state = (state << 8) | buf[i]; -if (((state >> 8) & 0xFF) == START_CODE) { -int nut = (state >> 1) & 0x3F; -if (nut >= NAL_VPS && nut <= NAL_PPS) -has_ps = 1; -else if (has_ps) -return i - 3; -else // no parameter set at the beginning of the stream -return 0; -} +while (ptr < end) { +ptr = avpriv_find_start_code(ptr, end, &state); +if ((state >> 8) != START_CODE) +break; +nut = (state >> 1) & 0x3F; +if (nut >= NAL_VPS && nut <= NAL_PPS) +has_ps = 1; +else if (has_ps) +return ptr - 4 - buf; +else // no parameter set at the beginning of the stream +return 0; } return 0; } -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avcodec/golomb: cleanup
>From 87f51c45cf3ebb2ffefbba72414bf5f9c06f6351 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sat, 7 Mar 2015 23:42:05 +0800 Subject: [PATCH 1/1] avcodec/golomb: cleanup Signed-off-by: Zeng Zhaoxiu --- libavcodec/golomb.h | 19 +-- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/libavcodec/golomb.h b/libavcodec/golomb.h index 1632ee3..3c73571 100644 --- a/libavcodec/golomb.h +++ b/libavcodec/golomb.h @@ -215,9 +215,7 @@ static inline int get_se_golomb(GetBitContext *gb) static inline int get_se_golomb_long(GetBitContext *gb) { unsigned int buf = get_ue_golomb_long(gb); -int sign; - -sign = (buf & 1) - 1; +int sign = (buf & 1) - 1; return ((buf >> 1) ^ sign) + 1; } @@ -259,8 +257,7 @@ static inline int dirac_get_se_golomb(GetBitContext *gb) uint32_t ret = svq3_get_ue_golomb(gb); if (ret) { -int sign; -sign = -get_bits1(gb); +int sign = -get_bits1(gb); ret = (ret ^ sign) - sign; } @@ -363,11 +360,7 @@ static inline int get_sr_golomb(GetBitContext *gb, int k, int limit, int esc_len) { int v = get_ur_golomb(gb, k, limit, esc_len); -int sign; - -v++; -sign = (v & 1) - 1; -return ((v >> 1) ^ sign) - sign; +return (v >> 1) ^ -(v & 1); } /** -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avcodec/hevc_parser: use avpriv_find_start_code in hevc_split()
在 2015/3/8 20:14, Michael Niedermayer 写道: > On Sat, Mar 07, 2015 at 11:47:08PM +0800, zhaoxiu.zeng wrote: >> From ab12e3081ba987c2e05d819be97cde96952f1c2a Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Sat, 7 Mar 2015 23:29:46 +0800 >> Subject: [PATCH 1/1] avcodec/hevc_parser: use avpriv_find_start_code in >> hevc_split() >> >> Signed-off-by: Zeng Zhaoxiu >> --- >> libavcodec/hevc_parser.c | 26 +- >> 1 file changed, 13 insertions(+), 13 deletions(-) >> >> diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c >> index a6fdbb7..91fc0d4 100644 >> --- a/libavcodec/hevc_parser.c >> +++ b/libavcodec/hevc_parser.c >> @@ -286,21 +286,21 @@ static int hevc_parse(AVCodecParserContext *s, >> // Split after the parameter sets at the beginning of the stream if they >> exist. >> static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int >> buf_size) >> { >> -int i; >> +const uint8_t *ptr = buf, end = buf + buf_size; > > end is a uint8_t, that will not work > also please make sure to test the code you change > Sorry for my carelessness. (I tested with "make fate" only) Thanks! > [...] > > > > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > The new patch: diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index a6fdbb7..7076897 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -286,21 +286,21 @@ static int hevc_parse(AVCodecParserContext *s, // Split after the parameter sets at the beginning of the stream if they exist. static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { -int i; +const uint8_t *ptr = buf, *end = buf + buf_size; uint32_t state = -1; -int has_ps = 0; +int has_ps = 0, nut; -for (i = 0; i < buf_size; i++) { -state = (state << 8) | buf[i]; -if (((state >> 8) & 0xFF) == START_CODE) { -int nut = (state >> 1) & 0x3F; -if (nut >= NAL_VPS && nut <= NAL_PPS) -has_ps = 1; -else if (has_ps) -return i - 3; -else // no parameter set at the beginning of the stream -return 0; -} +while (ptr < end) { +ptr = avpriv_find_start_code(ptr, end, &state); +if ((state >> 8) != START_CODE) +break; +nut = (state >> 1) & 0x3F; +if (nut >= NAL_VPS && nut <= NAL_PPS) +has_ps = 1; +else if (has_ps) +return ptr - 4 - buf; +else // no parameter set at the beginning of the stream +return 0; } return 0; } ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avformat/avidec: use avpriv_find_start_code in avi_read_packet()
>From 50cefc3b62bf45e16b858f5e414777afb1a9bd36 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sun, 15 Mar 2015 11:54:13 +0800 Subject: [PATCH 1/7] avformat/avidec: use avpriv_find_start_code in avi_read_packet() Signed-off-by: Zeng Zhaoxiu --- libavformat/avidec.c | 25 - 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 00f0037..42599bf 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -36,7 +36,8 @@ #include "riff.h" #include "libavcodec/bytestream.h" #include "libavcodec/exif.h" -#include "libavformat/isom.h" +#include "libavcodec/internal.h" +#include "isom.h" typedef struct AVIStream { int64_t frame_offset; /* current frame (video) or byte (audio) counter @@ -1444,19 +1445,17 @@ FF_ENABLE_DEPRECATION_WARNINGS e = &st->index_entries[index]; if (index >= 0 && e->timestamp == ast->frame_offset) { -if (index == st->nb_index_entries-1) { -int key=1; -int i; -uint32_t state=-1; -for (i=0; icodec->codec_id == AV_CODEC_ID_MPEG4) { -if (state == 0x1B6) { -key= !(pkt->data[i]&0xC0); -break; -} -}else +if (index == st->nb_index_entries - 1 && +st->codec->codec_id == AV_CODEC_ID_MPEG4) { +const uint8_t *ptr = pkt->data, *end = ptr + FFMIN(size, 256); +int key = 1; +uint32_t state = -1; +while (ptr < end) { +ptr = avpriv_find_start_code(ptr, end, &state); +if (state == 0x1B6 && ptr < end) { +key = !(*ptr & 0xC0); break; -state= (state<<8) + pkt->data[i]; +} } if (!key) e->flags &= ~AVINDEX_KEYFRAME; -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avformat/mpegvideodec: use avpriv_find_start_code in mpegvideo_probe()
>From 60cdc9161881cdf86e428a0d6812785938ae6667 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sun, 15 Mar 2015 11:56:53 +0800 Subject: [PATCH 2/7] avformat/mpegvideodec: use avpriv_find_start_code in mpegvideo_probe() Signed-off-by: Zeng Zhaoxiu --- libavformat/mpegvideodec.c | 34 -- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/libavformat/mpegvideodec.c b/libavformat/mpegvideodec.c index ade76d8..c2fa6c2 100644 --- a/libavformat/mpegvideodec.c +++ b/libavformat/mpegvideodec.c @@ -24,6 +24,7 @@ #include "rawdec.h" #include "libavutil/intreadwrite.h" +#include "libavcodec/internal.h" #define SEQ_START_CODE 0x01b3 #define GOP_START_CODE 0x01b8 @@ -37,33 +38,30 @@ static int mpegvideo_probe(AVProbeData *p) { uint32_t code= -1; int pic=0, seq=0, slice=0, pspack=0, vpes=0, apes=0, res=0, sicle=0; -int i, j; +const uint8_t *ptr = p->buf, *end = ptr + p->buf_size; uint32_t last = 0; +int j; -for(i=0; ibuf_size; i++){ -code = (code<<8) + p->buf[i]; +while (ptr < end) { +ptr = avpriv_find_start_code(ptr, end, &code); if ((code & 0xff00) == 0x100) { -switch(code){ +switch (code) { case SEQ_START_CODE: -if (!(p->buf[i+1+3+1+2] & 0x20)) +if (!(ptr[3 + 1 + 2] & 0x20)) break; -j = i; -if (p->buf[j+8] & 2) -j+= 64; -if (j >= p->buf_size) +j = -1 + (ptr[-1 + 8] & 2) * 32; +if (ptr + j >= end) break; -if (p->buf[j+8] & 1) -j+= 64; -if (j >= p->buf_size) +j += (ptr[j + 8] & 1) * 64; +if (ptr + j >= end) break; -if (AV_RB24(p->buf + j + 9) & 0xFE) +if (AV_RB24(ptr + j + 9) & 0xFE) break; seq++; -break; -case PICTURE_START_CODE: pic++; break; +break; +case PICTURE_START_CODE:pic++; break; casePACK_START_CODE: pspack++; break; -case 0x1b6: -res++; break; +case 0x1b6:res++; break; } if (code >= SLICE_START_CODE && code <= 0x1af) { if (last >= SLICE_START_CODE && last <= 0x1af) { -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avformat/cavsvideodec: use avpriv_find_start_code in cavsvideo_probe()
>From 9a97b5559a8c4ea9a03560d59e1725b6c99d0960 Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sun, 15 Mar 2015 11:58:12 +0800 Subject: [PATCH 3/7] avformat/cavsvideodec: use avpriv_find_start_code in cavsvideo_probe() Signed-off-by: Zeng Zhaoxiu --- libavformat/cavsvideodec.c | 9 + 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libavformat/cavsvideodec.c b/libavformat/cavsvideodec.c index 880f4ab..d985dd5 100644 --- a/libavformat/cavsvideodec.c +++ b/libavformat/cavsvideodec.c @@ -21,6 +21,7 @@ #include "avformat.h" #include "rawdec.h" +#include "libavcodec/internal.h" #define CAVS_SEQ_START_CODE 0x01b0 #define CAVS_PIC_I_START_CODE 0x01b3 @@ -33,10 +34,10 @@ static int cavsvideo_probe(AVProbeData *p) { uint32_t code= -1; int pic=0, seq=0, slice_pos = 0; -int i; +const uint8_t *ptr = p->buf, *end = p->buf + p->buf_size; -for(i=0; ibuf_size; i++){ -code = (code<<8) + p->buf[i]; +while (ptr < end) { +ptr = avpriv_find_start_code(ptr, end, &code); if ((code & 0xff00) == 0x100) { if(code < CAVS_SEQ_START_CODE) { /* slices have to be consecutive */ @@ -49,7 +50,7 @@ static int cavsvideo_probe(AVProbeData *p) if (code == CAVS_SEQ_START_CODE) { seq++; /* check for the only currently supported profile */ -if(p->buf[i+1] != CAVS_PROFILE_JIZHUN) +if (*ptr != CAVS_PROFILE_JIZHUN) return 0; } else if ((code == CAVS_PIC_I_START_CODE) || (code == CAVS_PIC_PB_START_CODE)) { -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avformat/m4vdec: use avpriv_find_start_code in mpeg4video_probe()
>From 7d57cb0e822ac755ba7e3d9c09d90bf62c7da24d Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sun, 15 Mar 2015 11:59:27 +0800 Subject: [PATCH 4/7] avformat/m4vdec: use avpriv_find_start_code in mpeg4video_probe() Signed-off-by: Zeng Zhaoxiu --- libavformat/m4vdec.c | 17 - 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/libavformat/m4vdec.c b/libavformat/m4vdec.c index d8ee530..aa0ee36 100644 --- a/libavformat/m4vdec.c +++ b/libavformat/m4vdec.c @@ -21,6 +21,7 @@ #include "avformat.h" #include "rawdec.h" +#include "libavcodec/internal.h" #define VISUAL_OBJECT_START_CODE 0x01b5 #define VOP_START_CODE 0x01b6 @@ -29,22 +30,20 @@ static int mpeg4video_probe(AVProbeData *probe_packet) { uint32_t temp_buffer = -1; int VO = 0, VOL = 0, VOP = 0, VISO = 0, res = 0; -int i; +const uint8_t *ptr = probe_packet->buf, *end = ptr + probe_packet->buf_size; -for (i = 0; i < probe_packet->buf_size; i++) { -temp_buffer = (temp_buffer << 8) + probe_packet->buf[i]; -if (temp_buffer & 0xfe00) -continue; -if (temp_buffer < 2) -continue; +while (ptr < end) { +ptr = avpriv_find_start_code(ptr, end, &temp_buffer); +if ((temp_buffer & 0xff00) != 0x100) +break; if (temp_buffer == VOP_START_CODE) VOP++; else if (temp_buffer == VISUAL_OBJECT_START_CODE) VISO++; -else if (temp_buffer >= 0x100 && temp_buffer < 0x120) +else if (temp_buffer < 0x120) VO++; -else if (temp_buffer >= 0x120 && temp_buffer < 0x130) +else if (temp_buffer < 0x130) VOL++; else if (!(0x1AF < temp_buffer && temp_buffer < 0x1B7) && !(0x1B9 < temp_buffer && temp_buffer < 0x1C4)) -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
[FFmpeg-devel] [PATCH] avformat/mpeg: use avpriv_find_start_code in mpegps_probe()
>From 520c5898f2c0372188f17f98e10a40174dde4aac Mon Sep 17 00:00:00 2001 From: Zeng Zhaoxiu Date: Sun, 15 Mar 2015 12:01:51 +0800 Subject: [PATCH 5/7] avformat/mpeg: use avpriv_find_start_code in mpegps_probe() Signed-off-by: Zeng Zhaoxiu --- libavformat/mpeg.c | 51 --- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index a0b5738..ffba786 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -29,6 +29,7 @@ #endif #include "libavutil/avassert.h" +#include "libavcodec/internal.h" /*/ /* demux code */ @@ -38,12 +39,12 @@ static int check_pes(const uint8_t *p, const uint8_t *end) { int pes1; -int pes2 = (p[3] & 0xC0) == 0x80 && - (p[4] & 0xC0) != 0x40 && - ((p[4] & 0xC0) == 0x00 || -(p[4] & 0xC0) >> 2 == (p[6] & 0xF0)); +int pes2 = (p[2] & 0xC0) == 0x80 && + (p[3] & 0xC0) != 0x40 && + ((p[3] & 0xC0) == 0x00 || +(p[3] & 0xC0) >> 2 == (p[5] & 0xF0)); -for (p += 3; p < end && *p == 0xFF; p++) ; +for (p += 2; p < end && *p == 0xFF; p++) ; if ((*p & 0xC0) == 0x40) p += 2; @@ -59,41 +60,37 @@ static int check_pes(const uint8_t *p, const uint8_t *end) static int check_pack_header(const uint8_t *buf) { -return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20; +return (buf[0] & 0xC0) == 0x40 || (buf[0] & 0xF0) == 0x20; } static int mpegps_probe(AVProbeData *p) { uint32_t code = -1; -int i; int sys = 0, pspack = 0, priv1 = 0, vid = 0; int audio = 0, invalid = 0, score = 0; -int endpes = 0; +const uint8_t *ptr = p->buf, *end = ptr + p->buf_size; +const uint8_t *endpes = ptr; -for (i = 0; i < p->buf_size; i++) { -code = (code << 8) + p->buf[i]; +while (ptr < end) { +ptr = avpriv_find_start_code(ptr, end, &code); if ((code & 0xff00) == 0x100) { -int len = p->buf[i + 1] << 8 | p->buf[i + 2]; -int pes = endpes <= i && check_pes(p->buf + i, p->buf + p->buf_size); -int pack = check_pack_header(p->buf + i); - if (code == SYSTEM_HEADER_START_CODE) sys++; -else if (code == PACK_START_CODE && pack) +else if (code == PACK_START_CODE && check_pack_header(ptr)) pspack++; -else if ((code & 0xf0) == VIDEO_ID && pes) { -endpes = i + len; -vid++; +else if (endpes < ptr && check_pes(ptr, end)) { +int len = AV_RB16(ptr); + if ((code & 0xf0) == VIDEO_ID) { vid++; endpes = ptr + len; } +// skip pes payload to avoid start code emulation for private +// and audio streams +else if ((code & 0xe0) == AUDIO_ID) { audio++; ptr += len; code = -1; } +else if (code == PRIVATE_STREAM_1 ) { priv1++; ptr += len; code = -1; } +else if (code == 0x1fd) vid++; //VC1 +} else { + if ((code & 0xf0) == VIDEO_ID) invalid++; +else if ((code & 0xe0) == AUDIO_ID) invalid++; +else if (code == PRIVATE_STREAM_1 ) invalid++; } -// skip pes payload to avoid start code emulation for private -// and audio streams -else if ((code & 0xe0) == AUDIO_ID && pes) {audio++; i+=len;} -else if (code == PRIVATE_STREAM_1 && pes) {priv1++; i+=len;} -else if (code == 0x1fd && pes) vid++; //VC1 - -else if ((code & 0xf0) == VIDEO_ID && !pes) invalid++; -else if ((code & 0xe0) == AUDIO_ID && !pes) invalid++; -else if (code == PRIVATE_STREAM_1 && !pes) invalid++; } } -- 2.1.0 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avformat/avidec: use avpriv_find_start_code in avi_read_packet()
在 2015/3/15 20:22, Michael Niedermayer 写道: > On Sun, Mar 15, 2015 at 04:38:27PM +0800, zhaoxiu.zeng wrote: >> From 50cefc3b62bf45e16b858f5e414777afb1a9bd36 Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Sun, 15 Mar 2015 11:54:13 +0800 >> Subject: [PATCH 1/7] avformat/avidec: use avpriv_find_start_code in >> avi_read_packet() >> >> Signed-off-by: Zeng Zhaoxiu >> --- >> libavformat/avidec.c | 25 - >> 1 file changed, 12 insertions(+), 13 deletions(-) > > split and applied > > btw i was wondering as you worked alot on vc1 if you would be I have done alot optimizations in the past. I want to commit the optimizations to the mainline. VC1 releated are the part of that. > interrested to look at some of the long stading bugs: > https://trac.ffmpeg.org/ticket/2557 > and > https://trac.ffmpeg.org/ticket/3262 > I'll give it a try! > Thanks > > [...] > > > > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Re: [FFmpeg-devel] [PATCH] avformat/mpegvideodec: use avpriv_find_start_code in mpegvideo_probe()
在 2015/3/15 20:38, Michael Niedermayer 写道: > On Sun, Mar 15, 2015 at 04:46:22PM +0800, zhaoxiu.zeng wrote: >> From 60cdc9161881cdf86e428a0d6812785938ae6667 Mon Sep 17 00:00:00 2001 >> From: Zeng Zhaoxiu >> Date: Sun, 15 Mar 2015 11:56:53 +0800 >> Subject: [PATCH 2/7] avformat/mpegvideodec: use avpriv_find_start_code in >> mpegvideo_probe() >> >> Signed-off-by: Zeng Zhaoxiu >> --- >> libavformat/mpegvideodec.c | 34 -- >> 1 file changed, 16 insertions(+), 18 deletions(-) >> >> diff --git a/libavformat/mpegvideodec.c b/libavformat/mpegvideodec.c >> index ade76d8..c2fa6c2 100644 >> --- a/libavformat/mpegvideodec.c >> +++ b/libavformat/mpegvideodec.c >> @@ -24,6 +24,7 @@ >> #include "rawdec.h" >> >> #include "libavutil/intreadwrite.h" >> +#include "libavcodec/internal.h" >> >> #define SEQ_START_CODE 0x01b3 >> #define GOP_START_CODE 0x01b8 >> @@ -37,33 +38,30 @@ static int mpegvideo_probe(AVProbeData *p) >> { >> uint32_t code= -1; >> int pic=0, seq=0, slice=0, pspack=0, vpes=0, apes=0, res=0, sicle=0; >> -int i, j; >> +const uint8_t *ptr = p->buf, *end = ptr + p->buf_size; >> uint32_t last = 0; >> +int j; >> >> -for(i=0; ibuf_size; i++){ >> -code = (code<<8) + p->buf[i]; >> +while (ptr < end) { >> +ptr = avpriv_find_start_code(ptr, end, &code); >> if ((code & 0xff00) == 0x100) { >> -switch(code){ >> +switch (code) { >> case SEQ_START_CODE: >> -if (!(p->buf[i+1+3+1+2] & 0x20)) >> +if (!(ptr[3 + 1 + 2] & 0x20)) >> break; >> -j = i; >> -if (p->buf[j+8] & 2) >> -j+= 64; >> -if (j >= p->buf_size) >> +j = -1 + (ptr[-1 + 8] & 2) * 32; >> +if (ptr + j >= end) >> break; >> -if (p->buf[j+8] & 1) >> -j+= 64; >> -if (j >= p->buf_size) >> +j += (ptr[j + 8] & 1) * 64; >> +if (ptr + j >= end) >> break; >> -if (AV_RB24(p->buf + j + 9) & 0xFE) >> +if (AV_RB24(ptr + j + 9) & 0xFE) >> break; >> seq++; >> -break; >> -case PICTURE_START_CODE: pic++; break; >> +break; >> +case PICTURE_START_CODE:pic++; break; >> casePACK_START_CODE: pspack++; break; >> -case 0x1b6: >> -res++; break; >> +case 0x1b6:res++; break; >> } >> if (code >= SLICE_START_CODE && code <= 0x1af) { >> if (last >= SLICE_START_CODE && last <= 0x1af) { > > cleaned up and applied > > also please do not mix unrelated cosmetic changes in the code > see for example the diff with these cosmetics removed, which i applied > its much more readable: (this is important for being reviewable) > I see! Thanks! > diff --git a/libavformat/mpegvideodec.c b/libavformat/mpegvideodec.c > index ade76d86..5ea5569 100644 > --- a/libavformat/mpegvideodec.c > +++ b/libavformat/mpegvideodec.c > @@ -24,6 +24,7 @@ > #include "rawdec.h" > > #include "libavutil/intreadwrite.h" > +#include "libavcodec/internal.h" > > #define SEQ_START_CODE 0x01b3 > #define GOP_START_CODE 0x01b8 > @@ -37,26 +38,27 @@ static int mpegvideo_probe(AVProbeData *p) > { > uint32_t code= -1; > int pic=0, seq=0, slice=0, pspack=0, vpes=0, apes=0, res=0, sicle=0; > -int i, j; > +const uint8_t *ptr = p->buf, *end = ptr + p->buf_size; > uint32_t last = 0; > +int j; > > -for(i=0; ibuf_size; i++){ > -code = (code<<8) + p->buf[i]; > +while (ptr < end) { > +ptr = avpriv_find_start_code(ptr, end, &code); > if ((code & 0xff00) == 0x100) { > switch(code){ > case SEQ_START_CODE: > -if (!(p->buf[i+1+3+1+2] & 0x20)) > +if (!(ptr[3 + 1 + 2] & 0x20)) > break; > -