张源 a écrit : > > > 2009/7/4 Laurent Tarrisse <[email protected] <mailto:[email protected]>> > > Do you know what palettes are supported by your webcam ? > > Laurent > > 张源 a écrit : > > > > > > 2009/7/2 Laurent Tarrisse <[email protected] > <mailto:[email protected]> <mailto:[email protected] > <mailto:[email protected]>>> > > > > Can you make a small test : > > > > nmake webcam-test-visu-c > > > > ... > > > > launch webcam-test-visu-c.exe > > > > Is it the same result ? > > > > Laurent > > > > 张源 a écrit : > > > > > > > > > 2009/7/1 Laurent Tarrisse <[email protected] > <mailto:[email protected]> > > <mailto:[email protected] <mailto:[email protected]>> > <mailto:[email protected] <mailto:[email protected]> > > <mailto:[email protected] <mailto:[email protected]>>>> > > > > > > Laurent Tarrisse a écrit : > > > > 张源 a écrit : > > > > > > > >> I have built qutecom-2-2-3faed9597730(debug),with vs 2005 on > > > windows > > > >> xp Chinese simplified but there are some problems with > > Qutecom when > > > >> making a webcam preview or a video call . > > > >> > > > >> The problems are as follows: when entering Video settings ,then > > > click > > > >> Webcam Preview button ,after a while ,the Label on the right > > > side just > > > >> shows a gray rectangle. The Video call is also just shows a > gray > > > >> rectangle,and after a while it crashed . > > > >> Webcam Preview.png (/image/png/) 5K > > > >> > > > > > > <?ui=2&ik=ab85a7e087&view=att&th=1223455e9356b51f&attid=0.1&disp=attd> > > > >> The piximage has been sucessfully catched by WebcamDriver. > > > >> I found the problem may lie in this code section: > > > >> pixertool.cpp > > > >> > > > >> *...* > > > >> pixerrorcode* pix_convert*(int flags, piximage * img_dst, > > > piximage * > > > >> img_src) { > > > >> *...* > > > >> if (*img_convert*(&avp_target, pix_fmt_target, > > > >> &avp_tmp_target, pix_fmt_source, > > > >> img_dst->width, img_dst->height) *== -1*) { > > > >> av_free(buf_tmp_target); > > > >> return PIX_NOK; > > > >> } > > > >> * ...* > > > >> } > > > >> > > > > Can you give me img_src->palette and img_src->dst ? > > > > > > > Oups, > > > > > > it is img_src->palette and img_dst->palette. > > > > > > Laurent > > > >> *...* > > > >> when calling * pix_convert*() ,the function *img_convert()* > > allways > > > >> return -1 which means the image conversion fails. > > > >> > > > >> Has anyone face the same problem ,please help me > > > >> > > > >> > > > > > > ------------------------------------------------------------------------ > > > >> > > > >> > > > > > > ------------------------------------------------------------------------ > > > >> > > > >> _______________________________________________ > > > >> QuteCom-dev mailing list > > > >> [email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>> > > > <mailto:[email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>>> > > > >> http://lists.qutecom.org/mailman/listinfo/qutecom-dev > > > >> > > > >> > > > > > > > > _______________________________________________ > > > > QuteCom-dev mailing list > > > > [email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>> > > <mailto:[email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>>> > > > > http://lists.qutecom.org/mailman/listinfo/qutecom-dev > > > > > > > > > > _______________________________________________ > > > QuteCom-dev mailing list > > > [email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>> > > <mailto:[email protected] > <mailto:[email protected]> > > <mailto:[email protected] > <mailto:[email protected]>>> > > > http://lists.qutecom.org/mailman/listinfo/qutecom-dev > > > > > > > > > Thank you ! > > > the functions are called as follows:1――>2――>3 > > > *1 *void QtVideoSettings::frameCapturedEventHandler > (IWebcamDriver * > > > sender, piximage * image) {//重要函数 > > > > > > * ...* > > > QSize qs(_ui->webcamPreviewLabel->width(), > > > _ui->webcamPreviewLabel->height()); > > > QImage tmpRgbImage(qs, QImage::Format_RGB32); > > > *QtVideoQt::convertPixImageToQImage(image, qs, &tmpRgbImage);* > > > QPixmap tmp = QPixmap::fromImage(tmpRgbImage); > > > * ...* > > > > > > } > > > *2 * void QtVideoQt::convertPixImageToQImage(piximage* pixImage, > > const > > > QSize& size, QImage* image) { > > > * ...* > > > piximage resizedPixImage; > > > resizedPixImage.palette = PIX_OSI_RGB32; > > > resizedPixImage.width = image->width(); > > > resizedPixImage.height = image->height(); > > > resizedPixImage.data = image->bits(); > > > > > > * pix_convert(PIX_NO_FLAG, &resizedPixImage, pixImage); > > > * //测试// > > > } > > > > > > * so the img_dst->palette == PIX_OSI_RGB32 img_src->palette == > > > PIX_OSI_YUV420P* > > > *3* pixerrorcode pix_convert(int flags, piximage * img_dst, > > piximage * > > > img_src) { > > > > > > * ...* > > > enum PixelFormat pix_fmt_source > > > =(PixelFormat)pix_ffmpeg_from_pix_osi(img_src->palette); > > > enum PixelFormat pix_fmt_target = > > > (PixelFormat)pix_ffmpeg_from_pix_osi(img_dst->palette); > > > > > > > > > *...* > > > > > > > > > #ifndef HAVE_SWSCALE > > > //TODO optimize this part but will need the preparation of > contexts > > > ImgReSampleContext * resample_context = > > > img_resample_init(img_dst->width, img_dst->height, > > > img_src->width, img_src->height); > > > > > > if (!resample_context) { > > > return PIX_NOK; > > > } > > > > > > AVPicture avp_tmp_target; > > > > > > //we need to prepare a tmp buffer > > > uint8_t * buf_tmp_target = (uint8_t > > > *)av_malloc(avpicture_get_size(pix_fmt_source, img_dst->width, > > > img_dst->height) * sizeof(uint8_t)); > > > avpicture_fill(&avp_tmp_target, buf_tmp_target, pix_fmt_source, > > > img_dst->width, img_dst->height); > > > // > > > > > > //do the resampling > > > img_resample(resample_context, &avp_tmp_target, &avp_source); > > > img_resample_close(resample_context); > > > // > > > > > > //do the conversion > > > if (*img_convert*(&avp_target, pix_fmt_target, > > > &avp_tmp_target, pix_fmt_source, > > > img_dst->width, img_dst->height) == -1) { > > > av_free(buf_tmp_target); > > > return PIX_NOK;//转换没有成功 > > > } > > > * ...* > > > } > > > *img_dst->palette : PIX_OSI_RGB32* > > > * img_src->palette : PIX_OSI_YUV420P* > > > pix_fmt_target : *PIX_FMT_BGR32* > > > pix_fmt_source : *PIX_FMT_YUV420P* > > > img_convert()is a function in ffmpeg library,so the problems > > might be > > > in parameters passed into it .It involves encoding and decoding > > which > > > I totally don't know how to deal with . > > > Thanks again ! > > > > > > > > > > _______________________________________________ > > QuteCom-dev mailing list > > [email protected] > <mailto:[email protected]> > <mailto:[email protected] > <mailto:[email protected]>> > > http://lists.qutecom.org/mailman/listinfo/qutecom-dev > > > > > > > > Thank you Laurent > > I have made a small test with webcam-test-visu-c.exe. the > results are > > as follows: > > * <error>15:32:03 [Common] DirectXWebcamDriver::setCaps:failed caps > > request:(19,15,320,240) > > > > Using width:320 ,height:240 FPS:15 > > **Starting capture... > > I am called!! > > frame _captured > > ..... > > > > * > > * * > > setCaps error.png (/image/png/) 7K > > > <?ui=2&ik=ab85a7e087&view=att&th=1223a64d4bdb3ee5&attid=0.2&disp=attd> > > webcam widget.png (/image/png/) 5K > > > <?ui=2&ik=ab85a7e087&view=att&th=1223a64d4bdb3ee5&attid=0.1&disp=attd> > > The picture still coulid not show on the webcam widget > > The execution results show below: > > > > DirectXWebcamDriver .cpp > > * ...* > > ** > > WebcamErrorCode DirectXWebcamDriver::setDevice(const std::string & > > deviceName) { > > > > //TODO: test if a webcam is already open > > //TODO: refactor the COM initialization phase to avoid > > //multiple initalisations and better handle unitialization > > //cf trac ticket #1008 > > // We really need to refactor that point > > // I leave this line here just because the phapi thread > > // must call this function (one time). We must move this > elsewhere ... > > CoInitialize(NULL); > > //// > > _pGraph.CoCreateInstance(CLSID_FilterGraph); > > if (!_pGraph) { > > LOG_ERROR("failed to create Graph builder"); > > return WEBCAM_NOK; > > } > > _pBuild.CoCreateInstance(CLSID_CaptureGraphBuilder2); > > if (!_pBuild) { > > LOG_ERROR("failed to create Capture Graph builder"); > > return WEBCAM_NOK; > > } > > _pBuild->SetFiltergraph(_pGraph); > > //Create the Sample Grabber > > HRESULT hr = CoCreateInstance(CLSID_SampleGrabber, NULL, > > CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&(_pGrabberF)); > > if (hr != S_OK) { > > LOG_ERROR("failed to create COM instance"); > > return WEBCAM_NOK; > > } > > //Add the filter to the graph > > hr = (_pGraph)->AddFilter(_pGrabberF, L"Sample Grabber"); > > if (hr != S_OK) { > > LOG_ERROR("failed to add filter"); > > return WEBCAM_NOK; > > } > > //Query the Sample Grabber for the ISampleGrabber interface. > > _pGrabberF->QueryInterface(IID_ISampleGrabber, (void**)&_pGrabber); > > hr = _pGrabber->SetBufferSamples(FALSE); > > hr = _pGrabber->SetOneShot(FALSE); > > //Set the Sample Grabber callback > > //0: SampleCB (the buffer is the original buffer, not a copy) > > //1: BufferCB (the buffer is a copy of the original buffer) > > if (_pGrabber->SetCallback(this, 0) != S_OK) { > > LOG_ERROR("failed to assign callback"); > > return WEBCAM_NOK; > > } > > CComBSTR bstrName(deviceName.c_str()); > > hr = FindMyCaptureDevice(&_pCap, bstrName); > > if ((hr != S_OK) || !_pCap) { > > return WEBCAM_NOK; > > } > > //initialize IAMStreamConfig > > _iam = GetIAMStreamConfig(_pCap); > > if (!_iam) { > > return WEBCAM_NOK; > > } > > //add the capture filter to the graph > > hr = (_pGraph)->AddFilter(_pCap, L""); > > if (hr != S_OK) { > > LOG_ERROR("failed to add filter"); > > return WEBCAM_NOK; > > } > > //Add a null renderer filter > > hr = CoCreateInstance(CLSID_NullRenderer, NULL, > > CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&_pNull); > > hr = (_pGraph)->AddFilter(_pNull, L"NullRender"); > > _pBuild->RenderStream(&PIN_CATEGORY_CAPTURE, NULL, _pCap, NULL, > > _pGrabberF); > > //try to assign some palette until the webcam supports it > > if (*setCaps*(PIX_OSI_YUV420P, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_YUV420P, _cachedFPS, 160, 120) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_I420, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_I420, _cachedFPS, 160, 120) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_RGB32, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_RGB32, _cachedFPS, 160, 120) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_RGB24, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_RGB24, _cachedFPS, 160, 120) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_YUV422, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_YUV422, _cachedFPS, 160, 120) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_RGB565, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_RGB565, _cachedFPS, 160, 120) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_RGB555, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_RGB555, _cachedFPS, 160, 120) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_YUY2, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_YUY2, _cachedFPS, 160, 120) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_UYVY, _cachedFPS, 176, 144) != WEBCAM_OK) { > > if (*setCaps*(PIX_OSI_UYVY, _cachedFPS, 160, 120) != WEBCAM_OK) { > > }}}}}}}}}}}}}}}}}} > > ** > > *all of the 18 "if(setCaps(...)!=WEBCAM_OK)" above are executed > > .That's to say all the 18 " setCaps() " return WEBCAM_NOK;* > > ** > > ** > > *readCaps();* > > if (getPalette() == PIX_OSI_UNSUPPORTED) { > > return WEBCAM_NOK; > > } > > _isOpen = true; > > return WEBCAM_OK; > > > > } > > WebcamErrorCode DirectXWebcamDriver::setCaps(pixosi palette, > unsigned > > fps, unsigned resolutionWidth, unsigned resolutionHeight) { > > _cachedFPS = fps; > > > > if (!isOpen()) { > > return WEBCAM_NOK; > > } > > > > if (!_pCap) { > > LOG_FATAL("webcam not initialized"); > > } > > if (!_iam) { > > LOG_FATAL("webcam not initialized"); > > } > > > > int iCount, iSize; > > HRESULT hr = _iam->GetNumberOfCapabilities(&iCount, &iSize); > > > > VIDEO_STREAM_CONFIG_CAPS scc; > > if (sizeof(scc) != iSize) { > > LOG_ERROR("wrong config structure"); > > return WEBCAM_NOK; > > } > > > > for (int i = 0; i < iCount; i++) { > > AM_MEDIA_TYPE * pmt = NULL; > > hr = _iam->GetStreamCaps(i, &pmt, reinterpret_cast<BYTE *>(&scc)); > > if (hr == S_OK) { > > pixosi wc_palette = pix_directx_to_pix_osi(pmt->subtype); > > if (wc_palette != palette) { > > hr = E_FAIL; > > continue; > > } > > VIDEOINFOHEADER * pvi = (VIDEOINFOHEADER *) pmt->pbFormat; > > pvi->bmiHeader.biWidth = resolutionWidth; > > pvi->bmiHeader.biHeight = resolutionHeight; > > pvi->AvgTimePerFrame = (LONGLONG) (10000000. / (double)fps); > > hr = _iam->SetFormat(pmt); > > if (hr != S_OK) { > > hr = E_FAIL; > > continue; > > } else { > > LOG_DEBUG("assigned caps : (" > > + String::fromNumber(palette) > > + "," + String::fromNumber(fps) > > + "," + String::fromNumber(resolutionWidth) > > + "," + String::fromNumber(resolutionHeight) > > + ")"); > > break; > > } > > } > > } > > > > readCaps(); > > > > if (hr == S_OK) { > > return WEBCAM_OK; > > } > > > > *LOG_ERROR("failed caps request: (" > > + String::fromNumber(palette) > > + "," + String::fromNumber(fps) > > + "," + String::fromNumber(resolutionWidth) > > + "," + String::fromNumber(resolutionHeight) > > + ")");* > > > > *error occured , I am trying to figure out which function > > (DirectXWebcamDriver::setResolution() or > > DirectXWebcamDriver::setPalette() or others)calling setCaps() > results > > in this error * > > > > > > return WEBCAM_NOK; > > } > > void DirectXWebcamDriver::*readCaps*() { > > > > VIDEOINFOHEADER * pvi; > > pixosi palette; > > AM_MEDIA_TYPE * pmt = NULL; > > HRESULT hr = _iam->GetFormat(&pmt); > > if (pmt->formattype == FORMAT_VideoInfo) { > > pvi = (VIDEOINFOHEADER *) pmt->pbFormat; > > palette = pix_directx_to_pix_osi(pmt->subtype); > > } > > _cachedPalette = palette; > > _cachedWidth = pvi->bmiHeader.biWidth; > > _cachedHeight = pvi->bmiHeader.biHeight; > > > > > > } > > > > > > > ------------------------------------------------------------------------ > > > > > > > ------------------------------------------------------------------------ > > > > _______________________________________________ > QuteCom-dev mailing list > [email protected] <mailto:[email protected]> > http://lists.qutecom.org/mailman/listinfo/qutecom-dev > > > > > > Thank you very much > > > /********************************** > webcam/DirectXWebcamDriver.cpp******************************/ > > WebcamErrorCode DirectXWebcamDriver::setCaps(pixosi palette, unsigned > fps, unsigned resolutionWidth, unsigned resolutionHeight) { > * ...* > if (sizeof(scc) != iSize) { > LOG_ERROR("wrong config structure"); > return WEBCAM_NOK; > } > > for (int i = 0; i < iCount; i++) { > AM_MEDIA_TYPE * pmt = NULL; > hr = _iam->GetStreamCaps(i, *&pmt*, reinterpret_cast<BYTE > *>(&scc));//i 为 6 时 > if (hr == S_OK) { > pixosi wc_palette =* pix_directx_to_pix_osi*(pmt->subtype); > if (wc_palette != palette) { > hr = E_FAIL; > continue; > } > ... > } > > > /**********************************pixertool/directx-pixertool.h***************************************/ > > pixosi *pix_directx_to_pix_os**i*(GUID *pix*) { > register unsigned i; > pixosi palette = PIX_OSI_UNSUPPORTED; > > for (i = 0; i < sizeof(_ms_table) / sizeof(pixms_pixosi); i++) { > if (memcmp(&_ms_table[i].pix_ms, &pix, sizeof(GUID)) == 0) { > palette = _ms_table[i].pix_osi; > break; > } > } > return *palette*; > } > > > I have debug the *pix_directx_to_pix_osi*(GUID pix) many times,and > found my > webcam only supports the following two palettes : > *1,{ MEDIASUBTYPE_RGB24, PIX_OSI_RGB24 }* > ( *21* in enum pixosi) > *2,{ OUR_MEDIASUBTYPE_I420, PIX_OSI_YUV420P }* > ( *0 * in enum* *pixosi) > > This can be used to expalain the error : > > I have made a small test with webcam-test-visu-c.exe. the results are > > as follows: > > * <error>15:32:03 [Common] DirectXWebcamDriver::setCaps: > failed caps > > request:(*19*,15,320,240) > > My webcam* does't support { MEDIASUBTYPE_RGB32, PIX_OSI_RGB32 }* > (*19* in enum pixosi) > *,resulting image conversion failure:* > > > void QtVideoQt::convertPixImageToQImage(piximage* pixImage, const > QSize& size, QImage* image) { > Q_ASSERT(image); > > if (image->size() != size || image->format() !=* QImage::Format_RGB32*) { > *image = QImage(size, QImage::*Format_RGB32*); > } > > > resizedPixImage.palette = *PIX_OSI_RGB32*; //* error!, my webcam > dosen't support * Ok you're webcam doesn't support PIX_OSI_RGB32* *But here you're webcam is not engaged : I mean, convertPixImageToQImage will convert pixImage to QImage without access to webcam driver ... If you're pixImage format is not PIX_OSI_RGB32 it will be converted with ffmpeg* * > resizedPixImage.width = image->width(); > resizedPixImage.height = image->height(); > resizedPixImage.data = image->bits(); > > *pix_convert*(PIX_NO_FLAG, &resizedPixImage, pixImage); > //测试// > > > } > pixertool.cpp > > * ...* > pixerrorcode* pix_convert*(int flags, piximage * img_dst, piximage * > img_src) { > *...* > if (*img_convert*(&avp_target, pix_fmt_target, > &avp_tmp_target, pix_fmt_source, > img_dst->width, img_dst->height) *== -1*) { > av_free(buf_tmp_target); > return PIX_NOK; // *img _convert () failure*, *always return PIX_NOK* > } > * ...* > } > * ...* > > > > > > > I have just changed "resizedPixImage.palette = PIX_OSI_RGB*32" * to* > *resizedPixImage.palette = PIX_OSI_RGB*24 > and now ,the video can show on the Label widget ,However, the picture > showed on the label is not clear and overlapped *Webcam Preview.png > (/image/png/) 39K > <http://?ui=2&ik=ab85a7e087&view=att&th=122461d06b4f0e4c&attid=0.1&disp=attd> > > > Clearly ,the problem resulted from the following conflicts :GUI shows > QImage(size, QImage::*Format_RGB32*) while the converted picture is > RGB*24*, it conflicts .My Qt library version is 4.3.2,amd Qt don't > support QImage::Format_RGB888 until version 4.4 I think there is something wrong with format value of piximage in convertPixImageToQImage() Can you verify that pixImage->palette in convertPixImageToQImage() is equal to PIX_OSI_RGB24 ?* * > > what makes me puzzled is that: I have downloaded Qutecom release > version on my computer ,installed it ,and the Qutecom workeds well, > the video workes well,everything is ok.but when i compiled the source > code ,the debug version faced the problem mentioned previously. > > It makes me puzzled . My webcam dosen't support *PIX_OSI_RGB32: > * > * Is it due to my DirectX library or windows server platform SDK?* > * > Does QImage::Format_RGB888 equal to RGB24? if true, I would rather > compile a higher Qt version to make Qt support QImage::Format_ RGB24 > Would you please give me some other guidance *, *thanks again! * > > > > > ------------------------------------------------------------------------ >
_______________________________________________ QuteCom-dev mailing list [email protected] http://lists.qutecom.org/mailman/listinfo/qutecom-dev
