亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? callback.c

?? a sample WDM stream class video capture driver that supports two IEEE 1394 digital cameras. The sam
?? C
?? 第 1 頁 / 共 2 頁
字號:
    // 
    //
    // CAUTION: 
    //    maybe need to do this only if we are recovered from power loss state.
    //    We can move this to power management function in the future.
    //    In the completion routine, it will invoke other function to restore its streaming state.
    //

    DCamSetKSStateInitialize(pDevExt);
    
    DbgMsg2(("\'DCamBusResetNotification: Leaving...; Task complete in the CompletionRoutine.\n"));

    return;
}


NTSTATUS
DCamDetachBufferCR(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP pIrp,
    IN PIRB pIrb
    )
/*++

Routine Description:

    Detaching a buffer has completed.  Attach next buffer.
    Returns more processing required so the IO Manager will leave us alone

Arguments:

    DriverObject - Pointer to driver object created by system.

    pIrp - Irp that just completed

    pIrb - Context set in DCamIsochCallback()

Return Value:

    None.

--*/

{
    IN PISOCH_DESCRIPTOR IsochDescriptor;
    PDCAM_EXTENSION pDevExt;
    PISOCH_DESCRIPTOR_RESERVED IsochDescriptorReserved;
    KIRQL oldIrql;


    if(!pIrb) {
        ERROR_LOG(("\'DCamDetachBufferCR: pIrb is NULL\n"));
        ASSERT(pIrb);
        IoFreeIrp(pIrp);
        return (STATUS_MORE_PROCESSING_REQUIRED);
    }

    // Get IsochDescriptor from the context (pIrb)
    IsochDescriptor = pIrb->u.IsochDetachBuffers.pIsochDescriptor;
    if(!IsochDescriptor) {
        ERROR_LOG(("\'DCamDetachBufferCR: IsochDescriptor is NULL\n"));
        ASSERT(IsochDescriptor);
        IoFreeIrp(pIrp);
        return (STATUS_MORE_PROCESSING_REQUIRED);
    }

    if(pIrp->IoStatus.Status != STATUS_SUCCESS) {
        ERROR_LOG(("\'DCamDetachBufferCR: pIrp->IoStatus.Status(%x) != STATUS_SUCCESS\n", pIrp->IoStatus.Status));
        ASSERT(pIrp->IoStatus.Status == STATUS_SUCCESS);
        IoFreeIrp(pIrp);
        return STATUS_MORE_PROCESSING_REQUIRED;
    }


    // IsochDescriptorReserved->Srb->Irp->IoStatus = pIrp->IoStatus.Status;
    IoFreeIrp(pIrp);

    // Freed and should not be referenced again!
    IsochDescriptor->DeviceReserved[5] = 0;

    IsochDescriptorReserved = (PISOCH_DESCRIPTOR_RESERVED) &IsochDescriptor->DeviceReserved[0];
    pDevExt = (PDCAM_EXTENSION) IsochDescriptor->Context1;
    DbgMsg3(("\'DCamDetachBufferCR: IsochDescriptorReserved=%x; DevExt=%x\n", IsochDescriptorReserved, pDevExt));   

    ASSERT(IsochDescriptorReserved);
    ASSERT(pDevExt);
     
    if(pDevExt &&
       IsochDescriptorReserved) {
        //
        // Indicate that the Srb should be complete
        //

        IsochDescriptorReserved->Flags |= STATE_SRB_IS_COMPLETE;
        IsochDescriptorReserved->Srb->Status = STATUS_SUCCESS;
        IsochDescriptorReserved->Srb->CommandData.DataBufferArray->DataUsed = IsochDescriptor->ulLength;
        IsochDescriptorReserved->Srb->ActualBytesTransferred = IsochDescriptor->ulLength;

        DbgMsg3(("\'DCamDetachBufferCR: Completing Srb %x\n", IsochDescriptorReserved->Srb));

        KeAcquireSpinLock(&pDevExt->IsochDescriptorLock, &oldIrql);
        RemoveEntryList(&IsochDescriptorReserved->DescriptorList);  InterlockedDecrement(&pDevExt->PendingReadCount);
        KeReleaseSpinLock(&pDevExt->IsochDescriptorLock, oldIrql);

        ASSERT(IsochDescriptorReserved->Srb->StreamObject);
        ASSERT(IsochDescriptorReserved->Srb->Flags & SRB_HW_FLAGS_STREAM_REQUEST);
        StreamClassStreamNotification(
               StreamRequestComplete, 
               IsochDescriptorReserved->Srb->StreamObject, 
               IsochDescriptorReserved->Srb);

        // Free it here instead of in DCamCompletionRoutine.
        ExFreePool(IsochDescriptor);     


        KeAcquireSpinLock(&pDevExt->IsochWaitingLock, &oldIrql);
        if (!IsListEmpty(&pDevExt->IsochWaitingList) && pDevExt->PendingReadCount >= MAX_BUFFERS_SUPPLIED) {

            //
            // We had someone blocked waiting for us to complete.  Pull
            // them off the waiting list and get them running
            //

            DbgMsg3(("DCamDetachBufferCR: Dequeueing request - Read Count = %x\n", pDevExt->PendingReadCount));
            IsochDescriptorReserved = \
                   (PISOCH_DESCRIPTOR_RESERVED) RemoveHeadList(
                   &pDevExt->IsochWaitingList
                   );

            KeReleaseSpinLock(&pDevExt->IsochWaitingLock, oldIrql);

            IsochDescriptor = \
                   (PISOCH_DESCRIPTOR) (((PUCHAR) IsochDescriptorReserved) - 
                   FIELDOFFSET(ISOCH_DESCRIPTOR, DeviceReserved[0]));

            DCamReadStreamWorker(IsochDescriptorReserved->Srb, IsochDescriptor);

        } else {
            KeReleaseSpinLock(&pDevExt->IsochWaitingLock, oldIrql);
        }
    }    

    return (STATUS_MORE_PROCESSING_REQUIRED);
}



