Merge commit 'd1dd0d404c085f4fce7b8358b4aea677761c5d88'
* commit 'd1dd0d404c085f4fce7b8358b4aea677761c5d88': mpegvideo: Move block permutation function where is used Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
21d8e2c0b5
@ -2734,35 +2734,6 @@ void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Permute an 8x8 block.
|
|
||||||
* @param block the block which will be permuted according to the given permutation vector
|
|
||||||
* @param permutation the permutation vector
|
|
||||||
* @param last the last non zero coefficient in scantable order, used to speed the permutation up
|
|
||||||
* @param scantable the used scantable, this is only used to speed the permutation up, the block is not
|
|
||||||
* (inverse) permutated to scantable order!
|
|
||||||
*/
|
|
||||||
void ff_block_permute(int16_t *block, uint8_t *permutation, const uint8_t *scantable, int last)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int16_t temp[64];
|
|
||||||
|
|
||||||
if(last<=0) return;
|
|
||||||
//if(permutation[1]==1) return; //FIXME it is ok but not clean and might fail for some permutations
|
|
||||||
|
|
||||||
for(i=0; i<=last; i++){
|
|
||||||
const int j= scantable[i];
|
|
||||||
temp[j]= block[j];
|
|
||||||
block[j]=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0; i<=last; i++){
|
|
||||||
const int j= scantable[i];
|
|
||||||
const int perm_j= permutation[j];
|
|
||||||
block[perm_j]= temp[j];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ff_mpeg_flush(AVCodecContext *avctx){
|
void ff_mpeg_flush(AVCodecContext *avctx){
|
||||||
int i;
|
int i;
|
||||||
MpegEncContext *s = avctx->priv_data;
|
MpegEncContext *s = avctx->priv_data;
|
||||||
|
|||||||
@ -674,12 +674,6 @@ void ff_mpv_motion(MpegEncContext *s,
|
|||||||
op_pixels_func (*pix_op)[4],
|
op_pixels_func (*pix_op)[4],
|
||||||
qpel_mc_func (*qpix_op)[16]);
|
qpel_mc_func (*qpix_op)[16]);
|
||||||
|
|
||||||
/**
|
|
||||||
* permute block according to permuatation.
|
|
||||||
* @param last last non zero element in scantable order
|
|
||||||
*/
|
|
||||||
void ff_block_permute(int16_t *block, uint8_t *permutation, const uint8_t *scantable, int last);
|
|
||||||
|
|
||||||
static inline void ff_update_block_index(MpegEncContext *s){
|
static inline void ff_update_block_index(MpegEncContext *s){
|
||||||
const int block_size= 8 >> s->avctx->lowres;
|
const int block_size= 8 >> s->avctx->lowres;
|
||||||
|
|
||||||
|
|||||||
@ -4489,6 +4489,42 @@ STOP_TIMER("iterative search")
|
|||||||
return last_non_zero;
|
return last_non_zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permute an 8x8 block according to permuatation.
|
||||||
|
* @param block the block which will be permuted according to
|
||||||
|
* the given permutation vector
|
||||||
|
* @param permutation the permutation vector
|
||||||
|
* @param last the last non zero coefficient in scantable order, used to
|
||||||
|
* speed the permutation up
|
||||||
|
* @param scantable the used scantable, this is only used to speed the
|
||||||
|
* permutation up, the block is not (inverse) permutated
|
||||||
|
* to scantable order!
|
||||||
|
*/
|
||||||
|
static void block_permute(int16_t *block, uint8_t *permutation,
|
||||||
|
const uint8_t *scantable, int last)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int16_t temp[64];
|
||||||
|
|
||||||
|
if (last <= 0)
|
||||||
|
return;
|
||||||
|
//FIXME it is ok but not clean and might fail for some permutations
|
||||||
|
// if (permutation[1] == 1)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
for (i = 0; i <= last; i++) {
|
||||||
|
const int j = scantable[i];
|
||||||
|
temp[j] = block[j];
|
||||||
|
block[j] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i <= last; i++) {
|
||||||
|
const int j = scantable[i];
|
||||||
|
const int perm_j = permutation[j];
|
||||||
|
block[perm_j] = temp[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int ff_dct_quantize_c(MpegEncContext *s,
|
int ff_dct_quantize_c(MpegEncContext *s,
|
||||||
int16_t *block, int n,
|
int16_t *block, int n,
|
||||||
int qscale, int *overflow)
|
int qscale, int *overflow)
|
||||||
@ -4564,7 +4600,7 @@ int ff_dct_quantize_c(MpegEncContext *s,
|
|||||||
|
|
||||||
/* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
|
/* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
|
||||||
if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
|
if (s->idsp.perm_type != FF_IDCT_PERM_NONE)
|
||||||
ff_block_permute(block, s->idsp.idct_permutation,
|
block_permute(block, s->idsp.idct_permutation,
|
||||||
scantable, last_non_zero);
|
scantable, last_non_zero);
|
||||||
|
|
||||||
return last_non_zero;
|
return last_non_zero;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user