podigest.c
来自「一个不错的硬盘播放器程序,包含VFD显示程序,红外线遥控程序,硬盘读写程序,及解」· C语言 代码 · 共 777 行 · 第 1/2 页
C
777 行
/* Copyright 1996, ESS Technology, Inc. *//* SCCSID @(#)podigest.c 1.21 12/22/97 *//* * This is modified from version 1.76 of 3204's podigest.c *//* * $Log$ */#ifdef DIGEST#include "util.h"#include "fsosd.h"#include "display.h"#include "vcxi.h"#include "digest.h"#include "timedef.h"#include "tdm.h"#include "mvd.h"#include "tact.h"#include "debug.h"#include "ir.h"#include "vp.h"#include "sysinfo.h"#include "const.h"/* * Undefine fading control. Audio fade in/out doesn't seem to give "good" * result (expecially if we want to implement "track digest" */#undef FADING_CONTROL/************************************************************************ * Local defines. * ************************************************************************/#define yoffsetGlobal33_Y_for_fillSubDigest (DEST_HEIGHT==288?84:62)#define yoffsetGlobal33_Y ((DEST_HEIGHT >> 2) - VGAP33)#define yoffset_Y(index) ((vcx_subDigestPerPage == 9) ? \ yoffset33_Y(index) : \ yoffset22_Y(index, HGAP22, xoffsetEnd22_Y))#define DFACTOR 2 /* decimate factor: hardwired to 2 */#define D_CHAR_WIDTH (OSD_CHAR_WIDTH/DFACTOR)#define D_CHAR_HEIGHT (OSD_CHAR_HEIGHT/DFACTOR)#define FADING_DURATION (ONE__SEC) /* (second) *//* scratch area for digest osd fonts *//* use one row of D_CHAR_HEIGHT x D_CHAR_WIDTH*10 */#define XOFFSET_SCRATCH 0#define YOFFSET_SCRATCH 864#define OSD_XPOS(index) (XOFFSET_SCRATCH + (index) * MYDX)#define MYDY D_CHAR_HEIGHT#define MYDX (D_CHAR_WIDTH >> 2)#define SOURCE_WIDTH (352 >> 2)#define SOURCE_HEIGHT vcx_VertSz#define DEST_HEIGHT vcx_scn_height#define DGST_MAXFRAME 5 #define DGST_FWIDTH 12 /* Width of digest font */ #define DGST_FHEIGHT 16 /* Height of digest font */#define DGST_SUBSCRW 160 /* Width of digest subscreen */ #define DGST_SUBSCRH 120 /* Height of digest subscreen */#define DGST_FIRST_STARTX 104 /* Digest start x */ #define DGST_FIRST_STARTY 64 /* Digest start y */ /* john also got left shifted by 2 */#define CIFMODE 0#define assignDigestIndex(tmp, col, john) \{ \ (tmp).bYte[3-(col)] = (((unsigned long)john) >> 31) ? 0x7f : 0x80; \ (john) <<= 4; \}/************************************************************************ * Global variables * ************************************************************************/int vcx_digest_audio_duration = THREE_SECOND; /* Number of * * audio seconds */char digestIframe2show = 6; /* Number of I frames to show * * before freezing */int xoffsetY;int yoffsetY;unsigned int subDigestPeriod = FIFTEEN_SECOND; /* Max. 15 sec for each* * digest screen; this is on * * top of other constraints. */#if 0char DigestFrameToSkip; /* Number of frames to skip in * * digest (before the first I) */#endifchar audio_in_digest = 0; /* Play audio during digest if 1*//************************************************************************ * Private variables * ************************************************************************/PRIVATE int subDigestFinish;/* flag to increment the digest track */PRIVATE int digestInited = 0;#if 0PRIVATE int xoffsetOsdY;PRIVATE int yoffsetOsdY;#endifPRIVATE int Vgap;PRIVATE int Hgap;PRIVATE int YoffsetEndY;PRIVATE int XoffsetEndY;PRIVATE int digest_track; /* current track to be digested */PRIVATE int prevDigestTck; /* The last digest track number, so we * * can make sure that digest track * * number is increasing */PRIVATE char showIframe; /* Number of I frames to show before * * starting audio. */#if (P3O || P4O)PRIVATE unsigned int resendNextTime = 0xffffffff; /* Time we will * * resend NEXT track */#define SET_RESEND resendNextTime = glbTimer + resend_delay#define CLEAR_RESEND resendNextTime = 0xffffffff#else#define SET_RESEND#define CLEAR_RESEND#endif/************************************************************************ * Functions private to this module * ************************************************************************/PRIVATE void digestAdvanceTrack(void);PRIVATE void digestOsd(int index, int xoffset, int yoffset, int pos);#ifdef FADING_CONTROLPRIVATE int fadeOutAudio(int, int);#endifPRIVATE void incDigestTrack(void);#ifdef NEW_DIGEST_OSDPRIVATE void DGST_wr_num(int);#define dgst_wr_num(a,b,c,d,e) DGST_wr_num((a))#elsePRIVATE void DGST_wr_num(int,int,int,int,int);PRIVATE void DGST_wr_numxy(int,int,int,int,int,int,int); #define dgst_wr_num(a,b,c,d,e) DGST_wr_num((a),(b),(c),(d),(e))#endifPRIVATE void nextSubDigest(void);/* * Increment digest_track. We'll limit it to 99 (for OSD purpose) */PRIVATE void incDigestTrack(){ digest_track++; if (digest_track > 99) digest_track = 1;}/* * Initialize digest. This routine is responsible for: * 1. Set variables related to digest. * 2. Move fonts needed for digest OSD to scratch DRAM. Also * process the font accordingly. * 3. A smooth screen resolution conversion. */PRIVATE void initDigest(){ VP_load_ucode(rtwo2one); showIframe = digestIframe2show;#if 0 subDigestEndTime = glbTimer +subDigestPeriod; /* Scheduled end time for first track */#else subDigestEndTime = 0xffffffff; /* Don't rush user. Let him have * * some time to press the play key. */#endif#if (P1O || P2O || P4O) digestPause = 1; /* Don't time out from digest mode. * * Give customer time for inputing */#endif vcx_digest = 1; /* We are in digest mode */ /* audio_in_digest decide start with video (first picture) or play * * audio during digest*/ vcx_playvideo_only = audio_in_digest ? 0 : 1; vcx_playaudio_only = 0; /* No audio at beginning */ /* * In case we enter digest mode again while we just finished digest * and waiting for user to make a choice. */ ignoreTDM = 0; clearIgnoreTime = 0xffffffff; if (!digestInited) { digestInited = 1; } DISP_frame = E2; DISP_change_resolution(704, DISP_scn_height*2); DISP_paint_screen(COLOR_BLUE, NORMAL_PAINT, DISP_frame); DISP_count = 0; showingLogo = SHOWING_NOLOGO;/* Digest is no longer showing logo */}void setupSubDigestScreen(){ int index = (digest_track+(vcx_subDigestPerPage-1)) % vcx_subDigestPerPage; if (vcx_subDigestPerPage == 9) { /* order in assigning is important */ YoffsetEndY = yoffsetEnd33_Y; XoffsetEndY = xoffsetEnd33_Y; Vgap = VGAP33; Hgap = HGAP33; /* the following have dependency on the previous variables */ xoffsetY = xoffset33_Y(index); yoffsetY = yoffset33_Y(index); } else { YoffsetEndY = yoffsetEnd22_Y; XoffsetEndY = xoffsetEnd22_Y; Vgap = VGAP22; Hgap = HGAP22; xoffsetY = xoffset22_Y(index,HGAP22,xoffsetEnd22_Y); yoffsetY = yoffset22_Y(index,VGAP22,yoffsetEnd22_Y); } /* * caculate the y and uv offsets in long word address for the next * decoded picture. */ { int offset = yoffsetY * DMAWIDTH2_E2_UV; digest_y_offset = xoffsetY + (offset<<1); digest_uv_offset = (xoffsetY>>1) + (offset); }}/* * Advance a picture * */PRIVATE void digestAdvanceTrack(void){ setupSubDigestScreen(); signalFinishSubDigest(0); /* Reset subDigestFinish */ digestAudioStart = 0;}#ifdef FADING_CONTROL/* * Compute vcx_audio_volume based on a factor. This routine is used * to do audio fade in/out. * * Inputs: * vol: current audio volume * factor: Multiplication factor. */PRIVATE int fadeOutAudio(vol, factor)int vol;int factor;{ union { unsigned char byte[2]; unsigned short word; } john; john.word = (unsigned short) vol; john.byte[0] = (unsigned char) (((unsigned long) john.byte[0] * factor) >> 6); john.byte[1] = (unsigned char) (((unsigned long) john.byte[1] * factor) >> 6); return (int) john.word;}#endif/* * Action to taken when we are done with one digest picture */PRIVATE void nextSubDigest(){ /* * Done with one digest screen. Let's get next picture. * For the timebeing, turn audio off; wait for first picture. */ vcx_playaudio_only = 0; /* audio_in_digest decide start with video (first picture) or play * * audio during digest*/ vcx_playvideo_only = audio_in_digest ? 0 : 1; vcx_fade_audio_volume = 0x1010; /* Make sure we are moving forward with digest track number */ if (prevDigestTck == digest_track) incDigestTrack(); prevDigestTck = digest_track; /* Decide what to do next */#if (P3O || P4O) if (1) {#else if (digest_track <= 18) {#endif subDigestEndTime = glbTimer + subDigestPeriod; /* Scheduled end time for next track */ if (!viewTrack) { if (((digest_track-1) % vcx_subDigestPerPage) == 0) {#if (P1O || P2O || P4O) /* * After 4/9 pictures, pause, and wait for user input */ assertPause(); /* Don't time out while allowing user to do selection */ subDigestEndTime = 0xffffffff; digestPause = 1; /* Pausing, so ignore timeout stuff*/ /* * Customer can select it message. */ OUTOSD(OSD_VIEW_REGION, MSG_digest_pause, MSG_c_digest_pause, 0);#else skipTrack(); SET_RESEND; /* Start a resend timer (just in case) */#endif } else { skipTrack(); SET_RESEND; /* Start a resend timer (just in case) */ digestPause = 0; /* No longer pausing. */ } } digestAdvanceTrack(); } else { /* * Stopped because we hit 18 pictures. In which case, * we'll ignore TDM input for 20 seconds. After that, we * do decoding again. */ ignoreTDM = 1; clearIgnoreTime = glbTimer + TWENTY_SECOND; resetDigest(); }}/************************************************************************ * Functions to interface with outside world. * ************************************************************************//* * Do disk digest * * Input parameter is not used for play-only machines. */int digestPage(int next){#ifdef LATER extern int VscaleReady; VscaleReady = 0; /* force no scaling when digest is on */ InitVscale();#endif assert((vcx_subDigestPerPage == 4) || (vcx_subDigestPerPage == 9)); keepVideoType = 0xe0; /* We only want E0 data. */ initDigest(); prevDigestTck = digest_track = 1; digestAdvanceTrack(); return (digest_track);}/* * Called from video decoder to indicate the one digest screen is done. *//* double functions: 1. luminance level calculation 2. signal a subDigest picture has been finished or not finished *//* digestNumMB: counter for tracking how many MB being decoded *//* digest NumMB used only if orNot==1 *//* return digestLuminanceLevel *//* after normalization digestLuminanceLevel is 8-bit signed value * ranging from 0x80 to 0x7f *//* assumption: * two2one_1st/2nd has been called to put accumulated luminance to port */void signalFinishSubDigest(int orNot)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?