📄 mpegvideo.c
字号:
"sra $14,$14,31;" //
"or $15,$15,$14;" //
"sb $15,1($24);"
"add $15,$5,$9;" //x0+x4
"lbu $2,2($24);"
"sra $15,$15,14;"
"add $15,$15,$2;"
"srl $14,$15,16;" //
"srlv $15,$15,$14;" //
"sll $14,$15,23;" //if bigger than 255:255
"sra $14,$14,31;" //
"or $15,$15,$14;" //
"sb $15,2($24);"
"add $15,$13,$11;" //x8+x6
"lbu $2,3($24);"
"sra $15,$15,14;"
"add $15,$15,$2;"
"srl $14,$15,16;" //
"srlv $15,$15,$14;" //
"sll $14,$15,23;" //if bigger than 255:255
"sra $14,$14,31;" //
"or $15,$15,$14;" //
"sb $15,3($24);"
);
__asm( "sub $15,$13,$11;"
"lbu $2,4($24);"
"sra $15,$15,14;"
"add $15,$15,$2;"
"srl $14,$15,16;" //
"srlv $15,$15,$14;" //
"sll $14,$15,23;" //if bigger than 255:255
"sra $14,$14,31;" //
"or $15,$15,$14;" //
"sb $15,4($24);"
"sub $15,$5,$9;"
"lbu $2,5($24);"
"sra $15,$15,14;"
"add $15,$15,$2;"
"srl $14,$15,16;" //
"srlv $15,$15,$14;" //
"sll $14,$15,23;" //if bigger than 255:255
"sra $14,$14,31;" //
"or $15,$15,$14;" //
"sb $15,5($24);"
"sub $15,$8,$7;"
"lbu $2,6($24);"
"sra $15,$15,14;"
"add $15,$15,$2;"
"srl $14,$15,16;" //
"srlv $15,$15,$14;" //
"sll $14,$15,23;" //if bigger than 255:255
"sra $14,$14,31;" //
"or $15,$15,$14;" //
"sb $15,6($24);"
"sub $15,$12,$6;"
"lbu $2,7($24);"
"sra $15,$15,14;"
"add $15,$15,$2;"
"srl $14,$15,16;" //
"srlv $15,$15,$14;" //
"sll $14,$15,23;" //if bigger than 255:255
"sra $14,$14,31;" //
"or $15,$15,$14;" //
"sb $15,7($24);"
);
}
static void idctcol (DCTELEM *blk)
{
__asm ( "lh $5,0($4);"//x0
"lh $9,16($4);"//x4
"lh $8,32($4);"//x3
"lh $12,48($4);"//x7
"lh $6,64($4);"//x1
"lh $11,80($4);"//x6
"lh $7,96($4);"//x2
"lh $10,112($4);"//x5
"or $2,$7,$6;"
"or $2,$2,$8;"
"or $2,$2,$9;"
"or $2,$2,$10;"
"or $2,$2,$11;"
"or $2,$2,$12;"//shortcut
"sll $6,$6,11;"// x1<<11
"bne $2,$0,idct_estandar;"//si no es 0 no podemos atajar
"sll $5,$5,3;"//x0<<3
"beq $5,$0,final;"
"sh $5,0($4);"//guardamos x0
"sh $5,16($4);"
"sh $5,32($4);"
"sh $5,48($4);"
"sh $5,64($4);"
"sh $5,80($4);"
"sh $5,96($4);"
"sh $5,112($4);"
"final:jr $31;",blk);
__asm ("idct_estandar:add $13,$9,$10;"//x8=x4+x5
"li $14,565;"//W7
"mult $14,$13;"//W7*x8
"li $15,2276;"//W1_minus_W7
"macc $0,$15,$9;"//x4=x(W1-W7)*x4+W7*8
"mflo $9;"
"sll $5,$5,11;"// x0<<11
"mult $14,$13;"//W7*x8
"li $15,-3406;" //-W1_plus_W7
"macc $0,$15,$10;"//-((W1+W7)*x5)+W7*x8
"mflo $10;"
"li $14,2408;"//W3
"add $13,$11,$12;"// x6+x7
"mult $14,$13;"//W3*(x6+x7)
"li $15,-799;"//-W3_minus_W5
"macc $0,$15,$11;"//-((W3-W5)*x6)+W3*(x6+x7)
"mflo $11;"
"add $5,$5,128;"//x0+=128
"mult $14,$13;"
"li $14,-4017;"
"macc $0,$12,$14;"
"mflo $12;"
);
__asm ( "add $13,$5,$6;"
"sub $5,$5,$6;"//x0 -=x1
"add $6,$7,$8;"//x1=(x2+x3)
"li $15,1108;"//W6
"mult $15,$6;"//W6*(x3+x2)
"li $14,-3784;" //-W2_plus_W6
"macc $0,$14,$7;" //x1+(-W2_plus_W6*x2)
"mflo $7;"
"mult $15,$6;"//W6*(x3+x2)
"li $14,1568;"//W2_minus_W6
"macc $0,$14,$8;"//W2_minus_W6*x3
"mflo $8;"
"add $6,$9,$11;"//x1=x4+x6
"sub $9,$9,$11;"//x4=x4-x6
"add $11,$10,$12;"//x6=x5+x7
"sub $10,$10,$12;"//x5=x5-x7
);
__asm ( "add $12,$13,$8;"//x7=x8+x3
"sub $13,$13,$8;"//x8-=x3
"add $8,$5,$7;"//x3=x0+x2
"sub $5,$5,$7;"//x0-=x2
"li $14,181;"
"add $7,$9,$10;"//x4+x5
"mult $14,$7;"//
"mflo $7;"
"addi $7,$7,128;"
"sra $7,$7,8;"
"sub $9,$9,$10;"
"mult $14,$9;"
"mflo $9;"
"addi $9,$9,128;"
"sra $9,$9,8;");
//Fourth Stage
__asm ( "add $24,$12,$6;"//x7+x1
"sra $24,$24,8;"
"sh $24,0($4);"
"add $24,$7,$8;"//x3+x2
"sra $24,$24,8;"
"sh $24,16($4);"
"add $24,$5,$9;"//x0+x4
"sra $24,$24,8;"
"sh $24,32($4);"
"add $24,$13,$11;"//x8+x6
"sra $24,$24,8;"
"sh $24,48($4);"
"sub $24,$13,$11;"
"sra $24,$24,8;"
"sh $24,64($4);"
"sub $24,$5,$9;"
"sra $24,$24,8;"
"sh $24,80($4);"
"sub $24,$8,$7;"
"sra $24,$24,8;"
"sh $24,96($4);"
"sub $24,$12,$6;"
"sra $24,$24,8;"
"sh $24,112($4);");
}
#else
static void idctcol (DCTELEM *blk)
{
int x0, x1, x2, x3, x4, x5, x6, x7, x8;
x4 = blk[8];
x3 = blk[16];
x7 = blk[24];
x1 = blk[32] << 11;
x6 = blk[40];
x2 = blk[48];
x5 = blk[56];
if (!((x1) | (x2) | (x3) | (x4) | (x5) | (x6) | (x7)))
{
blk[0] = blk[8] = blk[16] = blk[24] = blk[32] = blk[40] = blk[48] = blk[56] = blk[0] << 3;
return;
}
x0 = (blk[0] << 11) + 128;
x8 = W7 * (x4 + x5);
x4 = x8 + (W1_minus_W7) * x4;
x5 = x8 - (W1_plus_W7) * x5;
x8 = W3 * (x6 + x7);
x6 = x8 - (W3_minus_W5) * x6;
x7 = x8 - (W3_plus_W5) * x7;
x8 = x0 + x1;
x0 -= x1;
x1 = W6 * (x3 + x2);
x2 = x1 - (W2_plus_W6) * x2;
x3 = x1 + (W2_minus_W6) * x3;
x1 = x4 + x6;
x4 -= x6;
x6 = x5 + x7;
x5 -= x7;
x7 = x8 + x3;
x8 -= x3;
x3 = x0 + x2;
x0 -= x2;
x2 = (181 * (x4 + x5) + 128) >> 8;
x4 = (181 * (x4 - x5) + 128) >> 8;
blk[0] = (DCTELEM)((x7 + x1) >> 8);
blk[8] = (DCTELEM)((x3 + x2) >> 8);
blk[16] = (DCTELEM)((x0 + x4) >> 8);
blk[24] = (DCTELEM)((x8 + x6) >> 8);
blk[32] = (DCTELEM)((x8 - x6) >> 8);
blk[40] = (DCTELEM)((x0 - x4) >> 8);
blk[48] = (DCTELEM)((x3 - x2) >> 8);
blk[56] = (DCTELEM)((x7 - x1) >> 8);
}
static __inline void idctrow_special (DCTELEM *blk, UINT8 *destU8,int flag)
{
int x0, x1, x2, x3, x4, x5, x6, x7, x8;
int temp;
x4 = blk[1];
x3 = blk[2];
x7 = blk[3];
x1 = (blk[4] << 8);
x6 = blk[5];
x2 = blk[6];
x5 = blk[7];
if (!((x1) | (x2) | (x3) | (x4) | (x5) | (x6) | (x7)))
{
temp = (blk[0] + 32) >> 6;
if (flag==1) {
destU8[0] = (temp+destU8[0])>255?255:(temp+destU8[0])<0?0:(temp+destU8[0]);
destU8[1] = (temp+destU8[1])>255?255:(temp+destU8[1])<0?0:(temp+destU8[1]);
destU8[2] = (temp+destU8[2])>255?255:(temp+destU8[2])<0?0:(temp+destU8[2]);
destU8[3] = (temp+destU8[3])>255?255:(temp+destU8[3])<0?0:(temp+destU8[3]);
destU8[4] = (temp+destU8[4])>255?255:(temp+destU8[4])<0?0:(temp+destU8[4]);
destU8[5] = (temp+destU8[5])>255?255:(temp+destU8[5])<0?0:(temp+destU8[5]);
destU8[6] = (temp+destU8[6])>255?255:(temp+destU8[6])<0?0:(temp+destU8[6]);
destU8[7] = (temp+destU8[7])>255?255:(temp+destU8[7])<0?0:(temp+destU8[7]);
}
else {
temp=temp>255? 255: temp<0?0:temp;
destU8[0]=destU8[1]=destU8[2]=destU8[3]=destU8[4]=destU8[5]=destU8[6]=destU8[7]=temp;
}
return;
}
x0 = (blk[0] << 8) + 8192;
x8 = W7 * (x4 + x5) + 4;
x4 = (x8 + (W1_minus_W7) * x4) >> 3;
x5 = (x8 - (W1_plus_W7) * x5) >> 3;
x8 = W3 * (x6 + x7) + 4;
x6 = (x8 - (W3_minus_W5) * x6) >> 3;
x7 = (x8 - (W3_plus_W5) * x7) >> 3;
x8 = x0 + x1;
x0 -= x1;
x1 = W6 * (x3 + x2) + 4;
x2 = (x1 - (W2_plus_W6) * x2) >> 3;
x3 = (x1 + (W2_minus_W6) * x3) >> 3;
x1 = x4 + x6;
x4 -= x6;
x6 = x5 + x7;
x5 -= x7;
x7 = x8 + x3;
x8 -= x3;
x3 = x0 + x2;
x0 -= x2;
x2 = (181 * (x4 + x5) + 128) >> 8;
x4 = (181 * (x4 - x5) + 128) >> 8;
if (flag ==1){
destU8[0] = (((x7 + x1) >> 14)+destU8[0])>255? 255: (((x7 + x1) >> 14)+destU8[0])<0 ? 0:(((x7 + x1) >> 14)+destU8[0]);
destU8[1] = (((x3 + x2) >> 14)+destU8[1])>255? 255: (((x3 + x2) >> 14)+destU8[1])<0 ? 0:(((x3 + x2) >> 14)+destU8[1]);
destU8[2] = (((x0 + x4) >> 14)+destU8[2])>255? 255: (((x0 + x4) >> 14)+destU8[2])<0 ? 0:(((x0 + x4) >> 14)+destU8[2]);
destU8[3] = (((x8 + x6) >> 14)+destU8[3])>255? 255: (((x8 + x6) >> 14)+destU8[3])<0 ? 0:(((x8 + x6) >> 14)+destU8[3]);
destU8[4] = (((x8 - x6) >> 14)+destU8[4])>255? 255: (((x8 - x6) >> 14)+destU8[4])<0 ? 0:(((x8 - x6) >> 14)+destU8[4]);
destU8[5] = (((x0 - x4) >> 14)+destU8[5])>255? 255: (((x0 - x4) >> 14)+destU8[5])<0 ? 0:(((x0 - x4) >> 14)+destU8[5]);
destU8[6] = (((x3 - x2) >> 14)+destU8[6])>255? 255: (((x3 - x2) >> 14)+destU8[6])<0 ? 0:(((x3 - x2) >> 14)+destU8[6]);
destU8[7] = (((x7 - x1) >> 14)+destU8[7])>255? 255: (((x7 - x1) >> 14)+destU8[7])<0 ? 0:(((x7 - x1) >> 14)+destU8[7]);}
else{
destU8[0] = ((x7 + x1) >> 14)>255? 255: ((x7 + x1) >> 14)<0 ? 0:((x7 + x1) >> 14);
destU8[1] = ((x3 + x2) >> 14)>255? 255: ((x3 + x2) >> 14)<0 ? 0:((x3 + x2) >> 14);
destU8[2] = ((x0 + x4) >> 14)>255? 255: ((x0 + x4) >> 14)<0 ? 0:((x0 + x4) >> 14);
destU8[3] = ((x8 + x6) >> 14)>255? 255: ((x8 + x6) >> 14)<0 ? 0:((x8 + x6) >> 14);
destU8[4] = ((x8 - x6) >> 14)>255? 255: ((x8 - x6) >> 14)<0 ? 0:((x8 - x6) >> 14);
destU8[5] = ((x0 - x4) >> 14)>255? 255: ((x0 - x4) >> 14)<0 ? 0:((x0 - x4) >> 14);
destU8[6] = ((x3 - x2) >> 14)>255? 255: ((x3 - x2) >> 14)<0 ? 0:((x3 - x2) >> 14);
destU8[7] = ((x7 - x1) >> 14)>255? 255: ((x7 - x1) >> 14)<0 ? 0:((x7 - x1) >> 14);
}
}
#endif
/* two dimensional inverse discrete cosine transform */
static __inline void idct_special (DCTELEM *block, UINT8 *destU8, int stride, int flag)
{
idctcol(block);
idctcol(block+1);
idctcol(block+2);
idctcol(block+3);
idctcol(block+4);
idctcol(block+5);
idctcol(block+6);
idctcol(block+7);
idctrow_special(block,destU8,flag);
destU8+=stride;
idctrow_special(block+8,destU8,flag);
destU8+=stride;
idctrow_special(block+16,destU8,flag);
destU8+=stride;
idctrow_special(block+24,destU8,flag);
destU8+=stride;
idctrow_special(block+32,destU8,flag);
destU8+=stride;
idctrow_special(block+40,destU8,flag);
destU8+=stride;
idctrow_special(block+48,destU8,flag);
destU8+=stride;
idctrow_special(block+56,destU8,flag);
clearblock(block);
}
/* init common structure for both encoder and decoder */
int MPV_common_init(MpegEncContext *s)
{
int c_size, i;
UINT8 *pict;
s->mb_width = (s->width + 15) / 16;
s->mb_height = (s->height + 15) / 16;
s->linesize = s->mb_width * 16 + 2 * EDGE_WIDTH;
for(i=0;i<3;i++) {
int w, h, shift, pict_start;
w = s->linesize;
h = s->mb_height * 16 + 2 * EDGE_WIDTH;
shift = (i == 0) ? 0 : 1;
c_size = (w >> shift) * (h >> shift);
pict_start = (w >> shift) * (EDGE_WIDTH >> shift) + (EDGE_WIDTH >> shift);
pict = av_mallocz(c_size);
if (pict == NULL)
goto fail;
s->last_picture_base[i] = pict;
s->last_picture[i] = pict + pict_start;
pict = av_mallocz(c_size);
if (pict == NULL)
goto fail;
s->next_picture_base[i] = pict;
s->next_picture[i] = pict + pict_start;
if (s->has_b_frames) {
pict = av_mallocz(c_size);
if (pict == NULL)
goto fail;
s->aux_picture_base[i] = pict;
s->aux_picture[i] = pict + pict_start;
}
}
if (s->out_format == FMT_H263) {
int size;
/* MV prediction */
size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
s->motion_val = malloc(size * 2 * sizeof(INT16));
if (s->motion_val == NULL)
goto fail;
memset(s->motion_val, 0, size * 2 * sizeof(INT16));
}
if (s->h263_pred) {
int y_size, c_size, i, size;
/* dc values */
y_size = (2 * s->mb_width + 2) * (2 * s->mb_height + 2);
c_size = (s->mb_width + 2) * (s->mb_height + 2);
size = y_size + 2 * c_size;
s->dc_val[0] = malloc(size * sizeof(INT16));
if (s->dc_val[0] == NULL)
goto fail;
s->dc_val[1] = s->dc_val[0] + y_size;
s->dc_val[2] = s->dc_val[1] + c_size;
for(i=0;i<size;i++)
s->dc_val[0][i] = 1024;
/* ac values */
s->ac_val[0] = av_mallocz(size * sizeof(INT16) * 16);
if (s->ac_val[0] == NULL)
goto fail;
s->ac_val[1] = s->ac_val[0] + y_size;
s->ac_val[2] = s->ac_val[1] + c_size;
/* cbp values */
s->coded_block = av_mallocz(y_size);
if (!s->coded_block)
goto fail;
}
/* default structure is frame */
s->picture_structure = PICT_FRAME;
/* init default q matrix (only for mpeg and mjpeg) */
for(i=0;i<64;i++) {
s->intra_matrix[i] = default_intra_matrix[i];
s->chroma_intra_matrix[i] = default_intra_matrix[i];
s->non_intra_matrix[i] = default_non_intra_matrix[i];
s->chroma_non_intra_matrix[i] = default_non_intra_matrix[i];
}
s->context_initialized = 1;
return 0;
fail:
if (s->motion_val)
free(s->motion_val);
if (s->dc_val[0])
free(s->dc_val[0]);
if (s->ac_val[0])
free(s->ac_val[0]);
if (s->coded_block)
free(s->coded_block);
for(i=0;i<3;i++) {
if (s->last_picture_base[i])
free(s->last_picture_base[i]);
if (s->next_picture_base[i])
free(s->next_picture_base[i]);
if (s->aux_picture_base[i])
free(s->aux_picture_base[i]);
}
return -1;
}
/* init common structure for both encoder and decoder */
void MPV_common_end(MpegEncContext *s)
{
int i;
if (s->motion_val)
free(s->motion_val);
if (s->h263_pred) {
free(s->dc_val[0]);
free(s->ac_val[0]);
free(s->coded_block);
}
for(i=0;i<3;i++) {
free(s->last_picture_base[i]);
free(s->next_picture_base[i]);
if (s->has_b_frames)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -