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

📄 digest.c

📁 ESS3890+SL原代码(1*16内存)
💻 C
📖 第 1 页 / 共 2 页
字号:
			turn_off_data();	/* Safer than setting TDM_off */			clear_dec(); /* Reset VBV pointers, since we do					not need to do any more video					decoding. */		    }		} else#endif		{		    {#ifdef MOVING_DIGEST			if (digest_track % vcx_subDigestPerPage) {			    int tmp = (digest_track - 1)%num_of_digest_windows;			    DGST_move_window(4, move_window[tmp]);			}#endif			digest_track++;			digestAdvanceTrack();		    }		}	    }	}    } else if ((digest_mode == DIGEST_MOTION_MODE) && subDigestFinish) {    	dgst_wr_num(digest_track, COLOR_WHITE, COLOR_BLACK, 8, FILL_E2);    }}/************************************************************************ * Global function. Reset digest related things. ************************************************************************/void resetDigest(){    /* reset global variables when we are not in digest mode. */    vcx_digest = 0;    I_am_searching = 0;    vcx_playaudio_only = 0;    digestAudioStart = 0;    subDigestFinish = 0;    digest_track = 0; /* reset the starting digest track number */    if (digestInited) {	digestInited = 0;	vcx_fade_audio_volume = 0x8080;    }    system_reset();    DISP_do_blank(); /* then do DISP_END_DO_BLANK to bring back screen */    DISP_change_resolution(vcx_HorizSz, vcx_VertSz);#if 0    install_filter_coeffs(h_filters[0], h_filters[1]);#endif    DISP_END_DO_BLANK;}/************************************************************************ * Global function. One I frame has been digested, reset the frame_count.  ************************************************************************/void signalFinishSubDigest(int orNot){    if (orNot) {         /* normalize it */         frame_count++;     }     subDigestFinish = (orNot && (frame_count > DGST_MAXFRAME));     if (subDigestFinish) {	frame_count=0;    }}/************************************************************************ * Global function. Check if the macroblock is out of the display range.  ************************************************************************/int checkSubDigestRange(int MBRow, int MBColumn){    int tmpMBRow;    int tmpMBColumn;    tmpMBRow = MBRow;    tmpMBColumn = MBColumn;    if (vcx_subDigestPerPage == 9) {	tmpMBRow>>=1;	tmpMBColumn>>=1;    }    /* Check if the macro block is in the subdigest picture range. */    return((tmpMBColumn>=Hgap)                        	   && tmpMBColumn <(Hgap+XoffsetEndY)                     	   && (tmpMBRow>=Vgap)                                      	   && tmpMBRow < (Vgap+YoffsetEndY)                       	   );}/************************************************************************ * Global function. Tell the play control what the current track is.  ************************************************************************/int current_digest_track(){    return (digest_track);}/************************************************************************ * Digest OSD. * Write a number at special position, number can not be larger than 99. ************************************************************************/#ifndef USE_DGS_FONT PRIVATE void DGST_font(int num, int *addr) {	int i,j, tmp, ctmp, *dest;    unsigned char scratch_buf[192];/* To store decompressed dat	*/    unsigned char *srcptr;#ifdef USE_VWCOMP	ctmp = T_digit2ascii[num] - FONT_START;    /* Decompress 24B into scratch_buf */    newicon_decomp(scratch_buf, 				   T_osd_efonts_comp_font+T_osd_efonts_offset_tbl[ctmp], 				   T_osd_efonts_code_book,  6,  DGST_FHEIGHT);    srcptr = scratch_buf;#else	ERROR - In DGST_font();#endif		dest = addr;	for (j=0; j<DGST_FHEIGHT; j++){		ctmp = 0;		for (i=0; i<6; i++){			tmp = *srcptr++;			ctmp <<= 4;			ctmp |= ((tmp & 0x30)>>2);			ctmp |= (tmp & 0x03);		}		*dest++ = ctmp;	}}#endif /* !USE_DGS_FONT  */#ifdef NEW_DIGEST_OSDint top_left;PRIVATE void one_byte_becomes_one_dword(int b, int *dw){    int  i, x;    char *cp;    x = *dw;    cp = (char *)(&x);    for (i=0; i<4; i++) {	switch (b & 0xc0) {	    case 0xc0: *cp = 0x7b; break; /* white */	    case 0x40: *cp = 0x80; break; /* black */	    case 0x80: *cp = 0xb2; break; /* blue */	}	b <<= 2;	cp++;    }    *dw = x;}PRIVATE void DGST_overlay(int num, int addr){    int *fp;    int *dp = (int *)dram(addr);    int i, j, dw;    char *cp;#ifndef USE_DGS_FONT 	int ibuf[DGST_FHEIGHT];	DGST_font(num, ibuf);	fp = ibuf;#else	fp = (int *)(T_dgs_font + 16*num);#endif	    for (j=0;j<DGST_FHEIGHT;j++) {     	dw = *fp++;    	cp = (char *)(&dw);        for (i=0;i<4;i++) { 			one_byte_becomes_one_dword(*cp, dp);			cp++; dp++;        }		dp += 4;    } }PRIVATE void DGST_wr_num(int num) {     int dst;    uint num_bcd;    if (TDM_isCDDA) {	/* for CDDA, clear digest osd background */	DGST_OSD_clear();    }    dst = DIGEST_OSD_start;        num_bcd = hex2bcd[num]; /* num < 99 */    if (num > 9) {	DGST_overlay(num_bcd>>4, dst);	DGST_overlay(num_bcd&0xf, dst+4);    } else    	DGST_overlay(num_bcd&0xf, dst);    VP_xfer(50, VPCMD_W_DPCM, 0, VPDMA_USEDX, dst, 8, 16);    VP_xfer_bf(0, VPCMD_R_DPCM, 0,	       VPDMA_BREAK+VPDMA_INC2+VPDMA_WIDTH1, top_left, 4, 16);    VP_xfer_bf(0, VPCMD_R_DPCM, 8,	       VPDMA_BREAK+VPDMA_INC2+VPDMA_WIDTH1, top_left+3, 4, 16);}void DGST_OSD_clear(void){    int *dp = (int *)dram(DIGEST_OSD_start);    int i, j;    /* clear background to blue */    for (j=0;j<(DGST_FHEIGHT*2);j++) {         for (i=0;i<4;i++) { 	    one_byte_becomes_one_dword(0xaa, dp);	    dp++;        }    } }#else	/* NEW_DIGEST_OSD *//************************************************************************ * Digest OSD. * Write a number at special position, number can not be larger than 99. ************************************************************************/PRIVATE void DGST_wr_num(num, fc, bkc, blend, frame) int num, fc, bkc, blend, frame;{     int offsetX,offsetY;     int subnum,dnum;#if 1    int index = get_position_index();#else     int index = num - 1;#endif    subnum = num%10;     dnum = num/10;     if (DISP_scn_height==288) 	/* PAL ??? note:  Y_PAL=Y_NTSC*6/5+4 */ 	offsetY=DGST_SUBSCRH*6/5*(((index)%9)/3)+DGST_FIRST_STARTY*6/5+8;         else			/*NTSC */ 	offsetY=DGST_SUBSCRH*(((index)%9)/3)+DGST_FIRST_STARTY;            offsetX=DGST_FIRST_STARTX+(((index)%9)%3)*DGST_SUBSCRW;            if (dnum){ 	DGST_wr_numxy(dnum, fc, bkc, blend, frame, offsetX, offsetY); 	offsetX += 12;		/* move to next digital */     }     DGST_wr_numxy(subnum, fc, bkc, blend, frame, offsetX, offsetY);} /************************************************************************ * Digest OSD. * Write a number at special position, notice: only one digital.            ************************************************************************/PRIVATE void DGST_wr_numxy(num, fc, bkc, blend, frame, x, y) int num, fc, bkc, blend, frame, x, y;{     int mask,div;     short i,j;     int color;     unsigned long * font = T_dgs_font;    for (j=0;j<DGST_FHEIGHT;j++) {         mask=0xc00000;         div=0x400000;         for (i=0;i<DGST_FWIDTH;i++) {             switch ((int)(font[num*DGST_FHEIGHT+j]&mask)/div){                 case 3:				/* front color */                     DISP_paint_dot(x+i,y+j,fc,blend,frame);                     break; #if 1                 case 1: color=COLOR_BLUE;	/* it is edge, color=blue */                     DISP_paint_dot(x+i,y+j,color,blend,frame);                     break; #else                 case 0:				/* background */                     DISP_paint_dot(x+i,y+j,bkc,blend,frame);                     break; #endif             }             mask >>= 2; 	    div >>= 2;        }     } } #endif	/* NEW_DIGEST_OSD */#ifdef MOVING_DIGEST/************************************************************************ * Move digest window from "orig" to "dest". * Both "orig" and "dest" are digest window index defined in custdgt.h. * Return -1 if the input window index is out of range. ************************************************************************/int DGST_move_window(orig, dest)int orig, dest;{    DRAM_Addr from, to, bkgd;    int i, j, width_Y, height_Y;    /*     * Check the input window index.     */    if ((orig < 0) || (orig > 8) || (dest < 0) || (dest > 8))	return (-1);	/* out of index range */    /*     * Get the corresponding dram location according to      * digest window index.     */    get_dram_address(&from, orig);    get_dram_address(&to, dest);        get_dram_address(&bkgd, -1);	/* get background address */    width_Y = subDigestXSpacing33;    height_Y = subDigestYSpacing33;	        /*     * Copy the corresponding Y, U and V.     */    for (i = 0; i < width_Y; i++) {	for (j = 0; j < height_Y; j++) {	    int addr = i + j*DMAWIDTH2_E2_UV*2;		    /* Y */	    *(long *) dram(addr + to.start_Y) = 	    *(long *) dram(addr + from.start_Y);	    *(long *) dram(addr + from.start_Y) =	    *(long *) dram(i + bkgd.start_Y);	    /* U and V */	    if ((i < width_Y>>1) && (j < height_Y>>1)) {	    	*(long *) dram(addr + to.start_U) =	    	*(long *) dram(addr + from.start_U);	    	*(long *) dram(addr + from.start_U) =	    	*(long *) dram(i + bkgd.start_U);	    	*(long *) dram(addr + to.start_V) =	    	*(long *) dram(addr + from.start_V);	    	*(long *) dram(addr + from.start_V) =	    	*(long *) dram(i + bkgd.start_V);	    }	}    }    return (0);	/* done */}/************************************************************************ * Get the starting dram address of Y, U and V according to digest  * window index. Index == -1 means background. ************************************************************************/PRIVATE void get_dram_address(ptr, index)DRAM_Addr *ptr;int index;{    DISP_Info *dip = DISP_info + 3;	/* e2 frame */    int x, y, offset, y_offset, uv_offset;        if (index >= 0) {    	x = xoffset33_Y(index);	/* x coordinate in unit of DWORD */    	y = yoffset33_Y(index);	/* y coordinate (number of lines) */    	/*     	 * For PAL source and NTSC display in digest mode, we cropped     	 * the first 2 macroblock rows for each digest picture. So we     	 * have to advance the y coordinate by 16 (32/2 lines) in order     	 * to get the ture starting dram addresses.     	 */    	if (vcx_VertSz > vcx_scn_height) y += 16;    } else { 	/* background */	x = xoffset33_Y(1);	y = yoffset33_Y(1) - 20;    }    /*     * Convert to linear addresses for Y and UV.      */    offset = y * DMAWIDTH2_E2_UV;    y_offset = x + (offset<<1);    uv_offset = (x>>1) + offset;    /*     * Obtain the starting Y, U and V addresses based on      * the addresses in DISP_info for e2 offset by (x,y)      * location.     */    ptr->start_Y = dip->startY + y_offset;    ptr->start_U = dip->startU + uv_offset;    ptr->start_V = dip->startV + uv_offset;}#endif	/* MOVING_DIGEST */#endif /* DIGEST */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -