www.pudn.com > JPEGMotion.rar > thrControl.c
/* * Copyright 2002 by Texas Instruments Incorporated. * All rights reserved. Property of Texas Instruments Incorporated. * Restricted rights to use, duplicate or disclose this code are * granted through contract. * */ /* "@(#) RF5_IEK 2.00.01 11-26-02 (swat-c18)" */ /* * ======== thrControl.c ======== * This file shows an example of sending messages from one thread to the * other using mailbox. */ #include// DSP/BIOS includes #include #include // RF includes #include // application includes #include "appResources.h" // application-wide common info #include "appThreads.h" // thread-wide common info #include "thrControl.h" #include "appmain.h" #include "tskProcess.h" /* contains thread specific information */ // global variables to be modified by GEL #define NUMCONTROLS 1 // same as the number of processing channels typedef struct ExternalControl { Int frameRatio[NUMCONTROLS]; Int quality[NUMCONTROLS]; } ExternalControl; #pragma DATA_ALIGN(externalControl, 128); ExternalControl externalControl; // GEL script writes here ExternalControl externalControlPrev; // this is a local copy /* * ======== thrControlInit ======== * */ Void thrControlInit() { UTL_assert( NUMCONTROLS == 1 ); // set the default frame ratio externalControl.frameRatio[0] = 1; // live video channel externalControl.quality[0] = 85; externalControlPrev = externalControl; } void thrControlSet( int FrameRatio, int Quality ) { UTL_assert( NUMCONTROLS == 1 ); // Keep the quality reasonable. File size increases // about 60% between quality factors 95 and 100. // Keep it 1-90. if( (Quality-=10) < 1 ) Quality = 1; // set the default frame ratio externalControl.frameRatio[0] = FrameRatio; externalControl.quality[0] = Quality; } /* * ======== thrControlStartup ======== * */ Void thrControlStartup() { Int chanNum; CtrlMsg txMsg; // send message to initialize the frame ratio for( chanNum = 0; chanNum < NUMCONTROLS; chanNum++) { // Set-up initial values for frame ratio txMsg.cmd = MSGFRAMECHANGE; txMsg.arg1 = chanNum; txMsg.arg2 = externalControl.frameRatio[chanNum]; // Send the request MBX_post( &mbxProcess, &txMsg, 0 ); // Set-up initial values for new quality txMsg.cmd = MSGQUALCHANGE; txMsg.arg1 = chanNum; txMsg.arg2 = 0; // JPEG encoder cell index txMsg.arg3 = externalControl.quality[chanNum]; // Send the request MBX_post( &mbxProcess, &txMsg, 0 ); } } /* * ======== thrControlRun ======== * * Main function of Control task. */ Void thrControlRun() { Int chanNum; CtrlMsg txMsg; // Main loop while (TRUE) { // check for changes for( chanNum = 0; chanNum < NUMCONTROLS; chanNum++) { // See if user requested a frame ratio change. if( externalControl.frameRatio[chanNum] != externalControlPrev.frameRatio[chanNum] ) { // new value entered externalControlPrev.frameRatio[chanNum] = externalControl.frameRatio[chanNum]; // send message to tell which channel has ratio changed txMsg.cmd = MSGFRAMECHANGE; txMsg.arg1 = chanNum; txMsg.arg2 = externalControl.frameRatio[chanNum]; MBX_post( &mbxProcess, &txMsg, 0 ); } // See if user requested a quality change. if( externalControl.quality[chanNum] != externalControlPrev.quality[chanNum] ) { // new value entered externalControlPrev.quality[chanNum] = externalControl.quality[chanNum]; // send message to tell which channel has ratio changed txMsg.cmd = MSGQUALCHANGE; txMsg.arg1 = chanNum; txMsg.arg2 = 0; // JPEG encoder cell index txMsg.arg3 = externalControl.quality[chanNum]; MBX_post( &mbxProcess, &txMsg, 0 ); } } // suspend self for 500 ticks, and then poll again TSK_sleep( 500 ); } }