From: Jason Garrett-Glaser <[email protected]>
---
libavcodec/h264.c | 93 +++++++++++++++++++++++++++++------------------------
1 files changed, 51 insertions(+), 42 deletions(-)
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 276d6e6..a83e138 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -1538,6 +1538,56 @@ static av_always_inline void dctcoef_set(DCTELEM *mb,
int high_bit_depth, int in
AV_WN16A(mb + index, value);
}
+static av_always_inline void hl_decode_mb_idct_luma(H264Context *h, int
mb_type, int is_h264, int simple, int transform_bypass,
+ int pixel_shift, int
*block_offset, int linesize, uint8_t *dest_y, int p)
+{
+ MpegEncContext * const s = &h->s;
+ void (*idct_add)(uint8_t *dst, DCTELEM *block, int stride);
+ int i;
+ block_offset += 16*p;
+ if(!IS_INTRA4x4(mb_type)){
+ if(is_h264){
+ if(IS_INTRA16x16(mb_type)){
+ if(transform_bypass){
+ if(h->sps.profile_idc==244 &&
(h->intra16x16_pred_mode==VERT_PRED8x8 ||
h->intra16x16_pred_mode==HOR_PRED8x8)){
+ h->hpc.pred16x16_add[h->intra16x16_pred_mode](dest_y,
block_offset, h->mb + (p*256 << pixel_shift), linesize);
+ }else{
+ for(i=0; i<16; i++){
+ if(h->non_zero_count_cache[ scan8[i+p*16] ] ||
dctcoef_get(h->mb, pixel_shift, i*16))
+ s->dsp.add_pixels4(dest_y + block_offset[i],
h->mb + (i*16+p*256 << pixel_shift), linesize);
+ }
+ }
+ }else{
+ h->h264dsp.h264_idct_add16intra(dest_y, block_offset,
h->mb + (p*256 << pixel_shift), linesize, h->non_zero_count_cache+p*5*8);
+ }
+ }else if(h->cbp&15){
+ if(transform_bypass){
+ const int di = IS_8x8DCT(mb_type) ? 4 : 1;
+ idct_add= IS_8x8DCT(mb_type) ? s->dsp.add_pixels8 :
s->dsp.add_pixels4;
+ for(i=0; i<16; i+=di){
+ if(h->non_zero_count_cache[ scan8[i+p*16] ]){
+ idct_add(dest_y + block_offset[i], h->mb +
(i*16+p*256 << pixel_shift), linesize);
+ }
+ }
+ }else{
+ if(IS_8x8DCT(mb_type)){
+ h->h264dsp.h264_idct8_add4(dest_y, block_offset, h->mb
+ (p*256 << pixel_shift), linesize, h->non_zero_count_cache+p*5*8);
+ }else{
+ h->h264dsp.h264_idct_add16(dest_y, block_offset, h->mb
+ (p*256 << pixel_shift), linesize, h->non_zero_count_cache+p*5*8);
+ }
+ }
+ }
+ }else{
+ for(i=0; i<16; i++){
+ if(h->non_zero_count_cache[ scan8[i+p*16] ] ||
h->mb[i*16+p*256]){ //FIXME benchmark weird rule, & below
+ uint8_t * const ptr= dest_y + block_offset[i];
+ ff_svq3_add_idct_c(ptr, h->mb + i*16 + p*256, linesize,
s->qscale, IS_INTRA(mb_type) ? 1 : 0);
+ }
+ }
+ }
+ }
+}
+
static av_always_inline void hl_decode_mb_internal(H264Context *h, int simple,
int pixel_shift){
MpegEncContext * const s = &h->s;
const int mb_x= s->mb_x;
@@ -1745,48 +1795,7 @@ static av_always_inline void
hl_decode_mb_internal(H264Context *h, int simple, i
h->h264dsp.biweight_h264_pixels_tab);
}
-
- if(!IS_INTRA4x4(mb_type)){
- if(is_h264){
- if(IS_INTRA16x16(mb_type)){
- if(transform_bypass){
- if(h->sps.profile_idc==244 &&
(h->intra16x16_pred_mode==VERT_PRED8x8 ||
h->intra16x16_pred_mode==HOR_PRED8x8)){
-
h->hpc.pred16x16_add[h->intra16x16_pred_mode](dest_y, block_offset, h->mb,
linesize);
- }else{
- for(i=0; i<16; i++){
- if(h->non_zero_count_cache[ scan8[i] ] ||
dctcoef_get(h->mb, pixel_shift, i*16))
- s->dsp.add_pixels4(dest_y +
block_offset[i], h->mb + (i*16 << pixel_shift), linesize);
- }
- }
- }else{
- h->h264dsp.h264_idct_add16intra(dest_y, block_offset,
h->mb, linesize, h->non_zero_count_cache);
- }
- }else if(h->cbp&15){
- if(transform_bypass){
- const int di = IS_8x8DCT(mb_type) ? 4 : 1;
- idct_add= IS_8x8DCT(mb_type) ? s->dsp.add_pixels8 :
s->dsp.add_pixels4;
- for(i=0; i<16; i+=di){
- if(h->non_zero_count_cache[ scan8[i] ]){
- idct_add(dest_y + block_offset[i], h->mb +
(i*16 << pixel_shift), linesize);
- }
- }
- }else{
- if(IS_8x8DCT(mb_type)){
- h->h264dsp.h264_idct8_add4(dest_y, block_offset,
h->mb, linesize, h->non_zero_count_cache);
- }else{
- h->h264dsp.h264_idct_add16(dest_y, block_offset,
h->mb, linesize, h->non_zero_count_cache);
- }
- }
- }
- }else{
- for(i=0; i<16; i++){
- if(h->non_zero_count_cache[ scan8[i] ] || h->mb[i*16]){
//FIXME benchmark weird rule, & below
- uint8_t * const ptr= dest_y + block_offset[i];
- ff_svq3_add_idct_c(ptr, h->mb + i*16, linesize,
s->qscale, IS_INTRA(mb_type) ? 1 : 0);
- }
- }
- }
- }
+ hl_decode_mb_idct_luma(h, mb_type, is_h264, simple, transform_bypass,
pixel_shift, block_offset, linesize, dest_y, 0);
if((simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)) &&
(h->cbp&0x30)){
uint8_t *dest[2] = {dest_cb, dest_cr};
--
1.7.1
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel