Ejemplo n.º 1
0
//int CPROC CompressFrame( PCOMPRESS pCompress, POINTER *data, INDEX *len )
int CPROC CompressFrame( uintptr_t psv, PCAPTURE_DEVICE pDevice )
{
   PCOMPRESS pCompress = (PCOMPRESS)psv;
	int xerr;
   Image frame;
   GetDeviceData( pDevice, &frame, NULL );

	{  // setup constant factors about encoding behavior
      pCompress->xframe.version = XVID_VERSION;
		//pCompress->xframe.general = 0;
		pCompress->xframe.motion = 0; /*PMV_ADVANCEDDIAMOND16;*/
		pCompress->xframe.quant = 0; //1-31 specify quantizer...
		//pCompress->xframe.intra = -0; // 1- force keyframe, 0-force not keyframe
		pCompress->xframe.quant_intra_matrix = NULL;
		pCompress->xframe.quant_inter_matrix = NULL;

														 /* setup the input frame here... */
      pCompress->xframe.type = XVID_TYPE_AUTO;
		pCompress->xframe.input.csp = XVID_CSP_BGRA;
		pCompress->xframe.input.plane[0] = frame->image;
		pCompress->xframe.input.stride[0] = frame->pwidth*sizeof(CDATA);

		if( !pCompress->xframe.bitstream )
		{
			pCompress->xframe.length = frame->pwidth * frame->height; //frame->width * frame->height * 4;
			pCompress->xframe.bitstream = Allocate( frame->pwidth * frame->height );
		}

	}
   pCompress->xstats.version = XVID_VERSION;
	xerr = xvid_encore( pCompress->xparam.handle, XVID_ENC_ENCODE, &pCompress->xframe, &pCompress->xstats );
   if(0)
	lprintf( WIDE("stats! %d %d %d %d %d %d")
          , xerr
			 , pCompress->xstats.length
			 , pCompress->xstats.hlength
			 , pCompress->xstats.kblks
			 , pCompress->xstats.mblks
			 , pCompress->xstats.ublks );
	if( xerr < 0 || xerr > 512000 )
	{
		lprintf( WIDE("Resulting %d data was %p(%d)")
				 , xerr
				 , pCompress->xframe.bitstream
				 , pCompress->xframe.length );
	}
   MemCpy( pCompress->bitstream, pCompress->xframe.bitstream, xerr );
   SetDeviceData( pDevice, pCompress->bitstream, xerr );
   // at this point pCompress->xframe.intra 0 did not result in keyframe
	// 1 is a keyframe (scene change) 2 is keyframe (max keyfram interval)
   return 1;
}
// returns FALSE on END command, TRUE otherwise
bool tScriptState::ExecuteCommand(tCommand& cmd)
{
    bool bContinue = TRUE;
    switch(cmd.cmdId)
    {
        case cmdLabel:
            break;
        case cmdGoto:
            {
                ULONG step;
                const tParameter *pParam = cmd.params.GetAt(0);
                if (!FindLabelByName(*pParam, &step))
                {
                    FailCase("Can't find label %s", (LPCSTR)pParam->String());
                }
                else
                {
                    currentCommandIndex = step;
                }
            }
            break;
        case cmdIf:
            {
                bool bTrue = EvaluateCondition(cmd.params[0]->String());
                if (!bTrue)
                {
                    currentCommandIndex = cmd.elseStepForIf;
                }
            }
            break;
        case cmdEnd:
            bContinue = FALSE;
            break;
        case cmdSet:
            {
                ULONG data;
                ULONG value = cmd.params[1]->Value();
                if (!GetVariable(cmd.params[0]->String(), data) || data != value)
                {
                    data = value;
                    SetVariable(cmd.params[0]->String(), data);
                }
            }
            break;
        case cmdAdd:
            {
                ULONG data;
                if (GetVariable(cmd.params[0]->String(), data))
                {
                    data += cmd.params[1]->Value();
                    SetVariable(cmd.params[0]->String(), data);
                }
                else
                {
                    FailCase("Can't add %s", cmd.params[0]->String());
                }
            }
            break;
        case cmdPrepare:
            {
                ULONG data;
                if (GetVariable("use_merged_buffers", data))
                    bUseMergedBuffers = !!data;
                if (GetVariable("use_published_events", data))
                    bUsePublishedIndices = !!data;
                if (GetVariable("use_msix", data))
                    bMSIXUsed = !!data;
                SimulationPrepare();
            }
            break;
        case cmdTxAsync:
            {
                bAsyncTransmit = !!cmd.params[0]->Value();
            }
            break;
        case cmdSend:
            {
                AddTxBuffers(cmd.params[0]->Value(), cmd.params[1]->Value());
            }
            break;
        case cmdTxComplete:
            {
                CompleteTx((int)cmd.params[0]->Value());
            }
            break;
        case cmdTxGet:
            {
                GetTxBuffer(cmd.params[0]->Value());
            }
            break;
        case cmdRxReturn:
            {
                ReturnRxBuffer(cmd.params[0]->Value());
            }
            break;
        case cmdRxReceive:
            {
                RxReceivePacket((UCHAR)cmd.params[0]->Value());
            }
            break;
        case cmdDataGet:
            {
                UCHAR offset, val, res;
                offset = (UCHAR)cmd.params[0]->Value();
                val = (UCHAR)cmd.params[1]->Value();
                res = GetDeviceData(offset);
                if (res != val)
                {
                    FailCase("cmdDataGet(%d) = %d, expected %d", offset, res, val);
                }
            }
            break;
        case cmdDataSet:
            {
                UCHAR offset, val;
                offset = (UCHAR)cmd.params[0]->Value();
                val = (UCHAR)cmd.params[1]->Value();
                SetDeviceData(offset, val);
            }
            break;

        case cmdRxRestart:
            {
                BOOLEAN bExpected = (BOOLEAN)cmd.params[0]->Value();
                BOOLEAN b = RxRestart();
                if (b != bExpected)
                {
                    FailCase("RxRestart: %d, expected %d", b, bExpected);
                }
            }
            break;
        case cmdTxRestart:
            {
                BOOLEAN bExpected = (BOOLEAN)cmd.params[0]->Value();
                BOOLEAN b = TxRestart();
                if (b != bExpected)
                {
                    FailCase("TxRestart: %d, expected %d", b, bExpected);
                }
            }
            break;
        case cmdTxEnableInterrupt:
            {
                TxEnableInterrupt();
            }
            break;
        case cmdTxDisableInterrupt:
            {
                TxDisableInterrupt();
            }
            break;
        case cmdRxEnableInterrupt:
            {
                RxEnableInterrupt();
            }
            break;
        case cmdRxDisableInterrupt:
            {
                RxDisableInterrupt();
            }
            break;
        case cmdRxGet:
            {
                ULONG len;
                GetRxBuffer(&len);
            }
            break;
        case cmdControlRxMode:
            {
                SetRxMode((UCHAR)cmd.params[0]->Value(), cmd.params[1]->Value() != 0);
            }
            break;
        case cmdControlVlanAdd:
            {
                USHORT us = (USHORT)cmd.params[0]->Value();
                VlansAdd(&us, 1);
            }
            break;
        case cmdControlVlanDel:
            {
                USHORT us = (USHORT)cmd.params[0]->Value();
                VlansDel(&us, 1);
            }
            break;
        case cmdControlMacTable:
            {
                SetMacAddresses(cmd.params[0]->Value());
            }
        default:
            result = 1;
            break;
    }
    return bContinue;
}
Ejemplo n.º 3
0
DWORD
ProcessSessionThreadRequest(SessionInfo* session_info)
{
    MMRESULT result = MMSYSERR_NOERROR;

    switch ( session_info->thread.function )
    {
        case WODM_WRITE :
        {
            result = QueueWaveBuffer(session_info,
                                     (LPWAVEHDR) session_info->thread.parameter);
            break;
        }

        case WODM_RESET :
        {
            /* TODO */
            break;
        }

        case WODM_PAUSE :
        {
            /* TODO */
            break;
        }

        case WODM_RESTART :
        {
            /* TODO */
            break;
        }

        case WODM_GETPOS :
        {
            /* TODO */
            break;
        }

        case WODM_SETPITCH :
        {
            result = SetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_SET_PITCH,
                                   (PBYTE) session_info->thread.parameter,
                                   sizeof(DWORD));
            break;
        }

        case WODM_GETPITCH :
        {
            result = GetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_GET_PITCH,
                                   (PBYTE) session_info->thread.parameter,
                                   sizeof(DWORD));
            break;
        }

        case WODM_SETVOLUME :
        {
            break;
        }

        case WODM_GETVOLUME :
        {
#if 0
            result = GetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_GET_VOLUME,
                                   (PBYTE) session_info->thread.parameter,);
#endif
            break;
        }

        case WODM_SETPLAYBACKRATE :
        {
            result = SetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_SET_PLAYBACK_RATE,
                                   (PBYTE) session_info->thread.parameter,
                                   sizeof(DWORD));
            break;
        }

        case WODM_GETPLAYBACKRATE :
        {
            result = GetDeviceData(session_info->kernel_device_handle,
                                   IOCTL_WAVE_GET_PLAYBACK_RATE,
                                   (PBYTE) session_info->thread.parameter,
                                   sizeof(DWORD));
            break;
        }

        case WODM_CLOSE :
        {
            DPRINT("Thread was asked if OK to close device\n");

            if ( session_info->wave_queue != NULL )
                result = WAVERR_STILLPLAYING;
            else
                result = MMSYSERR_NOERROR;

            break;
        }

        case DRVM_TERMINATE :
        {
            DPRINT("Terminating thread...\n");
            result = MMSYSERR_NOERROR;
            break;
        }

        default :
        {
            DPRINT("INVALID FUNCTION\n");
            result = MMSYSERR_ERROR;
            break;
        }
    }

    /* We're done with the function now */

    return result;
}