VOID
DCamIsochCallback(
    IN PDCAM_EXTENSION pDevExt,
    IN PISOCH_DESCRIPTOR IsochDescriptor
    )

/*++

Routine Description:

    Called when an Isoch Descriptor completes

Arguments:

    pDevExt - Pointer to our DeviceExtension

    IsochDescriptor - IsochDescriptor that completed

Return Value:

    Nothing

--*/

{
    PIRB pIrb;
    PIRP pIrp;
    PSTREAMEX pStrmEx;
    PIO_STACK_LOCATION NextIrpStack;
    PISOCH_DESCRIPTOR_RESERVED IsochDescriptorReserved;
    PKSSTREAM_HEADER pDataPacket;
    PKS_FRAME_INFO pFrameInfo;
    KIRQL oldIrql;




    //
    // Debug check to make sure we're dealing with a real IsochDescriptor
    //

    ASSERT ( IsochDescriptor );
    IsochDescriptorReserved = (PISOCH_DESCRIPTOR_RESERVED) &IsochDescriptor->DeviceReserved[0];


    //
    // All Pending read will be either resubmitted, or cancelled (if out of resource).
    //

    if(pDevExt->bStopIsochCallback) {
        ERROR_LOG(("DCamIsochCallback: bStopCallback is set. IsochDescriptor %x (and Reserved %x) is returned and not processed.\n", 
            IsochDescriptor, IsochDescriptorReserved));
        return;
    }
    

    //
    // Synchronization note:
    //
    // We are competing with cancel packet routine in the 
    // event of device removal or setting to STOP state.
    // which ever got the spin lock to set DEATCH_BUFFER 
    // flag take ownership completing the Irp/IsochDescriptor.
    // 

    KeAcquireSpinLock(&pDevExt->IsochDescriptorLock, &oldIrql);
    if(pDevExt->bDevRemoved ||
       (IsochDescriptorReserved->Flags & (STATE_SRB_IS_COMPLETE | STATE_DETACHING_BUFFERS)) ) {
        ERROR_LOG(("DCamIsochCallback: bDevRemoved || STATE_SRB_IS_COMPLETE | STATE_DETACHING_BUFFERS %x %x\n", 
                IsochDescriptorReserved,IsochDescriptorReserved->Flags));
        ASSERT((!pDevExt->bDevRemoved && !(IsochDescriptorReserved->Flags & (STATE_SRB_IS_COMPLETE | STATE_DETACHING_BUFFERS))));
        KeReleaseSpinLock(&pDevExt->IsochDescriptorLock, oldIrql);    
        return;   
    }
    IsochDescriptorReserved->Flags |= STATE_DETACHING_BUFFERS;        
    KeReleaseSpinLock(&pDevExt->IsochDescriptorLock, oldIrql);    


    pStrmEx = (PSTREAMEX) pDevExt->pStrmEx;

    ASSERT(pStrmEx == (PSTREAMEX)IsochDescriptorReserved->Srb->StreamObject->HwStreamExtension);

    pStrmEx->FrameCaptured++;
    pStrmEx->FrameInfo.PictureNumber = pStrmEx->FrameCaptured + pStrmEx->FrameInfo.DropCount;

    //
    // Return the timestamp for the frame
    //

    pDataPacket = IsochDescriptorReserved->Srb->CommandData.DataBufferArray;
    pFrameInfo = (PKS_FRAME_INFO) (pDataPacket + 1);

    ASSERT ( pDataPacket );
    ASSERT ( pFrameInfo );

    //
    // Return the timestamp for the frame
    //
    pDataPacket->PresentationTime.Numerator = 1;
    pDataPacket->PresentationTime.Denominator = 1;
    pDataPacket->Duration = pStrmEx->pVideoInfoHeader->AvgTimePerFrame;

    //
    // if we have a master clock
    // 
    if (pStrmEx->hMasterClock) {

        ULONGLONG tmStream;
                    
        tmGetStreamTime(IsochDescriptorReserved->Srb, pStrmEx, &tmStream);
        pDataPacket->PresentationTime.Time = tmStream;
        pDataPacket->OptionsFlags = 0;
          
        pDataPacket->OptionsFlags |= 
             KSSTREAM_HEADER_OPTIONSF_TIMEVALID |
             KSSTREAM_HEADER_OPTIONSF_DURATIONVALID |
             KSSTREAM_HEADER_OPTIONSF_SPLICEPOINT;     // Every frame we generate is a key frame (aka SplicePoint)
               
        DbgMsg3(("\'IsochCallback: Time(%dms); P#(%d)=Cap(%d)+Drp(%d); Pend%d\n",
                (ULONG) tmStream/10000,
                (ULONG) pStrmEx->FrameInfo.PictureNumber,
                (ULONG) pStrmEx->FrameCaptured,
                (ULONG) pStrmEx->FrameInfo.DropCount,
                pDevExt->PendingReadCount));

    } else {

        pDataPacket->PresentationTime.Time = 0;
        pDataPacket->OptionsFlags &=                       
            ~(KSSTREAM_HEADER_OPTIONSF_TIMEVALID |
            KSSTREAM_HEADER_OPTIONSF_DURATIONVALID);
    }

    // Set additional info fields about the data captured such as:
    //   Frames Captured
    //   Frames Dropped
    //   Field Polarity
                
    pStrmEx->FrameInfo.ExtendedHeaderSize = pFrameInfo->ExtendedHeaderSize;
    *pFrameInfo = pStrmEx->FrameInfo;

#ifdef SUPPORT_RGB24
    // Swaps B and R or BRG24 to RGB24.
    // There are 640x480 pixels so 307200 swaps are needed.
    if(pDevExt->CurrentModeIndex == VMODE4_RGB24 && pStrmEx->pVideoInfoHeader) {
        PBYTE pbFrameBuffer;
        BYTE bTemp;
        ULONG i, ulLen;

#ifdef USE_WDM110   // Win2000
        // Driver verifier flag to use this but if this is used, this driver will not load for any Win9x OS.
        pbFrameBuffer = (PBYTE) MmGetSystemAddressForMdlSafe(IsochDescriptorReserved->Srb->Irp->MdlAddress, NormalPagePriority);
#else    // Win9x
        pbFrameBuffer = (PBYTE) MmGetSystemAddressForMdl    (IsochDescriptorReserved->Srb->Irp->MdlAddress);
#endif
        if(pbFrameBuffer) {
            // calculate number of pixels
            ulLen = abs(pStrmEx->pVideoInfoHeader->bmiHeader.biWidth) * abs(pStrmEx->pVideoInfoHeader->bmiHeader.biHeight);
            ASSERT(ulLen == pStrmEx->pVideoInfoHeader->bmiHeader.biSizeImage/3);
            if(ulLen > pStrmEx->pVideoInfoHeader->bmiHeader.biSizeImage)
                ulLen = pStrmEx->pVideoInfoHeader->bmiHeader.biSizeImage/3;

            for (i=0; i < ulLen; i++) {
                // swap R and B
                bTemp = pbFrameBuffer[0];
                pbFrameBuffer[0] = pbFrameBuffer[2];
                pbFrameBuffer[2] = bTemp;
                pbFrameBuffer += 3;  // next RGB24 pixel
            }
        }
    }
#endif

    // Reuse the Irp and Irb
    pIrp = (PIRP) IsochDescriptor->DeviceReserved[5];
    ASSERT(pIrp);            

    pIrb = (PIRB) IsochDescriptor->DeviceReserved[6];
    ASSERT(pIrb);            

#if DBG
    // Same isochdescriptor should only be callback once.    
    ASSERT((IsochDescriptor->DeviceReserved[7] == 0x87654321));
    IsochDescriptor->DeviceReserved[7]++;
#endif

    pIrb->FunctionNumber = REQUEST_ISOCH_DETACH_BUFFERS;
    pIrb->u.IsochDetachBuffers.hResource = pDevExt->hResource;
    pIrb->u.IsochDetachBuffers.nNumberOfDescriptors = 1;
    pIrb->u.IsochDetachBuffers.pIsochDescriptor = IsochDescriptor;

    NextIrpStack = IoGetNextIrpStackLocation(pIrp);
    NextIrpStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
    NextIrpStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_1394_CLASS;
    NextIrpStack->Parameters.Others.Argument1 = pIrb;

    IoSetCompletionRoutine(
        pIrp,
        DCamDetachBufferCR,  // Detach complete and will attach queued buffer.
        pIrb,
        TRUE,
        TRUE,
        TRUE
        );
          
    IoCallDriver(pDevExt->BusDeviceObject, pIrp);
            
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线视频观看58 | 欧美日本免费一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 久久久不卡网国产精品二区| 欧美色偷偷大香| 国产sm精品调教视频网站| 亚洲成人免费在线| 亚洲特级片在线| 欧美精品一区二区三区一线天视频 | 国产精品色眯眯| 欧美精品v国产精品v日韩精品 | 日韩午夜激情免费电影| 91日韩一区二区三区| 国内不卡的二区三区中文字幕| 五月婷婷另类国产| 中文字幕一区二区在线播放| 精品卡一卡二卡三卡四在线| 国产精品无码永久免费888| 色就色 综合激情| 成人性生交大片| 国产一区二区福利| 毛片av一区二区三区| 一区二区三区精品视频| 中文字幕人成不卡一区| 久久久久久久免费视频了| 欧美videossexotv100| 91精品国产手机| 欧美色图片你懂的| 欧美午夜寂寞影院| 91免费精品国自产拍在线不卡| 国产jizzjizz一区二区| 国产精品综合二区| 国模无码大尺度一区二区三区| 日韩av一二三| 首页国产丝袜综合| 亚洲一区二三区| 亚洲二区在线观看| 亚洲韩国精品一区| 亚洲国产婷婷综合在线精品| 亚洲精品免费在线观看| 亚洲三级电影全部在线观看高清| 国产精品久久久久影院| 中文字幕一区二区在线观看| 国产精品久久精品日日| 国产精品国产三级国产三级人妇| 久久久精品免费网站| 中文字幕精品在线不卡| 中文字幕一区二区三中文字幕| 国产精品短视频| 亚洲欧美精品午睡沙发| 亚洲免费av网站| 亚洲一区二区av电影| 亚洲成人免费视| 蜜臀av一级做a爰片久久| 国产真实乱偷精品视频免| 国产精品99久久久久久久女警| 成人国产电影网| 99久精品国产| 欧美色男人天堂| 日韩色在线观看| 国产亚洲成aⅴ人片在线观看| 国产欧美一区二区三区沐欲 | 国产清纯美女被跳蛋高潮一区二区久久w | 日韩色在线观看| 久久精品人人做人人爽97| 国产欧美日韩视频一区二区| 亚洲欧美成aⅴ人在线观看| 伊人一区二区三区| 免费在线观看视频一区| 国产福利一区二区| 欧日韩精品视频| 精品精品欲导航| 国产精品丝袜在线| 亚洲成人tv网| 国产麻豆一精品一av一免费| 99久久99久久综合| 91精品国产综合久久久蜜臀图片 | 精品免费日韩av| 自拍偷拍亚洲欧美日韩| 天天综合色天天| 国产凹凸在线观看一区二区| 欧美午夜一区二区| 国产亚洲精久久久久久| 亚洲一区在线观看免费| 国产精品一区二区三区乱码 | 91老师片黄在线观看| 制服丝袜在线91| 国产精品久久久久一区二区三区共 | 国产亚洲va综合人人澡精品 | 成人avav影音| 欧美一级欧美三级在线观看| 国产精品免费视频网站| 日韩成人伦理电影在线观看| av中文字幕亚洲| 欧美一区二区三级| 亚洲人成精品久久久久久 | 99国产精品久久久久久久久久久| 91精品国产麻豆| 亚洲欧美另类小说| 国产精品一区二区在线看| 在线播放国产精品二区一二区四区| 国产夜色精品一区二区av| 日韩精品欧美精品| 97久久超碰国产精品电影| 精品久久五月天| 午夜天堂影视香蕉久久| 色综合久久久久| 国产精品欧美一区喷水| 美国十次了思思久久精品导航| 色94色欧美sute亚洲13| 国产女主播一区| 韩国一区二区三区| 欧美一区2区视频在线观看| 亚洲图片欧美激情| 国产不卡视频一区| 精品免费国产二区三区| 天天色综合天天| 91激情五月电影| 最新国产の精品合集bt伙计| 国产一区二区三区黄视频 | 免费在线视频一区| 欧美日韩高清一区二区不卡| 亚洲女同一区二区| 成人高清免费观看| 国产午夜精品久久久久久免费视| 久久99国产精品免费网站| 777久久久精品| 午夜免费欧美电影| 欧美日韩在线播| 亚洲乱码国产乱码精品精可以看| 成人美女在线视频| 中文在线一区二区| 成人动漫视频在线| 国产精品理论片| 99在线视频精品| 一区在线中文字幕| 91一区在线观看| 亚洲人成网站色在线观看| 91社区在线播放| 亚洲精选在线视频| 欧美日韩一级片网站| 日韩激情视频网站| 欧美一区二区免费视频| 黄页网站大全一区二区| 久久婷婷国产综合国色天香| 国产乱码字幕精品高清av| 中文字幕不卡在线播放| 成人精品视频一区二区三区| 亚洲欧美一区二区三区极速播放| 色猫猫国产区一区二在线视频| 一区二区三区四区国产精品| 欧美午夜寂寞影院| 美女脱光内衣内裤视频久久影院| 91精品在线观看入口| 麻豆国产一区二区| 久久精品视频免费观看| 91色婷婷久久久久合中文| 亚洲精品高清在线| 这里只有精品电影| 国产麻豆午夜三级精品| 亚洲精品视频免费看| 欧美日韩成人综合| 精品一区中文字幕| 中文字幕一区二区三区乱码在线| 色哟哟欧美精品| 青青草原综合久久大伊人精品 | 日韩午夜av电影| 高清不卡一区二区| 一二三区精品视频| 日韩欧美在线影院| 成人福利视频网站| 日韩激情在线观看| 国产精品天干天干在线综合| 欧美亚洲综合在线| 韩国精品一区二区| 一区二区三区欧美日| 日韩欧美高清一区| 91免费版在线看| 麻豆中文一区二区| 中文字幕在线免费不卡| 日韩欧美在线不卡| 9l国产精品久久久久麻豆| 欧美aaaaaa午夜精品| 亚洲同性gay激情无套| 日韩欧美一卡二卡| 97成人超碰视| 韩国理伦片一区二区三区在线播放 | 91国在线观看| 国产精品69久久久久水密桃| 亚洲国产综合人成综合网站| 国产视频一区在线观看| 欧美日韩精品电影| av中文字幕一区| 久久草av在线| 亚洲r级在线视频| 国产精品不卡视频| 久久色成人在线| 3751色影院一区二区三区| 色婷婷综合激情| 国产丶欧美丶日本不卡视频|