⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpegvideo.c

📁 一个播放器 使用了evc 大家可以参考下 哦
💻 C
📖 第 1 页 / 共 3 页
字号:
		"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 + -