diff options
Diffstat (limited to 'ffmpeg/libavcodec/h261.c')
| -rw-r--r-- | ffmpeg/libavcodec/h261.c | 72 |
1 files changed, 56 insertions, 16 deletions
diff --git a/ffmpeg/libavcodec/h261.c b/ffmpeg/libavcodec/h261.c index f89d5c7..9836905 100644 --- a/ffmpeg/libavcodec/h261.c +++ b/ffmpeg/libavcodec/h261.c @@ -28,25 +28,65 @@ #include "avcodec.h" #include "h261.h" -#define IS_FIL(a) ((a)&MB_TYPE_H261_FIL) +#define IS_FIL(a) ((a) & MB_TYPE_H261_FIL) -uint8_t ff_h261_rl_table_store[2][2*MAX_RUN + MAX_LEVEL + 3]; +uint8_t ff_h261_rl_table_store[2][2 * MAX_RUN + MAX_LEVEL + 3]; -void ff_h261_loop_filter(MpegEncContext *s){ - H261Context * h= (H261Context*)s; - const int linesize = s->linesize; - const int uvlinesize= s->uvlinesize; - uint8_t *dest_y = s->dest[0]; - uint8_t *dest_cb= s->dest[1]; - uint8_t *dest_cr= s->dest[2]; +static void h261_loop_filter(uint8_t *src, int stride) +{ + int x, y, xy, yz; + int temp[64]; - if(!(IS_FIL (h->mtype))) + for (x = 0; x < 8; x++) { + temp[x] = 4 * src[x]; + temp[x + 7 * 8] = 4 * src[x + 7 * stride]; + } + for (y = 1; y < 7; y++) { + for (x = 0; x < 8; x++) { + xy = y * stride + x; + yz = y * 8 + x; + temp[yz] = src[xy - stride] + 2 * src[xy] + src[xy + stride]; + } + } + + for (y = 0; y < 8; y++) { + src[y * stride] = (temp[y * 8] + 2) >> 2; + src[y * stride + 7] = (temp[y * 8 + 7] + 2) >> 2; + for (x = 1; x < 7; x++) { + xy = y * stride + x; + yz = y * 8 + x; + src[xy] = (temp[yz - 1] + 2 * temp[yz] + temp[yz + 1] + 8) >> 4; + } + } +} + +void ff_h261_loop_filter(MpegEncContext *s) +{ + H261Context *h = (H261Context *)s; + const int linesize = s->linesize; + const int uvlinesize = s->uvlinesize; + uint8_t *dest_y = s->dest[0]; + uint8_t *dest_cb = s->dest[1]; + uint8_t *dest_cr = s->dest[2]; + + if (!(IS_FIL(h->mtype))) + return; + + h261_loop_filter(dest_y, linesize); + h261_loop_filter(dest_y + 8, linesize); + h261_loop_filter(dest_y + 8 * linesize, linesize); + h261_loop_filter(dest_y + 8 * linesize + 8, linesize); + h261_loop_filter(dest_cb, uvlinesize); + h261_loop_filter(dest_cr, uvlinesize); +} + +av_cold void ff_h261_common_init(void) +{ + static int done = 0; + + if (done) return; - s->dsp.h261_loop_filter(dest_y , linesize); - s->dsp.h261_loop_filter(dest_y + 8, linesize); - s->dsp.h261_loop_filter(dest_y + 8 * linesize , linesize); - s->dsp.h261_loop_filter(dest_y + 8 * linesize + 8, linesize); - s->dsp.h261_loop_filter(dest_cb, uvlinesize); - s->dsp.h261_loop_filter(dest_cr, uvlinesize); + ff_init_rl(&ff_h261_rl_tcoeff, ff_h261_rl_table_store); + done = 1; } |
