avcodec/smacker: Avoid code duplication
Besides the obvious advantage of less code this also has a performance impact: For GCC 9 the time spent on one call to smka_decode_frame() for the sample from ticket #2425 decreased from 1693619 to 1498127 decicycles. For Clang 9, it decreased from 1369089 to 1366465 decicycles. Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
		
							parent
							
								
									b2c42f0233
								
							
						
					
					
						commit
						6ffc7be5da
					
				@ -671,37 +671,23 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data,
 | 
				
			|||||||
        for(i = 0; i <= stereo; i++)
 | 
					        for(i = 0; i <= stereo; i++)
 | 
				
			||||||
            *samples++ = pred[i];
 | 
					            *samples++ = pred[i];
 | 
				
			||||||
        for(; i < unp_size / 2; i++) {
 | 
					        for(; i < unp_size / 2; i++) {
 | 
				
			||||||
 | 
					            unsigned idx = 2 * (i & stereo);
 | 
				
			||||||
            if (get_bits_left(&gb) < 0) {
 | 
					            if (get_bits_left(&gb) < 0) {
 | 
				
			||||||
                ret = AVERROR_INVALIDDATA;
 | 
					                ret = AVERROR_INVALIDDATA;
 | 
				
			||||||
                goto error;
 | 
					                goto error;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if(i & stereo) {
 | 
					            if (vlc[idx].table)
 | 
				
			||||||
                if(vlc[2].table)
 | 
					                res = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3);
 | 
				
			||||||
                    res = get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3);
 | 
					            else
 | 
				
			||||||
                else
 | 
					                res = values[idx];
 | 
				
			||||||
                    res = values[2];
 | 
					            val  = res;
 | 
				
			||||||
                val  = res;
 | 
					            if (vlc[++idx].table)
 | 
				
			||||||
                if(vlc[3].table)
 | 
					                res = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3);
 | 
				
			||||||
                    res = get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3);
 | 
					            else
 | 
				
			||||||
                else
 | 
					                res = values[idx];
 | 
				
			||||||
                    res = values[3];
 | 
					            val |= res << 8;
 | 
				
			||||||
                val |= res << 8;
 | 
					            pred[idx / 2] += val;
 | 
				
			||||||
                pred[1] += val;
 | 
					            *samples++ = pred[idx / 2];
 | 
				
			||||||
                *samples++ = pred[1];
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                if(vlc[0].table)
 | 
					 | 
				
			||||||
                    res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3);
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                    res = values[0];
 | 
					 | 
				
			||||||
                val  = res;
 | 
					 | 
				
			||||||
                if(vlc[1].table)
 | 
					 | 
				
			||||||
                    res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                    res = values[1];
 | 
					 | 
				
			||||||
                val |= res << 8;
 | 
					 | 
				
			||||||
                pred[0] += val;
 | 
					 | 
				
			||||||
                *samples++ = pred[0];
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    } else { //8-bit data
 | 
					    } else { //8-bit data
 | 
				
			||||||
        for(i = stereo; i >= 0; i--)
 | 
					        for(i = stereo; i >= 0; i--)
 | 
				
			||||||
@ -709,25 +695,17 @@ static int smka_decode_frame(AVCodecContext *avctx, void *data,
 | 
				
			|||||||
        for(i = 0; i <= stereo; i++)
 | 
					        for(i = 0; i <= stereo; i++)
 | 
				
			||||||
            *samples8++ = pred[i];
 | 
					            *samples8++ = pred[i];
 | 
				
			||||||
        for(; i < unp_size; i++) {
 | 
					        for(; i < unp_size; i++) {
 | 
				
			||||||
 | 
					            unsigned idx = i & stereo;
 | 
				
			||||||
            if (get_bits_left(&gb) < 0) {
 | 
					            if (get_bits_left(&gb) < 0) {
 | 
				
			||||||
                ret = AVERROR_INVALIDDATA;
 | 
					                ret = AVERROR_INVALIDDATA;
 | 
				
			||||||
                goto error;
 | 
					                goto error;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if(i & stereo){
 | 
					            if (vlc[idx].table)
 | 
				
			||||||
                if(vlc[1].table)
 | 
					                val = get_vlc2(&gb, vlc[idx].table, SMKTREE_BITS, 3);
 | 
				
			||||||
                    res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
 | 
					            else
 | 
				
			||||||
                else
 | 
					                val = values[idx];
 | 
				
			||||||
                    res = values[1];
 | 
					            pred[idx] += val;
 | 
				
			||||||
                pred[1] += res;
 | 
					            *samples8++ = pred[idx];
 | 
				
			||||||
                *samples8++ = pred[1];
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                if(vlc[0].table)
 | 
					 | 
				
			||||||
                    res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3);
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                    res = values[0];
 | 
					 | 
				
			||||||
                pred[0] += res;
 | 
					 | 
				
			||||||
                *samples8++ = pred[0];
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user